Skip to content

Commit 440c551

Browse files
committed
---
yaml --- r: 5674 b: refs/heads/master c: 6f5a0c7 h: refs/heads/master v: v3
1 parent 7e2a196 commit 440c551

File tree

3 files changed

+156
-1
lines changed

3 files changed

+156
-1
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 51ae30287bf8512cde8747d7ae6788ec5ac41395
2+
refs/heads/master: 6f5a0c7500fe3a7b1dd7a18f85daa419807759f3

trunk/src/lib/fs.rs

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,84 @@ fn split(p: path) -> [path] {
8585
ret split2;
8686
}
8787

88+
fn normalize(p: path) -> path {
89+
let s = split(p);
90+
let s = strip_dots(s);
91+
let s = rollup_doubledots(s);
92+
93+
let s = if check vec::is_not_empty(s) {
94+
connect_many(s)
95+
} else {
96+
""
97+
};
98+
let s = reabsolute(p, s);
99+
let s = reterminate(p, s);
100+
101+
let s = if str::byte_len(s) == 0u {
102+
"."
103+
} else {
104+
s
105+
};
106+
107+
ret s;
108+
109+
fn strip_dots(s: [path]) -> [path] {
110+
vec::filter_map({ |elem|
111+
if elem == "." {
112+
option::none
113+
} else {
114+
option::some(elem)
115+
}
116+
}, s)
117+
}
118+
119+
fn rollup_doubledots(s: [path]) -> [path] {
120+
if vec::is_empty(s) {
121+
ret [];
122+
}
123+
124+
let t = [];
125+
let i = vec::len(s);
126+
let skip = 0;
127+
do {
128+
i -= 1u;
129+
if s[i] == ".." {
130+
skip += 1;
131+
} else {
132+
if skip == 0 {
133+
t += [s[i]];
134+
} else {
135+
skip -= 1;
136+
}
137+
}
138+
} while i != 0u;
139+
let t = vec::reversed(t);
140+
while skip > 0 {
141+
t += [".."];
142+
skip -= 1;
143+
}
144+
ret t;
145+
}
146+
147+
fn reabsolute(orig: path, new: path) -> path {
148+
if path_is_absolute(orig) {
149+
path_sep() + new
150+
} else {
151+
new
152+
}
153+
}
154+
155+
fn reterminate(orig: path, new: path) -> path {
156+
let last = orig[str::byte_len(orig) - 1u];
157+
if last == os_fs::path_sep as u8
158+
|| last == os_fs::path_sep as u8 {
159+
ret new + path_sep();
160+
} else {
161+
ret new;
162+
}
163+
}
164+
}
165+
88166
// Local Variables:
89167
// mode: rust;
90168
// fill-column: 78;

trunk/src/test/stdtest/fs.rs

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,80 @@ fn split4() {
6464
let expected = ["a", "b", "c"];
6565
assert actual == expected;
6666
}
67+
68+
#[test]
69+
fn normalize1() {
70+
let actual = fs::normalize("a/b/..");
71+
let expected = "a";
72+
assert actual == expected;
73+
}
74+
75+
#[test]
76+
fn normalize2() {
77+
let actual = fs::normalize("/a/b/..");
78+
let expected = "/a";
79+
assert actual == expected;
80+
}
81+
82+
#[test]
83+
fn normalize3() {
84+
let actual = fs::normalize("a/../b");
85+
let expected = "b";
86+
assert actual == expected;
87+
}
88+
89+
#[test]
90+
fn normalize4() {
91+
let actual = fs::normalize("/a/../b");
92+
let expected = "/b";
93+
assert actual == expected;
94+
}
95+
96+
#[test]
97+
fn normalize5() {
98+
let actual = fs::normalize("a/.");
99+
let expected = "a";
100+
assert actual == expected;
101+
}
102+
103+
#[test]
104+
fn normalize6() {
105+
let actual = fs::normalize("a/./b/");
106+
let expected = "a/b/";
107+
assert actual == expected;
108+
}
109+
110+
#[test]
111+
fn normalize7() {
112+
let actual = fs::normalize("a/..");
113+
let expected = ".";
114+
assert actual == expected;
115+
}
116+
117+
#[test]
118+
fn normalize8() {
119+
let actual = fs::normalize("../../..");
120+
let expected = "../../..";
121+
assert actual == expected;
122+
}
123+
124+
#[test]
125+
fn normalize9() {
126+
let actual = fs::normalize("a/b/../../..");
127+
let expected = "..";
128+
assert actual == expected;
129+
}
130+
131+
#[test]
132+
fn normalize10() {
133+
let actual = fs::normalize("/a/b/c/../d/./../../e/");
134+
let expected = "/a/e/";
135+
assert actual == expected;
136+
}
137+
138+
#[test]
139+
fn normalize11() {
140+
let actual = fs::normalize("/a/..");
141+
let expected = "/";
142+
assert actual == expected;
143+
}

0 commit comments

Comments
 (0)