Skip to content

Commit 2dfab96

Browse files
committed
Fix and undeprecate home_dir()
1 parent 588a420 commit 2dfab96

File tree

3 files changed

+13
-26
lines changed

3 files changed

+13
-26
lines changed

Diff for: library/std/src/env.rs

+6-15
Original file line numberDiff line numberDiff line change
@@ -608,20 +608,16 @@ impl Error for JoinPathsError {
608608
///
609609
/// # Windows
610610
///
611-
/// - Returns the value of the 'HOME' environment variable if it is set
612-
/// (including to an empty string).
613-
/// - Otherwise, returns the value of the 'USERPROFILE' environment variable if it is set
614-
/// (including to an empty string).
615-
/// - If both do not exist, [`GetUserProfileDirectory`][msdn] is used to return the path.
611+
/// - Returns the value of the 'USERPROFILE' environment variable if it is set, and is not an empty string.
612+
/// - Otherwise, [`GetUserProfileDirectory`][msdn] is used to return the path. This may change in the future.
616613
///
617614
/// [msdn]: https://docs.microsoft.com/en-us/windows/win32/api/userenv/nf-userenv-getuserprofiledirectorya
618615
///
619-
/// # Deprecation
616+
/// In UWP (Universal Windows Platform) targets this function is unimplemented and always returns `None`.
620617
///
621-
/// This function is deprecated because the behavior on Windows is not correct.
622-
/// The 'HOME' environment variable is not standard on Windows, and may not produce
623-
/// desired results; for instance, under Cygwin or Mingw it will return `/home/you`
624-
/// when it should return `C:\Users\you`.
618+
/// Before Rust CURRENT_RUSTC_VERSION, this function used to return the value of the 'HOME' environment variable
619+
/// on Windows, which in Cygwin or Mingw environments could return non-standard paths like `/home/you`
620+
/// instead of `C:\Users\you`.
625621
///
626622
/// # Examples
627623
///
@@ -633,11 +629,6 @@ impl Error for JoinPathsError {
633629
/// None => println!("Impossible to get your home dir!"),
634630
/// }
635631
/// ```
636-
#[deprecated(
637-
since = "1.29.0",
638-
note = "This function's behavior may be unexpected on Windows. \
639-
Consider using a crate from crates.io instead."
640-
)]
641632
#[must_use]
642633
#[stable(feature = "env", since = "1.0.0")]
643634
pub fn home_dir() -> Option<PathBuf> {

Diff for: library/std/src/sys/pal/windows/os.rs

+1-4
Original file line numberDiff line numberDiff line change
@@ -377,10 +377,7 @@ fn home_dir_crt() -> Option<PathBuf> {
377377
}
378378

379379
pub fn home_dir() -> Option<PathBuf> {
380-
crate::env::var_os("HOME")
381-
.or_else(|| crate::env::var_os("USERPROFILE"))
382-
.map(PathBuf::from)
383-
.or_else(home_dir_crt)
380+
env::var_os("USERPROFILE").filter(|s| !s.is_empty()).map(PathBuf::from).or_else(home_dir_crt)
384381
}
385382

386383
pub fn exit(code: i32) -> ! {

Diff for: library/std/tests/env.rs

+6-7
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,6 @@ fn test_env_set_var() {
8383

8484
#[test]
8585
#[cfg_attr(not(any(unix, windows)), ignore, allow(unused))]
86-
#[allow(deprecated)]
8786
fn env_home_dir() {
8887
use std::path::PathBuf;
8988

@@ -122,19 +121,19 @@ fn env_home_dir() {
122121

123122
assert!(home_dir().is_some());
124123

125-
set_var("HOME", "/home/MountainView");
124+
set_var("HOME", "/home/PaloAlto");
125+
assert_ne!(home_dir(), Some(PathBuf::from("/home/PaloAlto")), "HOME must not be used");
126+
127+
set_var("USERPROFILE", "/home/MountainView");
126128
assert_eq!(home_dir(), Some(PathBuf::from("/home/MountainView")));
127129

128130
remove_var("HOME");
129131

130-
set_var("USERPROFILE", "/home/MountainView");
131132
assert_eq!(home_dir(), Some(PathBuf::from("/home/MountainView")));
132133

133-
set_var("HOME", "/home/MountainView");
134-
set_var("USERPROFILE", "/home/PaloAlto");
135-
assert_eq!(home_dir(), Some(PathBuf::from("/home/MountainView")));
134+
set_var("USERPROFILE", "");
135+
assert_ne!(home_dir(), Some(PathBuf::from("")), "Empty USERPROFILE must be ignored");
136136

137-
remove_var("HOME");
138137
remove_var("USERPROFILE");
139138

140139
if let Some(oldhome) = oldhome { set_var("HOME", oldhome); }

0 commit comments

Comments
 (0)