Improved windows path handling support
This commit is contained in:
parent
c8d8f6cfec
commit
b07eab5faa
1 changed files with 100 additions and 18 deletions
|
@ -697,21 +697,44 @@ impl GenericPath for WindowsPath {
|
||||||
}
|
}
|
||||||
|
|
||||||
pure fn unsafe_join(other: &WindowsPath) -> WindowsPath {
|
pure fn unsafe_join(other: &WindowsPath) -> WindowsPath {
|
||||||
|
/* rhs not absolute is simple push */
|
||||||
if !other.is_absolute {
|
if !other.is_absolute {
|
||||||
self.push_rel(other)
|
return self.push_many(other.components);
|
||||||
} else {
|
}
|
||||||
WindowsPath {
|
|
||||||
host: match other.host {
|
/* if rhs has a host set, then the whole thing wins */
|
||||||
None => copy self.host,
|
match other.host {
|
||||||
Some(copy x) => Some(x)
|
Some(copy host) => {
|
||||||
},
|
return WindowsPath {
|
||||||
device: match other.device {
|
host: Some(host),
|
||||||
None => copy self.device,
|
device: copy other.device,
|
||||||
Some(copy x) => Some(x)
|
|
||||||
},
|
|
||||||
is_absolute: true,
|
is_absolute: true,
|
||||||
components: copy other.components
|
components: copy other.components
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if rhs has a device set, then a part wins */
|
||||||
|
match other.device {
|
||||||
|
Some(copy device) => {
|
||||||
|
return WindowsPath {
|
||||||
|
host: None,
|
||||||
|
device: Some(device),
|
||||||
|
is_absolute: true,
|
||||||
|
components: copy other.components
|
||||||
|
};
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* fallback: host and device of lhs win, but the
|
||||||
|
whole path of the right */
|
||||||
|
WindowsPath {
|
||||||
|
host: copy self.host,
|
||||||
|
device: copy self.device,
|
||||||
|
is_absolute: self.is_absolute || other.is_absolute,
|
||||||
|
components: copy other.components
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -755,7 +778,10 @@ impl GenericPath for WindowsPath {
|
||||||
pure fn normalize() -> WindowsPath {
|
pure fn normalize() -> WindowsPath {
|
||||||
return WindowsPath {
|
return WindowsPath {
|
||||||
host: copy self.host,
|
host: copy self.host,
|
||||||
device: copy self.device,
|
device: match self.device {
|
||||||
|
None => None,
|
||||||
|
Some(ref device) => Some(device.to_upper())
|
||||||
|
},
|
||||||
is_absolute: self.is_absolute,
|
is_absolute: self.is_absolute,
|
||||||
components: normalize(self.components)
|
components: normalize(self.components)
|
||||||
}
|
}
|
||||||
|
@ -794,13 +820,13 @@ pub mod windows {
|
||||||
|
|
||||||
pub pure fn extract_unc_prefix(s: &str) -> Option<(~str,~str)> {
|
pub pure fn extract_unc_prefix(s: &str) -> Option<(~str,~str)> {
|
||||||
if (s.len() > 1 &&
|
if (s.len() > 1 &&
|
||||||
s[0] == '\\' as u8 &&
|
(s[0] == '\\' as u8 || s[0] == '/' as u8) &&
|
||||||
s[1] == '\\' as u8) {
|
s[0] == s[1]) {
|
||||||
let mut i = 2;
|
let mut i = 2;
|
||||||
while i < s.len() {
|
while i < s.len() {
|
||||||
if s[i] == '\\' as u8 {
|
if is_sep(s[i]) {
|
||||||
let pre = s.slice(2, i);
|
let pre = s.slice(2, i);
|
||||||
let rest = s.slice(i, s.len());
|
let mut rest = s.slice(i, s.len());
|
||||||
return Some((pre, rest));
|
return Some((pre, rest));
|
||||||
}
|
}
|
||||||
i += 1;
|
i += 1;
|
||||||
|
@ -946,13 +972,21 @@ mod tests {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_extract_unc_prefixes() {
|
fn test_extract_unc_prefixes() {
|
||||||
assert windows::extract_unc_prefix("\\\\").is_none();
|
assert windows::extract_unc_prefix("\\\\").is_none();
|
||||||
|
assert windows::extract_unc_prefix("//").is_none();
|
||||||
assert windows::extract_unc_prefix("\\\\hi").is_none();
|
assert windows::extract_unc_prefix("\\\\hi").is_none();
|
||||||
|
assert windows::extract_unc_prefix("//hi").is_none();
|
||||||
assert windows::extract_unc_prefix("\\\\hi\\") ==
|
assert windows::extract_unc_prefix("\\\\hi\\") ==
|
||||||
Some((~"hi", ~"\\"));
|
Some((~"hi", ~"\\"));
|
||||||
|
assert windows::extract_unc_prefix("//hi\\") ==
|
||||||
|
Some((~"hi", ~"\\"));
|
||||||
assert windows::extract_unc_prefix("\\\\hi\\there") ==
|
assert windows::extract_unc_prefix("\\\\hi\\there") ==
|
||||||
Some((~"hi", ~"\\there"));
|
Some((~"hi", ~"\\there"));
|
||||||
|
assert windows::extract_unc_prefix("//hi/there") ==
|
||||||
|
Some((~"hi", ~"/there"));
|
||||||
assert windows::extract_unc_prefix("\\\\hi\\there\\friends.txt") ==
|
assert windows::extract_unc_prefix("\\\\hi\\there\\friends.txt") ==
|
||||||
Some((~"hi", ~"\\there\\friends.txt"));
|
Some((~"hi", ~"\\there\\friends.txt"));
|
||||||
|
assert windows::extract_unc_prefix("//hi\\there\\friends.txt") ==
|
||||||
|
Some((~"hi", ~"\\there\\friends.txt"));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -1011,5 +1045,53 @@ mod tests {
|
||||||
.push_many([~"lib", ~"thingy.dll"])
|
.push_many([~"lib", ~"thingy.dll"])
|
||||||
.with_filename("librustc.dll")),
|
.with_filename("librustc.dll")),
|
||||||
"c:\\program files (x86)\\rust\\lib\\librustc.dll");
|
"c:\\program files (x86)\\rust\\lib\\librustc.dll");
|
||||||
|
|
||||||
|
t(&(WindowsPath("\\\\computer\\share")
|
||||||
|
.unsafe_join(&WindowsPath("\\a"))),
|
||||||
|
"\\\\computer\\a");
|
||||||
|
|
||||||
|
t(&(WindowsPath("//computer/share")
|
||||||
|
.unsafe_join(&WindowsPath("\\a"))),
|
||||||
|
"\\\\computer\\a");
|
||||||
|
|
||||||
|
t(&(WindowsPath("//computer/share")
|
||||||
|
.unsafe_join(&WindowsPath("\\\\computer\\share"))),
|
||||||
|
"\\\\computer\\share");
|
||||||
|
|
||||||
|
t(&(WindowsPath("C:/whatever")
|
||||||
|
.unsafe_join(&WindowsPath("//computer/share/a/b"))),
|
||||||
|
"\\\\computer\\share\\a\\b");
|
||||||
|
|
||||||
|
t(&(WindowsPath("C:")
|
||||||
|
.unsafe_join(&WindowsPath("D:/foo"))),
|
||||||
|
"D:\\foo");
|
||||||
|
|
||||||
|
t(&(WindowsPath("C:")
|
||||||
|
.unsafe_join(&WindowsPath("B"))),
|
||||||
|
"C:B");
|
||||||
|
|
||||||
|
t(&(WindowsPath("C:")
|
||||||
|
.unsafe_join(&WindowsPath("/foo"))),
|
||||||
|
"C:\\foo");
|
||||||
|
|
||||||
|
t(&(WindowsPath("C:\\")
|
||||||
|
.unsafe_join(&WindowsPath("\\bar"))),
|
||||||
|
"C:\\bar");
|
||||||
|
|
||||||
|
t(&(WindowsPath("")
|
||||||
|
.unsafe_join(&WindowsPath(""))),
|
||||||
|
"");
|
||||||
|
|
||||||
|
t(&(WindowsPath("")
|
||||||
|
.unsafe_join(&WindowsPath("a"))),
|
||||||
|
"a");
|
||||||
|
|
||||||
|
t(&(WindowsPath("")
|
||||||
|
.unsafe_join(&WindowsPath("C:\\a"))),
|
||||||
|
"C:\\a");
|
||||||
|
|
||||||
|
t(&(WindowsPath("c:\\foo")
|
||||||
|
.normalize()),
|
||||||
|
"C:\\foo");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue