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 # Copyright (c) 2016 Jacob Keller (copy + convert to --submodule=diff)
6 #
7
8 test_description='Support for diff format verbose submodule difference in git diff
9
10 This test tries to verify the sanity of --submodule=diff option of git diff.
11 '
12
13 . ./test-lib.sh
14
15 # Test non-UTF-8 encoding in case iconv is available.
16 if test_have_prereq ICONV
17 then
18 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")
22 else
23 test_encoding="UTF-8"
24 added="added"
25 fi
26
27 add_file () {
28 (
29 cd "$1" &&
30 shift &&
31 for name
32 do
33 echo "$name" >"$name" &&
34 git add "$name" &&
35 test_tick &&
36 # "git commit -m" would break MinGW, as Windows refuse to pass
37 # $test_encoding encoded parameter to git.
38 message="Add $name ($added $name)" &&
39 if test_have_prereq ICONV
40 then
41 message=$(echo "$message" | iconv -f utf-8 -t $test_encoding)
42 fi &&
43 echo "$message" | git -c "i18n.commitEncoding=$test_encoding" commit -F -
44 done >/dev/null &&
45 git rev-parse --short --verify HEAD
46 )
47 }
48
49 commit_file () {
50 test_tick &&
51 git commit "$@" -m "Commit $*" >/dev/null
52 }
53
54 diff_cmp () {
55 for i in "$1" "$2"
56 do
57 sed -e 's/^index 0000000\.\.[0-9a-f]*/index 0000000..1234567/' \
58 -e 's/^index [0-9a-f]*\.\.[0-9a-f]*/index 1234567..89abcde/' \
59 "$i" >"$i.compare" || return 1
60 done &&
61 test_cmp "$1.compare" "$2.compare" &&
62 rm -f "$1.compare" "$2.compare"
63 }
64
65 test_expect_success 'setup repository' '
66 test_create_repo sm1 &&
67 add_file . foo &&
68 head1=$(add_file sm1 foo1 foo2) &&
69 fullhead1=$(git -C sm1 rev-parse --verify HEAD)
70 '
71
72 test_expect_success 'added submodule' '
73 git add sm1 &&
74 git diff-index -p --submodule=diff HEAD >actual &&
75 cat >expected <<-EOF &&
76 Submodule sm1 0000000...$head1 (new submodule)
77 diff --git a/sm1/foo1 b/sm1/foo1
78 new file mode 100644
79 index 0000000..1715acd
80 --- /dev/null
81 +++ b/sm1/foo1
82 @@ -0,0 +1 @@
83 +foo1
84 diff --git a/sm1/foo2 b/sm1/foo2
85 new file mode 100644
86 index 0000000..54b060e
87 --- /dev/null
88 +++ b/sm1/foo2
89 @@ -0,0 +1 @@
90 +foo2
91 EOF
92 diff_cmp expected actual
93 '
94
95 test_expect_success 'added submodule, set diff.submodule' '
96 test_config diff.submodule log &&
97 git add sm1 &&
98 git diff-index -p --submodule=diff HEAD >actual &&
99 cat >expected <<-EOF &&
100 Submodule sm1 0000000...$head1 (new submodule)
101 diff --git a/sm1/foo1 b/sm1/foo1
102 new file mode 100644
103 index 0000000..1715acd
104 --- /dev/null
105 +++ b/sm1/foo1
106 @@ -0,0 +1 @@
107 +foo1
108 diff --git a/sm1/foo2 b/sm1/foo2
109 new file mode 100644
110 index 0000000..54b060e
111 --- /dev/null
112 +++ b/sm1/foo2
113 @@ -0,0 +1 @@
114 +foo2
115 EOF
116 diff_cmp expected actual
117 '
118
119 test_expect_success '--submodule=short overrides diff.submodule' '
120 test_config diff.submodule log &&
121 git add sm1 &&
122 git diff --submodule=short --cached >actual &&
123 cat >expected <<-EOF &&
124 diff --git a/sm1 b/sm1
125 new file mode 160000
126 index 0000000..$head1
127 --- /dev/null
128 +++ b/sm1
129 @@ -0,0 +1 @@
130 +Subproject commit $fullhead1
131 EOF
132 diff_cmp expected actual
133 '
134
135 test_expect_success 'diff.submodule does not affect plumbing' '
136 test_config diff.submodule log &&
137 git diff-index -p HEAD >actual &&
138 cat >expected <<-EOF &&
139 diff --git a/sm1 b/sm1
140 new file mode 160000
141 index 0000000..$head1
142 --- /dev/null
143 +++ b/sm1
144 @@ -0,0 +1 @@
145 +Subproject commit $fullhead1
146 EOF
147 diff_cmp expected actual
148 '
149
150 commit_file sm1 &&
151 head2=$(add_file sm1 foo3)
152
153 test_expect_success 'modified submodule(forward)' '
154 git diff-index -p --submodule=diff HEAD >actual &&
155 cat >expected <<-EOF &&
156 Submodule sm1 $head1..$head2:
157 diff --git a/sm1/foo3 b/sm1/foo3
158 new file mode 100644
159 index 0000000..c1ec6c6
160 --- /dev/null
161 +++ b/sm1/foo3
162 @@ -0,0 +1 @@
163 +foo3
164 EOF
165 diff_cmp expected actual
166 '
167
168 test_expect_success 'modified submodule(forward)' '
169 git diff --submodule=diff >actual &&
170 cat >expected <<-EOF &&
171 Submodule sm1 $head1..$head2:
172 diff --git a/sm1/foo3 b/sm1/foo3
173 new file mode 100644
174 index 0000000..c1ec6c6
175 --- /dev/null
176 +++ b/sm1/foo3
177 @@ -0,0 +1 @@
178 +foo3
179 EOF
180 diff_cmp expected actual
181 '
182
183 test_expect_success 'modified submodule(forward) --submodule' '
184 git diff --submodule >actual &&
185 cat >expected <<-EOF &&
186 Submodule sm1 $head1..$head2:
187 > Add foo3 ($added foo3)
188 EOF
189 diff_cmp expected actual
190 '
191
192 fullhead2=$(cd sm1; git rev-parse --verify HEAD)
193 test_expect_success 'modified submodule(forward) --submodule=short' '
194 git diff --submodule=short >actual &&
195 cat >expected <<-EOF &&
196 diff --git a/sm1 b/sm1
197 index $head1..$head2 160000
198 --- a/sm1
199 +++ b/sm1
200 @@ -1 +1 @@
201 -Subproject commit $fullhead1
202 +Subproject commit $fullhead2
203 EOF
204 diff_cmp expected actual
205 '
206
207 commit_file sm1 &&
208 head3=$(
209 cd sm1 &&
210 git reset --hard HEAD~2 >/dev/null &&
211 git rev-parse --short --verify HEAD
212 )
213
214 test_expect_success 'modified submodule(backward)' '
215 git diff-index -p --submodule=diff HEAD >actual &&
216 cat >expected <<-EOF &&
217 Submodule sm1 $head2..$head3 (rewind):
218 diff --git a/sm1/foo2 b/sm1/foo2
219 deleted file mode 100644
220 index 54b060e..0000000
221 --- a/sm1/foo2
222 +++ /dev/null
223 @@ -1 +0,0 @@
224 -foo2
225 diff --git a/sm1/foo3 b/sm1/foo3
226 deleted file mode 100644
227 index c1ec6c6..0000000
228 --- a/sm1/foo3
229 +++ /dev/null
230 @@ -1 +0,0 @@
231 -foo3
232 EOF
233 diff_cmp expected actual
234 '
235
236 head4=$(add_file sm1 foo4 foo5)
237 test_expect_success 'modified submodule(backward and forward)' '
238 git diff-index -p --submodule=diff HEAD >actual &&
239 cat >expected <<-EOF &&
240 Submodule sm1 $head2...$head4:
241 diff --git a/sm1/foo2 b/sm1/foo2
242 deleted file mode 100644
243 index 54b060e..0000000
244 --- a/sm1/foo2
245 +++ /dev/null
246 @@ -1 +0,0 @@
247 -foo2
248 diff --git a/sm1/foo3 b/sm1/foo3
249 deleted file mode 100644
250 index c1ec6c6..0000000
251 --- a/sm1/foo3
252 +++ /dev/null
253 @@ -1 +0,0 @@
254 -foo3
255 diff --git a/sm1/foo4 b/sm1/foo4
256 new file mode 100644
257 index 0000000..a0016db
258 --- /dev/null
259 +++ b/sm1/foo4
260 @@ -0,0 +1 @@
261 +foo4
262 diff --git a/sm1/foo5 b/sm1/foo5
263 new file mode 100644
264 index 0000000..d6f2413
265 --- /dev/null
266 +++ b/sm1/foo5
267 @@ -0,0 +1 @@
268 +foo5
269 EOF
270 diff_cmp expected actual
271 '
272
273 commit_file sm1 &&
274 mv sm1 sm1-bak &&
275 echo sm1 >sm1 &&
276 head5=$(git hash-object sm1 | cut -c1-7) &&
277 git add sm1 &&
278 rm -f sm1 &&
279 mv sm1-bak sm1
280
281 test_expect_success 'typechanged submodule(submodule->blob), --cached' '
282 git diff --submodule=diff --cached >actual &&
283 cat >expected <<-EOF &&
284 Submodule sm1 $head4...0000000 (submodule deleted)
285 diff --git a/sm1/foo1 b/sm1/foo1
286 deleted file mode 100644
287 index 1715acd..0000000
288 --- a/sm1/foo1
289 +++ /dev/null
290 @@ -1 +0,0 @@
291 -foo1
292 diff --git a/sm1/foo4 b/sm1/foo4
293 deleted file mode 100644
294 index a0016db..0000000
295 --- a/sm1/foo4
296 +++ /dev/null
297 @@ -1 +0,0 @@
298 -foo4
299 diff --git a/sm1/foo5 b/sm1/foo5
300 deleted file mode 100644
301 index d6f2413..0000000
302 --- a/sm1/foo5
303 +++ /dev/null
304 @@ -1 +0,0 @@
305 -foo5
306 diff --git a/sm1 b/sm1
307 new file mode 100644
308 index 0000000..9da5fb8
309 --- /dev/null
310 +++ b/sm1
311 @@ -0,0 +1 @@
312 +sm1
313 EOF
314 diff_cmp expected actual
315 '
316
317 test_expect_success 'typechanged submodule(submodule->blob)' '
318 git diff --submodule=diff >actual &&
319 cat >expected <<-EOF &&
320 diff --git a/sm1 b/sm1
321 deleted file mode 100644
322 index 9da5fb8..0000000
323 --- a/sm1
324 +++ /dev/null
325 @@ -1 +0,0 @@
326 -sm1
327 Submodule sm1 0000000...$head4 (new submodule)
328 diff --git a/sm1/foo1 b/sm1/foo1
329 new file mode 100644
330 index 0000000..1715acd
331 --- /dev/null
332 +++ b/sm1/foo1
333 @@ -0,0 +1 @@
334 +foo1
335 diff --git a/sm1/foo4 b/sm1/foo4
336 new file mode 100644
337 index 0000000..a0016db
338 --- /dev/null
339 +++ b/sm1/foo4
340 @@ -0,0 +1 @@
341 +foo4
342 diff --git a/sm1/foo5 b/sm1/foo5
343 new file mode 100644
344 index 0000000..d6f2413
345 --- /dev/null
346 +++ b/sm1/foo5
347 @@ -0,0 +1 @@
348 +foo5
349 EOF
350 diff_cmp expected actual
351 '
352
353 rm -rf sm1 &&
354 git checkout-index sm1
355 test_expect_success 'typechanged submodule(submodule->blob)' '
356 git diff-index -p --submodule=diff HEAD >actual &&
357 cat >expected <<-EOF &&
358 Submodule sm1 $head4...0000000 (submodule deleted)
359 diff --git a/sm1 b/sm1
360 new file mode 100644
361 index 0000000..9da5fb8
362 --- /dev/null
363 +++ b/sm1
364 @@ -0,0 +1 @@
365 +sm1
366 EOF
367 diff_cmp expected actual
368 '
369
370 test_expect_success 'setup' '
371 rm -f sm1 &&
372 git init sm1 &&
373 head6=$(add_file sm1 foo6 foo7)
374 '
375
376 test_expect_success 'nonexistent commit' '
377 git diff-index -p --submodule=diff HEAD >actual &&
378 cat >expected <<-EOF &&
379 Submodule sm1 $head4...$head6 (commits not present)
380 EOF
381 diff_cmp expected actual
382 '
383
384 commit_file
385 test_expect_success 'typechanged submodule(blob->submodule)' '
386 git diff-index -p --submodule=diff HEAD >actual &&
387 cat >expected <<-EOF &&
388 diff --git a/sm1 b/sm1
389 deleted file mode 100644
390 index 9da5fb8..0000000
391 --- a/sm1
392 +++ /dev/null
393 @@ -1 +0,0 @@
394 -sm1
395 Submodule sm1 0000000...$head6 (new submodule)
396 diff --git a/sm1/foo6 b/sm1/foo6
397 new file mode 100644
398 index 0000000..462398b
399 --- /dev/null
400 +++ b/sm1/foo6
401 @@ -0,0 +1 @@
402 +foo6
403 diff --git a/sm1/foo7 b/sm1/foo7
404 new file mode 100644
405 index 0000000..6e9262c
406 --- /dev/null
407 +++ b/sm1/foo7
408 @@ -0,0 +1 @@
409 +foo7
410 EOF
411 diff_cmp expected actual
412 '
413
414 commit_file sm1 &&
415 test_expect_success 'submodule is up to date' '
416 head7=$(git -C sm1 rev-parse --short --verify HEAD) &&
417 git diff-index -p --submodule=diff HEAD >actual &&
418 test_must_be_empty actual
419 '
420
421 test_expect_success 'submodule contains untracked content' '
422 echo new > sm1/new-file &&
423 git diff-index -p --ignore-submodules=none --submodule=diff HEAD >actual &&
424 cat >expected <<-EOF &&
425 Submodule sm1 contains untracked content
426 EOF
427 diff_cmp expected actual
428 '
429
430 test_expect_success 'submodule contains untracked content (untracked ignored)' '
431 git diff-index -p --submodule=diff HEAD >actual &&
432 test_must_be_empty actual
433 '
434
435 test_expect_success 'submodule contains untracked content (dirty ignored)' '
436 git diff-index -p --ignore-submodules=dirty --submodule=diff HEAD >actual &&
437 test_must_be_empty actual
438 '
439
440 test_expect_success 'submodule contains untracked content (all ignored)' '
441 git diff-index -p --ignore-submodules=all --submodule=diff HEAD >actual &&
442 test_must_be_empty actual
443 '
444
445 test_expect_success 'submodule contains untracked and modified content' '
446 echo new > sm1/foo6 &&
447 git diff-index -p --ignore-submodules=none --submodule=diff HEAD >actual &&
448 cat >expected <<-EOF &&
449 Submodule sm1 contains untracked content
450 Submodule sm1 contains modified content
451 diff --git a/sm1/foo6 b/sm1/foo6
452 index 462398b..3e75765 100644
453 --- a/sm1/foo6
454 +++ b/sm1/foo6
455 @@ -1 +1 @@
456 -foo6
457 +new
458 EOF
459 diff_cmp expected actual
460 '
461
462 # NOT OK
463 test_expect_success 'submodule contains untracked and modified content (untracked ignored)' '
464 echo new > sm1/foo6 &&
465 git diff-index -p --submodule=diff HEAD >actual &&
466 cat >expected <<-EOF &&
467 Submodule sm1 contains modified content
468 diff --git a/sm1/foo6 b/sm1/foo6
469 index 462398b..3e75765 100644
470 --- a/sm1/foo6
471 +++ b/sm1/foo6
472 @@ -1 +1 @@
473 -foo6
474 +new
475 EOF
476 diff_cmp expected actual
477 '
478
479 test_expect_success 'submodule contains untracked and modified content (dirty ignored)' '
480 echo new > sm1/foo6 &&
481 git diff-index -p --ignore-submodules=dirty --submodule=diff HEAD >actual &&
482 test_must_be_empty actual
483 '
484
485 test_expect_success 'submodule contains untracked and modified content (all ignored)' '
486 echo new > sm1/foo6 &&
487 git diff-index -p --ignore-submodules --submodule=diff HEAD >actual &&
488 test_must_be_empty actual
489 '
490
491 test_expect_success 'submodule contains modified content' '
492 rm -f sm1/new-file &&
493 git diff-index -p --submodule=diff HEAD >actual &&
494 cat >expected <<-EOF &&
495 Submodule sm1 contains modified content
496 diff --git a/sm1/foo6 b/sm1/foo6
497 index 462398b..3e75765 100644
498 --- a/sm1/foo6
499 +++ b/sm1/foo6
500 @@ -1 +1 @@
501 -foo6
502 +new
503 EOF
504 diff_cmp expected actual
505 '
506
507 (cd sm1; git commit -mchange foo6 >/dev/null) &&
508 head8=$(cd sm1; git rev-parse --short --verify HEAD) &&
509 test_expect_success 'submodule is modified' '
510 git diff-index -p --submodule=diff HEAD >actual &&
511 cat >expected <<-EOF &&
512 Submodule sm1 $head7..$head8:
513 diff --git a/sm1/foo6 b/sm1/foo6
514 index 462398b..3e75765 100644
515 --- a/sm1/foo6
516 +++ b/sm1/foo6
517 @@ -1 +1 @@
518 -foo6
519 +new
520 EOF
521 diff_cmp expected actual
522 '
523
524 test_expect_success 'modified submodule contains untracked content' '
525 echo new > sm1/new-file &&
526 git diff-index -p --ignore-submodules=none --submodule=diff HEAD >actual &&
527 cat >expected <<-EOF &&
528 Submodule sm1 contains untracked content
529 Submodule sm1 $head7..$head8:
530 diff --git a/sm1/foo6 b/sm1/foo6
531 index 462398b..3e75765 100644
532 --- a/sm1/foo6
533 +++ b/sm1/foo6
534 @@ -1 +1 @@
535 -foo6
536 +new
537 EOF
538 diff_cmp expected actual
539 '
540
541 test_expect_success 'modified submodule contains untracked content (untracked ignored)' '
542 git diff-index -p --submodule=diff HEAD >actual &&
543 cat >expected <<-EOF &&
544 Submodule sm1 $head7..$head8:
545 diff --git a/sm1/foo6 b/sm1/foo6
546 index 462398b..3e75765 100644
547 --- a/sm1/foo6
548 +++ b/sm1/foo6
549 @@ -1 +1 @@
550 -foo6
551 +new
552 EOF
553 diff_cmp expected actual
554 '
555
556 test_expect_success 'modified submodule contains untracked content (dirty ignored)' '
557 git diff-index -p --ignore-submodules=dirty --submodule=diff HEAD >actual &&
558 cat >expected <<-EOF &&
559 Submodule sm1 $head7..$head8:
560 diff --git a/sm1/foo6 b/sm1/foo6
561 index 462398b..3e75765 100644
562 --- a/sm1/foo6
563 +++ b/sm1/foo6
564 @@ -1 +1 @@
565 -foo6
566 +new
567 EOF
568 diff_cmp expected actual
569 '
570
571 test_expect_success 'modified submodule contains untracked content (all ignored)' '
572 git diff-index -p --ignore-submodules=all --submodule=diff HEAD >actual &&
573 test_must_be_empty actual
574 '
575
576 test_expect_success 'modified submodule contains untracked and modified content' '
577 echo modification >> sm1/foo6 &&
578 git diff-index -p --ignore-submodules=none --submodule=diff HEAD >actual &&
579 cat >expected <<-EOF &&
580 Submodule sm1 contains untracked content
581 Submodule sm1 contains modified content
582 Submodule sm1 $head7..$head8:
583 diff --git a/sm1/foo6 b/sm1/foo6
584 index 462398b..dfda541 100644
585 --- a/sm1/foo6
586 +++ b/sm1/foo6
587 @@ -1 +1,2 @@
588 -foo6
589 +new
590 +modification
591 EOF
592 diff_cmp expected actual
593 '
594
595 test_expect_success 'modified submodule contains untracked and modified content (untracked ignored)' '
596 echo modification >> sm1/foo6 &&
597 git diff-index -p --submodule=diff HEAD >actual &&
598 cat >expected <<-EOF &&
599 Submodule sm1 contains modified content
600 Submodule sm1 $head7..$head8:
601 diff --git a/sm1/foo6 b/sm1/foo6
602 index 462398b..e20e2d9 100644
603 --- a/sm1/foo6
604 +++ b/sm1/foo6
605 @@ -1 +1,3 @@
606 -foo6
607 +new
608 +modification
609 +modification
610 EOF
611 diff_cmp expected actual
612 '
613
614 test_expect_success 'modified submodule contains untracked and modified content (dirty ignored)' '
615 echo modification >> sm1/foo6 &&
616 git diff-index -p --ignore-submodules=dirty --submodule=diff HEAD >actual &&
617 cat >expected <<-EOF &&
618 Submodule sm1 $head7..$head8:
619 diff --git a/sm1/foo6 b/sm1/foo6
620 index 462398b..3e75765 100644
621 --- a/sm1/foo6
622 +++ b/sm1/foo6
623 @@ -1 +1 @@
624 -foo6
625 +new
626 EOF
627 diff_cmp expected actual
628 '
629
630 test_expect_success 'modified submodule contains untracked and modified content (all ignored)' '
631 echo modification >> sm1/foo6 &&
632 git diff-index -p --ignore-submodules --submodule=diff HEAD >actual &&
633 test_must_be_empty actual
634 '
635
636 # NOT OK
637 test_expect_success 'modified submodule contains modified content' '
638 rm -f sm1/new-file &&
639 git diff-index -p --submodule=diff HEAD >actual &&
640 cat >expected <<-EOF &&
641 Submodule sm1 contains modified content
642 Submodule sm1 $head7..$head8:
643 diff --git a/sm1/foo6 b/sm1/foo6
644 index 462398b..ac466ca 100644
645 --- a/sm1/foo6
646 +++ b/sm1/foo6
647 @@ -1 +1,5 @@
648 -foo6
649 +new
650 +modification
651 +modification
652 +modification
653 +modification
654 EOF
655 diff_cmp expected actual
656 '
657
658 rm -rf sm1
659 test_expect_success 'deleted submodule' '
660 git diff-index -p --submodule=diff HEAD >actual &&
661 cat >expected <<-EOF &&
662 Submodule sm1 $head7...0000000 (submodule deleted)
663 EOF
664 diff_cmp expected actual
665 '
666
667 test_expect_success 'create second submodule' '
668 test_create_repo sm2 &&
669 head9=$(add_file sm2 foo8 foo9) &&
670 git add sm2
671 '
672
673 test_expect_success 'multiple submodules' '
674 git diff-index -p --submodule=diff HEAD >actual &&
675 cat >expected <<-EOF &&
676 Submodule sm1 $head7...0000000 (submodule deleted)
677 Submodule sm2 0000000...$head9 (new submodule)
678 diff --git a/sm2/foo8 b/sm2/foo8
679 new file mode 100644
680 index 0000000..db9916b
681 --- /dev/null
682 +++ b/sm2/foo8
683 @@ -0,0 +1 @@
684 +foo8
685 diff --git a/sm2/foo9 b/sm2/foo9
686 new file mode 100644
687 index 0000000..9c3b4f6
688 --- /dev/null
689 +++ b/sm2/foo9
690 @@ -0,0 +1 @@
691 +foo9
692 EOF
693 diff_cmp expected actual
694 '
695
696 test_expect_success 'path filter' '
697 git diff-index -p --submodule=diff HEAD sm2 >actual &&
698 cat >expected <<-EOF &&
699 Submodule sm2 0000000...$head9 (new submodule)
700 diff --git a/sm2/foo8 b/sm2/foo8
701 new file mode 100644
702 index 0000000..db9916b
703 --- /dev/null
704 +++ b/sm2/foo8
705 @@ -0,0 +1 @@
706 +foo8
707 diff --git a/sm2/foo9 b/sm2/foo9
708 new file mode 100644
709 index 0000000..9c3b4f6
710 --- /dev/null
711 +++ b/sm2/foo9
712 @@ -0,0 +1 @@
713 +foo9
714 EOF
715 diff_cmp expected actual
716 '
717
718 cat >.gitmodules <<-EOF
719 [submodule "sm2"]
720 path = sm2
721 url = bogus_url
722 EOF
723 git add .gitmodules
724 commit_file sm2 .gitmodules
725
726 test_expect_success 'given commit' '
727 git diff-index -p --submodule=diff HEAD^ >actual &&
728 cat >expected <<-EOF &&
729 diff --git a/.gitmodules b/.gitmodules
730 new file mode 100644
731 index 1234567..89abcde
732 --- /dev/null
733 +++ b/.gitmodules
734 @@ -0,0 +1,3 @@
735 +[submodule "sm2"]
736 +path = sm2
737 +url = bogus_url
738 Submodule sm1 $head7...0000000 (submodule deleted)
739 Submodule sm2 0000000...$head9 (new submodule)
740 diff --git a/sm2/foo8 b/sm2/foo8
741 new file mode 100644
742 index 0000000..db9916b
743 --- /dev/null
744 +++ b/sm2/foo8
745 @@ -0,0 +1 @@
746 +foo8
747 diff --git a/sm2/foo9 b/sm2/foo9
748 new file mode 100644
749 index 0000000..9c3b4f6
750 --- /dev/null
751 +++ b/sm2/foo9
752 @@ -0,0 +1 @@
753 +foo9
754 EOF
755 diff_cmp expected actual
756 '
757
758 test_expect_success 'setup .git file for sm2' '
759 git submodule absorbgitdirs sm2
760 '
761
762 test_expect_success 'diff --submodule=diff with .git file' '
763 git diff --submodule=diff HEAD^ >actual &&
764 cat >expected <<-EOF &&
765 diff --git a/.gitmodules b/.gitmodules
766 new file mode 100644
767 index 1234567..89abcde
768 --- /dev/null
769 +++ b/.gitmodules
770 @@ -0,0 +1,3 @@
771 +[submodule "sm2"]
772 +path = sm2
773 +url = bogus_url
774 Submodule sm1 $head7...0000000 (submodule deleted)
775 Submodule sm2 0000000...$head9 (new submodule)
776 diff --git a/sm2/foo8 b/sm2/foo8
777 new file mode 100644
778 index 0000000..db9916b
779 --- /dev/null
780 +++ b/sm2/foo8
781 @@ -0,0 +1 @@
782 +foo8
783 diff --git a/sm2/foo9 b/sm2/foo9
784 new file mode 100644
785 index 0000000..9c3b4f6
786 --- /dev/null
787 +++ b/sm2/foo9
788 @@ -0,0 +1 @@
789 +foo9
790 EOF
791 diff_cmp expected actual
792 '
793
794 mv sm2 sm2-bak
795
796 test_expect_success 'deleted submodule with .git file' '
797 git diff-index -p --submodule=diff HEAD >actual &&
798 cat >expected <<-EOF &&
799 Submodule sm1 $head7...0000000 (submodule deleted)
800 Submodule sm2 $head9...0000000 (submodule deleted)
801 diff --git a/sm2/foo8 b/sm2/foo8
802 deleted file mode 100644
803 index 1234567..89abcde
804 --- a/sm2/foo8
805 +++ /dev/null
806 @@ -1 +0,0 @@
807 -foo8
808 diff --git a/sm2/foo9 b/sm2/foo9
809 deleted file mode 100644
810 index 1234567..89abcde
811 --- a/sm2/foo9
812 +++ /dev/null
813 @@ -1 +0,0 @@
814 -foo9
815 EOF
816 diff_cmp expected actual
817 '
818
819 echo submodule-to-blob>sm2
820
821 test_expect_success 'typechanged(submodule->blob) submodule with .git file' '
822 git diff-index -p --submodule=diff HEAD >actual &&
823 cat >expected <<-EOF &&
824 Submodule sm1 $head7...0000000 (submodule deleted)
825 Submodule sm2 $head9...0000000 (submodule deleted)
826 diff --git a/sm2/foo8 b/sm2/foo8
827 deleted file mode 100644
828 index 1234567..89abcde
829 --- a/sm2/foo8
830 +++ /dev/null
831 @@ -1 +0,0 @@
832 -foo8
833 diff --git a/sm2/foo9 b/sm2/foo9
834 deleted file mode 100644
835 index 1234567..89abcde
836 --- a/sm2/foo9
837 +++ /dev/null
838 @@ -1 +0,0 @@
839 -foo9
840 diff --git a/sm2 b/sm2
841 new file mode 100644
842 index 1234567..89abcde
843 --- /dev/null
844 +++ b/sm2
845 @@ -0,0 +1 @@
846 +submodule-to-blob
847 EOF
848 diff_cmp expected actual
849 '
850
851 rm sm2
852 mv sm2-bak sm2
853
854 test_expect_success 'setup nested submodule' '
855 git -c protocol.file.allow=always -C sm2 submodule add ../sm2 nested &&
856 git -C sm2 commit -a -m "nested sub" &&
857 head10=$(git -C sm2 rev-parse --short --verify HEAD)
858 '
859
860 test_expect_success 'move nested submodule HEAD' '
861 echo "nested content" >sm2/nested/file &&
862 git -C sm2/nested add file &&
863 git -C sm2/nested commit --allow-empty -m "new HEAD" &&
864 head11=$(git -C sm2/nested rev-parse --short --verify HEAD)
865 '
866
867 test_expect_success 'diff --submodule=diff with moved nested submodule HEAD' '
868 cat >expected <<-EOF &&
869 Submodule nested $head9..$head11:
870 diff --git a/nested/file b/nested/file
871 new file mode 100644
872 index 0000000..ca281f5
873 --- /dev/null
874 +++ b/nested/file
875 @@ -0,0 +1 @@
876 +nested content
877 EOF
878 git -C sm2 diff --submodule=diff >actual 2>err &&
879 test_must_be_empty err &&
880 diff_cmp expected actual
881 '
882
883 test_expect_success 'diff --submodule=diff recurses into nested submodules' '
884 cat >expected <<-EOF &&
885 Submodule sm1 $head7...0000000 (submodule deleted)
886 Submodule sm2 contains modified content
887 Submodule sm2 $head9..$head10:
888 diff --git a/sm2/.gitmodules b/sm2/.gitmodules
889 new file mode 100644
890 index 0000000..3a816b8
891 --- /dev/null
892 +++ b/sm2/.gitmodules
893 @@ -0,0 +1,3 @@
894 +[submodule "nested"]
895 + path = nested
896 + url = ../sm2
897 Submodule nested 0000000...$head11 (new submodule)
898 diff --git a/sm2/nested/file b/sm2/nested/file
899 new file mode 100644
900 index 0000000..ca281f5
901 --- /dev/null
902 +++ b/sm2/nested/file
903 @@ -0,0 +1 @@
904 +nested content
905 diff --git a/sm2/nested/foo8 b/sm2/nested/foo8
906 new file mode 100644
907 index 0000000..db9916b
908 --- /dev/null
909 +++ b/sm2/nested/foo8
910 @@ -0,0 +1 @@
911 +foo8
912 diff --git a/sm2/nested/foo9 b/sm2/nested/foo9
913 new file mode 100644
914 index 0000000..9c3b4f6
915 --- /dev/null
916 +++ b/sm2/nested/foo9
917 @@ -0,0 +1 @@
918 +foo9
919 EOF
920 git diff --submodule=diff >actual 2>err &&
921 test_must_be_empty err &&
922 diff_cmp expected actual
923 '
924
925 (cd sm2; commit_file nested)
926 commit_file sm2
927 head12=$(cd sm2; git rev-parse --short --verify HEAD)
928
929 mv sm2 sm2-bak
930
931 test_expect_success 'diff --submodule=diff recurses into deleted nested submodules' '
932 cat >expected <<-EOF &&
933 Submodule sm1 $head7...0000000 (submodule deleted)
934 Submodule sm2 $head12...0000000 (submodule deleted)
935 diff --git a/sm2/.gitmodules b/sm2/.gitmodules
936 deleted file mode 100644
937 index 3a816b8..0000000
938 --- a/sm2/.gitmodules
939 +++ /dev/null
940 @@ -1,3 +0,0 @@
941 -[submodule "nested"]
942 - path = nested
943 - url = ../sm2
944 diff --git a/sm2/foo8 b/sm2/foo8
945 deleted file mode 100644
946 index db9916b..0000000
947 --- a/sm2/foo8
948 +++ /dev/null
949 @@ -1 +0,0 @@
950 -foo8
951 diff --git a/sm2/foo9 b/sm2/foo9
952 deleted file mode 100644
953 index 9c3b4f6..0000000
954 --- a/sm2/foo9
955 +++ /dev/null
956 @@ -1 +0,0 @@
957 -foo9
958 Submodule nested $head11...0000000 (submodule deleted)
959 diff --git a/sm2/nested/file b/sm2/nested/file
960 deleted file mode 100644
961 index ca281f5..0000000
962 --- a/sm2/nested/file
963 +++ /dev/null
964 @@ -1 +0,0 @@
965 -nested content
966 diff --git a/sm2/nested/foo8 b/sm2/nested/foo8
967 deleted file mode 100644
968 index db9916b..0000000
969 --- a/sm2/nested/foo8
970 +++ /dev/null
971 @@ -1 +0,0 @@
972 -foo8
973 diff --git a/sm2/nested/foo9 b/sm2/nested/foo9
974 deleted file mode 100644
975 index 9c3b4f6..0000000
976 --- a/sm2/nested/foo9
977 +++ /dev/null
978 @@ -1 +0,0 @@
979 -foo9
980 EOF
981 git diff --submodule=diff >actual 2>err &&
982 test_must_be_empty err &&
983 diff_cmp expected actual
984 '
985
986 mv sm2-bak sm2
987
988 test_done