Sync with Git 2.46-rc1
[alt-git.git] / t / t4060-diff-submodule-option-diff-format.sh
blob8ce67442d96b2ce8e659a907e47982ebd7c2facf
1 #!/bin/sh
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
14 . ./test-lib.sh
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")
23 add_file () {
25 cd "$1" &&
26 shift &&
27 for name
29 echo "$name" >"$name" &&
30 git add "$name" &&
31 test_tick &&
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 -
36 done >/dev/null &&
37 git rev-parse --short --verify HEAD
41 commit_file () {
42 test_tick &&
43 git commit "$@" -m "Commit $*" >/dev/null
46 diff_cmp () {
47 for i in "$1" "$2"
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
52 done &&
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 &&
59 add_file . foo &&
60 head1=$(add_file sm1 foo1 foo2) &&
61 fullhead1=$(git -C sm1 rev-parse --verify HEAD)
64 test_expect_success 'added submodule' '
65 git add sm1 &&
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
70 new file mode 100644
71 index 0000000..1715acd
72 --- /dev/null
73 +++ b/sm1/foo1
74 @@ -0,0 +1 @@
75 +foo1
76 diff --git a/sm1/foo2 b/sm1/foo2
77 new file mode 100644
78 index 0000000..54b060e
79 --- /dev/null
80 +++ b/sm1/foo2
81 @@ -0,0 +1 @@
82 +foo2
83 EOF
84 diff_cmp expected actual
87 test_expect_success 'added submodule, set diff.submodule' '
88 test_config diff.submodule log &&
89 git add sm1 &&
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
94 new file mode 100644
95 index 0000000..1715acd
96 --- /dev/null
97 +++ b/sm1/foo1
98 @@ -0,0 +1 @@
99 +foo1
100 diff --git a/sm1/foo2 b/sm1/foo2
101 new file mode 100644
102 index 0000000..54b060e
103 --- /dev/null
104 +++ b/sm1/foo2
105 @@ -0,0 +1 @@
106 +foo2
108 diff_cmp expected actual
111 test_expect_success '--submodule=short overrides diff.submodule' '
112 test_config diff.submodule log &&
113 git add sm1 &&
114 git diff --submodule=short --cached >actual &&
115 cat >expected <<-EOF &&
116 diff --git a/sm1 b/sm1
117 new file mode 160000
118 index 0000000..$head1
119 --- /dev/null
120 +++ b/sm1
121 @@ -0,0 +1 @@
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
132 new file mode 160000
133 index 0000000..$head1
134 --- /dev/null
135 +++ b/sm1
136 @@ -0,0 +1 @@
137 +Subproject commit $fullhead1
139 diff_cmp expected actual
142 commit_file sm1 &&
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
150 new file mode 100644
151 index 0000000..c1ec6c6
152 --- /dev/null
153 +++ b/sm1/foo3
154 @@ -0,0 +1 @@
155 +foo3
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
165 new file mode 100644
166 index 0000000..c1ec6c6
167 --- /dev/null
168 +++ b/sm1/foo3
169 @@ -0,0 +1 @@
170 +foo3
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
190 --- a/sm1
191 +++ b/sm1
192 @@ -1 +1 @@
193 -Subproject commit $fullhead1
194 +Subproject commit $fullhead2
196 diff_cmp expected actual
199 commit_file sm1 &&
200 head3=$(
201 cd sm1 &&
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
213 --- a/sm1/foo2
214 +++ /dev/null
215 @@ -1 +0,0 @@
216 -foo2
217 diff --git a/sm1/foo3 b/sm1/foo3
218 deleted file mode 100644
219 index c1ec6c6..0000000
220 --- a/sm1/foo3
221 +++ /dev/null
222 @@ -1 +0,0 @@
223 -foo3
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
236 --- a/sm1/foo2
237 +++ /dev/null
238 @@ -1 +0,0 @@
239 -foo2
240 diff --git a/sm1/foo3 b/sm1/foo3
241 deleted file mode 100644
242 index c1ec6c6..0000000
243 --- a/sm1/foo3
244 +++ /dev/null
245 @@ -1 +0,0 @@
246 -foo3
247 diff --git a/sm1/foo4 b/sm1/foo4
248 new file mode 100644
249 index 0000000..a0016db
250 --- /dev/null
251 +++ b/sm1/foo4
252 @@ -0,0 +1 @@
253 +foo4
254 diff --git a/sm1/foo5 b/sm1/foo5
255 new file mode 100644
256 index 0000000..d6f2413
257 --- /dev/null
258 +++ b/sm1/foo5
259 @@ -0,0 +1 @@
260 +foo5
262 diff_cmp expected actual
265 commit_file sm1 &&
266 mv sm1 sm1-bak &&
267 echo sm1 >sm1 &&
268 head5=$(git hash-object sm1 | cut -c1-7) &&
269 git add sm1 &&
270 rm -f sm1 &&
271 mv sm1-bak sm1
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
280 --- a/sm1/foo1
281 +++ /dev/null
282 @@ -1 +0,0 @@
283 -foo1
284 diff --git a/sm1/foo4 b/sm1/foo4
285 deleted file mode 100644
286 index a0016db..0000000
287 --- a/sm1/foo4
288 +++ /dev/null
289 @@ -1 +0,0 @@
290 -foo4
291 diff --git a/sm1/foo5 b/sm1/foo5
292 deleted file mode 100644
293 index d6f2413..0000000
294 --- a/sm1/foo5
295 +++ /dev/null
296 @@ -1 +0,0 @@
297 -foo5
298 diff --git a/sm1 b/sm1
299 new file mode 100644
300 index 0000000..9da5fb8
301 --- /dev/null
302 +++ b/sm1
303 @@ -0,0 +1 @@
304 +sm1
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
315 --- a/sm1
316 +++ /dev/null
317 @@ -1 +0,0 @@
318 -sm1
319 Submodule sm1 0000000...$head4 (new submodule)
320 diff --git a/sm1/foo1 b/sm1/foo1
321 new file mode 100644
322 index 0000000..1715acd
323 --- /dev/null
324 +++ b/sm1/foo1
325 @@ -0,0 +1 @@
326 +foo1
327 diff --git a/sm1/foo4 b/sm1/foo4
328 new file mode 100644
329 index 0000000..a0016db
330 --- /dev/null
331 +++ b/sm1/foo4
332 @@ -0,0 +1 @@
333 +foo4
334 diff --git a/sm1/foo5 b/sm1/foo5
335 new file mode 100644
336 index 0000000..d6f2413
337 --- /dev/null
338 +++ b/sm1/foo5
339 @@ -0,0 +1 @@
340 +foo5
342 diff_cmp expected actual
345 rm -rf sm1 &&
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
352 new file mode 100644
353 index 0000000..9da5fb8
354 --- /dev/null
355 +++ b/sm1
356 @@ -0,0 +1 @@
357 +sm1
359 diff_cmp expected actual
362 rm -f sm1 &&
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
373 commit_file
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
380 --- a/sm1
381 +++ /dev/null
382 @@ -1 +0,0 @@
383 -sm1
384 Submodule sm1 0000000...$head6 (new submodule)
385 diff --git a/sm1/foo6 b/sm1/foo6
386 new file mode 100644
387 index 0000000..462398b
388 --- /dev/null
389 +++ b/sm1/foo6
390 @@ -0,0 +1 @@
391 +foo6
392 diff --git a/sm1/foo7 b/sm1/foo7
393 new file mode 100644
394 index 0000000..6e9262c
395 --- /dev/null
396 +++ b/sm1/foo7
397 @@ -0,0 +1 @@
398 +foo7
400 diff_cmp expected actual
403 commit_file sm1 &&
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
442 --- a/sm1/foo6
443 +++ b/sm1/foo6
444 @@ -1 +1 @@
445 -foo6
446 +new
448 diff_cmp expected actual
451 # NOT OK
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
459 --- a/sm1/foo6
460 +++ b/sm1/foo6
461 @@ -1 +1 @@
462 -foo6
463 +new
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
487 --- a/sm1/foo6
488 +++ b/sm1/foo6
489 @@ -1 +1 @@
490 -foo6
491 +new
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
504 --- a/sm1/foo6
505 +++ b/sm1/foo6
506 @@ -1 +1 @@
507 -foo6
508 +new
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
521 --- a/sm1/foo6
522 +++ b/sm1/foo6
523 @@ -1 +1 @@
524 -foo6
525 +new
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
536 --- a/sm1/foo6
537 +++ b/sm1/foo6
538 @@ -1 +1 @@
539 -foo6
540 +new
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
551 --- a/sm1/foo6
552 +++ b/sm1/foo6
553 @@ -1 +1 @@
554 -foo6
555 +new
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
574 --- a/sm1/foo6
575 +++ b/sm1/foo6
576 @@ -1 +1,2 @@
577 -foo6
578 +new
579 +modification
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
592 --- a/sm1/foo6
593 +++ b/sm1/foo6
594 @@ -1 +1,3 @@
595 -foo6
596 +new
597 +modification
598 +modification
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
610 --- a/sm1/foo6
611 +++ b/sm1/foo6
612 @@ -1 +1 @@
613 -foo6
614 +new
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
625 # NOT OK
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
634 --- a/sm1/foo6
635 +++ b/sm1/foo6
636 @@ -1 +1,5 @@
637 -foo6
638 +new
639 +modification
640 +modification
641 +modification
642 +modification
644 diff_cmp expected actual
647 rm -rf sm1
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) &&
659 git add sm2
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
668 new file mode 100644
669 index 0000000..db9916b
670 --- /dev/null
671 +++ b/sm2/foo8
672 @@ -0,0 +1 @@
673 +foo8
674 diff --git a/sm2/foo9 b/sm2/foo9
675 new file mode 100644
676 index 0000000..9c3b4f6
677 --- /dev/null
678 +++ b/sm2/foo9
679 @@ -0,0 +1 @@
680 +foo9
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
690 new file mode 100644
691 index 0000000..db9916b
692 --- /dev/null
693 +++ b/sm2/foo8
694 @@ -0,0 +1 @@
695 +foo8
696 diff --git a/sm2/foo9 b/sm2/foo9
697 new file mode 100644
698 index 0000000..9c3b4f6
699 --- /dev/null
700 +++ b/sm2/foo9
701 @@ -0,0 +1 @@
702 +foo9
704 diff_cmp expected actual
707 cat >.gitmodules <<-EOF
708 [submodule "sm2"]
709 path = sm2
710 url = bogus_url
712 git add .gitmodules
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
719 new file mode 100644
720 index 1234567..89abcde
721 --- /dev/null
722 +++ b/.gitmodules
723 @@ -0,0 +1,3 @@
724 +[submodule "sm2"]
725 +path = sm2
726 +url = bogus_url
727 Submodule sm1 $head7...0000000 (submodule deleted)
728 Submodule sm2 0000000...$head9 (new submodule)
729 diff --git a/sm2/foo8 b/sm2/foo8
730 new file mode 100644
731 index 0000000..db9916b
732 --- /dev/null
733 +++ b/sm2/foo8
734 @@ -0,0 +1 @@
735 +foo8
736 diff --git a/sm2/foo9 b/sm2/foo9
737 new file mode 100644
738 index 0000000..9c3b4f6
739 --- /dev/null
740 +++ b/sm2/foo9
741 @@ -0,0 +1 @@
742 +foo9
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
755 new file mode 100644
756 index 1234567..89abcde
757 --- /dev/null
758 +++ b/.gitmodules
759 @@ -0,0 +1,3 @@
760 +[submodule "sm2"]
761 +path = sm2
762 +url = bogus_url
763 Submodule sm1 $head7...0000000 (submodule deleted)
764 Submodule sm2 0000000...$head9 (new submodule)
765 diff --git a/sm2/foo8 b/sm2/foo8
766 new file mode 100644
767 index 0000000..db9916b
768 --- /dev/null
769 +++ b/sm2/foo8
770 @@ -0,0 +1 @@
771 +foo8
772 diff --git a/sm2/foo9 b/sm2/foo9
773 new file mode 100644
774 index 0000000..9c3b4f6
775 --- /dev/null
776 +++ b/sm2/foo9
777 @@ -0,0 +1 @@
778 +foo9
780 diff_cmp expected actual
783 mv sm2 sm2-bak
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
793 --- a/sm2/foo8
794 +++ /dev/null
795 @@ -1 +0,0 @@
796 -foo8
797 diff --git a/sm2/foo9 b/sm2/foo9
798 deleted file mode 100644
799 index 1234567..89abcde
800 --- a/sm2/foo9
801 +++ /dev/null
802 @@ -1 +0,0 @@
803 -foo9
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
818 --- a/sm2/foo8
819 +++ /dev/null
820 @@ -1 +0,0 @@
821 -foo8
822 diff --git a/sm2/foo9 b/sm2/foo9
823 deleted file mode 100644
824 index 1234567..89abcde
825 --- a/sm2/foo9
826 +++ /dev/null
827 @@ -1 +0,0 @@
828 -foo9
829 diff --git a/sm2 b/sm2
830 new file mode 100644
831 index 1234567..89abcde
832 --- /dev/null
833 +++ b/sm2
834 @@ -0,0 +1 @@
835 +submodule-to-blob
837 diff_cmp expected actual
840 rm sm2
841 mv sm2-bak sm2
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
860 new file mode 100644
861 index 0000000..ca281f5
862 --- /dev/null
863 +++ b/nested/file
864 @@ -0,0 +1 @@
865 +nested content
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
878 new file mode 100644
879 index 0000000..3a816b8
880 --- /dev/null
881 +++ b/sm2/.gitmodules
882 @@ -0,0 +1,3 @@
883 +[submodule "nested"]
884 + path = nested
885 + url = ../sm2
886 Submodule nested 0000000...$head11 (new submodule)
887 diff --git a/sm2/nested/file b/sm2/nested/file
888 new file mode 100644
889 index 0000000..ca281f5
890 --- /dev/null
891 +++ b/sm2/nested/file
892 @@ -0,0 +1 @@
893 +nested content
894 diff --git a/sm2/nested/foo8 b/sm2/nested/foo8
895 new file mode 100644
896 index 0000000..db9916b
897 --- /dev/null
898 +++ b/sm2/nested/foo8
899 @@ -0,0 +1 @@
900 +foo8
901 diff --git a/sm2/nested/foo9 b/sm2/nested/foo9
902 new file mode 100644
903 index 0000000..9c3b4f6
904 --- /dev/null
905 +++ b/sm2/nested/foo9
906 @@ -0,0 +1 @@
907 +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)
915 commit_file sm2
916 head12=$(cd sm2; git rev-parse --short --verify HEAD)
918 mv sm2 sm2-bak
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
928 +++ /dev/null
929 @@ -1,3 +0,0 @@
930 -[submodule "nested"]
931 - path = nested
932 - url = ../sm2
933 diff --git a/sm2/foo8 b/sm2/foo8
934 deleted file mode 100644
935 index db9916b..0000000
936 --- a/sm2/foo8
937 +++ /dev/null
938 @@ -1 +0,0 @@
939 -foo8
940 diff --git a/sm2/foo9 b/sm2/foo9
941 deleted file mode 100644
942 index 9c3b4f6..0000000
943 --- a/sm2/foo9
944 +++ /dev/null
945 @@ -1 +0,0 @@
946 -foo9
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
952 +++ /dev/null
953 @@ -1 +0,0 @@
954 -nested content
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
959 +++ /dev/null
960 @@ -1 +0,0 @@
961 -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
966 +++ /dev/null
967 @@ -1 +0,0 @@
968 -foo9
970 git diff --submodule=diff >actual 2>err &&
971 test_must_be_empty err &&
972 diff_cmp expected actual
975 mv sm2-bak sm2
977 test_done