]>
Commit | Line | Data |
---|---|---|
5c97558c JH |
1 | #!/bin/sh |
2 | # | |
3 | # Copyright (c) 2005 Junio C Hamano | |
4 | # | |
5 | ||
6 | test_description='Test rename detection in diff engine. | |
7 | ||
8 | ' | |
9 | . ./test-lib.sh | |
bfdbee98 | 10 | . "$TEST_DIRECTORY"/diff-lib.sh |
5c97558c | 11 | |
f07fc9e7 MM |
12 | test_expect_success 'setup' ' |
13 | cat >path0 <<-\EOF && | |
14 | Line 1 | |
15 | Line 2 | |
16 | Line 3 | |
17 | Line 4 | |
18 | Line 5 | |
19 | Line 6 | |
20 | Line 7 | |
21 | Line 8 | |
22 | Line 9 | |
23 | Line 10 | |
24 | line 11 | |
25 | Line 12 | |
26 | Line 13 | |
27 | Line 14 | |
28 | Line 15 | |
29 | EOF | |
a9276a69 | 30 | cat >expected <<-\EOF && |
f07fc9e7 MM |
31 | diff --git a/path0 b/path1 |
32 | rename from path0 | |
33 | rename to path1 | |
34 | --- a/path0 | |
35 | +++ b/path1 | |
36 | @@ -8,7 +8,7 @@ Line 7 | |
37 | Line 8 | |
38 | Line 9 | |
39 | Line 10 | |
40 | -line 11 | |
41 | +Line 11 | |
42 | Line 12 | |
43 | Line 13 | |
44 | Line 14 | |
45 | EOF | |
a9276a69 MM |
46 | cat >no-rename <<-\EOF |
47 | diff --git a/path0 b/path0 | |
48 | deleted file mode 100644 | |
49 | index fdbec44..0000000 | |
50 | --- a/path0 | |
51 | +++ /dev/null | |
52 | @@ -1,15 +0,0 @@ | |
53 | -Line 1 | |
54 | -Line 2 | |
55 | -Line 3 | |
56 | -Line 4 | |
57 | -Line 5 | |
58 | -Line 6 | |
59 | -Line 7 | |
60 | -Line 8 | |
61 | -Line 9 | |
62 | -Line 10 | |
63 | -line 11 | |
64 | -Line 12 | |
65 | -Line 13 | |
66 | -Line 14 | |
67 | -Line 15 | |
68 | diff --git a/path1 b/path1 | |
69 | new file mode 100644 | |
70 | index 0000000..752c50e | |
71 | --- /dev/null | |
72 | +++ b/path1 | |
73 | @@ -0,0 +1,15 @@ | |
74 | +Line 1 | |
75 | +Line 2 | |
76 | +Line 3 | |
77 | +Line 4 | |
78 | +Line 5 | |
79 | +Line 6 | |
80 | +Line 7 | |
81 | +Line 8 | |
82 | +Line 9 | |
83 | +Line 10 | |
84 | +Line 11 | |
85 | +Line 12 | |
86 | +Line 13 | |
87 | +Line 14 | |
88 | +Line 15 | |
89 | EOF | |
5c97558c JH |
90 | ' |
91 | ||
92 | test_expect_success \ | |
10455d2a | 93 | 'update-index --add a file.' \ |
5be60078 | 94 | 'git update-index --add path0' |
5c97558c JH |
95 | |
96 | test_expect_success \ | |
97 | 'write that tree.' \ | |
5be60078 | 98 | 'tree=$(git write-tree) && echo $tree' |
5c97558c JH |
99 | |
100 | sed -e 's/line/Line/' <path0 >path1 | |
101 | rm -f path0 | |
102 | test_expect_success \ | |
103 | 'renamed and edited the file.' \ | |
5be60078 | 104 | 'git update-index --add --remove path0 path1' |
5c97558c JH |
105 | |
106 | test_expect_success \ | |
5be60078 JH |
107 | 'git diff-index -p -M after rename and editing.' \ |
108 | 'git diff-index -p -M $tree >current' | |
f07fc9e7 | 109 | |
57fe64a4 JH |
110 | |
111 | test_expect_success \ | |
112 | 'validate the output.' \ | |
ec1fcc16 | 113 | 'compare_diff_patch current expected' |
57fe64a4 | 114 | |
a9276a69 MM |
115 | test_expect_success 'test diff.renames=true' ' |
116 | git -c diff.renames=true diff --cached $tree >current && | |
117 | compare_diff_patch current expected | |
118 | ' | |
119 | ||
120 | test_expect_success 'test diff.renames=false' ' | |
121 | git -c diff.renames=false diff --cached $tree >current && | |
122 | compare_diff_patch current no-rename | |
123 | ' | |
124 | ||
125 | test_expect_success 'test diff.renames unset' ' | |
126 | git diff --cached $tree >current && | |
5404c116 | 127 | compare_diff_patch current expected |
a9276a69 MM |
128 | ' |
129 | ||
68b2a005 | 130 | test_expect_success 'favour same basenames over different ones' ' |
0ce39643 JS |
131 | cp path1 another-path && |
132 | git add another-path && | |
133 | git commit -m 1 && | |
134 | git rm path1 && | |
135 | mkdir subdir && | |
136 | git mv another-path subdir/path1 && | |
3b85ec34 SG |
137 | git status >out && |
138 | test_i18ngrep "renamed: .*path1 -> subdir/path1" out | |
139 | ' | |
0ce39643 | 140 | |
dc6b1d92 EM |
141 | test_expect_success 'test diff.renames=true for git status' ' |
142 | git -c diff.renames=true status >out && | |
143 | test_i18ngrep "renamed: .*path1 -> subdir/path1" out | |
144 | ' | |
145 | ||
146 | test_expect_success 'test diff.renames=false for git status' ' | |
147 | git -c diff.renames=false status >out && | |
148 | test_i18ngrep ! "renamed: .*path1 -> subdir/path1" out && | |
149 | test_i18ngrep "new file: .*subdir/path1" out && | |
150 | test_i18ngrep "deleted: .*[^/]path1" out | |
151 | ' | |
152 | ||
68b2a005 | 153 | test_expect_success 'favour same basenames even with minor differences' ' |
0ce39643 | 154 | git show HEAD:path1 | sed "s/15/16/" > subdir/path1 && |
3b85ec34 SG |
155 | git status >out && |
156 | test_i18ngrep "renamed: .*path1 -> subdir/path1" out | |
157 | ' | |
0ce39643 | 158 | |
ca4e3ca0 SG |
159 | test_expect_success 'two files with same basename and same content' ' |
160 | git reset --hard && | |
161 | mkdir -p dir/A dir/B && | |
162 | cp path1 dir/A/file && | |
163 | cp path1 dir/B/file && | |
164 | git add dir && | |
165 | git commit -m 2 && | |
166 | git mv dir other-dir && | |
3b85ec34 SG |
167 | git status >out && |
168 | test_i18ngrep "renamed: .*dir/A/file -> other-dir/A/file" out | |
ca4e3ca0 SG |
169 | ' |
170 | ||
f31027c9 JH |
171 | test_expect_success 'setup for many rename source candidates' ' |
172 | git reset --hard && | |
173 | for i in 0 1 2 3 4 5 6 7 8 9; | |
174 | do | |
175 | for j in 0 1 2 3 4 5 6 7 8 9; | |
176 | do | |
177 | echo "$i$j" >"path$i$j" | |
178 | done | |
179 | done && | |
180 | git add "path??" && | |
181 | test_tick && | |
182 | git commit -m "hundred" && | |
f957f03b | 183 | (cat path1 && echo new) >new-path && |
f31027c9 JH |
184 | echo old >>path1 && |
185 | git add new-path path1 && | |
186 | git diff -l 4 -C -C --cached --name-status >actual 2>actual.err && | |
187 | sed -e "s/^\([CM]\)[0-9]* /\1 /" actual >actual.munged && | |
188 | cat >expect <<-EOF && | |
189 | C path1 new-path | |
190 | M path1 | |
191 | EOF | |
192 | test_cmp expect actual.munged && | |
193 | grep warning actual.err | |
194 | ' | |
195 | ||
b174eb42 AP |
196 | test_expect_success 'rename pretty print with nothing in common' ' |
197 | mkdir -p a/b/ && | |
198 | : >a/b/c && | |
199 | git add a/b/c && | |
200 | git commit -m "create a/b/c" && | |
201 | mkdir -p c/b/ && | |
202 | git mv a/b/c c/b/a && | |
203 | git commit -m "a/b/c -> c/b/a" && | |
204 | git diff -M --summary HEAD^ HEAD >output && | |
205 | test_i18ngrep " a/b/c => c/b/a " output && | |
206 | git diff -M --stat HEAD^ HEAD >output && | |
207 | test_i18ngrep " a/b/c => c/b/a " output | |
208 | ' | |
209 | ||
210 | test_expect_success 'rename pretty print with common prefix' ' | |
211 | mkdir -p c/d && | |
212 | git mv c/b/a c/d/e && | |
213 | git commit -m "c/b/a -> c/d/e" && | |
214 | git diff -M --summary HEAD^ HEAD >output && | |
215 | test_i18ngrep " c/{b/a => d/e} " output && | |
216 | git diff -M --stat HEAD^ HEAD >output && | |
217 | test_i18ngrep " c/{b/a => d/e} " output | |
218 | ' | |
219 | ||
220 | test_expect_success 'rename pretty print with common suffix' ' | |
221 | mkdir d && | |
222 | git mv c/d/e d/e && | |
223 | git commit -m "c/d/e -> d/e" && | |
224 | git diff -M --summary HEAD^ HEAD >output && | |
225 | test_i18ngrep " {c/d => d}/e " output && | |
226 | git diff -M --stat HEAD^ HEAD >output && | |
227 | test_i18ngrep " {c/d => d}/e " output | |
228 | ' | |
229 | ||
230 | test_expect_success 'rename pretty print with common prefix and suffix' ' | |
231 | mkdir d/f && | |
232 | git mv d/e d/f/e && | |
233 | git commit -m "d/e -> d/f/e" && | |
234 | git diff -M --summary HEAD^ HEAD >output && | |
235 | test_i18ngrep " d/{ => f}/e " output && | |
236 | git diff -M --stat HEAD^ HEAD >output && | |
237 | test_i18ngrep " d/{ => f}/e " output | |
238 | ' | |
239 | ||
240 | test_expect_success 'rename pretty print common prefix and suffix overlap' ' | |
241 | mkdir d/f/f && | |
242 | git mv d/f/e d/f/f/e && | |
243 | git commit -m "d/f/e d/f/f/e" && | |
244 | git diff -M --summary HEAD^ HEAD >output && | |
245 | test_i18ngrep " d/f/{ => f}/e " output && | |
246 | git diff -M --stat HEAD^ HEAD >output && | |
247 | test_i18ngrep " d/f/{ => f}/e " output | |
248 | ' | |
249 | ||
89973554 JT |
250 | test_expect_success 'diff-tree -l0 defaults to a big rename limit, not zero' ' |
251 | test_write_lines line1 line2 line3 >myfile && | |
252 | git add myfile && | |
253 | git commit -m x && | |
254 | ||
255 | test_write_lines line1 line2 line4 >myotherfile && | |
256 | git rm myfile && | |
257 | git add myotherfile && | |
258 | git commit -m x && | |
259 | ||
260 | git diff-tree -M -l0 HEAD HEAD^ >actual && | |
261 | # Verify that a rename from myotherfile to myfile was detected | |
262 | grep "myotherfile.*myfile" actual | |
263 | ' | |
264 | ||
57fe64a4 | 265 | test_done |