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