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 # Copyright (c) 2016 Jacob Keller (copy + convert to --submodule=diff)
8 test_description
='Support for diff format verbose submodule difference in git diff
10 This test tries to verify the sanity of --submodule=diff option of git diff.
15 # Tested non-UTF-8 encoding
16 test_encoding
="ISO8859-1"
18 # String "added" in German (translated with Google Translate), encoded in UTF-8,
19 # used in sample commit log messages in add_file() function below.
20 added
=$
(printf "hinzugef\303\274gt")
28 echo "$name" >"$name" &&
31 # "git commit -m" would break MinGW, as Windows refuse to pass
32 # $test_encoding encoded parameter to git.
33 echo "Add $name ($added $name)" |
iconv -f utf-8
-t $test_encoding |
34 git
-c "i18n.commitEncoding=$test_encoding" commit
-F -
36 git rev-parse
--short --verify HEAD
42 git commit
"$@" -m "Commit $*" >/dev
/null
45 test_expect_success
'setup repository' '
46 test_create_repo sm1 &&
48 head1=$(add_file sm1 foo1 foo2) &&
49 fullhead1=$(git -C sm1 rev-parse --verify HEAD)
52 test_expect_success
'added submodule' '
54 git diff-index -p --submodule=diff HEAD >actual &&
55 cat >expected <<-EOF &&
56 Submodule sm1 0000000...$head1 (new submodule)
57 diff --git a/sm1/foo1 b/sm1/foo1
59 index 0000000..1715acd
64 diff --git a/sm1/foo2 b/sm1/foo2
66 index 0000000..54b060e
72 test_cmp expected actual
75 test_expect_success
'added submodule, set diff.submodule' '
76 test_config diff.submodule log &&
78 git diff-index -p --submodule=diff HEAD >actual &&
79 cat >expected <<-EOF &&
80 Submodule sm1 0000000...$head1 (new submodule)
81 diff --git a/sm1/foo1 b/sm1/foo1
83 index 0000000..1715acd
88 diff --git a/sm1/foo2 b/sm1/foo2
90 index 0000000..54b060e
96 test_cmp expected actual
99 test_expect_success
'--submodule=short overrides diff.submodule' '
100 test_config diff.submodule log &&
102 git diff --submodule=short --cached >actual &&
103 cat >expected <<-EOF &&
104 diff --git a/sm1 b/sm1
106 index 0000000..$head1
110 +Subproject commit $fullhead1
112 test_cmp expected actual
115 test_expect_success
'diff.submodule does not affect plumbing' '
116 test_config diff.submodule log &&
117 git diff-index -p HEAD >actual &&
118 cat >expected <<-EOF &&
119 diff --git a/sm1 b/sm1
121 index 0000000..$head1
125 +Subproject commit $fullhead1
127 test_cmp expected actual
131 head2
=$
(add_file sm1 foo3
)
133 test_expect_success
'modified submodule(forward)' '
134 git diff-index -p --submodule=diff HEAD >actual &&
135 cat >expected <<-EOF &&
136 Submodule sm1 $head1..$head2:
137 diff --git a/sm1/foo3 b/sm1/foo3
139 index 0000000..c1ec6c6
145 test_cmp expected actual
148 test_expect_success
'modified submodule(forward)' '
149 git diff --submodule=diff >actual &&
150 cat >expected <<-EOF &&
151 Submodule sm1 $head1..$head2:
152 diff --git a/sm1/foo3 b/sm1/foo3
154 index 0000000..c1ec6c6
160 test_cmp expected actual
163 test_expect_success
'modified submodule(forward) --submodule' '
164 git diff --submodule >actual &&
165 cat >expected <<-EOF &&
166 Submodule sm1 $head1..$head2:
167 > Add foo3 ($added foo3)
169 test_cmp expected actual
172 fullhead2
=$
(cd sm1
; git rev-parse
--verify HEAD
)
173 test_expect_success
'modified submodule(forward) --submodule=short' '
174 git diff --submodule=short >actual &&
175 cat >expected <<-EOF &&
176 diff --git a/sm1 b/sm1
177 index $head1..$head2 160000
181 -Subproject commit $fullhead1
182 +Subproject commit $fullhead2
184 test_cmp expected actual
190 git
reset --hard HEAD~
2 >/dev
/null
&&
191 git rev-parse
--short --verify HEAD
194 test_expect_success
'modified submodule(backward)' '
195 git diff-index -p --submodule=diff HEAD >actual &&
196 cat >expected <<-EOF &&
197 Submodule sm1 $head2..$head3 (rewind):
198 diff --git a/sm1/foo2 b/sm1/foo2
199 deleted file mode 100644
200 index 54b060e..0000000
205 diff --git a/sm1/foo3 b/sm1/foo3
206 deleted file mode 100644
207 index c1ec6c6..0000000
213 test_cmp expected actual
216 head4
=$
(add_file sm1 foo4 foo5
)
217 test_expect_success
'modified submodule(backward and forward)' '
218 git diff-index -p --submodule=diff HEAD >actual &&
219 cat >expected <<-EOF &&
220 Submodule sm1 $head2...$head4:
221 diff --git a/sm1/foo2 b/sm1/foo2
222 deleted file mode 100644
223 index 54b060e..0000000
228 diff --git a/sm1/foo3 b/sm1/foo3
229 deleted file mode 100644
230 index c1ec6c6..0000000
235 diff --git a/sm1/foo4 b/sm1/foo4
237 index 0000000..a0016db
242 diff --git a/sm1/foo5 b/sm1/foo5
244 index 0000000..d6f2413
250 test_cmp expected actual
256 head5
=$
(git hash-object sm1 | cut
-c1-7) &&
261 test_expect_success
'typechanged submodule(submodule->blob), --cached' '
262 git diff --submodule=diff --cached >actual &&
263 cat >expected <<-EOF &&
264 Submodule sm1 $head4...0000000 (submodule deleted)
265 diff --git a/sm1/foo1 b/sm1/foo1
266 deleted file mode 100644
267 index 1715acd..0000000
272 diff --git a/sm1/foo4 b/sm1/foo4
273 deleted file mode 100644
274 index a0016db..0000000
279 diff --git a/sm1/foo5 b/sm1/foo5
280 deleted file mode 100644
281 index d6f2413..0000000
286 diff --git a/sm1 b/sm1
288 index 0000000..9da5fb8
294 test_cmp expected actual
297 test_expect_success
'typechanged submodule(submodule->blob)' '
298 git diff --submodule=diff >actual &&
299 cat >expected <<-EOF &&
300 diff --git a/sm1 b/sm1
301 deleted file mode 100644
302 index 9da5fb8..0000000
307 Submodule sm1 0000000...$head4 (new submodule)
308 diff --git a/sm1/foo1 b/sm1/foo1
310 index 0000000..1715acd
315 diff --git a/sm1/foo4 b/sm1/foo4
317 index 0000000..a0016db
322 diff --git a/sm1/foo5 b/sm1/foo5
324 index 0000000..d6f2413
330 test_cmp expected actual
334 git checkout-index sm1
335 test_expect_success
'typechanged submodule(submodule->blob)' '
336 git diff-index -p --submodule=diff HEAD >actual &&
337 cat >expected <<-EOF &&
338 Submodule sm1 $head4...0000000 (submodule deleted)
339 diff --git a/sm1 b/sm1
341 index 0000000..9da5fb8
347 test_cmp expected actual
351 test_create_repo sm1
&&
352 head6
=$
(add_file sm1 foo6 foo7
)
353 fullhead6
=$
(cd sm1
; git rev-parse
--verify HEAD
)
354 test_expect_success
'nonexistent commit' '
355 git diff-index -p --submodule=diff HEAD >actual &&
356 cat >expected <<-EOF &&
357 Submodule sm1 $head4...$head6 (commits not present)
359 test_cmp expected actual
363 test_expect_success
'typechanged submodule(blob->submodule)' '
364 git diff-index -p --submodule=diff HEAD >actual &&
365 cat >expected <<-EOF &&
366 diff --git a/sm1 b/sm1
367 deleted file mode 100644
368 index 9da5fb8..0000000
373 Submodule sm1 0000000...$head6 (new submodule)
374 diff --git a/sm1/foo6 b/sm1/foo6
376 index 0000000..462398b
381 diff --git a/sm1/foo7 b/sm1/foo7
383 index 0000000..6e9262c
389 test_cmp expected actual
393 test_expect_success
'submodule is up to date' '
394 git diff-index -p --submodule=diff HEAD >actual &&
395 cat >expected <<-EOF &&
397 test_cmp expected actual
400 test_expect_success
'submodule contains untracked content' '
401 echo new > sm1/new-file &&
402 git diff-index -p --submodule=diff HEAD >actual &&
403 cat >expected <<-EOF &&
404 Submodule sm1 contains untracked content
406 test_cmp expected actual
409 test_expect_success
'submodule contains untracked content (untracked ignored)' '
410 git diff-index -p --ignore-submodules=untracked --submodule=diff HEAD >actual &&
414 test_expect_success
'submodule contains untracked content (dirty ignored)' '
415 git diff-index -p --ignore-submodules=dirty --submodule=diff HEAD >actual &&
419 test_expect_success
'submodule contains untracked content (all ignored)' '
420 git diff-index -p --ignore-submodules=all --submodule=diff HEAD >actual &&
424 test_expect_success
'submodule contains untracked and modified content' '
425 echo new > sm1/foo6 &&
426 git diff-index -p --submodule=diff HEAD >actual &&
427 cat >expected <<-EOF &&
428 Submodule sm1 contains untracked content
429 Submodule sm1 contains modified content
430 diff --git a/sm1/foo6 b/sm1/foo6
431 index 462398b..3e75765 100644
438 test_cmp expected actual
442 test_expect_success
'submodule contains untracked and modified content (untracked ignored)' '
443 echo new > sm1/foo6 &&
444 git diff-index -p --ignore-submodules=untracked --submodule=diff HEAD >actual &&
445 cat >expected <<-EOF &&
446 Submodule sm1 contains modified content
447 diff --git a/sm1/foo6 b/sm1/foo6
448 index 462398b..3e75765 100644
455 test_cmp expected actual
458 test_expect_success
'submodule contains untracked and modified content (dirty ignored)' '
459 echo new > sm1/foo6 &&
460 git diff-index -p --ignore-submodules=dirty --submodule=diff HEAD >actual &&
464 test_expect_success
'submodule contains untracked and modified content (all ignored)' '
465 echo new > sm1/foo6 &&
466 git diff-index -p --ignore-submodules --submodule=diff HEAD >actual &&
470 test_expect_success
'submodule contains modified content' '
471 rm -f sm1/new-file &&
472 git diff-index -p --submodule=diff HEAD >actual &&
473 cat >expected <<-EOF &&
474 Submodule sm1 contains modified content
475 diff --git a/sm1/foo6 b/sm1/foo6
476 index 462398b..3e75765 100644
483 test_cmp expected actual
486 (cd sm1
; git commit
-mchange foo6
>/dev
/null
) &&
487 head8
=$
(cd sm1
; git rev-parse
--short --verify HEAD
) &&
488 test_expect_success
'submodule is modified' '
489 git diff-index -p --submodule=diff HEAD >actual &&
490 cat >expected <<-EOF &&
491 Submodule sm1 17243c9..$head8:
492 diff --git a/sm1/foo6 b/sm1/foo6
493 index 462398b..3e75765 100644
500 test_cmp expected actual
503 test_expect_success
'modified submodule contains untracked content' '
504 echo new > sm1/new-file &&
505 git diff-index -p --submodule=diff HEAD >actual &&
506 cat >expected <<-EOF &&
507 Submodule sm1 contains untracked content
508 Submodule sm1 17243c9..$head8:
509 diff --git a/sm1/foo6 b/sm1/foo6
510 index 462398b..3e75765 100644
517 test_cmp expected actual
520 test_expect_success
'modified submodule contains untracked content (untracked ignored)' '
521 git diff-index -p --ignore-submodules=untracked --submodule=diff HEAD >actual &&
522 cat >expected <<-EOF &&
523 Submodule sm1 17243c9..$head8:
524 diff --git a/sm1/foo6 b/sm1/foo6
525 index 462398b..3e75765 100644
532 test_cmp expected actual
535 test_expect_success
'modified submodule contains untracked content (dirty ignored)' '
536 git diff-index -p --ignore-submodules=dirty --submodule=diff HEAD >actual &&
537 cat >expected <<-EOF &&
538 Submodule sm1 17243c9..cfce562:
539 diff --git a/sm1/foo6 b/sm1/foo6
540 index 462398b..3e75765 100644
547 test_cmp expected actual
550 test_expect_success
'modified submodule contains untracked content (all ignored)' '
551 git diff-index -p --ignore-submodules=all --submodule=diff HEAD >actual &&
555 test_expect_success
'modified submodule contains untracked and modified content' '
556 echo modification >> sm1/foo6 &&
557 git diff-index -p --submodule=diff HEAD >actual &&
558 cat >expected <<-EOF &&
559 Submodule sm1 contains untracked content
560 Submodule sm1 contains modified content
561 Submodule sm1 17243c9..cfce562:
562 diff --git a/sm1/foo6 b/sm1/foo6
563 index 462398b..dfda541 100644
571 test_cmp expected actual
574 test_expect_success
'modified submodule contains untracked and modified content (untracked ignored)' '
575 echo modification >> sm1/foo6 &&
576 git diff-index -p --ignore-submodules=untracked --submodule=diff HEAD >actual &&
577 cat >expected <<-EOF &&
578 Submodule sm1 contains modified content
579 Submodule sm1 17243c9..cfce562:
580 diff --git a/sm1/foo6 b/sm1/foo6
581 index 462398b..e20e2d9 100644
590 test_cmp expected actual
593 test_expect_success
'modified submodule contains untracked and modified content (dirty ignored)' '
594 echo modification >> sm1/foo6 &&
595 git diff-index -p --ignore-submodules=dirty --submodule=diff HEAD >actual &&
596 cat >expected <<-EOF &&
597 Submodule sm1 17243c9..cfce562:
598 diff --git a/sm1/foo6 b/sm1/foo6
599 index 462398b..3e75765 100644
606 test_cmp expected actual
609 test_expect_success
'modified submodule contains untracked and modified content (all ignored)' '
610 echo modification >> sm1/foo6 &&
611 git diff-index -p --ignore-submodules --submodule=diff HEAD >actual &&
616 test_expect_success
'modified submodule contains modified content' '
617 rm -f sm1/new-file &&
618 git diff-index -p --submodule=diff HEAD >actual &&
619 cat >expected <<-EOF &&
620 Submodule sm1 contains modified content
621 Submodule sm1 17243c9..cfce562:
622 diff --git a/sm1/foo6 b/sm1/foo6
623 index 462398b..ac466ca 100644
634 test_cmp expected actual
638 test_expect_success
'deleted submodule' '
639 git diff-index -p --submodule=diff HEAD >actual &&
640 cat >expected <<-EOF &&
641 Submodule sm1 17243c9...0000000 (submodule deleted)
643 test_cmp expected actual
646 test_expect_success
'create second submodule' '
647 test_create_repo sm2 &&
648 head7=$(add_file sm2 foo8 foo9) &&
652 test_expect_success
'multiple submodules' '
653 git diff-index -p --submodule=diff HEAD >actual &&
654 cat >expected <<-EOF &&
655 Submodule sm1 17243c9...0000000 (submodule deleted)
656 Submodule sm2 0000000...a5a65c9 (new submodule)
657 diff --git a/sm2/foo8 b/sm2/foo8
659 index 0000000..db9916b
664 diff --git a/sm2/foo9 b/sm2/foo9
666 index 0000000..9c3b4f6
672 test_cmp expected actual
675 test_expect_success
'path filter' '
676 git diff-index -p --submodule=diff HEAD sm2 >actual &&
677 cat >expected <<-EOF &&
678 Submodule sm2 0000000...a5a65c9 (new submodule)
679 diff --git a/sm2/foo8 b/sm2/foo8
681 index 0000000..db9916b
686 diff --git a/sm2/foo9 b/sm2/foo9
688 index 0000000..9c3b4f6
694 test_cmp expected actual
698 test_expect_success
'given commit' '
699 git diff-index -p --submodule=diff HEAD^ >actual &&
700 cat >expected <<-EOF &&
701 Submodule sm1 17243c9...0000000 (submodule deleted)
702 Submodule sm2 0000000...a5a65c9 (new submodule)
703 diff --git a/sm2/foo8 b/sm2/foo8
705 index 0000000..db9916b
710 diff --git a/sm2/foo9 b/sm2/foo9
712 index 0000000..9c3b4f6
718 test_cmp expected actual
721 test_expect_success
'setup .git file for sm2' '
723 REAL="$(pwd)/../.real" &&
725 echo "gitdir: $REAL" >.git)
728 test_expect_success
'diff --submodule=diff with .git file' '
729 git diff --submodule=diff HEAD^ >actual &&
730 cat >expected <<-EOF &&
731 Submodule sm1 17243c9...0000000 (submodule deleted)
732 Submodule sm2 0000000...a5a65c9 (new submodule)
733 diff --git a/sm2/foo8 b/sm2/foo8
735 index 0000000..db9916b
740 diff --git a/sm2/foo9 b/sm2/foo9
742 index 0000000..9c3b4f6
748 test_cmp expected actual
751 test_expect_success
'setup nested submodule' '
752 git submodule add -f ./sm2 &&
753 git commit -a -m "add sm2" &&
754 git -C sm2 submodule add ../sm2 nested &&
755 git -C sm2 commit -a -m "nested sub"
758 test_expect_success
'move nested submodule HEAD' '
759 echo "nested content" >sm2/nested/file &&
760 git -C sm2/nested add file &&
761 git -C sm2/nested commit --allow-empty -m "new HEAD"
764 test_expect_success
'diff --submodule=diff with moved nested submodule HEAD' '
765 cat >expected <<-EOF &&
766 Submodule nested a5a65c9..b55928c:
767 diff --git a/nested/file b/nested/file
769 index 0000000..ca281f5
775 git -C sm2 diff --submodule=diff >actual 2>err &&
776 test_must_be_empty err &&
777 test_cmp expected actual
780 test_expect_success
'diff --submodule=diff recurses into nested submodules' '
781 cat >expected <<-EOF &&
782 Submodule sm2 contains modified content
783 Submodule sm2 a5a65c9..280969a:
784 diff --git a/sm2/.gitmodules b/sm2/.gitmodules
786 index 0000000..3a816b8
788 +++ b/sm2/.gitmodules
790 +[submodule "nested"]
793 Submodule nested 0000000...b55928c (new submodule)
794 diff --git a/sm2/nested/file b/sm2/nested/file
796 index 0000000..ca281f5
798 +++ b/sm2/nested/file
801 diff --git a/sm2/nested/foo8 b/sm2/nested/foo8
803 index 0000000..db9916b
805 +++ b/sm2/nested/foo8
808 diff --git a/sm2/nested/foo9 b/sm2/nested/foo9
810 index 0000000..9c3b4f6
812 +++ b/sm2/nested/foo9
816 git diff --submodule=diff >actual 2>err &&
817 test_must_be_empty err &&
818 test_cmp expected actual