]>
Commit | Line | Data |
---|---|---|
ae299be0 DR |
1 | #!/bin/sh |
2 | # | |
3 | # Copyright (c) 2008 David Reiss | |
4 | # | |
5 | ||
6 | test_description='Test various path utilities' | |
7 | ||
8 | . ./test-lib.sh | |
9 | ||
2718e852 | 10 | norm_path() { |
7ffd18fc | 11 | expected=$(test-path-utils print_path "$2") |
2718e852 | 12 | test_expect_success $3 "normalize path: $1 => $2" \ |
abd4284b | 13 | "test \"\$(test-path-utils normalize_path_copy '$1')\" = '$expected'" |
ae299be0 DR |
14 | } |
15 | ||
203439b2 | 16 | relative_path() { |
7ffd18fc | 17 | expected=$(test-path-utils print_path "$3") |
203439b2 | 18 | test_expect_success $4 "relative path: $1 $2 => $3" \ |
abd4284b | 19 | "test \"\$(test-path-utils relative_path '$1' '$2')\" = '$expected'" |
203439b2 JX |
20 | } |
21 | ||
557bd833 NTND |
22 | test_git_path() { |
23 | test_expect_success "git-path $1 $2 => $3" " | |
24 | $1 git rev-parse --git-path $2 >actual && | |
25 | echo $3 >expect && | |
26 | test_cmp expect actual | |
27 | " | |
28 | } | |
29 | ||
2718e852 JS |
30 | # On Windows, we are using MSYS's bash, which mangles the paths. |
31 | # Absolute paths are anchored at the MSYS installation directory, | |
32 | # which means that the path / accounts for this many characters: | |
33 | rootoff=$(test-path-utils normalize_path_copy / | wc -c) | |
34 | # Account for the trailing LF: | |
28baf82e | 35 | if test $rootoff = 2; then |
2718e852 JS |
36 | rootoff= # we are on Unix |
37 | else | |
38 | rootoff=$(($rootoff-1)) | |
39 | fi | |
40 | ||
0454dd93 | 41 | ancestor() { |
2718e852 JS |
42 | # We do some math with the expected ancestor length. |
43 | expected=$3 | |
44 | if test -n "$rootoff" && test "x$expected" != x-1; then | |
45 | expected=$(($expected+$rootoff)) | |
46 | fi | |
47 | test_expect_success "longest ancestor: $1 $2 => $expected" \ | |
48 | "actual=\$(test-path-utils longest_ancestor_length '$1' '$2') && | |
49 | test \"\$actual\" = '$expected'" | |
0454dd93 DR |
50 | } |
51 | ||
abd4284b JX |
52 | # Some absolute path tests should be skipped on Windows due to path mangling |
53 | # on POSIX-style absolute paths | |
2718e852 JS |
54 | case $(uname -s) in |
55 | *MINGW*) | |
56 | ;; | |
57 | *) | |
58 | test_set_prereq POSIX | |
59 | ;; | |
60 | esac | |
61 | ||
62 | norm_path "" "" | |
63 | norm_path . "" | |
64 | norm_path ./ "" | |
65 | norm_path ./. "" | |
66 | norm_path ./.. ++failed++ | |
67 | norm_path ../. ++failed++ | |
68 | norm_path ./../.// ++failed++ | |
69 | norm_path dir/.. "" | |
70 | norm_path dir/sub/../.. "" | |
71 | norm_path dir/sub/../../.. ++failed++ | |
72 | norm_path dir dir | |
73 | norm_path dir// dir/ | |
74 | norm_path ./dir dir | |
75 | norm_path dir/. dir/ | |
76 | norm_path dir///./ dir/ | |
77 | norm_path dir//sub/.. dir/ | |
78 | norm_path dir/sub/../ dir/ | |
79 | norm_path dir/sub/../. dir/ | |
80 | norm_path dir/s1/../s2/ dir/s2/ | |
81 | norm_path d1/s1///s2/..//../s3/ d1/s3/ | |
82 | norm_path d1/s1//../s2/../../d2 d2 | |
83 | norm_path d1/.../d2 d1/.../d2 | |
84 | norm_path d1/..././../d2 d1/d2 | |
85 | ||
abd4284b | 86 | norm_path / / |
2718e852 JS |
87 | norm_path // / POSIX |
88 | norm_path /// / POSIX | |
abd4284b | 89 | norm_path /. / |
2718e852 JS |
90 | norm_path /./ / POSIX |
91 | norm_path /./.. ++failed++ POSIX | |
abd4284b | 92 | norm_path /../. ++failed++ |
2718e852 JS |
93 | norm_path /./../.// ++failed++ POSIX |
94 | norm_path /dir/.. / POSIX | |
95 | norm_path /dir/sub/../.. / POSIX | |
96 | norm_path /dir/sub/../../.. ++failed++ POSIX | |
abd4284b JX |
97 | norm_path /dir /dir |
98 | norm_path /dir// /dir/ | |
99 | norm_path /./dir /dir | |
100 | norm_path /dir/. /dir/ | |
101 | norm_path /dir///./ /dir/ | |
102 | norm_path /dir//sub/.. /dir/ | |
103 | norm_path /dir/sub/../ /dir/ | |
2718e852 | 104 | norm_path //dir/sub/../. /dir/ POSIX |
abd4284b JX |
105 | norm_path /dir/s1/../s2/ /dir/s2/ |
106 | norm_path /d1/s1///s2/..//../s3/ /d1/s3/ | |
107 | norm_path /d1/s1//../s2/../../d2 /d2 | |
108 | norm_path /d1/.../d2 /d1/.../d2 | |
109 | norm_path /d1/..././../d2 /d1/d2 | |
ae299be0 | 110 | |
0454dd93 | 111 | ancestor / / -1 |
0454dd93 DR |
112 | ancestor /foo / 0 |
113 | ancestor /foo /fo -1 | |
114 | ancestor /foo /foo -1 | |
0454dd93 | 115 | ancestor /foo /bar -1 |
0454dd93 | 116 | ancestor /foo /foo/bar -1 |
9e2326c7 MH |
117 | ancestor /foo /foo:/bar -1 |
118 | ancestor /foo /:/foo:/bar 0 | |
119 | ancestor /foo /foo:/:/bar 0 | |
120 | ancestor /foo /:/bar:/foo 0 | |
0454dd93 DR |
121 | ancestor /foo/bar / 0 |
122 | ancestor /foo/bar /fo -1 | |
0454dd93 | 123 | ancestor /foo/bar /foo 4 |
0454dd93 DR |
124 | ancestor /foo/bar /foo/ba -1 |
125 | ancestor /foo/bar /:/fo 0 | |
126 | ancestor /foo/bar /foo:/foo/ba 4 | |
127 | ancestor /foo/bar /bar -1 | |
9e2326c7 MH |
128 | ancestor /foo/bar /fo -1 |
129 | ancestor /foo/bar /foo:/bar 4 | |
130 | ancestor /foo/bar /:/foo:/bar 4 | |
131 | ancestor /foo/bar /foo:/:/bar 4 | |
132 | ancestor /foo/bar /:/bar:/fo 0 | |
133 | ancestor /foo/bar /:/bar 0 | |
134 | ancestor /foo/bar /foo 4 | |
135 | ancestor /foo/bar /foo:/bar 4 | |
136 | ancestor /foo/bar /bar -1 | |
0454dd93 | 137 | |
4fcc86b0 JS |
138 | test_expect_success 'strip_path_suffix' ' |
139 | test c:/msysgit = $(test-path-utils strip_path_suffix \ | |
140 | c:/msysgit/libexec//git-core libexec/git-core) | |
141 | ' | |
8da650b4 | 142 | |
a0601dc1 | 143 | test_expect_success 'absolute path rejects the empty string' ' |
17264bcc MH |
144 | test_must_fail test-path-utils absolute_path "" |
145 | ' | |
146 | ||
3efe5d1d | 147 | test_expect_success 'real path rejects the empty string' ' |
a5c45218 MH |
148 | test_must_fail test-path-utils real_path "" |
149 | ' | |
150 | ||
bacca785 | 151 | test_expect_success POSIX 'real path works on absolute paths 1' ' |
7bcf48da MH |
152 | nopath="hopefully-absent-path" && |
153 | test "/" = "$(test-path-utils real_path "/")" && | |
bacca785 JS |
154 | test "/$nopath" = "$(test-path-utils real_path "/$nopath")" |
155 | ' | |
156 | ||
157 | test_expect_success 'real path works on absolute paths 2' ' | |
158 | nopath="hopefully-absent-path" && | |
7bcf48da MH |
159 | # Find an existing top-level directory for the remaining tests: |
160 | d=$(pwd -P | sed -e "s|^\([^/]*/[^/]*\)/.*|\1|") && | |
161 | test "$d" = "$(test-path-utils real_path "$d")" && | |
162 | test "$d/$nopath" = "$(test-path-utils real_path "$d/$nopath")" | |
163 | ' | |
164 | ||
379a03ad MH |
165 | test_expect_success POSIX 'real path removes extra leading slashes' ' |
166 | nopath="hopefully-absent-path" && | |
167 | test "/" = "$(test-path-utils real_path "///")" && | |
168 | test "/$nopath" = "$(test-path-utils real_path "///$nopath")" && | |
169 | # Find an existing top-level directory for the remaining tests: | |
170 | d=$(pwd -P | sed -e "s|^\([^/]*/[^/]*\)/.*|\1|") && | |
171 | test "$d" = "$(test-path-utils real_path "//$d")" && | |
172 | test "$d/$nopath" = "$(test-path-utils real_path "//$d/$nopath")" | |
173 | ' | |
174 | ||
175 | test_expect_success 'real path removes other extra slashes' ' | |
176 | nopath="hopefully-absent-path" && | |
177 | # Find an existing top-level directory for the remaining tests: | |
178 | d=$(pwd -P | sed -e "s|^\([^/]*/[^/]*\)/.*|\1|") && | |
179 | test "$d" = "$(test-path-utils real_path "$d///")" && | |
180 | test "$d/$nopath" = "$(test-path-utils real_path "$d///$nopath")" | |
181 | ' | |
182 | ||
7bcf48da | 183 | test_expect_success SYMLINKS 'real path works on symlinks' ' |
8da650b4 MH |
184 | mkdir first && |
185 | ln -s ../.git first/.git && | |
186 | mkdir second && | |
187 | ln -s ../first second/other && | |
188 | mkdir third && | |
189 | dir="$(cd .git; pwd -P)" && | |
190 | dir2=third/../second/other/.git && | |
191 | test "$dir" = "$(test-path-utils real_path $dir2)" && | |
192 | file="$dir"/index && | |
193 | test "$file" = "$(test-path-utils real_path $dir2/index)" && | |
194 | basename=blub && | |
195 | test "$dir/$basename" = "$(cd .git && test-path-utils real_path "$basename")" && | |
196 | ln -s ../first/file .git/syml && | |
197 | sym="$(cd first; pwd -P)"/file && | |
198 | test "$sym" = "$(test-path-utils real_path "$dir2/syml")" | |
199 | ' | |
200 | ||
655ee9ea | 201 | test_expect_success SYMLINKS 'prefix_path works with absolute paths to work tree symlinks' ' |
74af95d6 MEW |
202 | ln -s target symlink && |
203 | test "$(test-path-utils prefix_path prefix "$(pwd)/symlink")" = "symlink" | |
204 | ' | |
205 | ||
e5aa1fc4 MEW |
206 | test_expect_success 'prefix_path works with only absolute path to work tree' ' |
207 | echo "" >expected && | |
208 | test-path-utils prefix_path prefix "$(pwd)" >actual && | |
209 | test_cmp expected actual | |
210 | ' | |
211 | ||
e131daa4 MEW |
212 | test_expect_success 'prefix_path rejects absolute path to dir with same beginning as work tree' ' |
213 | test_must_fail test-path-utils prefix_path prefix "$(pwd)a" | |
214 | ' | |
215 | ||
216 | test_expect_success SYMLINKS 'prefix_path works with absolute path to a symlink to work tree having same beginning as work tree' ' | |
217 | git init repo && | |
218 | ln -s repo repolink && | |
219 | test "a" = "$(cd repo && test-path-utils prefix_path prefix "$(pwd)/../repolink/a")" | |
220 | ' | |
221 | ||
daf19a80 JX |
222 | relative_path /foo/a/b/c/ /foo/a/b/ c/ |
223 | relative_path /foo/a/b/c/ /foo/a/b c/ | |
224 | relative_path /foo/a//b//c/ ///foo/a/b// c/ POSIX | |
225 | relative_path /foo/a/b /foo/a/b ./ | |
226 | relative_path /foo/a/b/ /foo/a/b ./ | |
227 | relative_path /foo/a /foo/a/b ../ | |
228 | relative_path / /foo/a/b/ ../../../ | |
229 | relative_path /foo/a/c /foo/a/b/ ../c | |
230 | relative_path /foo/a/c /foo/a/b ../c | |
231 | relative_path /foo/x/y /foo/a/b/ ../../x/y | |
232 | relative_path /foo/a/b "<empty>" /foo/a/b | |
233 | relative_path /foo/a/b "<null>" /foo/a/b | |
234 | relative_path foo/a/b/c/ foo/a/b/ c/ | |
235 | relative_path foo/a/b/c/ foo/a/b c/ | |
236 | relative_path foo/a/b//c foo/a//b c | |
237 | relative_path foo/a/b/ foo/a/b/ ./ | |
238 | relative_path foo/a/b/ foo/a/b ./ | |
239 | relative_path foo/a foo/a/b ../ | |
240 | relative_path foo/x/y foo/a/b ../../x/y | |
241 | relative_path foo/a/c foo/a/b ../c | |
7fbd4221 JX |
242 | relative_path foo/a/b /foo/x/y foo/a/b |
243 | relative_path /foo/a/b foo/x/y /foo/a/b | |
244 | relative_path d:/a/b D:/a/c ../b MINGW | |
245 | relative_path C:/a/b D:/a/c C:/a/b MINGW | |
daf19a80 JX |
246 | relative_path foo/a/b "<empty>" foo/a/b |
247 | relative_path foo/a/b "<null>" foo/a/b | |
248 | relative_path "<empty>" /foo/a/b ./ | |
249 | relative_path "<empty>" "<empty>" ./ | |
250 | relative_path "<empty>" "<null>" ./ | |
251 | relative_path "<null>" "<empty>" ./ | |
252 | relative_path "<null>" "<null>" ./ | |
253 | relative_path "<null>" /foo/a/b ./ | |
203439b2 | 254 | |
557bd833 NTND |
255 | test_git_path A=B info/grafts .git/info/grafts |
256 | test_git_path GIT_GRAFT_FILE=foo info/grafts foo | |
257 | test_git_path GIT_GRAFT_FILE=foo info/////grafts foo | |
258 | test_git_path GIT_INDEX_FILE=foo index foo | |
259 | test_git_path GIT_INDEX_FILE=foo index/foo .git/index/foo | |
260 | test_git_path GIT_INDEX_FILE=foo index2 .git/index2 | |
261 | test_expect_success 'setup fake objects directory foo' 'mkdir foo' | |
262 | test_git_path GIT_OBJECT_DIRECTORY=foo objects foo | |
263 | test_git_path GIT_OBJECT_DIRECTORY=foo objects/foo foo/foo | |
264 | test_git_path GIT_OBJECT_DIRECTORY=foo objects2 .git/objects2 | |
c7b3a3d2 NTND |
265 | test_expect_success 'setup common repository' 'git --git-dir=bar init' |
266 | test_git_path GIT_COMMON_DIR=bar index .git/index | |
267 | test_git_path GIT_COMMON_DIR=bar HEAD .git/HEAD | |
268 | test_git_path GIT_COMMON_DIR=bar logs/HEAD .git/logs/HEAD | |
269 | test_git_path GIT_COMMON_DIR=bar objects bar/objects | |
270 | test_git_path GIT_COMMON_DIR=bar objects/bar bar/objects/bar | |
271 | test_git_path GIT_COMMON_DIR=bar info/exclude bar/info/exclude | |
272 | test_git_path GIT_COMMON_DIR=bar info/grafts bar/info/grafts | |
6cfbdcb2 | 273 | test_git_path GIT_COMMON_DIR=bar info/sparse-checkout .git/info/sparse-checkout |
4e09cf2a | 274 | test_git_path GIT_COMMON_DIR=bar info//sparse-checkout .git/info//sparse-checkout |
c7b3a3d2 NTND |
275 | test_git_path GIT_COMMON_DIR=bar remotes/bar bar/remotes/bar |
276 | test_git_path GIT_COMMON_DIR=bar branches/bar bar/branches/bar | |
277 | test_git_path GIT_COMMON_DIR=bar logs/refs/heads/master bar/logs/refs/heads/master | |
278 | test_git_path GIT_COMMON_DIR=bar refs/heads/master bar/refs/heads/master | |
279 | test_git_path GIT_COMMON_DIR=bar hooks/me bar/hooks/me | |
280 | test_git_path GIT_COMMON_DIR=bar config bar/config | |
281 | test_git_path GIT_COMMON_DIR=bar packed-refs bar/packed-refs | |
282 | test_git_path GIT_COMMON_DIR=bar shallow bar/shallow | |
557bd833 | 283 | |
ae299be0 | 284 | test_done |