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