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.
13 TEST_PASSES_SANITIZE_LEAK
=true
16 # Tested non-UTF-8 encoding
17 test_encoding
="ISO8859-1"
19 # String "added" in German (translated with Google Translate), encoded in UTF-8,
20 # used in sample commit log messages in add_file() function below.
21 added
=$
(printf "hinzugef\303\274gt")
29 echo "$name" >"$name" &&
32 # "git commit -m" would break MinGW, as Windows refuse to pass
33 # $test_encoding encoded parameter to git.
34 echo "Add $name ($added $name)" |
iconv -f utf-8
-t $test_encoding |
35 git
-c "i18n.commitEncoding=$test_encoding" commit
-F -
37 git rev-parse
--short --verify HEAD
43 git commit
"$@" -m "Commit $*" >/dev
/null
49 sed -e 's/^index 0000000\.\.[0-9a-f]*/index 0000000..1234567/' \
50 -e 's/^index [0-9a-f]*\.\.[0-9a-f]*/index 1234567..89abcde/' \
51 "$i" >"$i.compare" ||
return 1
53 test_cmp
"$1.compare" "$2.compare" &&
54 rm -f "$1.compare" "$2.compare"
57 test_expect_success
'setup repository' '
58 test_create_repo sm1 &&
60 head1=$(add_file sm1 foo1 foo2) &&
61 fullhead1=$(git -C sm1 rev-parse --verify HEAD)
64 test_expect_success
'added submodule' '
66 git diff-index -p --submodule=diff HEAD >actual &&
67 cat >expected <<-EOF &&
68 Submodule sm1 0000000...$head1 (new submodule)
69 diff --git a/sm1/foo1 b/sm1/foo1
71 index 0000000..1715acd
76 diff --git a/sm1/foo2 b/sm1/foo2
78 index 0000000..54b060e
84 diff_cmp expected actual
87 test_expect_success
'added submodule, set diff.submodule' '
88 test_config diff.submodule log &&
90 git diff-index -p --submodule=diff HEAD >actual &&
91 cat >expected <<-EOF &&
92 Submodule sm1 0000000...$head1 (new submodule)
93 diff --git a/sm1/foo1 b/sm1/foo1
95 index 0000000..1715acd
100 diff --git a/sm1/foo2 b/sm1/foo2
102 index 0000000..54b060e
108 diff_cmp expected actual
111 test_expect_success
'--submodule=short overrides diff.submodule' '
112 test_config diff.submodule log &&
114 git diff --submodule=short --cached >actual &&
115 cat >expected <<-EOF &&
116 diff --git a/sm1 b/sm1
118 index 0000000..$head1
122 +Subproject commit $fullhead1
124 diff_cmp expected actual
127 test_expect_success
'diff.submodule does not affect plumbing' '
128 test_config diff.submodule log &&
129 git diff-index -p HEAD >actual &&
130 cat >expected <<-EOF &&
131 diff --git a/sm1 b/sm1
133 index 0000000..$head1
137 +Subproject commit $fullhead1
139 diff_cmp expected actual
143 head2
=$
(add_file sm1 foo3
)
145 test_expect_success
'modified submodule(forward)' '
146 git diff-index -p --submodule=diff HEAD >actual &&
147 cat >expected <<-EOF &&
148 Submodule sm1 $head1..$head2:
149 diff --git a/sm1/foo3 b/sm1/foo3
151 index 0000000..c1ec6c6
157 diff_cmp expected actual
160 test_expect_success
'modified submodule(forward)' '
161 git diff --submodule=diff >actual &&
162 cat >expected <<-EOF &&
163 Submodule sm1 $head1..$head2:
164 diff --git a/sm1/foo3 b/sm1/foo3
166 index 0000000..c1ec6c6
172 diff_cmp expected actual
175 test_expect_success
'modified submodule(forward) --submodule' '
176 git diff --submodule >actual &&
177 cat >expected <<-EOF &&
178 Submodule sm1 $head1..$head2:
179 > Add foo3 ($added foo3)
181 diff_cmp expected actual
184 fullhead2
=$
(cd sm1
; git rev-parse
--verify HEAD
)
185 test_expect_success
'modified submodule(forward) --submodule=short' '
186 git diff --submodule=short >actual &&
187 cat >expected <<-EOF &&
188 diff --git a/sm1 b/sm1
189 index $head1..$head2 160000
193 -Subproject commit $fullhead1
194 +Subproject commit $fullhead2
196 diff_cmp expected actual
202 git
reset --hard HEAD~
2 >/dev
/null
&&
203 git rev-parse
--short --verify HEAD
206 test_expect_success
'modified submodule(backward)' '
207 git diff-index -p --submodule=diff HEAD >actual &&
208 cat >expected <<-EOF &&
209 Submodule sm1 $head2..$head3 (rewind):
210 diff --git a/sm1/foo2 b/sm1/foo2
211 deleted file mode 100644
212 index 54b060e..0000000
217 diff --git a/sm1/foo3 b/sm1/foo3
218 deleted file mode 100644
219 index c1ec6c6..0000000
225 diff_cmp expected actual
228 head4
=$
(add_file sm1 foo4 foo5
)
229 test_expect_success
'modified submodule(backward and forward)' '
230 git diff-index -p --submodule=diff HEAD >actual &&
231 cat >expected <<-EOF &&
232 Submodule sm1 $head2...$head4:
233 diff --git a/sm1/foo2 b/sm1/foo2
234 deleted file mode 100644
235 index 54b060e..0000000
240 diff --git a/sm1/foo3 b/sm1/foo3
241 deleted file mode 100644
242 index c1ec6c6..0000000
247 diff --git a/sm1/foo4 b/sm1/foo4
249 index 0000000..a0016db
254 diff --git a/sm1/foo5 b/sm1/foo5
256 index 0000000..d6f2413
262 diff_cmp expected actual
268 head5
=$
(git hash-object sm1 | cut
-c1-7) &&
273 test_expect_success
'typechanged submodule(submodule->blob), --cached' '
274 git diff --submodule=diff --cached >actual &&
275 cat >expected <<-EOF &&
276 Submodule sm1 $head4...0000000 (submodule deleted)
277 diff --git a/sm1/foo1 b/sm1/foo1
278 deleted file mode 100644
279 index 1715acd..0000000
284 diff --git a/sm1/foo4 b/sm1/foo4
285 deleted file mode 100644
286 index a0016db..0000000
291 diff --git a/sm1/foo5 b/sm1/foo5
292 deleted file mode 100644
293 index d6f2413..0000000
298 diff --git a/sm1 b/sm1
300 index 0000000..9da5fb8
306 diff_cmp expected actual
309 test_expect_success
'typechanged submodule(submodule->blob)' '
310 git diff --submodule=diff >actual &&
311 cat >expected <<-EOF &&
312 diff --git a/sm1 b/sm1
313 deleted file mode 100644
314 index 9da5fb8..0000000
319 Submodule sm1 0000000...$head4 (new submodule)
320 diff --git a/sm1/foo1 b/sm1/foo1
322 index 0000000..1715acd
327 diff --git a/sm1/foo4 b/sm1/foo4
329 index 0000000..a0016db
334 diff --git a/sm1/foo5 b/sm1/foo5
336 index 0000000..d6f2413
342 diff_cmp expected actual
346 git checkout-index sm1
347 test_expect_success
'typechanged submodule(submodule->blob)' '
348 git diff-index -p --submodule=diff HEAD >actual &&
349 cat >expected <<-EOF &&
350 Submodule sm1 $head4...0000000 (submodule deleted)
351 diff --git a/sm1 b/sm1
353 index 0000000..9da5fb8
359 diff_cmp expected actual
363 test_create_repo sm1
&&
364 head6
=$
(add_file sm1 foo6 foo7
)
365 test_expect_success
'nonexistent commit' '
366 git diff-index -p --submodule=diff HEAD >actual &&
367 cat >expected <<-EOF &&
368 Submodule sm1 $head4...$head6 (commits not present)
370 diff_cmp expected actual
374 test_expect_success
'typechanged submodule(blob->submodule)' '
375 git diff-index -p --submodule=diff HEAD >actual &&
376 cat >expected <<-EOF &&
377 diff --git a/sm1 b/sm1
378 deleted file mode 100644
379 index 9da5fb8..0000000
384 Submodule sm1 0000000...$head6 (new submodule)
385 diff --git a/sm1/foo6 b/sm1/foo6
387 index 0000000..462398b
392 diff --git a/sm1/foo7 b/sm1/foo7
394 index 0000000..6e9262c
400 diff_cmp expected actual
404 test_expect_success
'submodule is up to date' '
405 head7=$(git -C sm1 rev-parse --short --verify HEAD) &&
406 git diff-index -p --submodule=diff HEAD >actual &&
407 test_must_be_empty actual
410 test_expect_success
'submodule contains untracked content' '
411 echo new > sm1/new-file &&
412 git diff-index -p --ignore-submodules=none --submodule=diff HEAD >actual &&
413 cat >expected <<-EOF &&
414 Submodule sm1 contains untracked content
416 diff_cmp expected actual
419 test_expect_success
'submodule contains untracked content (untracked ignored)' '
420 git diff-index -p --submodule=diff HEAD >actual &&
421 test_must_be_empty actual
424 test_expect_success
'submodule contains untracked content (dirty ignored)' '
425 git diff-index -p --ignore-submodules=dirty --submodule=diff HEAD >actual &&
426 test_must_be_empty actual
429 test_expect_success
'submodule contains untracked content (all ignored)' '
430 git diff-index -p --ignore-submodules=all --submodule=diff HEAD >actual &&
431 test_must_be_empty actual
434 test_expect_success
'submodule contains untracked and modified content' '
435 echo new > sm1/foo6 &&
436 git diff-index -p --ignore-submodules=none --submodule=diff HEAD >actual &&
437 cat >expected <<-EOF &&
438 Submodule sm1 contains untracked content
439 Submodule sm1 contains modified content
440 diff --git a/sm1/foo6 b/sm1/foo6
441 index 462398b..3e75765 100644
448 diff_cmp expected actual
452 test_expect_success
'submodule contains untracked and modified content (untracked ignored)' '
453 echo new > sm1/foo6 &&
454 git diff-index -p --submodule=diff HEAD >actual &&
455 cat >expected <<-EOF &&
456 Submodule sm1 contains modified content
457 diff --git a/sm1/foo6 b/sm1/foo6
458 index 462398b..3e75765 100644
465 diff_cmp expected actual
468 test_expect_success
'submodule contains untracked and modified content (dirty ignored)' '
469 echo new > sm1/foo6 &&
470 git diff-index -p --ignore-submodules=dirty --submodule=diff HEAD >actual &&
471 test_must_be_empty actual
474 test_expect_success
'submodule contains untracked and modified content (all ignored)' '
475 echo new > sm1/foo6 &&
476 git diff-index -p --ignore-submodules --submodule=diff HEAD >actual &&
477 test_must_be_empty actual
480 test_expect_success
'submodule contains modified content' '
481 rm -f sm1/new-file &&
482 git diff-index -p --submodule=diff HEAD >actual &&
483 cat >expected <<-EOF &&
484 Submodule sm1 contains modified content
485 diff --git a/sm1/foo6 b/sm1/foo6
486 index 462398b..3e75765 100644
493 diff_cmp expected actual
496 (cd sm1
; git commit
-mchange foo6
>/dev
/null
) &&
497 head8
=$
(cd sm1
; git rev-parse
--short --verify HEAD
) &&
498 test_expect_success
'submodule is modified' '
499 git diff-index -p --submodule=diff HEAD >actual &&
500 cat >expected <<-EOF &&
501 Submodule sm1 $head7..$head8:
502 diff --git a/sm1/foo6 b/sm1/foo6
503 index 462398b..3e75765 100644
510 diff_cmp expected actual
513 test_expect_success
'modified submodule contains untracked content' '
514 echo new > sm1/new-file &&
515 git diff-index -p --ignore-submodules=none --submodule=diff HEAD >actual &&
516 cat >expected <<-EOF &&
517 Submodule sm1 contains untracked content
518 Submodule sm1 $head7..$head8:
519 diff --git a/sm1/foo6 b/sm1/foo6
520 index 462398b..3e75765 100644
527 diff_cmp expected actual
530 test_expect_success
'modified submodule contains untracked content (untracked ignored)' '
531 git diff-index -p --submodule=diff HEAD >actual &&
532 cat >expected <<-EOF &&
533 Submodule sm1 $head7..$head8:
534 diff --git a/sm1/foo6 b/sm1/foo6
535 index 462398b..3e75765 100644
542 diff_cmp expected actual
545 test_expect_success
'modified submodule contains untracked content (dirty ignored)' '
546 git diff-index -p --ignore-submodules=dirty --submodule=diff HEAD >actual &&
547 cat >expected <<-EOF &&
548 Submodule sm1 $head7..$head8:
549 diff --git a/sm1/foo6 b/sm1/foo6
550 index 462398b..3e75765 100644
557 diff_cmp expected actual
560 test_expect_success
'modified submodule contains untracked content (all ignored)' '
561 git diff-index -p --ignore-submodules=all --submodule=diff HEAD >actual &&
562 test_must_be_empty actual
565 test_expect_success
'modified submodule contains untracked and modified content' '
566 echo modification >> sm1/foo6 &&
567 git diff-index -p --ignore-submodules=none --submodule=diff HEAD >actual &&
568 cat >expected <<-EOF &&
569 Submodule sm1 contains untracked content
570 Submodule sm1 contains modified content
571 Submodule sm1 $head7..$head8:
572 diff --git a/sm1/foo6 b/sm1/foo6
573 index 462398b..dfda541 100644
581 diff_cmp expected actual
584 test_expect_success
'modified submodule contains untracked and modified content (untracked ignored)' '
585 echo modification >> sm1/foo6 &&
586 git diff-index -p --submodule=diff HEAD >actual &&
587 cat >expected <<-EOF &&
588 Submodule sm1 contains modified content
589 Submodule sm1 $head7..$head8:
590 diff --git a/sm1/foo6 b/sm1/foo6
591 index 462398b..e20e2d9 100644
600 diff_cmp expected actual
603 test_expect_success
'modified submodule contains untracked and modified content (dirty ignored)' '
604 echo modification >> sm1/foo6 &&
605 git diff-index -p --ignore-submodules=dirty --submodule=diff HEAD >actual &&
606 cat >expected <<-EOF &&
607 Submodule sm1 $head7..$head8:
608 diff --git a/sm1/foo6 b/sm1/foo6
609 index 462398b..3e75765 100644
616 diff_cmp expected actual
619 test_expect_success
'modified submodule contains untracked and modified content (all ignored)' '
620 echo modification >> sm1/foo6 &&
621 git diff-index -p --ignore-submodules --submodule=diff HEAD >actual &&
622 test_must_be_empty actual
626 test_expect_success
'modified submodule contains modified content' '
627 rm -f sm1/new-file &&
628 git diff-index -p --submodule=diff HEAD >actual &&
629 cat >expected <<-EOF &&
630 Submodule sm1 contains modified content
631 Submodule sm1 $head7..$head8:
632 diff --git a/sm1/foo6 b/sm1/foo6
633 index 462398b..ac466ca 100644
644 diff_cmp expected actual
648 test_expect_success
'deleted submodule' '
649 git diff-index -p --submodule=diff HEAD >actual &&
650 cat >expected <<-EOF &&
651 Submodule sm1 $head7...0000000 (submodule deleted)
653 diff_cmp expected actual
656 test_expect_success
'create second submodule' '
657 test_create_repo sm2 &&
658 head9=$(add_file sm2 foo8 foo9) &&
662 test_expect_success
'multiple submodules' '
663 git diff-index -p --submodule=diff HEAD >actual &&
664 cat >expected <<-EOF &&
665 Submodule sm1 $head7...0000000 (submodule deleted)
666 Submodule sm2 0000000...$head9 (new submodule)
667 diff --git a/sm2/foo8 b/sm2/foo8
669 index 0000000..db9916b
674 diff --git a/sm2/foo9 b/sm2/foo9
676 index 0000000..9c3b4f6
682 diff_cmp expected actual
685 test_expect_success
'path filter' '
686 git diff-index -p --submodule=diff HEAD sm2 >actual &&
687 cat >expected <<-EOF &&
688 Submodule sm2 0000000...$head9 (new submodule)
689 diff --git a/sm2/foo8 b/sm2/foo8
691 index 0000000..db9916b
696 diff --git a/sm2/foo9 b/sm2/foo9
698 index 0000000..9c3b4f6
704 diff_cmp expected actual
707 cat >.gitmodules
<<-EOF
713 commit_file sm2 .gitmodules
715 test_expect_success
'given commit' '
716 git diff-index -p --submodule=diff HEAD^ >actual &&
717 cat >expected <<-EOF &&
718 diff --git a/.gitmodules b/.gitmodules
720 index 1234567..89abcde
727 Submodule sm1 $head7...0000000 (submodule deleted)
728 Submodule sm2 0000000...$head9 (new submodule)
729 diff --git a/sm2/foo8 b/sm2/foo8
731 index 0000000..db9916b
736 diff --git a/sm2/foo9 b/sm2/foo9
738 index 0000000..9c3b4f6
744 diff_cmp expected actual
747 test_expect_success
'setup .git file for sm2' '
748 git submodule absorbgitdirs sm2
751 test_expect_success
'diff --submodule=diff with .git file' '
752 git diff --submodule=diff HEAD^ >actual &&
753 cat >expected <<-EOF &&
754 diff --git a/.gitmodules b/.gitmodules
756 index 1234567..89abcde
763 Submodule sm1 $head7...0000000 (submodule deleted)
764 Submodule sm2 0000000...$head9 (new submodule)
765 diff --git a/sm2/foo8 b/sm2/foo8
767 index 0000000..db9916b
772 diff --git a/sm2/foo9 b/sm2/foo9
774 index 0000000..9c3b4f6
780 diff_cmp expected actual
785 test_expect_success
'deleted submodule with .git file' '
786 git diff-index -p --submodule=diff HEAD >actual &&
787 cat >expected <<-EOF &&
788 Submodule sm1 $head7...0000000 (submodule deleted)
789 Submodule sm2 $head9...0000000 (submodule deleted)
790 diff --git a/sm2/foo8 b/sm2/foo8
791 deleted file mode 100644
792 index 1234567..89abcde
797 diff --git a/sm2/foo9 b/sm2/foo9
798 deleted file mode 100644
799 index 1234567..89abcde
805 diff_cmp expected actual
808 echo submodule-to-blob
>sm2
810 test_expect_success
'typechanged(submodule->blob) submodule with .git file' '
811 git diff-index -p --submodule=diff HEAD >actual &&
812 cat >expected <<-EOF &&
813 Submodule sm1 $head7...0000000 (submodule deleted)
814 Submodule sm2 $head9...0000000 (submodule deleted)
815 diff --git a/sm2/foo8 b/sm2/foo8
816 deleted file mode 100644
817 index 1234567..89abcde
822 diff --git a/sm2/foo9 b/sm2/foo9
823 deleted file mode 100644
824 index 1234567..89abcde
829 diff --git a/sm2 b/sm2
831 index 1234567..89abcde
837 diff_cmp expected actual
843 test_expect_success
'setup nested submodule' '
844 git -c protocol.file.allow=always -C sm2 submodule add ../sm2 nested &&
845 git -C sm2 commit -a -m "nested sub" &&
846 head10=$(git -C sm2 rev-parse --short --verify HEAD)
849 test_expect_success
'move nested submodule HEAD' '
850 echo "nested content" >sm2/nested/file &&
851 git -C sm2/nested add file &&
852 git -C sm2/nested commit --allow-empty -m "new HEAD" &&
853 head11=$(git -C sm2/nested rev-parse --short --verify HEAD)
856 test_expect_success
'diff --submodule=diff with moved nested submodule HEAD' '
857 cat >expected <<-EOF &&
858 Submodule nested $head9..$head11:
859 diff --git a/nested/file b/nested/file
861 index 0000000..ca281f5
867 git -C sm2 diff --submodule=diff >actual 2>err &&
868 test_must_be_empty err &&
869 diff_cmp expected actual
872 test_expect_success
'diff --submodule=diff recurses into nested submodules' '
873 cat >expected <<-EOF &&
874 Submodule sm1 $head7...0000000 (submodule deleted)
875 Submodule sm2 contains modified content
876 Submodule sm2 $head9..$head10:
877 diff --git a/sm2/.gitmodules b/sm2/.gitmodules
879 index 0000000..3a816b8
881 +++ b/sm2/.gitmodules
883 +[submodule "nested"]
886 Submodule nested 0000000...$head11 (new submodule)
887 diff --git a/sm2/nested/file b/sm2/nested/file
889 index 0000000..ca281f5
891 +++ b/sm2/nested/file
894 diff --git a/sm2/nested/foo8 b/sm2/nested/foo8
896 index 0000000..db9916b
898 +++ b/sm2/nested/foo8
901 diff --git a/sm2/nested/foo9 b/sm2/nested/foo9
903 index 0000000..9c3b4f6
905 +++ b/sm2/nested/foo9
909 git diff --submodule=diff >actual 2>err &&
910 test_must_be_empty err &&
911 diff_cmp expected actual
914 (cd sm2
; commit_file nested
)
916 head12
=$
(cd sm2
; git rev-parse
--short --verify HEAD
)
920 test_expect_success
'diff --submodule=diff recurses into deleted nested submodules' '
921 cat >expected <<-EOF &&
922 Submodule sm1 $head7...0000000 (submodule deleted)
923 Submodule sm2 $head12...0000000 (submodule deleted)
924 diff --git a/sm2/.gitmodules b/sm2/.gitmodules
925 deleted file mode 100644
926 index 3a816b8..0000000
927 --- a/sm2/.gitmodules
930 -[submodule "nested"]
933 diff --git a/sm2/foo8 b/sm2/foo8
934 deleted file mode 100644
935 index db9916b..0000000
940 diff --git a/sm2/foo9 b/sm2/foo9
941 deleted file mode 100644
942 index 9c3b4f6..0000000
947 Submodule nested $head11...0000000 (submodule deleted)
948 diff --git a/sm2/nested/file b/sm2/nested/file
949 deleted file mode 100644
950 index ca281f5..0000000
951 --- a/sm2/nested/file
955 diff --git a/sm2/nested/foo8 b/sm2/nested/foo8
956 deleted file mode 100644
957 index db9916b..0000000
958 --- a/sm2/nested/foo8
962 diff --git a/sm2/nested/foo9 b/sm2/nested/foo9
963 deleted file mode 100644
964 index 9c3b4f6..0000000
965 --- a/sm2/nested/foo9
970 git diff --submodule=diff >actual 2>err &&
971 test_must_be_empty err &&
972 diff_cmp expected actual