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