Auto merge of #51656 - soc:topic/fix-home-dir, r=SimonSapin
Deprecate `std::env::home_dir` and fix incorrect documentation
Compare `std::env::home_dir`s claim:
> Returns the value of the 'HOME' environment variable if it is set and not equal to the empty string.
... with its actual behavior:
```
std::env::set_var("HOME", "");
println!("{:?}", std::env::var_os("HOME")); // Some("")
println!("{:?}", std::env::home_dir()); // Some("")
```
The implementation is incorrect in two cases:
- `$HOME` is set, but empty.
- An entry for the user exists in `/etc/passwd`, but it's `pw_dir` is empty.
In both cases Rust considers an empty string to be a valid home directory. This contradicts the documentation, and is wrong in general.
This commit is contained in:
commit
99b0ddb88a
1 changed files with 15 additions and 10 deletions
|
|
@ -512,18 +512,20 @@ impl Error for JoinPathsError {
|
|||
///
|
||||
/// # Unix
|
||||
///
|
||||
/// Returns the value of the 'HOME' environment variable if it is set
|
||||
/// and not equal to the empty string. Otherwise, it tries to determine the
|
||||
/// home directory by invoking the `getpwuid_r` function on the UID of the
|
||||
/// current user.
|
||||
/// - Returns the value of the 'HOME' environment variable if it is set
|
||||
/// (including to an empty string).
|
||||
/// - Otherwise, it tries to determine the home directory by invoking the `getpwuid_r` function
|
||||
/// using the UID of the current user. An empty home directory field returned from the
|
||||
/// `getpwuid_r` function is considered to be a valid value.
|
||||
/// - Returns `None` if the current user has no entry in the /etc/passwd file.
|
||||
///
|
||||
/// # Windows
|
||||
///
|
||||
/// Returns the value of the 'HOME' environment variable if it is
|
||||
/// set and not equal to the empty string. Otherwise, returns the value of the
|
||||
/// 'USERPROFILE' environment variable if it is set and not equal to the empty
|
||||
/// string. If both do not exist, [`GetUserProfileDirectory`][msdn] is used to
|
||||
/// return the appropriate path.
|
||||
/// - Returns the value of the 'HOME' environment variable if it is set
|
||||
/// (including to an empty string).
|
||||
/// - Otherwise, returns the value of the 'USERPROFILE' environment variable if it is set
|
||||
/// (including to an empty string).
|
||||
/// - If both do not exist, [`GetUserProfileDirectory`][msdn] is used to return the path.
|
||||
///
|
||||
/// [msdn]: https://msdn.microsoft.com/en-us/library/windows/desktop/bb762280(v=vs.85).aspx
|
||||
///
|
||||
|
|
@ -533,10 +535,13 @@ impl Error for JoinPathsError {
|
|||
/// use std::env;
|
||||
///
|
||||
/// match env::home_dir() {
|
||||
/// Some(path) => println!("{}", path.display()),
|
||||
/// Some(path) => println!("Your home directory, probably: {}", path.display()),
|
||||
/// None => println!("Impossible to get your home dir!"),
|
||||
/// }
|
||||
/// ```
|
||||
#[rustc_deprecated(since = "1.29.0",
|
||||
reason = "This function's behavior is unexpected and probably not what you want. \
|
||||
Consider using the home_dir function from crates.io/crates/dirs instead.")]
|
||||
#[stable(feature = "env", since = "1.0.0")]
|
||||
pub fn home_dir() -> Option<PathBuf> {
|
||||
os_imp::home_dir()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue