diff --git a/src/lib/fs.rs b/src/lib/fs.rs index f9fcc67510e..ec389593f5b 100644 --- a/src/lib/fs.rs +++ b/src/lib/fs.rs @@ -144,6 +144,8 @@ fn normalize(p: path) -> path { ret t; } + #[cfg(target_os = "linux")] + #[cfg(target_os = "macos")] fn reabsolute(orig: path, new: path) -> path { if path_is_absolute(orig) { path_sep() + new @@ -152,6 +154,15 @@ fn normalize(p: path) -> path { } } + #[cfg(target_os = "win32")] + fn reabsolute(orig: path, new: path) -> path { + if path_is_absolute(orig) && orig[0] == os_fs::path_sep as u8 { + str::from_char(os_fs::path_sep) + new + } else { + new + } + } + fn reterminate(orig: path, new: path) -> path { let last = orig[str::byte_len(orig) - 1u]; if last == os_fs::path_sep as u8 diff --git a/src/lib/win32_fs.rs b/src/lib/win32_fs.rs index 06701249150..dcd8a905d2e 100644 --- a/src/lib/win32_fs.rs +++ b/src/lib/win32_fs.rs @@ -12,7 +12,9 @@ fn list_dir(path: str) -> [str] { fn path_is_absolute(p: str) -> bool { ret str::char_at(p, 0u) == '/' || - str::char_at(p, 1u) == ':' && str::char_at(p, 2u) == '\\'; + str::char_at(p, 1u) == ':' + && (str::char_at(p, 2u) == path_sep + || str::char_at(p, 2u) == alt_path_sep); } /* FIXME: win32 path handling actually accepts '/' or '\' and has subtly diff --git a/src/test/stdtest/fs.rs b/src/test/stdtest/fs.rs index 2a348cc7ccb..14467ea59a6 100644 --- a/src/test/stdtest/fs.rs +++ b/src/test/stdtest/fs.rs @@ -132,6 +132,7 @@ fn normalize9() { fn normalize10() { let actual = fs::normalize("/a/b/c/../d/./../../e/"); let expected = "/a/e/"; + log_err actual; assert actual == expected; } @@ -140,4 +141,19 @@ fn normalize11() { let actual = fs::normalize("/a/.."); let expected = "/"; assert actual == expected; +} + +#[test] +#[cfg(target_os = "win32")] +fn normalize12() { + let actual = fs::normalize("C:/whatever"); + let expected = "C:/whatever"; + log_err actual; + assert actual == expected; +} + +#[test] +#[cfg(target_os = "win32")] +fn path_is_absolute_win32() { + assert fs::path_is_absolute("C:/whatever"); } \ No newline at end of file