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