Skip to content

Commit 74c825e

Browse files
committed
std: Add fs::homedir
Returns the home directory of the user as appropriate for the platform. Issue #1359
1 parent 2f4c931 commit 74c825e

File tree

2 files changed

+100
-0
lines changed

2 files changed

+100
-0
lines changed

src/libstd/fs.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,54 @@ fn normalize(p: path) -> path {
399399
}
400400
}
401401

402+
/*
403+
Function: homedir
404+
405+
Returns the path to the user's home directory, if known.
406+
407+
On Unix, returns the value of the "HOME" environment variable if it is set and
408+
not equal to the empty string.
409+
410+
On Windows, returns the value of the "HOME" environment variable if it is set
411+
and not equal to the empty string. Otherwise, returns the value of the
412+
"USERPROFILE" environment variable if it is set and not equal to the empty
413+
string.
414+
415+
Otherwise, homedir returns option::none.
416+
*/
417+
fn homedir() -> option<path> {
418+
ret alt generic_os::getenv("HOME") {
419+
some(p) {
420+
if !str::is_empty(p) {
421+
some(p)
422+
} else {
423+
secondary()
424+
}
425+
}
426+
none. {
427+
secondary()
428+
}
429+
};
430+
431+
#[cfg(target_os = "linux")]
432+
#[cfg(target_os = "macos")]
433+
#[cfg(target_os = "freebsd")]
434+
fn secondary() -> option<path> {
435+
none
436+
}
437+
438+
#[cfg(target_os = "win32")]
439+
fn secondary() -> option<path> {
440+
option::maybe(none, generic_os::getenv("USERPROFILE")) {|p|
441+
if !str::is_empty(p) {
442+
some(p)
443+
} else {
444+
none
445+
}
446+
}
447+
}
448+
}
449+
402450
// Local Variables:
403451
// mode: rust;
404452
// fill-column: 78;

src/test/stdtest/fs.rs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,3 +221,55 @@ fn splitext_nobasename() {
221221
assert base == "oh.my/";
222222
assert ext == "";
223223
}
224+
225+
#[test]
226+
#[cfg(target_os = "linux")]
227+
#[cfg(target_os = "macos")]
228+
#[cfg(target_os = "freebsd")]
229+
fn homedir() {
230+
import getenv = std::generic_os::getenv;
231+
import setenv = std::generic_os::setenv;
232+
233+
let oldhome = getenv("HOME");
234+
235+
setenv("HOME", "/home/MountainView");
236+
assert fs::homedir() == some("/home/MountainView");
237+
238+
setenv("HOME", "");
239+
assert fs::homedir() == none;
240+
241+
option::may(oldhome, {|s| setenv("HOME", s)});
242+
}
243+
244+
#[test]
245+
#[cfg(target_os = "win32")]
246+
fn homedir() {
247+
import getenv = std::generic_os::getenv;
248+
import setenv = std::generic_os::setenv;
249+
250+
let oldhome = getenv("HOME");
251+
let olduserprofile = getenv("USERPROFILE");
252+
253+
setenv("HOME", "");
254+
setenv("USERPROFILE", "");
255+
256+
assert fs::homedir() == none;
257+
258+
setenv("HOME", "/home/MountainView");
259+
assert fs::homedir() == some("/home/MountainView");
260+
261+
setenv("HOME", "");
262+
263+
setenv("USERPROFILE", "/home/MountainView");
264+
assert fs::homedir() == some("/home/MountainView");
265+
266+
setenv("USERPROFILE", "/home/MountainView");
267+
assert fs::homedir() == some("/home/MountainView");
268+
269+
setenv("HOME", "/home/MountainView");
270+
setenv("USERPROFILE", "/home/PaloAlto");
271+
assert fs::homedir() == some("/home/MountainView");
272+
273+
option::may(oldhome, {|s| setenv("HOME", s)});
274+
option::may(olduserprofile, {|s| setenv("USERPROFILE", s)});
275+
}

0 commit comments

Comments
 (0)