From 74c825e3858632d1ad7b26a5bf9a0d2bef7f0335 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Fri, 6 Jan 2012 11:55:43 -0800 Subject: [PATCH] std: Add fs::homedir Returns the home directory of the user as appropriate for the platform. Issue #1359 --- src/libstd/fs.rs | 48 ++++++++++++++++++++++++++++++++++++++ src/test/stdtest/fs.rs | 52 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+) diff --git a/src/libstd/fs.rs b/src/libstd/fs.rs index 33030565143..cf7173f0957 100644 --- a/src/libstd/fs.rs +++ b/src/libstd/fs.rs @@ -399,6 +399,54 @@ fn reterminate(orig: path, new: path) -> path { } } +/* +Function: homedir + +Returns the path to the user's home directory, if known. + +On Unix, returns the value of the "HOME" environment variable if it is set and +not equal to the empty string. + +On 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. + +Otherwise, homedir returns option::none. +*/ +fn homedir() -> option { + ret alt generic_os::getenv("HOME") { + some(p) { + if !str::is_empty(p) { + some(p) + } else { + secondary() + } + } + none. { + secondary() + } + }; + + #[cfg(target_os = "linux")] + #[cfg(target_os = "macos")] + #[cfg(target_os = "freebsd")] + fn secondary() -> option { + none + } + + #[cfg(target_os = "win32")] + fn secondary() -> option { + option::maybe(none, generic_os::getenv("USERPROFILE")) {|p| + if !str::is_empty(p) { + some(p) + } else { + none + } + } + } +} + // Local Variables: // mode: rust; // fill-column: 78; diff --git a/src/test/stdtest/fs.rs b/src/test/stdtest/fs.rs index a0ab02a898f..f0aacf7fe73 100644 --- a/src/test/stdtest/fs.rs +++ b/src/test/stdtest/fs.rs @@ -221,3 +221,55 @@ fn splitext_nobasename() { assert base == "oh.my/"; assert ext == ""; } + +#[test] +#[cfg(target_os = "linux")] +#[cfg(target_os = "macos")] +#[cfg(target_os = "freebsd")] +fn homedir() { + import getenv = std::generic_os::getenv; + import setenv = std::generic_os::setenv; + + let oldhome = getenv("HOME"); + + setenv("HOME", "/home/MountainView"); + assert fs::homedir() == some("/home/MountainView"); + + setenv("HOME", ""); + assert fs::homedir() == none; + + option::may(oldhome, {|s| setenv("HOME", s)}); +} + +#[test] +#[cfg(target_os = "win32")] +fn homedir() { + import getenv = std::generic_os::getenv; + import setenv = std::generic_os::setenv; + + let oldhome = getenv("HOME"); + let olduserprofile = getenv("USERPROFILE"); + + setenv("HOME", ""); + setenv("USERPROFILE", ""); + + assert fs::homedir() == none; + + setenv("HOME", "/home/MountainView"); + assert fs::homedir() == some("/home/MountainView"); + + setenv("HOME", ""); + + setenv("USERPROFILE", "/home/MountainView"); + assert fs::homedir() == some("/home/MountainView"); + + setenv("USERPROFILE", "/home/MountainView"); + assert fs::homedir() == some("/home/MountainView"); + + setenv("HOME", "/home/MountainView"); + setenv("USERPROFILE", "/home/PaloAlto"); + assert fs::homedir() == some("/home/MountainView"); + + option::may(oldhome, {|s| setenv("HOME", s)}); + option::may(olduserprofile, {|s| setenv("USERPROFILE", s)}); +} -- 2.44.0