Raw
1 #!/bin/sh
2 #
3 # Copyright (c) 2009 Jens Lehmann, based on t7401 by Ping Yin
4 # Copyright (c) 2011 Alexey Shumkin (+ non-UTF-8 commit encoding tests)
5 #
6
7 test_description='Support for verbose submodule differences in git diff
8
9 This test tries to verify the sanity of the --submodule option of git diff.
10 '
11
12 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
13 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
14
15 . ./test-lib.sh
16
17 # Test non-UTF-8 encoding in case iconv is available.
18 if test_have_prereq ICONV
19 then
20 test_encoding="ISO8859-1"
21 # String "added" in German (translated with Google Translate), encoded in UTF-8,
22 # used in sample commit log messages in add_file() function below.
23 added=$(printf "hinzugef\303\274gt")
24 else
25 test_encoding="UTF-8"
26 added="added"
27 fi
28
29 add_file () {
30 (
31 cd "$1" &&
32 shift &&
33 for name
34 do
35 echo "$name" >"$name" &&
36 git add "$name" &&
37 test_tick &&
38 # "git commit -m" would break MinGW, as Windows refuse to pass
39 # $test_encoding encoded parameter to git.
40 message="Add $name ($added $name)" &&
41 if test_have_prereq ICONV
42 then
43 message=$(echo "$message" | iconv -f utf-8 -t $test_encoding)
44 fi &&
45 echo "$message" | git -c "i18n.commitEncoding=$test_encoding" commit -F -
46 done >/dev/null &&
47 git rev-parse --short --verify HEAD
48 )
49 }
50 commit_file () {
51 test_tick &&
52 git commit "$@" -m "Commit $*" >/dev/null
53 }
54
55 test_expect_success 'setup submodule' '
56 git init sm1 &&
57 add_file . foo &&
58 head1=$(add_file sm1 foo1 foo2) &&
59 fullhead1=$(cd sm1 && git rev-parse --verify HEAD)
60 '
61
62 test_expect_success 'added submodule' '
63 git add sm1 &&
64 git diff-index -p --submodule=log HEAD >actual &&
65 cat >expected <<-EOF &&
66 Submodule sm1 0000000...$head1 (new submodule)
67 EOF
68 test_cmp expected actual
69 '
70
71 test_expect_success 'added submodule, set diff.submodule' '
72 git config diff.submodule log &&
73 git add sm1 &&
74 git diff --cached >actual &&
75 cat >expected <<-EOF &&
76 Submodule sm1 0000000...$head1 (new submodule)
77 EOF
78 git config --unset diff.submodule &&
79 test_cmp expected actual
80 '
81
82 test_expect_success '--submodule=short overrides diff.submodule' '
83 test_config diff.submodule log &&
84 git add sm1 &&
85 git diff --submodule=short --cached >actual &&
86 cat >expected <<-EOF &&
87 diff --git a/sm1 b/sm1
88 new file mode 160000
89 index 0000000..$head1
90 --- /dev/null
91 +++ b/sm1
92 @@ -0,0 +1 @@
93 +Subproject commit $fullhead1
94 EOF
95 test_cmp expected actual
96 '
97
98 test_expect_success 'diff.submodule does not affect plumbing' '
99 test_config diff.submodule log &&
100 git diff-index -p HEAD >actual &&
101 cat >expected <<-EOF &&
102 diff --git a/sm1 b/sm1
103 new file mode 160000
104 index 0000000..$head1
105 --- /dev/null
106 +++ b/sm1
107 @@ -0,0 +1 @@
108 +Subproject commit $fullhead1
109 EOF
110 test_cmp expected actual
111 '
112
113 commit_file sm1 &&
114 head2=$(add_file sm1 foo3)
115
116 test_expect_success 'modified submodule(forward)' '
117 git diff-index -p --submodule=log HEAD >actual &&
118 cat >expected <<-EOF &&
119 Submodule sm1 $head1..$head2:
120 > Add foo3 ($added foo3)
121 EOF
122 test_cmp expected actual
123 '
124
125 test_expect_success 'modified submodule(forward)' '
126 git diff --submodule=log >actual &&
127 cat >expected <<-EOF &&
128 Submodule sm1 $head1..$head2:
129 > Add foo3 ($added foo3)
130 EOF
131 test_cmp expected actual
132 '
133
134 test_expect_success 'modified submodule(forward) --submodule' '
135 git diff --submodule >actual &&
136 cat >expected <<-EOF &&
137 Submodule sm1 $head1..$head2:
138 > Add foo3 ($added foo3)
139 EOF
140 test_cmp expected actual
141 '
142
143 fullhead2=$(cd sm1; git rev-parse --verify HEAD)
144 test_expect_success 'modified submodule(forward) --submodule=short' '
145 git diff --submodule=short >actual &&
146 cat >expected <<-EOF &&
147 diff --git a/sm1 b/sm1
148 index $head1..$head2 160000
149 --- a/sm1
150 +++ b/sm1
151 @@ -1 +1 @@
152 -Subproject commit $fullhead1
153 +Subproject commit $fullhead2
154 EOF
155 test_cmp expected actual
156 '
157
158 commit_file sm1 &&
159 head3=$(
160 cd sm1 &&
161 git reset --hard HEAD~2 >/dev/null &&
162 git rev-parse --short --verify HEAD
163 )
164
165 test_expect_success 'modified submodule(backward)' '
166 git diff-index -p --submodule=log HEAD >actual &&
167 cat >expected <<-EOF &&
168 Submodule sm1 $head2..$head3 (rewind):
169 < Add foo3 ($added foo3)
170 < Add foo2 ($added foo2)
171 EOF
172 test_cmp expected actual
173 '
174
175 head4=$(add_file sm1 foo4 foo5)
176 test_expect_success 'modified submodule(backward and forward)' '
177 git diff-index -p --submodule=log HEAD >actual &&
178 cat >expected <<-EOF &&
179 Submodule sm1 $head2...$head4:
180 > Add foo5 ($added foo5)
181 > Add foo4 ($added foo4)
182 < Add foo3 ($added foo3)
183 < Add foo2 ($added foo2)
184 EOF
185 test_cmp expected actual
186 '
187
188 commit_file sm1 &&
189 mv sm1 sm1-bak &&
190 echo sm1 >sm1 &&
191 head5=$(git hash-object sm1 | cut -c1-7) &&
192 git add sm1 &&
193 rm -f sm1 &&
194 mv sm1-bak sm1
195
196 test_expect_success 'typechanged submodule(submodule->blob), --cached' '
197 git diff --submodule=log --cached >actual &&
198 cat >expected <<-EOF &&
199 Submodule sm1 $head4...0000000 (submodule deleted)
200 diff --git a/sm1 b/sm1
201 new file mode 100644
202 index 0000000..$head5
203 --- /dev/null
204 +++ b/sm1
205 @@ -0,0 +1 @@
206 +sm1
207 EOF
208 test_cmp expected actual
209 '
210
211 test_expect_success 'typechanged submodule(submodule->blob)' '
212 git diff --submodule=log >actual &&
213 cat >expected <<-EOF &&
214 diff --git a/sm1 b/sm1
215 deleted file mode 100644
216 index $head5..0000000
217 --- a/sm1
218 +++ /dev/null
219 @@ -1 +0,0 @@
220 -sm1
221 Submodule sm1 0000000...$head4 (new submodule)
222 EOF
223 test_cmp expected actual
224 '
225
226 rm -rf sm1 &&
227 git checkout-index sm1
228 test_expect_success 'typechanged submodule(submodule->blob)' '
229 git diff-index -p --submodule=log HEAD >actual &&
230 cat >expected <<-EOF &&
231 Submodule sm1 $head4...0000000 (submodule deleted)
232 diff --git a/sm1 b/sm1
233 new file mode 100644
234 index 0000000..$head5
235 --- /dev/null
236 +++ b/sm1
237 @@ -0,0 +1 @@
238 +sm1
239 EOF
240 test_cmp expected actual
241 '
242
243 test_expect_success 'setup submodule anew' '
244 rm -f sm1 &&
245 git init sm1 &&
246 head6=$(add_file sm1 foo6 foo7) &&
247 fullhead6=$(cd sm1 && git rev-parse --verify HEAD)
248 '
249
250 test_expect_success 'nonexistent commit' '
251 git diff-index -p --submodule=log HEAD >actual &&
252 cat >expected <<-EOF &&
253 Submodule sm1 $head4...$head6 (commits not present)
254 EOF
255 test_cmp expected actual
256 '
257
258 commit_file
259 test_expect_success 'typechanged submodule(blob->submodule)' '
260 git diff-index -p --submodule=log HEAD >actual &&
261 cat >expected <<-EOF &&
262 diff --git a/sm1 b/sm1
263 deleted file mode 100644
264 index $head5..0000000
265 --- a/sm1
266 +++ /dev/null
267 @@ -1 +0,0 @@
268 -sm1
269 Submodule sm1 0000000...$head6 (new submodule)
270 EOF
271 test_cmp expected actual
272 '
273
274 commit_file sm1 &&
275 test_expect_success 'submodule is up to date' '
276 git diff-index -p --submodule=log HEAD >actual &&
277 test_must_be_empty actual
278 '
279
280 test_expect_success 'submodule contains untracked content' '
281 echo new > sm1/new-file &&
282 git diff-index -p --ignore-submodules=none --submodule=log HEAD >actual &&
283 cat >expected <<-EOF &&
284 Submodule sm1 contains untracked content
285 EOF
286 test_cmp expected actual
287 '
288
289 test_expect_success 'submodule contains untracked content (untracked ignored)' '
290 git diff-index -p --submodule=log HEAD >actual &&
291 test_must_be_empty actual
292 '
293
294 test_expect_success 'submodule contains untracked content (dirty ignored)' '
295 git diff-index -p --ignore-submodules=dirty --submodule=log HEAD >actual &&
296 test_must_be_empty actual
297 '
298
299 test_expect_success 'submodule contains untracked content (all ignored)' '
300 git diff-index -p --ignore-submodules=all --submodule=log HEAD >actual &&
301 test_must_be_empty actual
302 '
303
304 test_expect_success 'submodule contains untracked and modified content' '
305 echo new > sm1/foo6 &&
306 git diff-index -p --ignore-submodules=none --submodule=log HEAD >actual &&
307 cat >expected <<-EOF &&
308 Submodule sm1 contains untracked content
309 Submodule sm1 contains modified content
310 EOF
311 test_cmp expected actual
312 '
313
314 test_expect_success 'submodule contains untracked and modified content (untracked ignored)' '
315 echo new > sm1/foo6 &&
316 git diff-index -p --submodule=log HEAD >actual &&
317 cat >expected <<-EOF &&
318 Submodule sm1 contains modified content
319 EOF
320 test_cmp expected actual
321 '
322
323 test_expect_success 'submodule contains untracked and modified content (dirty ignored)' '
324 echo new > sm1/foo6 &&
325 git diff-index -p --ignore-submodules=dirty --submodule=log HEAD >actual &&
326 test_must_be_empty actual
327 '
328
329 test_expect_success 'submodule contains untracked and modified content (all ignored)' '
330 echo new > sm1/foo6 &&
331 git diff-index -p --ignore-submodules --submodule=log HEAD >actual &&
332 test_must_be_empty actual
333 '
334
335 test_expect_success 'submodule contains modified content' '
336 rm -f sm1/new-file &&
337 git diff-index -p --submodule=log HEAD >actual &&
338 cat >expected <<-EOF &&
339 Submodule sm1 contains modified content
340 EOF
341 test_cmp expected actual
342 '
343
344 (cd sm1; git commit -mchange foo6 >/dev/null) &&
345 head8=$(cd sm1; git rev-parse --short --verify HEAD) &&
346 test_expect_success 'submodule is modified' '
347 git diff-index -p --submodule=log HEAD >actual &&
348 cat >expected <<-EOF &&
349 Submodule sm1 $head6..$head8:
350 > change
351 EOF
352 test_cmp expected actual
353 '
354
355 test_expect_success 'modified submodule contains untracked content' '
356 echo new > sm1/new-file &&
357 git diff-index -p --ignore-submodules=none --submodule=log HEAD >actual &&
358 cat >expected <<-EOF &&
359 Submodule sm1 contains untracked content
360 Submodule sm1 $head6..$head8:
361 > change
362 EOF
363 test_cmp expected actual
364 '
365
366 test_expect_success 'modified submodule contains untracked content (untracked ignored)' '
367 git diff-index -p --submodule=log HEAD >actual &&
368 cat >expected <<-EOF &&
369 Submodule sm1 $head6..$head8:
370 > change
371 EOF
372 test_cmp expected actual
373 '
374
375 test_expect_success 'modified submodule contains untracked content (dirty ignored)' '
376 git diff-index -p --ignore-submodules=dirty --submodule=log HEAD >actual &&
377 cat >expected <<-EOF &&
378 Submodule sm1 $head6..$head8:
379 > change
380 EOF
381 test_cmp expected actual
382 '
383
384 test_expect_success 'modified submodule contains untracked content (all ignored)' '
385 git diff-index -p --ignore-submodules=all --submodule=log HEAD >actual &&
386 test_must_be_empty actual
387 '
388
389 test_expect_success 'modified submodule contains untracked and modified content' '
390 echo modification >> sm1/foo6 &&
391 git diff-index -p --ignore-submodules=none --submodule=log HEAD >actual &&
392 cat >expected <<-EOF &&
393 Submodule sm1 contains untracked content
394 Submodule sm1 contains modified content
395 Submodule sm1 $head6..$head8:
396 > change
397 EOF
398 test_cmp expected actual
399 '
400
401 test_expect_success 'modified submodule contains untracked and modified content (untracked ignored)' '
402 echo modification >> sm1/foo6 &&
403 git diff-index -p --submodule=log HEAD >actual &&
404 cat >expected <<-EOF &&
405 Submodule sm1 contains modified content
406 Submodule sm1 $head6..$head8:
407 > change
408 EOF
409 test_cmp expected actual
410 '
411
412 test_expect_success 'modified submodule contains untracked and modified content (dirty ignored)' '
413 echo modification >> sm1/foo6 &&
414 git diff-index -p --ignore-submodules=dirty --submodule=log HEAD >actual &&
415 cat >expected <<-EOF &&
416 Submodule sm1 $head6..$head8:
417 > change
418 EOF
419 test_cmp expected actual
420 '
421
422 test_expect_success 'modified submodule contains untracked and modified content (all ignored)' '
423 echo modification >> sm1/foo6 &&
424 git diff-index -p --ignore-submodules --submodule=log HEAD >actual &&
425 test_must_be_empty actual
426 '
427
428 test_expect_success 'modified submodule contains modified content' '
429 rm -f sm1/new-file &&
430 git diff-index -p --submodule=log HEAD >actual &&
431 cat >expected <<-EOF &&
432 Submodule sm1 contains modified content
433 Submodule sm1 $head6..$head8:
434 > change
435 EOF
436 test_cmp expected actual
437 '
438
439 rm -rf sm1
440 test_expect_success 'deleted submodule' '
441 git diff-index -p --submodule=log HEAD >actual &&
442 cat >expected <<-EOF &&
443 Submodule sm1 $head6...0000000 (submodule deleted)
444 EOF
445 test_cmp expected actual
446 '
447
448 test_expect_success 'create second submodule' '
449 test_create_repo sm2 &&
450 head7=$(add_file sm2 foo8 foo9) &&
451 git add sm2
452 '
453
454 test_expect_success 'multiple submodules' '
455 git diff-index -p --submodule=log HEAD >actual &&
456 cat >expected <<-EOF &&
457 Submodule sm1 $head6...0000000 (submodule deleted)
458 Submodule sm2 0000000...$head7 (new submodule)
459 EOF
460 test_cmp expected actual
461 '
462
463 test_expect_success 'path filter' '
464 git diff-index -p --submodule=log HEAD sm2 >actual &&
465 cat >expected <<-EOF &&
466 Submodule sm2 0000000...$head7 (new submodule)
467 EOF
468 test_cmp expected actual
469 '
470
471 commit_file sm2
472 test_expect_success 'given commit' '
473 git diff-index -p --submodule=log HEAD^ >actual &&
474 cat >expected <<-EOF &&
475 Submodule sm1 $head6...0000000 (submodule deleted)
476 Submodule sm2 0000000...$head7 (new submodule)
477 EOF
478 test_cmp expected actual
479 '
480
481 test_expect_success 'given commit --submodule' '
482 git diff-index -p --submodule HEAD^ >actual &&
483 cat >expected <<-EOF &&
484 Submodule sm1 $head6...0000000 (submodule deleted)
485 Submodule sm2 0000000...$head7 (new submodule)
486 EOF
487 test_cmp expected actual
488 '
489
490 fullhead7=$(cd sm2; git rev-parse --verify HEAD)
491
492 test_expect_success 'given commit --submodule=short' '
493 git diff-index -p --submodule=short HEAD^ >actual &&
494 cat >expected <<-EOF &&
495 diff --git a/sm1 b/sm1
496 deleted file mode 160000
497 index $head6..0000000
498 --- a/sm1
499 +++ /dev/null
500 @@ -1 +0,0 @@
501 -Subproject commit $fullhead6
502 diff --git a/sm2 b/sm2
503 new file mode 160000
504 index 0000000..$head7
505 --- /dev/null
506 +++ b/sm2
507 @@ -0,0 +1 @@
508 +Subproject commit $fullhead7
509 EOF
510 test_cmp expected actual
511 '
512
513 test_expect_success 'setup .git file for sm2' '
514 (cd sm2 &&
515 REAL="$(pwd)/../.real" &&
516 mv .git "$REAL" &&
517 echo "gitdir: $REAL" >.git)
518 '
519
520 test_expect_success 'diff --submodule with .git file' '
521 git diff --submodule HEAD^ >actual &&
522 cat >expected <<-EOF &&
523 Submodule sm1 $head6...0000000 (submodule deleted)
524 Submodule sm2 0000000...$head7 (new submodule)
525 EOF
526 test_cmp expected actual
527 '
528
529 test_expect_success 'diff --submodule with objects referenced by alternates' '
530 mkdir sub_alt &&
531 (cd sub_alt &&
532 git init &&
533 echo a >a &&
534 git add a &&
535 git commit -m a
536 ) &&
537 mkdir super &&
538 (cd super &&
539 git clone -s ../sub_alt sub &&
540 git init &&
541 git add sub &&
542 git commit -m "sub a"
543 ) &&
544 (cd sub_alt &&
545 sha1_before=$(git rev-parse --short HEAD) &&
546 echo b >b &&
547 git add b &&
548 git commit -m b &&
549 sha1_after=$(git rev-parse --short HEAD) &&
550 {
551 echo "Submodule sub $sha1_before..$sha1_after:" &&
552 echo " > b"
553 } >../expected
554 ) &&
555 (cd super &&
556 (cd sub &&
557 git fetch &&
558 git checkout origin/main
559 ) &&
560 git diff --submodule > ../actual
561 ) &&
562 test_cmp expected actual
563 '
564
565 test_done