path normalization fixed for relative paths
This commit is contained in:
parent
f2885b7e00
commit
d4f62371f8
|
@ -38,8 +38,20 @@ pub trait Path: AsRef<[u8]> {
|
|||
Segment::NoOp | Segment::CurrentDir => {}
|
||||
Segment::Root | Segment::File(_) => segments.push_back(segment),
|
||||
Segment::ParentDir => {
|
||||
if segments.back() != Some(&Segment::Root) {
|
||||
segments.pop_back();
|
||||
match segments.back() {
|
||||
// parent of root is still root, so do nothing
|
||||
Some(&Segment::Root) => {}
|
||||
// relative path has to contain parentdir going up past
|
||||
// the current dir if segments already contain a
|
||||
// parentdir we know we must be in a relative path above
|
||||
// the current dir
|
||||
None | Some(&Segment::ParentDir) => {
|
||||
segments.push_back(segment);
|
||||
}
|
||||
// some path exists, pop up to parent
|
||||
_ => {
|
||||
segments.pop_back();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -168,6 +180,31 @@ mod tests {
|
|||
assert_eq!(iter.next(), Some(&b"some.file"[..]));
|
||||
assert_eq!(iter.next(), None);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_normalizing() {
|
||||
// normalizes to "/path"
|
||||
let path = b"///../../some/../path".normalize();
|
||||
let mut iter = path.into_iter();
|
||||
assert_eq!(iter.next(), Some(Segment::Root));
|
||||
assert_eq!(iter.next(), Some(Segment::File(&b"path"[..])));
|
||||
assert_eq!(iter.next(), None);
|
||||
|
||||
// normalizes to "../../path"
|
||||
let path = b"../../some/../path".normalize();
|
||||
let mut iter = path.into_iter();
|
||||
assert_eq!(iter.next(), Some(Segment::ParentDir));
|
||||
assert_eq!(iter.next(), Some(Segment::ParentDir));
|
||||
assert_eq!(iter.next(), Some(Segment::File(&b"path"[..])));
|
||||
assert_eq!(iter.next(), None);
|
||||
|
||||
// normalizes to "../.."
|
||||
let path = b".././../some/../path/..".normalize();
|
||||
let mut iter = path.into_iter();
|
||||
assert_eq!(iter.next(), Some(Segment::ParentDir));
|
||||
assert_eq!(iter.next(), Some(Segment::ParentDir));
|
||||
assert_eq!(iter.next(), None);
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
|
|
Loading…
Reference in a new issue