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