From 82ef8519c3ce9c2bf1176a6319cccbb3a5376bd2 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Wed, 5 Oct 2011 12:01:10 -0700 Subject: [PATCH] Fix some path handling in std::fs on win32 --- src/lib/fs.rs | 11 +++++++++++ src/lib/win32_fs.rs | 4 +++- src/test/stdtest/fs.rs | 16 ++++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/lib/fs.rs b/src/lib/fs.rs index f9fcc67510e1..ec389593f5be 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 067012491503..dcd8a905d2ef 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 2a348cc7ccb2..14467ea59a65 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