3 # Copyright (c) 2009 Jens Lehmann, based on t7401 by Ping Yin
4 # Copyright (c) 2011 Alexey Shumkin (+ non-UTF-8 commit encoding tests)
7 test_description
='Support for verbose submodule differences in git diff
9 This test tries to verify the sanity of the --submodule option of git diff.
14 # Tested non-UTF-8 encoding
15 test_encoding
="ISO8859-1"
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.
19 added
=$
(printf "hinzugef\303\274gt")
26 echo "$name" >"$name" &&
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 -
34 git rev-parse
--short --verify HEAD
39 git commit
"$@" -m "Commit $*" >/dev
/null
42 test_create_repo sm1
&&
43 add_file . foo
>/dev
/null
45 head1
=$
(add_file sm1 foo1 foo2
)
46 fullhead1
=$
(cd sm1
; git rev-parse
--verify HEAD
)
48 test_expect_success
'added submodule' '
50 git diff-index -p --submodule=log HEAD >actual &&
51 cat >expected <<-EOF &&
52 Submodule sm1 0000000...$head1 (new submodule)
54 test_cmp expected actual
57 test_expect_success
'added submodule, set diff.submodule' '
58 git config diff.submodule log &&
60 git diff --cached >actual &&
61 cat >expected <<-EOF &&
62 Submodule sm1 0000000...$head1 (new submodule)
64 git config --unset diff.submodule &&
65 test_cmp expected actual
68 test_expect_success
'--submodule=short overrides diff.submodule' '
69 test_config diff.submodule log &&
71 git diff --submodule=short --cached >actual &&
72 cat >expected <<-EOF &&
73 diff --git a/sm1 b/sm1
79 +Subproject commit $fullhead1
81 test_cmp expected actual
84 test_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
94 +Subproject commit $fullhead1
96 test_cmp expected actual
100 head2
=$
(add_file sm1 foo3
)
102 test_expect_success
'modified submodule(forward)' '
103 git diff-index -p --submodule=log HEAD >actual &&
104 cat >expected <<-EOF &&
105 Submodule sm1 $head1..$head2:
106 > Add foo3 ($added foo3)
108 test_cmp expected actual
111 test_expect_success
'modified submodule(forward)' '
112 git diff --submodule=log >actual &&
113 cat >expected <<-EOF &&
114 Submodule sm1 $head1..$head2:
115 > Add foo3 ($added foo3)
117 test_cmp expected actual
120 test_expect_success
'modified submodule(forward) --submodule' '
121 git diff --submodule >actual &&
122 cat >expected <<-EOF &&
123 Submodule sm1 $head1..$head2:
124 > Add foo3 ($added foo3)
126 test_cmp expected actual
129 fullhead2
=$
(cd sm1
; git rev-parse
--verify HEAD
)
130 test_expect_success
'modified submodule(forward) --submodule=short' '
131 git diff --submodule=short >actual &&
132 cat >expected <<-EOF &&
133 diff --git a/sm1 b/sm1
134 index $head1..$head2 160000
138 -Subproject commit $fullhead1
139 +Subproject commit $fullhead2
141 test_cmp expected actual
147 git
reset --hard HEAD~
2 >/dev
/null
&&
148 git rev-parse
--short --verify HEAD
151 test_expect_success
'modified submodule(backward)' '
152 git diff-index -p --submodule=log HEAD >actual &&
153 cat >expected <<-EOF &&
154 Submodule sm1 $head2..$head3 (rewind):
155 < Add foo3 ($added foo3)
156 < Add foo2 ($added foo2)
158 test_cmp expected actual
161 head4
=$
(add_file sm1 foo4 foo5
)
162 test_expect_success
'modified submodule(backward and forward)' '
163 git diff-index -p --submodule=log HEAD >actual &&
164 cat >expected <<-EOF &&
165 Submodule sm1 $head2...$head4:
166 > Add foo5 ($added foo5)
167 > Add foo4 ($added foo4)
168 < Add foo3 ($added foo3)
169 < Add foo2 ($added foo2)
171 test_cmp expected actual
177 head5
=$
(git hash-object sm1 | cut
-c1-7) &&
182 test_expect_success
'typechanged submodule(submodule->blob), --cached' '
183 git diff --submodule=log --cached >actual &&
184 cat >expected <<-EOF &&
185 Submodule sm1 $head4...0000000 (submodule deleted)
186 diff --git a/sm1 b/sm1
188 index 0000000..$head5
194 test_cmp expected actual
197 test_expect_success
'typechanged submodule(submodule->blob)' '
198 git diff --submodule=log >actual &&
199 cat >expected <<-EOF &&
200 diff --git a/sm1 b/sm1
201 deleted file mode 100644
202 index $head5..0000000
207 Submodule sm1 0000000...$head4 (new submodule)
209 test_cmp expected actual
213 git checkout-index sm1
214 test_expect_success
'typechanged submodule(submodule->blob)' '
215 git diff-index -p --submodule=log HEAD >actual &&
216 cat >expected <<-EOF &&
217 Submodule sm1 $head4...0000000 (submodule deleted)
218 diff --git a/sm1 b/sm1
220 index 0000000..$head5
226 test_cmp expected actual
230 test_create_repo sm1
&&
231 head6
=$
(add_file sm1 foo6 foo7
)
232 fullhead6
=$
(cd sm1
; git rev-parse
--verify HEAD
)
233 test_expect_success
'nonexistent commit' '
234 git diff-index -p --submodule=log HEAD >actual &&
235 cat >expected <<-EOF &&
236 Submodule sm1 $head4...$head6 (commits not present)
238 test_cmp expected actual
242 test_expect_success
'typechanged submodule(blob->submodule)' '
243 git diff-index -p --submodule=log HEAD >actual &&
244 cat >expected <<-EOF &&
245 diff --git a/sm1 b/sm1
246 deleted file mode 100644
247 index $head5..0000000
252 Submodule sm1 0000000...$head6 (new submodule)
254 test_cmp expected actual
258 test_expect_success
'submodule is up to date' '
259 git diff-index -p --submodule=log HEAD >actual &&
260 test_must_be_empty actual
263 test_expect_success
'submodule contains untracked content' '
264 echo new > sm1/new-file &&
265 git diff-index -p --submodule=log HEAD >actual &&
266 cat >expected <<-EOF &&
267 Submodule sm1 contains untracked content
269 test_cmp expected actual
272 test_expect_success
'submodule contains untracked content (untracked ignored)' '
273 git diff-index -p --ignore-submodules=untracked --submodule=log HEAD >actual &&
274 test_must_be_empty actual
277 test_expect_success
'submodule contains untracked content (dirty ignored)' '
278 git diff-index -p --ignore-submodules=dirty --submodule=log HEAD >actual &&
279 test_must_be_empty actual
282 test_expect_success
'submodule contains untracked content (all ignored)' '
283 git diff-index -p --ignore-submodules=all --submodule=log HEAD >actual &&
284 test_must_be_empty actual
287 test_expect_success
'submodule contains untracked and modifed content' '
288 echo new > sm1/foo6 &&
289 git diff-index -p --submodule=log HEAD >actual &&
290 cat >expected <<-EOF &&
291 Submodule sm1 contains untracked content
292 Submodule sm1 contains modified content
294 test_cmp expected actual
297 test_expect_success
'submodule contains untracked and modifed content (untracked ignored)' '
298 echo new > sm1/foo6 &&
299 git diff-index -p --ignore-submodules=untracked --submodule=log HEAD >actual &&
300 cat >expected <<-EOF &&
301 Submodule sm1 contains modified content
303 test_cmp expected actual
306 test_expect_success
'submodule contains untracked and modifed content (dirty ignored)' '
307 echo new > sm1/foo6 &&
308 git diff-index -p --ignore-submodules=dirty --submodule=log HEAD >actual &&
309 test_must_be_empty actual
312 test_expect_success
'submodule contains untracked and modifed content (all ignored)' '
313 echo new > sm1/foo6 &&
314 git diff-index -p --ignore-submodules --submodule=log HEAD >actual &&
315 test_must_be_empty actual
318 test_expect_success
'submodule contains modifed content' '
319 rm -f sm1/new-file &&
320 git diff-index -p --submodule=log HEAD >actual &&
321 cat >expected <<-EOF &&
322 Submodule sm1 contains modified content
324 test_cmp expected actual
327 (cd sm1
; git commit
-mchange foo6
>/dev
/null
) &&
328 head8
=$
(cd sm1
; git rev-parse
--short --verify HEAD
) &&
329 test_expect_success
'submodule is modified' '
330 git diff-index -p --submodule=log HEAD >actual &&
331 cat >expected <<-EOF &&
332 Submodule sm1 $head6..$head8:
335 test_cmp expected actual
338 test_expect_success
'modified submodule contains untracked content' '
339 echo new > sm1/new-file &&
340 git diff-index -p --submodule=log HEAD >actual &&
341 cat >expected <<-EOF &&
342 Submodule sm1 contains untracked content
343 Submodule sm1 $head6..$head8:
346 test_cmp expected actual
349 test_expect_success
'modified submodule contains untracked content (untracked ignored)' '
350 git diff-index -p --ignore-submodules=untracked --submodule=log HEAD >actual &&
351 cat >expected <<-EOF &&
352 Submodule sm1 $head6..$head8:
355 test_cmp expected actual
358 test_expect_success
'modified submodule contains untracked content (dirty ignored)' '
359 git diff-index -p --ignore-submodules=dirty --submodule=log HEAD >actual &&
360 cat >expected <<-EOF &&
361 Submodule sm1 $head6..$head8:
364 test_cmp expected actual
367 test_expect_success
'modified submodule contains untracked content (all ignored)' '
368 git diff-index -p --ignore-submodules=all --submodule=log HEAD >actual &&
369 test_must_be_empty actual
372 test_expect_success
'modified submodule contains untracked and modifed content' '
373 echo modification >> sm1/foo6 &&
374 git diff-index -p --submodule=log HEAD >actual &&
375 cat >expected <<-EOF &&
376 Submodule sm1 contains untracked content
377 Submodule sm1 contains modified content
378 Submodule sm1 $head6..$head8:
381 test_cmp expected actual
384 test_expect_success
'modified submodule contains untracked and modifed content (untracked ignored)' '
385 echo modification >> sm1/foo6 &&
386 git diff-index -p --ignore-submodules=untracked --submodule=log HEAD >actual &&
387 cat >expected <<-EOF &&
388 Submodule sm1 contains modified content
389 Submodule sm1 $head6..$head8:
392 test_cmp expected actual
395 test_expect_success
'modified submodule contains untracked and modifed content (dirty ignored)' '
396 echo modification >> sm1/foo6 &&
397 git diff-index -p --ignore-submodules=dirty --submodule=log HEAD >actual &&
398 cat >expected <<-EOF &&
399 Submodule sm1 $head6..$head8:
402 test_cmp expected actual
405 test_expect_success
'modified submodule contains untracked and modifed content (all ignored)' '
406 echo modification >> sm1/foo6 &&
407 git diff-index -p --ignore-submodules --submodule=log HEAD >actual &&
408 test_must_be_empty actual
411 test_expect_success
'modified submodule contains modifed content' '
412 rm -f sm1/new-file &&
413 git diff-index -p --submodule=log HEAD >actual &&
414 cat >expected <<-EOF &&
415 Submodule sm1 contains modified content
416 Submodule sm1 $head6..$head8:
419 test_cmp expected actual
423 test_expect_success
'deleted submodule' '
424 git diff-index -p --submodule=log HEAD >actual &&
425 cat >expected <<-EOF &&
426 Submodule sm1 $head6...0000000 (submodule deleted)
428 test_cmp expected actual
431 test_expect_success
'create second submodule' '
432 test_create_repo sm2 &&
433 head7=$(add_file sm2 foo8 foo9) &&
437 test_expect_success
'multiple submodules' '
438 git diff-index -p --submodule=log HEAD >actual &&
439 cat >expected <<-EOF &&
440 Submodule sm1 $head6...0000000 (submodule deleted)
441 Submodule sm2 0000000...$head7 (new submodule)
443 test_cmp expected actual
446 test_expect_success
'path filter' '
447 git diff-index -p --submodule=log HEAD sm2 >actual &&
448 cat >expected <<-EOF &&
449 Submodule sm2 0000000...$head7 (new submodule)
451 test_cmp expected actual
455 test_expect_success
'given commit' '
456 git diff-index -p --submodule=log HEAD^ >actual &&
457 cat >expected <<-EOF &&
458 Submodule sm1 $head6...0000000 (submodule deleted)
459 Submodule sm2 0000000...$head7 (new submodule)
461 test_cmp expected actual
464 test_expect_success
'given commit --submodule' '
465 git diff-index -p --submodule HEAD^ >actual &&
466 cat >expected <<-EOF &&
467 Submodule sm1 $head6...0000000 (submodule deleted)
468 Submodule sm2 0000000...$head7 (new submodule)
470 test_cmp expected actual
473 fullhead7
=$
(cd sm2
; git rev-parse
--verify HEAD
)
475 test_expect_success
'given commit --submodule=short' '
476 git diff-index -p --submodule=short HEAD^ >actual &&
477 cat >expected <<-EOF &&
478 diff --git a/sm1 b/sm1
479 deleted file mode 160000
480 index $head6..0000000
484 -Subproject commit $fullhead6
485 diff --git a/sm2 b/sm2
487 index 0000000..$head7
491 +Subproject commit $fullhead7
493 test_cmp expected actual
496 test_expect_success
'setup .git file for sm2' '
498 REAL="$(pwd)/../.real" &&
500 echo "gitdir: $REAL" >.git)
503 test_expect_success
'diff --submodule with .git file' '
504 git diff --submodule HEAD^ >actual &&
505 cat >expected <<-EOF &&
506 Submodule sm1 $head6...0000000 (submodule deleted)
507 Submodule sm2 0000000...$head7 (new submodule)
509 test_cmp expected actual
512 test_expect_success
'diff --submodule with objects referenced by alternates' '
522 git clone -s ../sub_alt sub &&
525 git commit -m "sub a"
528 sha1_before=$(git rev-parse --short HEAD) &&
532 sha1_after=$(git rev-parse --short HEAD) &&
534 echo "Submodule sub $sha1_before..$sha1_after:" &&
541 git checkout origin/master
543 git diff --submodule > ../actual
545 test_cmp expected actual