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