]> git.ipfire.org Git - thirdparty/git.git/blame - t/t4041-diff-submodule-option.sh
Merge branch 'jc/remove-treesame-parent-in-simplify-merges'
[thirdparty/git.git] / t / t4041-diff-submodule-option.sh
CommitLineData
86140d56
JL
1#!/bin/sh
2#
3# Copyright (c) 2009 Jens Lehmann, based on t7401 by Ping Yin
4#
5
6test_description='Support for verbose submodule differences in git diff
7
8This test tries to verify the sanity of the --submodule option of git diff.
9'
10
11. ./test-lib.sh
12
13add_file () {
2934975f
RR
14 (
15 cd "$1" &&
16 shift &&
17 for name
18 do
19 echo "$name" >"$name" &&
20 git add "$name" &&
21 test_tick &&
22 git commit -m "Add $name" || exit
23 done >/dev/null &&
24 git rev-parse --short --verify HEAD
25 )
86140d56
JL
26}
27commit_file () {
28 test_tick &&
29 git commit "$@" -m "Commit $*" >/dev/null
30}
31
32test_create_repo sm1 &&
33add_file . foo >/dev/null
34
35head1=$(add_file sm1 foo1 foo2)
20fa5385 36fullhead1=$(cd sm1; git rev-parse --verify HEAD)
86140d56 37
a1549f9b 38test_expect_success 'added submodule' '
86140d56
JL
39 git add sm1 &&
40 git diff-index -p --submodule=log HEAD >actual &&
f8d186bb 41 cat >expected <<-EOF &&
a1549f9b
RR
42 Submodule sm1 0000000...$head1 (new submodule)
43 EOF
f8d186bb 44 test_cmp expected actual
a1549f9b 45'
86140d56 46
a1549f9b 47test_expect_success 'added submodule, set diff.submodule' '
c47ef57c
RR
48 git config diff.submodule log &&
49 git add sm1 &&
50 git diff --cached >actual &&
51 cat >expected <<-EOF &&
a1549f9b
RR
52 Submodule sm1 0000000...$head1 (new submodule)
53 EOF
c47ef57c
RR
54 git config --unset diff.submodule &&
55 test_cmp expected actual
a1549f9b 56'
c47ef57c 57
a1549f9b 58test_expect_success '--submodule=short overrides diff.submodule' '
c47ef57c
RR
59 test_config diff.submodule log &&
60 git add sm1 &&
61 git diff --submodule=short --cached >actual &&
62 cat >expected <<-EOF &&
a1549f9b
RR
63 diff --git a/sm1 b/sm1
64 new file mode 160000
65 index 0000000..$head1
66 --- /dev/null
67 +++ b/sm1
68 @@ -0,0 +1 @@
69 +Subproject commit $fullhead1
70 EOF
c47ef57c 71 test_cmp expected actual
a1549f9b 72'
c47ef57c 73
d9c552f1
JK
74test_expect_success 'diff.submodule does not affect plumbing' '
75 test_config diff.submodule log &&
76 git diff-index -p HEAD >actual &&
77 cat >expected <<-EOF &&
78 diff --git a/sm1 b/sm1
79 new file mode 160000
3b13af9d 80 index 0000000..$head1
d9c552f1
JK
81 --- /dev/null
82 +++ b/sm1
83 @@ -0,0 +1 @@
84 +Subproject commit $fullhead1
85 EOF
86 test_cmp expected actual
87'
88
86140d56
JL
89commit_file sm1 &&
90head2=$(add_file sm1 foo3)
91
a1549f9b 92test_expect_success 'modified submodule(forward)' '
86140d56 93 git diff-index -p --submodule=log HEAD >actual &&
f8d186bb 94 cat >expected <<-EOF &&
a1549f9b
RR
95 Submodule sm1 $head1..$head2:
96 > Add foo3
97 EOF
f8d186bb 98 test_cmp expected actual
a1549f9b 99'
86140d56 100
a1549f9b 101test_expect_success 'modified submodule(forward)' '
86140d56 102 git diff --submodule=log >actual &&
f8d186bb 103 cat >expected <<-EOF &&
a1549f9b
RR
104 Submodule sm1 $head1..$head2:
105 > Add foo3
106 EOF
f8d186bb 107 test_cmp expected actual
a1549f9b 108'
86140d56 109
a1549f9b 110test_expect_success 'modified submodule(forward) --submodule' '
86140d56 111 git diff --submodule >actual &&
f8d186bb 112 cat >expected <<-EOF &&
a1549f9b
RR
113 Submodule sm1 $head1..$head2:
114 > Add foo3
115 EOF
f8d186bb 116 test_cmp expected actual
a1549f9b 117'
86140d56 118
20fa5385 119fullhead2=$(cd sm1; git rev-parse --verify HEAD)
a1549f9b 120test_expect_success 'modified submodule(forward) --submodule=short' '
86140d56 121 git diff --submodule=short >actual &&
f8d186bb 122 cat >expected <<-EOF &&
a1549f9b
RR
123 diff --git a/sm1 b/sm1
124 index $head1..$head2 160000
125 --- a/sm1
126 +++ b/sm1
127 @@ -1 +1 @@
128 -Subproject commit $fullhead1
129 +Subproject commit $fullhead2
130 EOF
f8d186bb 131 test_cmp expected actual
a1549f9b 132'
86140d56
JL
133
134commit_file sm1 &&
18a82692
JN
135head3=$(
136 cd sm1 &&
137 git reset --hard HEAD~2 >/dev/null &&
20fa5385 138 git rev-parse --short --verify HEAD
fd4ec4f2 139)
86140d56 140
a1549f9b 141test_expect_success 'modified submodule(backward)' '
86140d56 142 git diff-index -p --submodule=log HEAD >actual &&
f8d186bb 143 cat >expected <<-EOF &&
a1549f9b
RR
144 Submodule sm1 $head2..$head3 (rewind):
145 < Add foo3
146 < Add foo2
147 EOF
f8d186bb 148 test_cmp expected actual
a1549f9b 149'
86140d56 150
a1549f9b
RR
151head4=$(add_file sm1 foo4 foo5)
152test_expect_success 'modified submodule(backward and forward)' '
86140d56 153 git diff-index -p --submodule=log HEAD >actual &&
f8d186bb 154 cat >expected <<-EOF &&
a1549f9b
RR
155 Submodule sm1 $head2...$head4:
156 > Add foo5
157 > Add foo4
158 < Add foo3
159 < Add foo2
160 EOF
f8d186bb 161 test_cmp expected actual
a1549f9b 162'
86140d56
JL
163
164commit_file sm1 &&
165mv sm1 sm1-bak &&
166echo sm1 >sm1 &&
167head5=$(git hash-object sm1 | cut -c1-7) &&
168git add sm1 &&
169rm -f sm1 &&
170mv sm1-bak sm1
171
a1549f9b 172test_expect_success 'typechanged submodule(submodule->blob), --cached' '
86140d56 173 git diff --submodule=log --cached >actual &&
f8d186bb 174 cat >expected <<-EOF &&
a1549f9b
RR
175 Submodule sm1 $head4...0000000 (submodule deleted)
176 diff --git a/sm1 b/sm1
177 new file mode 100644
178 index 0000000..$head5
179 --- /dev/null
180 +++ b/sm1
181 @@ -0,0 +1 @@
182 +sm1
183 EOF
f8d186bb 184 test_cmp expected actual
a1549f9b 185'
86140d56 186
a1549f9b 187test_expect_success 'typechanged submodule(submodule->blob)' '
86140d56 188 git diff --submodule=log >actual &&
f8d186bb 189 cat >expected <<-EOF &&
a1549f9b
RR
190 diff --git a/sm1 b/sm1
191 deleted file mode 100644
192 index $head5..0000000
193 --- a/sm1
194 +++ /dev/null
195 @@ -1 +0,0 @@
196 -sm1
197 Submodule sm1 0000000...$head4 (new submodule)
198 EOF
f8d186bb 199 test_cmp expected actual
a1549f9b 200'
86140d56
JL
201
202rm -rf sm1 &&
203git checkout-index sm1
a1549f9b 204test_expect_success 'typechanged submodule(submodule->blob)' '
86140d56 205 git diff-index -p --submodule=log HEAD >actual &&
f8d186bb 206 cat >expected <<-EOF &&
a1549f9b
RR
207 Submodule sm1 $head4...0000000 (submodule deleted)
208 diff --git a/sm1 b/sm1
209 new file mode 100644
210 index 0000000..$head5
211 --- /dev/null
212 +++ b/sm1
213 @@ -0,0 +1 @@
214 +sm1
215 EOF
f8d186bb 216 test_cmp expected actual
a1549f9b 217'
86140d56
JL
218
219rm -f sm1 &&
220test_create_repo sm1 &&
221head6=$(add_file sm1 foo6 foo7)
20fa5385 222fullhead6=$(cd sm1; git rev-parse --verify HEAD)
a1549f9b 223test_expect_success 'nonexistent commit' '
86140d56 224 git diff-index -p --submodule=log HEAD >actual &&
f8d186bb 225 cat >expected <<-EOF &&
a1549f9b
RR
226 Submodule sm1 $head4...$head6 (commits not present)
227 EOF
f8d186bb 228 test_cmp expected actual
a1549f9b 229'
86140d56
JL
230
231commit_file
a1549f9b 232test_expect_success 'typechanged submodule(blob->submodule)' '
86140d56 233 git diff-index -p --submodule=log HEAD >actual &&
f8d186bb 234 cat >expected <<-EOF &&
a1549f9b
RR
235 diff --git a/sm1 b/sm1
236 deleted file mode 100644
237 index $head5..0000000
238 --- a/sm1
239 +++ /dev/null
240 @@ -1 +0,0 @@
241 -sm1
242 Submodule sm1 0000000...$head6 (new submodule)
243 EOF
f8d186bb 244 test_cmp expected actual
a1549f9b 245'
86140d56
JL
246
247commit_file sm1 &&
a1549f9b 248test_expect_success 'submodule is up to date' '
721ceec1 249 git diff-index -p --submodule=log HEAD >actual &&
f8d186bb 250 cat >expected <<-EOF &&
a1549f9b 251 EOF
f8d186bb 252 test_cmp expected actual
a1549f9b 253'
721ceec1 254
a1549f9b 255test_expect_success 'submodule contains untracked content' '
721ceec1
JL
256 echo new > sm1/new-file &&
257 git diff-index -p --submodule=log HEAD >actual &&
f8d186bb 258 cat >expected <<-EOF &&
a1549f9b
RR
259 Submodule sm1 contains untracked content
260 EOF
f8d186bb 261 test_cmp expected actual
a1549f9b 262'
721ceec1 263
a1549f9b 264test_expect_success 'submodule contains untracked content (untracked ignored)' '
dd44d419 265 git diff-index -p --ignore-submodules=untracked --submodule=log HEAD >actual &&
6ed7ddaa 266 ! test -s actual
a1549f9b 267'
dd44d419 268
a1549f9b 269test_expect_success 'submodule contains untracked content (dirty ignored)' '
dd44d419 270 git diff-index -p --ignore-submodules=dirty --submodule=log HEAD >actual &&
6ed7ddaa 271 ! test -s actual
a1549f9b 272'
dd44d419 273
a1549f9b 274test_expect_success 'submodule contains untracked content (all ignored)' '
dd44d419 275 git diff-index -p --ignore-submodules=all --submodule=log HEAD >actual &&
6ed7ddaa 276 ! test -s actual
a1549f9b 277'
dd44d419 278
a1549f9b 279test_expect_success 'submodule contains untracked and modifed content' '
721ceec1
JL
280 echo new > sm1/foo6 &&
281 git diff-index -p --submodule=log HEAD >actual &&
f8d186bb 282 cat >expected <<-EOF &&
a1549f9b
RR
283 Submodule sm1 contains untracked content
284 Submodule sm1 contains modified content
285 EOF
f8d186bb 286 test_cmp expected actual
a1549f9b 287'
721ceec1 288
a1549f9b 289test_expect_success 'submodule contains untracked and modifed content (untracked ignored)' '
dd44d419
JL
290 echo new > sm1/foo6 &&
291 git diff-index -p --ignore-submodules=untracked --submodule=log HEAD >actual &&
f8d186bb 292 cat >expected <<-EOF &&
a1549f9b
RR
293 Submodule sm1 contains modified content
294 EOF
f8d186bb 295 test_cmp expected actual
a1549f9b 296'
dd44d419 297
a1549f9b 298test_expect_success 'submodule contains untracked and modifed content (dirty ignored)' '
dd44d419
JL
299 echo new > sm1/foo6 &&
300 git diff-index -p --ignore-submodules=dirty --submodule=log HEAD >actual &&
6ed7ddaa 301 ! test -s actual
a1549f9b 302'
dd44d419 303
a1549f9b 304test_expect_success 'submodule contains untracked and modifed content (all ignored)' '
dd44d419
JL
305 echo new > sm1/foo6 &&
306 git diff-index -p --ignore-submodules --submodule=log HEAD >actual &&
6ed7ddaa 307 ! test -s actual
a1549f9b 308'
dd44d419 309
a1549f9b 310test_expect_success 'submodule contains modifed content' '
721ceec1
JL
311 rm -f sm1/new-file &&
312 git diff-index -p --submodule=log HEAD >actual &&
f8d186bb 313 cat >expected <<-EOF &&
a1549f9b
RR
314 Submodule sm1 contains modified content
315 EOF
f8d186bb 316 test_cmp expected actual
a1549f9b 317'
721ceec1
JL
318
319(cd sm1; git commit -mchange foo6 >/dev/null) &&
20fa5385 320head8=$(cd sm1; git rev-parse --short --verify HEAD) &&
a1549f9b 321test_expect_success 'submodule is modified' '
721ceec1 322 git diff-index -p --submodule=log HEAD >actual &&
f8d186bb 323 cat >expected <<-EOF &&
a1549f9b
RR
324 Submodule sm1 $head6..$head8:
325 > change
326 EOF
f8d186bb 327 test_cmp expected actual
a1549f9b 328'
721ceec1 329
a1549f9b 330test_expect_success 'modified submodule contains untracked content' '
721ceec1
JL
331 echo new > sm1/new-file &&
332 git diff-index -p --submodule=log HEAD >actual &&
f8d186bb 333 cat >expected <<-EOF &&
a1549f9b
RR
334 Submodule sm1 contains untracked content
335 Submodule sm1 $head6..$head8:
336 > change
337 EOF
f8d186bb 338 test_cmp expected actual
a1549f9b 339'
721ceec1 340
a1549f9b 341test_expect_success 'modified submodule contains untracked content (untracked ignored)' '
dd44d419 342 git diff-index -p --ignore-submodules=untracked --submodule=log HEAD >actual &&
f8d186bb 343 cat >expected <<-EOF &&
a1549f9b
RR
344 Submodule sm1 $head6..$head8:
345 > change
346 EOF
f8d186bb 347 test_cmp expected actual
a1549f9b 348'
dd44d419 349
a1549f9b 350test_expect_success 'modified submodule contains untracked content (dirty ignored)' '
dd44d419 351 git diff-index -p --ignore-submodules=dirty --submodule=log HEAD >actual &&
f8d186bb 352 cat >expected <<-EOF &&
a1549f9b
RR
353 Submodule sm1 $head6..$head8:
354 > change
355 EOF
f8d186bb 356 test_cmp expected actual
a1549f9b 357'
dd44d419 358
a1549f9b 359test_expect_success 'modified submodule contains untracked content (all ignored)' '
dd44d419 360 git diff-index -p --ignore-submodules=all --submodule=log HEAD >actual &&
6ed7ddaa 361 ! test -s actual
a1549f9b 362'
dd44d419 363
a1549f9b 364test_expect_success 'modified submodule contains untracked and modifed content' '
721ceec1
JL
365 echo modification >> sm1/foo6 &&
366 git diff-index -p --submodule=log HEAD >actual &&
f8d186bb 367 cat >expected <<-EOF &&
a1549f9b
RR
368 Submodule sm1 contains untracked content
369 Submodule sm1 contains modified content
370 Submodule sm1 $head6..$head8:
371 > change
372 EOF
f8d186bb 373 test_cmp expected actual
a1549f9b 374'
721ceec1 375
a1549f9b 376test_expect_success 'modified submodule contains untracked and modifed content (untracked ignored)' '
dd44d419
JL
377 echo modification >> sm1/foo6 &&
378 git diff-index -p --ignore-submodules=untracked --submodule=log HEAD >actual &&
f8d186bb 379 cat >expected <<-EOF &&
a1549f9b
RR
380 Submodule sm1 contains modified content
381 Submodule sm1 $head6..$head8:
382 > change
383 EOF
f8d186bb 384 test_cmp expected actual
a1549f9b 385'
dd44d419 386
a1549f9b 387test_expect_success 'modified submodule contains untracked and modifed content (dirty ignored)' '
dd44d419
JL
388 echo modification >> sm1/foo6 &&
389 git diff-index -p --ignore-submodules=dirty --submodule=log HEAD >actual &&
f8d186bb 390 cat >expected <<-EOF &&
a1549f9b
RR
391 Submodule sm1 $head6..$head8:
392 > change
393 EOF
f8d186bb 394 test_cmp expected actual
a1549f9b 395'
dd44d419 396
a1549f9b 397test_expect_success 'modified submodule contains untracked and modifed content (all ignored)' '
dd44d419
JL
398 echo modification >> sm1/foo6 &&
399 git diff-index -p --ignore-submodules --submodule=log HEAD >actual &&
6ed7ddaa 400 ! test -s actual
a1549f9b 401'
dd44d419 402
a1549f9b 403test_expect_success 'modified submodule contains modifed content' '
721ceec1
JL
404 rm -f sm1/new-file &&
405 git diff-index -p --submodule=log HEAD >actual &&
f8d186bb 406 cat >expected <<-EOF &&
a1549f9b
RR
407 Submodule sm1 contains modified content
408 Submodule sm1 $head6..$head8:
409 > change
410 EOF
f8d186bb 411 test_cmp expected actual
a1549f9b 412'
721ceec1 413
86140d56 414rm -rf sm1
a1549f9b 415test_expect_success 'deleted submodule' '
86140d56 416 git diff-index -p --submodule=log HEAD >actual &&
f8d186bb 417 cat >expected <<-EOF &&
a1549f9b
RR
418 Submodule sm1 $head6...0000000 (submodule deleted)
419 EOF
f8d186bb 420 test_cmp expected actual
a1549f9b 421'
86140d56
JL
422
423test_create_repo sm2 &&
424head7=$(add_file sm2 foo8 foo9) &&
425git add sm2
426
a1549f9b 427test_expect_success 'multiple submodules' '
86140d56 428 git diff-index -p --submodule=log HEAD >actual &&
f8d186bb 429 cat >expected <<-EOF &&
a1549f9b
RR
430 Submodule sm1 $head6...0000000 (submodule deleted)
431 Submodule sm2 0000000...$head7 (new submodule)
432 EOF
f8d186bb 433 test_cmp expected actual
a1549f9b 434'
86140d56 435
a1549f9b 436test_expect_success 'path filter' '
86140d56 437 git diff-index -p --submodule=log HEAD sm2 >actual &&
f8d186bb 438 cat >expected <<-EOF &&
a1549f9b
RR
439 Submodule sm2 0000000...$head7 (new submodule)
440 EOF
f8d186bb 441 test_cmp expected actual
a1549f9b 442'
86140d56
JL
443
444commit_file sm2
a1549f9b 445test_expect_success 'given commit' '
86140d56 446 git diff-index -p --submodule=log HEAD^ >actual &&
f8d186bb 447 cat >expected <<-EOF &&
a1549f9b
RR
448 Submodule sm1 $head6...0000000 (submodule deleted)
449 Submodule sm2 0000000...$head7 (new submodule)
450 EOF
f8d186bb 451 test_cmp expected actual
a1549f9b 452'
86140d56 453
a1549f9b 454test_expect_success 'given commit --submodule' '
86140d56 455 git diff-index -p --submodule HEAD^ >actual &&
f8d186bb 456 cat >expected <<-EOF &&
a1549f9b
RR
457 Submodule sm1 $head6...0000000 (submodule deleted)
458 Submodule sm2 0000000...$head7 (new submodule)
459 EOF
f8d186bb 460 test_cmp expected actual
a1549f9b 461'
86140d56 462
20fa5385 463fullhead7=$(cd sm2; git rev-parse --verify HEAD)
86140d56 464
a1549f9b 465test_expect_success 'given commit --submodule=short' '
86140d56 466 git diff-index -p --submodule=short HEAD^ >actual &&
f8d186bb 467 cat >expected <<-EOF &&
a1549f9b
RR
468 diff --git a/sm1 b/sm1
469 deleted file mode 160000
470 index $head6..0000000
471 --- a/sm1
472 +++ /dev/null
473 @@ -1 +0,0 @@
474 -Subproject commit $fullhead6
475 diff --git a/sm2 b/sm2
476 new file mode 160000
477 index 0000000..$head7
478 --- /dev/null
479 +++ b/sm2
480 @@ -0,0 +1 @@
481 +Subproject commit $fullhead7
482 EOF
483 test_cmp expected actual
484'
86140d56 485
eee49b6c
JL
486test_expect_success 'setup .git file for sm2' '
487 (cd sm2 &&
488 REAL="$(pwd)/../.real" &&
489 mv .git "$REAL"
490 echo "gitdir: $REAL" >.git)
491'
492
493test_expect_success 'diff --submodule with .git file' '
494 git diff --submodule HEAD^ >actual &&
f8d186bb 495 cat >expected <<-EOF &&
a1549f9b
RR
496 Submodule sm1 $head6...0000000 (submodule deleted)
497 Submodule sm2 0000000...$head7 (new submodule)
498 EOF
f8d186bb 499 test_cmp expected actual
eee49b6c
JL
500'
501
5e73633d
HV
502test_expect_success 'diff --submodule with objects referenced by alternates' '
503 mkdir sub_alt &&
504 (cd sub_alt &&
505 git init &&
506 echo a >a &&
507 git add a &&
508 git commit -m a
509 ) &&
510 mkdir super &&
511 (cd super &&
512 git clone -s ../sub_alt sub &&
513 git init &&
514 git add sub &&
515 git commit -m "sub a"
516 ) &&
517 (cd sub_alt &&
518 sha1_before=$(git rev-parse --short HEAD)
519 echo b >b &&
520 git add b &&
521 git commit -m b
522 sha1_after=$(git rev-parse --short HEAD)
523 echo "Submodule sub $sha1_before..$sha1_after:
524 > b" >../expected
525 ) &&
526 (cd super &&
527 (cd sub &&
528 git fetch &&
529 git checkout origin/master
530 ) &&
531 git diff --submodule > ../actual
532 )
533 test_cmp expected actual
534'
535
86140d56 536test_done