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 () {
14 sm=$1
15 shift
16 owd=$(pwd)
17 cd "$sm"
18 for name; do
19 echo "$name" > "$name" &&
20 git add "$name" &&
21 test_tick &&
22 git commit -m "Add $name"
23 done >/dev/null
24 git rev-parse --verify HEAD | cut -c1-7
25 cd "$owd"
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)
36
37test_expect_success 'added submodule' "
38 git add sm1 &&
39 git diff-index -p --submodule=log HEAD >actual &&
40 diff actual - <<-EOF
41Submodule sm1 0000000...$head1 (new submodule)
42EOF
43"
44
45commit_file sm1 &&
46head2=$(add_file sm1 foo3)
47
48test_expect_success 'modified submodule(forward)' "
49 git diff-index -p --submodule=log HEAD >actual &&
50 diff actual - <<-EOF
51Submodule sm1 $head1..$head2:
52 > Add foo3
53EOF
54"
55
56test_expect_success 'modified submodule(forward)' "
57 git diff --submodule=log >actual &&
58 diff actual - <<-EOF
59Submodule sm1 $head1..$head2:
60 > Add foo3
61EOF
62"
63
64test_expect_success 'modified submodule(forward) --submodule' "
65 git diff --submodule >actual &&
66 diff actual - <<-EOF
67Submodule sm1 $head1..$head2:
68 > Add foo3
69EOF
70"
71
72fullhead1=$(cd sm1; git rev-list --max-count=1 $head1)
73fullhead2=$(cd sm1; git rev-list --max-count=1 $head2)
74test_expect_success 'modified submodule(forward) --submodule=short' "
75 git diff --submodule=short >actual &&
76 diff actual - <<-EOF
77diff --git a/sm1 b/sm1
78index $head1..$head2 160000
79--- a/sm1
80+++ b/sm1
81@@ -1 +1 @@
82-Subproject commit $fullhead1
83+Subproject commit $fullhead2
84EOF
85"
86
87commit_file sm1 &&
88cd sm1 &&
89git reset --hard HEAD~2 >/dev/null &&
90head3=$(git rev-parse --verify HEAD | cut -c1-7) &&
91cd ..
92
93test_expect_success 'modified submodule(backward)' "
94 git diff-index -p --submodule=log HEAD >actual &&
95 diff actual - <<-EOF
96Submodule sm1 $head2..$head3 (rewind):
97 < Add foo3
98 < Add foo2
99EOF
100"
101
102head4=$(add_file sm1 foo4 foo5) &&
103head4_full=$(GIT_DIR=sm1/.git git rev-parse --verify HEAD)
104test_expect_success 'modified submodule(backward and forward)' "
105 git diff-index -p --submodule=log HEAD >actual &&
106 diff actual - <<-EOF
107Submodule sm1 $head2...$head4:
108 > Add foo5
109 > Add foo4
110 < Add foo3
111 < Add foo2
112EOF
113"
114
115commit_file sm1 &&
116mv sm1 sm1-bak &&
117echo sm1 >sm1 &&
118head5=$(git hash-object sm1 | cut -c1-7) &&
119git add sm1 &&
120rm -f sm1 &&
121mv sm1-bak sm1
122
123test_expect_success 'typechanged submodule(submodule->blob), --cached' "
124 git diff --submodule=log --cached >actual &&
125 diff actual - <<-EOF
126Submodule sm1 41fbea9...0000000 (submodule deleted)
127diff --git a/sm1 b/sm1
128new file mode 100644
129index 0000000..9da5fb8
130--- /dev/null
131+++ b/sm1
132@@ -0,0 +1 @@
133+sm1
134EOF
135"
136
137test_expect_success 'typechanged submodule(submodule->blob)' "
138 git diff --submodule=log >actual &&
139 diff actual - <<-EOF
140diff --git a/sm1 b/sm1
141deleted file mode 100644
142index 9da5fb8..0000000
143--- a/sm1
144+++ /dev/null
145@@ -1 +0,0 @@
146-sm1
147Submodule sm1 0000000...$head4 (new submodule)
148EOF
149"
150
151rm -rf sm1 &&
152git checkout-index sm1
153test_expect_success 'typechanged submodule(submodule->blob)' "
154 git diff-index -p --submodule=log HEAD >actual &&
155 diff actual - <<-EOF
156Submodule sm1 $head4...0000000 (submodule deleted)
157diff --git a/sm1 b/sm1
158new file mode 100644
159index 0000000..$head5
160--- /dev/null
161+++ b/sm1
162@@ -0,0 +1 @@
163+sm1
164EOF
165"
166
167rm -f sm1 &&
168test_create_repo sm1 &&
169head6=$(add_file sm1 foo6 foo7)
170fullhead6=$(cd sm1; git rev-list --max-count=1 $head6)
171test_expect_success 'nonexistent commit' "
172 git diff-index -p --submodule=log HEAD >actual &&
173 diff actual - <<-EOF
174Submodule sm1 $head4...$head6 (commits not present)
175EOF
176"
177
178commit_file
179test_expect_success 'typechanged submodule(blob->submodule)' "
180 git diff-index -p --submodule=log HEAD >actual &&
181 diff actual - <<-EOF
182diff --git a/sm1 b/sm1
183deleted file mode 100644
184index $head5..0000000
185--- a/sm1
186+++ /dev/null
187@@ -1 +0,0 @@
188-sm1
189Submodule sm1 0000000...$head6 (new submodule)
190EOF
191"
192
193commit_file sm1 &&
194test_expect_success 'submodule is up to date' "
195 git diff-index -p --submodule=log HEAD >actual &&
196 diff actual - <<-EOF
197EOF
198"
199
200test_expect_success 'submodule contains untracked content' "
201 echo new > sm1/new-file &&
202 git diff-index -p --submodule=log HEAD >actual &&
203 diff actual - <<-EOF
204Submodule sm1 contains untracked content
205EOF
206"
207
208test_expect_success 'submodule contains untracked and modifed content' "
209 echo new > sm1/foo6 &&
210 git diff-index -p --submodule=log HEAD >actual &&
211 diff actual - <<-EOF
212Submodule sm1 contains untracked content
213Submodule sm1 contains modified content
214EOF
215"
216
217test_expect_success 'submodule contains modifed content' "
218 rm -f sm1/new-file &&
219 git diff-index -p --submodule=log HEAD >actual &&
220 diff actual - <<-EOF
221Submodule sm1 contains modified content
222EOF
223"
224
225(cd sm1; git commit -mchange foo6 >/dev/null) &&
226head8=$(cd sm1; git rev-parse --verify HEAD | cut -c1-7) &&
227test_expect_success 'submodule is modified' "
228 git diff-index -p --submodule=log HEAD >actual &&
229 diff actual - <<-EOF
230Submodule sm1 $head6..$head8:
231 > change
232EOF
233"
234
235test_expect_success 'modified submodule contains untracked content' "
236 echo new > sm1/new-file &&
237 git diff-index -p --submodule=log HEAD >actual &&
238 diff actual - <<-EOF
239Submodule sm1 contains untracked content
240Submodule sm1 $head6..$head8:
241 > change
242EOF
243"
244
245test_expect_success 'modified submodule contains untracked and modifed content' "
246 echo modification >> sm1/foo6 &&
247 git diff-index -p --submodule=log HEAD >actual &&
248 diff actual - <<-EOF
249Submodule sm1 contains untracked content
250Submodule sm1 contains modified content
251Submodule sm1 $head6..$head8:
252 > change
253EOF
254"
255
256test_expect_success 'modified submodule contains modifed content' "
257 rm -f sm1/new-file &&
258 git diff-index -p --submodule=log HEAD >actual &&
259 diff actual - <<-EOF
260Submodule sm1 contains modified content
261Submodule sm1 $head6..$head8:
262 > change
263EOF
264"
265
266rm -rf sm1
267test_expect_success 'deleted submodule' "
268 git diff-index -p --submodule=log HEAD >actual &&
269 diff actual - <<-EOF
270Submodule sm1 $head6...0000000 (submodule deleted)
271EOF
272"
273
274test_create_repo sm2 &&
275head7=$(add_file sm2 foo8 foo9) &&
276git add sm2
277
278test_expect_success 'multiple submodules' "
279 git diff-index -p --submodule=log HEAD >actual &&
280 diff actual - <<-EOF
281Submodule sm1 $head6...0000000 (submodule deleted)
282Submodule sm2 0000000...$head7 (new submodule)
283EOF
284"
285
286test_expect_success 'path filter' "
287 git diff-index -p --submodule=log HEAD sm2 >actual &&
288 diff actual - <<-EOF
289Submodule sm2 0000000...$head7 (new submodule)
290EOF
291"
292
293commit_file sm2
294test_expect_success 'given commit' "
295 git diff-index -p --submodule=log HEAD^ >actual &&
296 diff actual - <<-EOF
297Submodule sm1 $head6...0000000 (submodule deleted)
298Submodule sm2 0000000...$head7 (new submodule)
299EOF
300"
301
302test_expect_success 'given commit --submodule' "
303 git diff-index -p --submodule HEAD^ >actual &&
304 diff actual - <<-EOF
305Submodule sm1 $head6...0000000 (submodule deleted)
306Submodule sm2 0000000...$head7 (new submodule)
307EOF
308"
309
310fullhead7=$(cd sm2; git rev-list --max-count=1 $head7)
311
312test_expect_success 'given commit --submodule=short' "
313 git diff-index -p --submodule=short HEAD^ >actual &&
314 diff actual - <<-EOF
315diff --git a/sm1 b/sm1
316deleted file mode 160000
317index $head6..0000000
318--- a/sm1
319+++ /dev/null
320@@ -1 +0,0 @@
321-Subproject commit $fullhead6
322diff --git a/sm2 b/sm2
323new file mode 160000
324index 0000000..$head7
325--- /dev/null
326+++ b/sm2
327@@ -0,0 +1 @@
328+Subproject commit $fullhead7
329EOF
330"
331
332test_expect_success 'setup .git file for sm2' '
333 (cd sm2 &&
334 REAL="$(pwd)/../.real" &&
335 mv .git "$REAL"
336 echo "gitdir: $REAL" >.git)
337'
338
339test_expect_success 'diff --submodule with .git file' '
340 git diff --submodule HEAD^ >actual &&
341 diff actual - <<-EOF
342Submodule sm1 $head6...0000000 (submodule deleted)
343Submodule sm2 0000000...$head7 (new submodule)
344EOF
345'
346
347test_done