]> git.ipfire.org Git - thirdparty/git.git/blame - t/t4060-diff-submodule-option-diff-format.sh
Merge branch 'dl/checkout-p-merge-base'
[thirdparty/git.git] / t / t4060-diff-submodule-option-diff-format.sh
CommitLineData
fd47ae6a
JK
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# Tested non-UTF-8 encoding
16test_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.
20added=$(printf "hinzugef\303\274gt")
21
22add_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
40commit_file () {
41 test_tick &&
42 git commit "$@" -m "Commit $*" >/dev/null
43}
44
417e45e5 45diff_cmp () {
46 for i in "$1" "$2"
47 do
48 sed -e 's/^index 0000000\.\.[0-9a-f]*/index 0000000..1234567/' \
49 -e 's/^index [0-9a-f]*\.\.[0-9a-f]*/index 1234567..89abcde/' \
50 "$i" >"$i.compare" || return 1
51 done &&
52 test_cmp "$1.compare" "$2.compare" &&
53 rm -f "$1.compare" "$2.compare"
54}
55
fd47ae6a
JK
56test_expect_success 'setup repository' '
57 test_create_repo sm1 &&
58 add_file . foo &&
59 head1=$(add_file sm1 foo1 foo2) &&
60 fullhead1=$(git -C sm1 rev-parse --verify HEAD)
61'
62
63test_expect_success 'added submodule' '
64 git add sm1 &&
65 git diff-index -p --submodule=diff HEAD >actual &&
66 cat >expected <<-EOF &&
67 Submodule sm1 0000000...$head1 (new submodule)
68 diff --git a/sm1/foo1 b/sm1/foo1
69 new file mode 100644
70 index 0000000..1715acd
71 --- /dev/null
72 +++ b/sm1/foo1
73 @@ -0,0 +1 @@
74 +foo1
75 diff --git a/sm1/foo2 b/sm1/foo2
76 new file mode 100644
77 index 0000000..54b060e
78 --- /dev/null
79 +++ b/sm1/foo2
80 @@ -0,0 +1 @@
81 +foo2
82 EOF
417e45e5 83 diff_cmp expected actual
fd47ae6a
JK
84'
85
86test_expect_success 'added submodule, set diff.submodule' '
87 test_config diff.submodule log &&
88 git add sm1 &&
89 git diff-index -p --submodule=diff HEAD >actual &&
90 cat >expected <<-EOF &&
91 Submodule sm1 0000000...$head1 (new submodule)
92 diff --git a/sm1/foo1 b/sm1/foo1
93 new file mode 100644
94 index 0000000..1715acd
95 --- /dev/null
96 +++ b/sm1/foo1
97 @@ -0,0 +1 @@
98 +foo1
99 diff --git a/sm1/foo2 b/sm1/foo2
100 new file mode 100644
101 index 0000000..54b060e
102 --- /dev/null
103 +++ b/sm1/foo2
104 @@ -0,0 +1 @@
105 +foo2
106 EOF
417e45e5 107 diff_cmp expected actual
fd47ae6a
JK
108'
109
110test_expect_success '--submodule=short overrides diff.submodule' '
111 test_config diff.submodule log &&
112 git add sm1 &&
113 git diff --submodule=short --cached >actual &&
114 cat >expected <<-EOF &&
115 diff --git a/sm1 b/sm1
116 new file mode 160000
117 index 0000000..$head1
118 --- /dev/null
119 +++ b/sm1
120 @@ -0,0 +1 @@
121 +Subproject commit $fullhead1
122 EOF
417e45e5 123 diff_cmp expected actual
fd47ae6a
JK
124'
125
126test_expect_success 'diff.submodule does not affect plumbing' '
127 test_config diff.submodule log &&
128 git diff-index -p HEAD >actual &&
129 cat >expected <<-EOF &&
130 diff --git a/sm1 b/sm1
131 new file mode 160000
132 index 0000000..$head1
133 --- /dev/null
134 +++ b/sm1
135 @@ -0,0 +1 @@
136 +Subproject commit $fullhead1
137 EOF
417e45e5 138 diff_cmp expected actual
fd47ae6a
JK
139'
140
141commit_file sm1 &&
142head2=$(add_file sm1 foo3)
143
144test_expect_success 'modified submodule(forward)' '
145 git diff-index -p --submodule=diff HEAD >actual &&
146 cat >expected <<-EOF &&
147 Submodule sm1 $head1..$head2:
148 diff --git a/sm1/foo3 b/sm1/foo3
149 new file mode 100644
150 index 0000000..c1ec6c6
151 --- /dev/null
152 +++ b/sm1/foo3
153 @@ -0,0 +1 @@
154 +foo3
155 EOF
417e45e5 156 diff_cmp expected actual
fd47ae6a
JK
157'
158
159test_expect_success 'modified submodule(forward)' '
160 git diff --submodule=diff >actual &&
161 cat >expected <<-EOF &&
162 Submodule sm1 $head1..$head2:
163 diff --git a/sm1/foo3 b/sm1/foo3
164 new file mode 100644
165 index 0000000..c1ec6c6
166 --- /dev/null
167 +++ b/sm1/foo3
168 @@ -0,0 +1 @@
169 +foo3
170 EOF
417e45e5 171 diff_cmp expected actual
fd47ae6a
JK
172'
173
174test_expect_success 'modified submodule(forward) --submodule' '
175 git diff --submodule >actual &&
176 cat >expected <<-EOF &&
177 Submodule sm1 $head1..$head2:
178 > Add foo3 ($added foo3)
179 EOF
417e45e5 180 diff_cmp expected actual
fd47ae6a
JK
181'
182
183fullhead2=$(cd sm1; git rev-parse --verify HEAD)
184test_expect_success 'modified submodule(forward) --submodule=short' '
185 git diff --submodule=short >actual &&
186 cat >expected <<-EOF &&
187 diff --git a/sm1 b/sm1
188 index $head1..$head2 160000
189 --- a/sm1
190 +++ b/sm1
191 @@ -1 +1 @@
192 -Subproject commit $fullhead1
193 +Subproject commit $fullhead2
194 EOF
417e45e5 195 diff_cmp expected actual
fd47ae6a
JK
196'
197
198commit_file sm1 &&
199head3=$(
200 cd sm1 &&
201 git reset --hard HEAD~2 >/dev/null &&
202 git rev-parse --short --verify HEAD
203)
204
205test_expect_success 'modified submodule(backward)' '
206 git diff-index -p --submodule=diff HEAD >actual &&
207 cat >expected <<-EOF &&
208 Submodule sm1 $head2..$head3 (rewind):
209 diff --git a/sm1/foo2 b/sm1/foo2
210 deleted file mode 100644
211 index 54b060e..0000000
212 --- a/sm1/foo2
213 +++ /dev/null
214 @@ -1 +0,0 @@
215 -foo2
216 diff --git a/sm1/foo3 b/sm1/foo3
217 deleted file mode 100644
218 index c1ec6c6..0000000
219 --- a/sm1/foo3
220 +++ /dev/null
221 @@ -1 +0,0 @@
222 -foo3
223 EOF
417e45e5 224 diff_cmp expected actual
fd47ae6a
JK
225'
226
227head4=$(add_file sm1 foo4 foo5)
228test_expect_success 'modified submodule(backward and forward)' '
229 git diff-index -p --submodule=diff HEAD >actual &&
230 cat >expected <<-EOF &&
231 Submodule sm1 $head2...$head4:
232 diff --git a/sm1/foo2 b/sm1/foo2
233 deleted file mode 100644
234 index 54b060e..0000000
235 --- a/sm1/foo2
236 +++ /dev/null
237 @@ -1 +0,0 @@
238 -foo2
239 diff --git a/sm1/foo3 b/sm1/foo3
240 deleted file mode 100644
241 index c1ec6c6..0000000
242 --- a/sm1/foo3
243 +++ /dev/null
244 @@ -1 +0,0 @@
245 -foo3
246 diff --git a/sm1/foo4 b/sm1/foo4
247 new file mode 100644
248 index 0000000..a0016db
249 --- /dev/null
250 +++ b/sm1/foo4
251 @@ -0,0 +1 @@
252 +foo4
253 diff --git a/sm1/foo5 b/sm1/foo5
254 new file mode 100644
255 index 0000000..d6f2413
256 --- /dev/null
257 +++ b/sm1/foo5
258 @@ -0,0 +1 @@
259 +foo5
260 EOF
417e45e5 261 diff_cmp expected actual
fd47ae6a
JK
262'
263
264commit_file sm1 &&
265mv sm1 sm1-bak &&
266echo sm1 >sm1 &&
267head5=$(git hash-object sm1 | cut -c1-7) &&
268git add sm1 &&
269rm -f sm1 &&
270mv sm1-bak sm1
271
272test_expect_success 'typechanged submodule(submodule->blob), --cached' '
273 git diff --submodule=diff --cached >actual &&
274 cat >expected <<-EOF &&
275 Submodule sm1 $head4...0000000 (submodule deleted)
276 diff --git a/sm1/foo1 b/sm1/foo1
277 deleted file mode 100644
278 index 1715acd..0000000
279 --- a/sm1/foo1
280 +++ /dev/null
281 @@ -1 +0,0 @@
282 -foo1
283 diff --git a/sm1/foo4 b/sm1/foo4
284 deleted file mode 100644
285 index a0016db..0000000
286 --- a/sm1/foo4
287 +++ /dev/null
288 @@ -1 +0,0 @@
289 -foo4
290 diff --git a/sm1/foo5 b/sm1/foo5
291 deleted file mode 100644
292 index d6f2413..0000000
293 --- a/sm1/foo5
294 +++ /dev/null
295 @@ -1 +0,0 @@
296 -foo5
297 diff --git a/sm1 b/sm1
298 new file mode 100644
299 index 0000000..9da5fb8
300 --- /dev/null
301 +++ b/sm1
302 @@ -0,0 +1 @@
303 +sm1
304 EOF
417e45e5 305 diff_cmp expected actual
fd47ae6a
JK
306'
307
308test_expect_success 'typechanged submodule(submodule->blob)' '
309 git diff --submodule=diff >actual &&
310 cat >expected <<-EOF &&
311 diff --git a/sm1 b/sm1
312 deleted file mode 100644
313 index 9da5fb8..0000000
314 --- a/sm1
315 +++ /dev/null
316 @@ -1 +0,0 @@
317 -sm1
318 Submodule sm1 0000000...$head4 (new submodule)
319 diff --git a/sm1/foo1 b/sm1/foo1
320 new file mode 100644
321 index 0000000..1715acd
322 --- /dev/null
323 +++ b/sm1/foo1
324 @@ -0,0 +1 @@
325 +foo1
326 diff --git a/sm1/foo4 b/sm1/foo4
327 new file mode 100644
328 index 0000000..a0016db
329 --- /dev/null
330 +++ b/sm1/foo4
331 @@ -0,0 +1 @@
332 +foo4
333 diff --git a/sm1/foo5 b/sm1/foo5
334 new file mode 100644
335 index 0000000..d6f2413
336 --- /dev/null
337 +++ b/sm1/foo5
338 @@ -0,0 +1 @@
339 +foo5
340 EOF
417e45e5 341 diff_cmp expected actual
fd47ae6a
JK
342'
343
344rm -rf sm1 &&
345git checkout-index sm1
346test_expect_success 'typechanged submodule(submodule->blob)' '
347 git diff-index -p --submodule=diff HEAD >actual &&
348 cat >expected <<-EOF &&
349 Submodule sm1 $head4...0000000 (submodule deleted)
350 diff --git a/sm1 b/sm1
351 new file mode 100644
352 index 0000000..9da5fb8
353 --- /dev/null
354 +++ b/sm1
355 @@ -0,0 +1 @@
356 +sm1
357 EOF
417e45e5 358 diff_cmp expected actual
fd47ae6a
JK
359'
360
361rm -f sm1 &&
362test_create_repo sm1 &&
363head6=$(add_file sm1 foo6 foo7)
364fullhead6=$(cd sm1; git rev-parse --verify HEAD)
365test_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)
369 EOF
417e45e5 370 diff_cmp expected actual
fd47ae6a
JK
371'
372
373commit_file
374test_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
399 EOF
417e45e5 400 diff_cmp expected actual
fd47ae6a
JK
401'
402
403commit_file sm1 &&
404test_expect_success 'submodule is up to date' '
417e45e5 405 head7=$(git -C sm1 rev-parse --short --verify HEAD) &&
fd47ae6a 406 git diff-index -p --submodule=diff HEAD >actual &&
1c5e94f4 407 test_must_be_empty actual
fd47ae6a
JK
408'
409
410test_expect_success 'submodule contains untracked content' '
411 echo new > sm1/new-file &&
412 git diff-index -p --submodule=diff HEAD >actual &&
413 cat >expected <<-EOF &&
414 Submodule sm1 contains untracked content
415 EOF
417e45e5 416 diff_cmp expected actual
fd47ae6a
JK
417'
418
419test_expect_success 'submodule contains untracked content (untracked ignored)' '
420 git diff-index -p --ignore-submodules=untracked --submodule=diff HEAD >actual &&
ec10b018 421 test_must_be_empty actual
fd47ae6a
JK
422'
423
424test_expect_success 'submodule contains untracked content (dirty ignored)' '
425 git diff-index -p --ignore-submodules=dirty --submodule=diff HEAD >actual &&
ec10b018 426 test_must_be_empty actual
fd47ae6a
JK
427'
428
429test_expect_success 'submodule contains untracked content (all ignored)' '
430 git diff-index -p --ignore-submodules=all --submodule=diff HEAD >actual &&
ec10b018 431 test_must_be_empty actual
fd47ae6a
JK
432'
433
434test_expect_success 'submodule contains untracked and modified content' '
435 echo new > sm1/foo6 &&
436 git diff-index -p --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
447 EOF
417e45e5 448 diff_cmp expected actual
fd47ae6a
JK
449'
450
451# NOT OK
452test_expect_success 'submodule contains untracked and modified content (untracked ignored)' '
453 echo new > sm1/foo6 &&
454 git diff-index -p --ignore-submodules=untracked --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
464 EOF
417e45e5 465 diff_cmp expected actual
fd47ae6a
JK
466'
467
468test_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 &&
ec10b018 471 test_must_be_empty actual
fd47ae6a
JK
472'
473
474test_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 &&
ec10b018 477 test_must_be_empty actual
fd47ae6a
JK
478'
479
480test_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
492 EOF
417e45e5 493 diff_cmp expected actual
fd47ae6a
JK
494'
495
496(cd sm1; git commit -mchange foo6 >/dev/null) &&
497head8=$(cd sm1; git rev-parse --short --verify HEAD) &&
498test_expect_success 'submodule is modified' '
499 git diff-index -p --submodule=diff HEAD >actual &&
500 cat >expected <<-EOF &&
417e45e5 501 Submodule sm1 $head7..$head8:
fd47ae6a
JK
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
509 EOF
417e45e5 510 diff_cmp expected actual
fd47ae6a
JK
511'
512
513test_expect_success 'modified submodule contains untracked content' '
514 echo new > sm1/new-file &&
515 git diff-index -p --submodule=diff HEAD >actual &&
516 cat >expected <<-EOF &&
517 Submodule sm1 contains untracked content
417e45e5 518 Submodule sm1 $head7..$head8:
fd47ae6a
JK
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
526 EOF
417e45e5 527 diff_cmp expected actual
fd47ae6a
JK
528'
529
530test_expect_success 'modified submodule contains untracked content (untracked ignored)' '
531 git diff-index -p --ignore-submodules=untracked --submodule=diff HEAD >actual &&
532 cat >expected <<-EOF &&
417e45e5 533 Submodule sm1 $head7..$head8:
fd47ae6a
JK
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
541 EOF
417e45e5 542 diff_cmp expected actual
fd47ae6a
JK
543'
544
545test_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 &&
417e45e5 548 Submodule sm1 $head7..$head8:
fd47ae6a
JK
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
556 EOF
417e45e5 557 diff_cmp expected actual
fd47ae6a
JK
558'
559
560test_expect_success 'modified submodule contains untracked content (all ignored)' '
561 git diff-index -p --ignore-submodules=all --submodule=diff HEAD >actual &&
ec10b018 562 test_must_be_empty actual
fd47ae6a
JK
563'
564
565test_expect_success 'modified submodule contains untracked and modified content' '
566 echo modification >> sm1/foo6 &&
567 git diff-index -p --submodule=diff HEAD >actual &&
568 cat >expected <<-EOF &&
569 Submodule sm1 contains untracked content
570 Submodule sm1 contains modified content
417e45e5 571 Submodule sm1 $head7..$head8:
fd47ae6a
JK
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
580 EOF
417e45e5 581 diff_cmp expected actual
fd47ae6a
JK
582'
583
584test_expect_success 'modified submodule contains untracked and modified content (untracked ignored)' '
585 echo modification >> sm1/foo6 &&
586 git diff-index -p --ignore-submodules=untracked --submodule=diff HEAD >actual &&
587 cat >expected <<-EOF &&
588 Submodule sm1 contains modified content
417e45e5 589 Submodule sm1 $head7..$head8:
fd47ae6a
JK
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
599 EOF
417e45e5 600 diff_cmp expected actual
fd47ae6a
JK
601'
602
603test_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 &&
417e45e5 607 Submodule sm1 $head7..$head8:
fd47ae6a
JK
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
615 EOF
417e45e5 616 diff_cmp expected actual
fd47ae6a
JK
617'
618
619test_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 &&
ec10b018 622 test_must_be_empty actual
fd47ae6a
JK
623'
624
625# NOT OK
626test_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
417e45e5 631 Submodule sm1 $head7..$head8:
fd47ae6a
JK
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
643 EOF
417e45e5 644 diff_cmp expected actual
fd47ae6a
JK
645'
646
647rm -rf sm1
648test_expect_success 'deleted submodule' '
649 git diff-index -p --submodule=diff HEAD >actual &&
650 cat >expected <<-EOF &&
417e45e5 651 Submodule sm1 $head7...0000000 (submodule deleted)
fd47ae6a 652 EOF
417e45e5 653 diff_cmp expected actual
fd47ae6a
JK
654'
655
17f2f88c
JK
656test_expect_success 'create second submodule' '
657 test_create_repo sm2 &&
417e45e5 658 head9=$(add_file sm2 foo8 foo9) &&
17f2f88c
JK
659 git add sm2
660'
fd47ae6a
JK
661
662test_expect_success 'multiple submodules' '
663 git diff-index -p --submodule=diff HEAD >actual &&
664 cat >expected <<-EOF &&
417e45e5 665 Submodule sm1 $head7...0000000 (submodule deleted)
666 Submodule sm2 0000000...$head9 (new submodule)
fd47ae6a
JK
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
681 EOF
417e45e5 682 diff_cmp expected actual
fd47ae6a
JK
683'
684
685test_expect_success 'path filter' '
686 git diff-index -p --submodule=diff HEAD sm2 >actual &&
687 cat >expected <<-EOF &&
417e45e5 688 Submodule sm2 0000000...$head9 (new submodule)
fd47ae6a
JK
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
703 EOF
417e45e5 704 diff_cmp expected actual
fd47ae6a
JK
705'
706
707commit_file sm2
708test_expect_success 'given commit' '
709 git diff-index -p --submodule=diff HEAD^ >actual &&
710 cat >expected <<-EOF &&
417e45e5 711 Submodule sm1 $head7...0000000 (submodule deleted)
712 Submodule sm2 0000000...$head9 (new submodule)
fd47ae6a
JK
713 diff --git a/sm2/foo8 b/sm2/foo8
714 new file mode 100644
715 index 0000000..db9916b
716 --- /dev/null
717 +++ b/sm2/foo8
718 @@ -0,0 +1 @@
719 +foo8
720 diff --git a/sm2/foo9 b/sm2/foo9
721 new file mode 100644
722 index 0000000..9c3b4f6
723 --- /dev/null
724 +++ b/sm2/foo9
725 @@ -0,0 +1 @@
726 +foo9
727 EOF
417e45e5 728 diff_cmp expected actual
fd47ae6a
JK
729'
730
731test_expect_success 'setup .git file for sm2' '
732 (cd sm2 &&
733 REAL="$(pwd)/../.real" &&
f957f03b 734 mv .git "$REAL" &&
fd47ae6a
JK
735 echo "gitdir: $REAL" >.git)
736'
737
738test_expect_success 'diff --submodule=diff with .git file' '
739 git diff --submodule=diff HEAD^ >actual &&
740 cat >expected <<-EOF &&
417e45e5 741 Submodule sm1 $head7...0000000 (submodule deleted)
742 Submodule sm2 0000000...$head9 (new submodule)
fd47ae6a
JK
743 diff --git a/sm2/foo8 b/sm2/foo8
744 new file mode 100644
745 index 0000000..db9916b
746 --- /dev/null
747 +++ b/sm2/foo8
748 @@ -0,0 +1 @@
749 +foo8
750 diff --git a/sm2/foo9 b/sm2/foo9
751 new file mode 100644
752 index 0000000..9c3b4f6
753 --- /dev/null
754 +++ b/sm2/foo9
755 @@ -0,0 +1 @@
756 +foo9
757 EOF
417e45e5 758 diff_cmp expected actual
fd47ae6a
JK
759'
760
17b254cd
SB
761test_expect_success 'setup nested submodule' '
762 git submodule add -f ./sm2 &&
763 git commit -a -m "add sm2" &&
764 git -C sm2 submodule add ../sm2 nested &&
417e45e5 765 git -C sm2 commit -a -m "nested sub" &&
766 head10=$(git -C sm2 rev-parse --short --verify HEAD)
17b254cd
SB
767'
768
769test_expect_success 'move nested submodule HEAD' '
770 echo "nested content" >sm2/nested/file &&
771 git -C sm2/nested add file &&
417e45e5 772 git -C sm2/nested commit --allow-empty -m "new HEAD" &&
773 head11=$(git -C sm2/nested rev-parse --short --verify HEAD)
17b254cd
SB
774'
775
776test_expect_success 'diff --submodule=diff with moved nested submodule HEAD' '
777 cat >expected <<-EOF &&
417e45e5 778 Submodule nested $head9..$head11:
17b254cd
SB
779 diff --git a/nested/file b/nested/file
780 new file mode 100644
781 index 0000000..ca281f5
782 --- /dev/null
783 +++ b/nested/file
784 @@ -0,0 +1 @@
785 +nested content
786 EOF
787 git -C sm2 diff --submodule=diff >actual 2>err &&
788 test_must_be_empty err &&
417e45e5 789 diff_cmp expected actual
17b254cd
SB
790'
791
5a522142
SB
792test_expect_success 'diff --submodule=diff recurses into nested submodules' '
793 cat >expected <<-EOF &&
794 Submodule sm2 contains modified content
417e45e5 795 Submodule sm2 $head9..$head10:
5a522142
SB
796 diff --git a/sm2/.gitmodules b/sm2/.gitmodules
797 new file mode 100644
798 index 0000000..3a816b8
799 --- /dev/null
800 +++ b/sm2/.gitmodules
801 @@ -0,0 +1,3 @@
802 +[submodule "nested"]
803 + path = nested
804 + url = ../sm2
417e45e5 805 Submodule nested 0000000...$head11 (new submodule)
5a522142
SB
806 diff --git a/sm2/nested/file b/sm2/nested/file
807 new file mode 100644
808 index 0000000..ca281f5
809 --- /dev/null
810 +++ b/sm2/nested/file
811 @@ -0,0 +1 @@
812 +nested content
813 diff --git a/sm2/nested/foo8 b/sm2/nested/foo8
814 new file mode 100644
815 index 0000000..db9916b
816 --- /dev/null
817 +++ b/sm2/nested/foo8
818 @@ -0,0 +1 @@
819 +foo8
820 diff --git a/sm2/nested/foo9 b/sm2/nested/foo9
821 new file mode 100644
822 index 0000000..9c3b4f6
823 --- /dev/null
824 +++ b/sm2/nested/foo9
825 @@ -0,0 +1 @@
826 +foo9
827 EOF
828 git diff --submodule=diff >actual 2>err &&
829 test_must_be_empty err &&
417e45e5 830 diff_cmp expected actual
5a522142
SB
831'
832
fd47ae6a 833test_done