1 #!/bin/sh
2 #
3 # Copyright (c) 2009 Jens Lehmann, based on t7401 by Ping Yin
4 #
6 test_description='Support for verbose submodule differences in git diff
8 This test tries to verify the sanity of the --submodule option of git diff.
9 '
11 . ./test-lib.sh
13 add_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 }
27 commit_file () {
28 test_tick &&
29 git commit "$@" -m "Commit $*" >/dev/null
30 }
32 test_create_repo sm1 &&
33 add_file . foo >/dev/null
35 head1=$(add_file sm1 foo1 foo2)
37 test_expect_success 'added submodule' "
38 git add sm1 &&
39 git diff-index -p --submodule=log HEAD >actual &&
40 diff actual - <<-EOF
41 Submodule sm1 0000000...$head1 (new submodule)
42 EOF
43 "
45 commit_file sm1 &&
46 head2=$(add_file sm1 foo3)
48 test_expect_success 'modified submodule(forward)' "
49 git diff-index -p --submodule=log HEAD >actual &&
50 diff actual - <<-EOF
51 Submodule sm1 $head1..$head2:
52 > Add foo3
53 EOF
54 "
56 test_expect_success 'modified submodule(forward)' "
57 git diff --submodule=log >actual &&
58 diff actual - <<-EOF
59 Submodule sm1 $head1..$head2:
60 > Add foo3
61 EOF
62 "
64 test_expect_success 'modified submodule(forward) --submodule' "
65 git diff --submodule >actual &&
66 diff actual - <<-EOF
67 Submodule sm1 $head1..$head2:
68 > Add foo3
69 EOF
70 "
72 fullhead1=$(cd sm1; git rev-list --max-count=1 $head1)
73 fullhead2=$(cd sm1; git rev-list --max-count=1 $head2)
74 test_expect_success 'modified submodule(forward) --submodule=short' "
75 git diff --submodule=short >actual &&
76 diff actual - <<-EOF
77 diff --git a/sm1 b/sm1
78 index $head1..$head2 160000
79 --- a/sm1
80 +++ b/sm1
81 @@ -1 +1 @@
82 -Subproject commit $fullhead1
83 +Subproject commit $fullhead2
84 EOF
85 "
87 commit_file sm1 &&
88 cd sm1 &&
89 git reset --hard HEAD~2 >/dev/null &&
90 head3=$(git rev-parse --verify HEAD | cut -c1-7) &&
91 cd ..
93 test_expect_success 'modified submodule(backward)' "
94 git diff-index -p --submodule=log HEAD >actual &&
95 diff actual - <<-EOF
96 Submodule sm1 $head2..$head3 (rewind):
97 < Add foo3
98 < Add foo2
99 EOF
100 "
102 head4=$(add_file sm1 foo4 foo5) &&
103 head4_full=$(GIT_DIR=sm1/.git git rev-parse --verify HEAD)
104 test_expect_success 'modified submodule(backward and forward)' "
105 git diff-index -p --submodule=log HEAD >actual &&
106 diff actual - <<-EOF
107 Submodule sm1 $head2...$head4:
108 > Add foo5
109 > Add foo4
110 < Add foo3
111 < Add foo2
112 EOF
113 "
115 commit_file sm1 &&
116 mv sm1 sm1-bak &&
117 echo sm1 >sm1 &&
118 head5=$(git hash-object sm1 | cut -c1-7) &&
119 git add sm1 &&
120 rm -f sm1 &&
121 mv sm1-bak sm1
123 test_expect_success 'typechanged submodule(submodule->blob), --cached' "
124 git diff --submodule=log --cached >actual &&
125 diff actual - <<-EOF
126 Submodule sm1 41fbea9...0000000 (submodule deleted)
127 diff --git a/sm1 b/sm1
128 new file mode 100644
129 index 0000000..9da5fb8
130 --- /dev/null
131 +++ b/sm1
132 @@ -0,0 +1 @@
133 +sm1
134 EOF
135 "
137 test_expect_success 'typechanged submodule(submodule->blob)' "
138 git diff --submodule=log >actual &&
139 diff actual - <<-EOF
140 diff --git a/sm1 b/sm1
141 deleted file mode 100644
142 index 9da5fb8..0000000
143 --- a/sm1
144 +++ /dev/null
145 @@ -1 +0,0 @@
146 -sm1
147 Submodule sm1 0000000...$head4 (new submodule)
148 EOF
149 "
151 rm -rf sm1 &&
152 git checkout-index sm1
153 test_expect_success 'typechanged submodule(submodule->blob)' "
154 git diff-index -p --submodule=log HEAD >actual &&
155 diff actual - <<-EOF
156 Submodule sm1 $head4...0000000 (submodule deleted)
157 diff --git a/sm1 b/sm1
158 new file mode 100644
159 index 0000000..$head5
160 --- /dev/null
161 +++ b/sm1
162 @@ -0,0 +1 @@
163 +sm1
164 EOF
165 "
167 rm -f sm1 &&
168 test_create_repo sm1 &&
169 head6=$(add_file sm1 foo6 foo7)
170 fullhead6=$(cd sm1; git rev-list --max-count=1 $head6)
171 test_expect_success 'nonexistent commit' "
172 git diff-index -p --submodule=log HEAD >actual &&
173 diff actual - <<-EOF
174 Submodule sm1 $head4...$head6 (commits not present)
175 EOF
176 "
178 commit_file
179 test_expect_success 'typechanged submodule(blob->submodule)' "
180 git diff-index -p --submodule=log HEAD >actual &&
181 diff actual - <<-EOF
182 diff --git a/sm1 b/sm1
183 deleted file mode 100644
184 index $head5..0000000
185 --- a/sm1
186 +++ /dev/null
187 @@ -1 +0,0 @@
188 -sm1
189 Submodule sm1 0000000...$head6 (new submodule)
190 EOF
191 "
193 commit_file sm1 &&
194 test_expect_success 'submodule is up to date' "
195 git diff-index -p --submodule=log HEAD >actual &&
196 diff actual - <<-EOF
197 EOF
198 "
200 test_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
204 Submodule sm1 contains untracked content
205 EOF
206 "
208 test_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
212 Submodule sm1 contains untracked content
213 Submodule sm1 contains modified content
214 EOF
215 "
217 test_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
221 Submodule sm1 contains modified content
222 EOF
223 "
225 (cd sm1; git commit -mchange foo6 >/dev/null) &&
226 head8=$(cd sm1; git rev-parse --verify HEAD | cut -c1-7) &&
227 test_expect_success 'submodule is modified' "
228 git diff-index -p --submodule=log HEAD >actual &&
229 diff actual - <<-EOF
230 Submodule sm1 $head6..$head8:
231 > change
232 EOF
233 "
235 test_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
239 Submodule sm1 contains untracked content
240 Submodule sm1 $head6..$head8:
241 > change
242 EOF
243 "
245 test_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
249 Submodule sm1 contains untracked content
250 Submodule sm1 contains modified content
251 Submodule sm1 $head6..$head8:
252 > change
253 EOF
254 "
256 test_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
260 Submodule sm1 contains modified content
261 Submodule sm1 $head6..$head8:
262 > change
263 EOF
264 "
266 rm -rf sm1
267 test_expect_success 'deleted submodule' "
268 git diff-index -p --submodule=log HEAD >actual &&
269 diff actual - <<-EOF
270 Submodule sm1 $head6...0000000 (submodule deleted)
271 EOF
272 "
274 test_create_repo sm2 &&
275 head7=$(add_file sm2 foo8 foo9) &&
276 git add sm2
278 test_expect_success 'multiple submodules' "
279 git diff-index -p --submodule=log HEAD >actual &&
280 diff actual - <<-EOF
281 Submodule sm1 $head6...0000000 (submodule deleted)
282 Submodule sm2 0000000...$head7 (new submodule)
283 EOF
284 "
286 test_expect_success 'path filter' "
287 git diff-index -p --submodule=log HEAD sm2 >actual &&
288 diff actual - <<-EOF
289 Submodule sm2 0000000...$head7 (new submodule)
290 EOF
291 "
293 commit_file sm2
294 test_expect_success 'given commit' "
295 git diff-index -p --submodule=log HEAD^ >actual &&
296 diff actual - <<-EOF
297 Submodule sm1 $head6...0000000 (submodule deleted)
298 Submodule sm2 0000000...$head7 (new submodule)
299 EOF
300 "
302 test_expect_success 'given commit --submodule' "
303 git diff-index -p --submodule HEAD^ >actual &&
304 diff actual - <<-EOF
305 Submodule sm1 $head6...0000000 (submodule deleted)
306 Submodule sm2 0000000...$head7 (new submodule)
307 EOF
308 "
310 fullhead7=$(cd sm2; git rev-list --max-count=1 $head7)
312 test_expect_success 'given commit --submodule=short' "
313 git diff-index -p --submodule=short HEAD^ >actual &&
314 diff actual - <<-EOF
315 diff --git a/sm1 b/sm1
316 deleted file mode 160000
317 index $head6..0000000
318 --- a/sm1
319 +++ /dev/null
320 @@ -1 +0,0 @@
321 -Subproject commit $fullhead6
322 diff --git a/sm2 b/sm2
323 new file mode 160000
324 index 0000000..$head7
325 --- /dev/null
326 +++ b/sm2
327 @@ -0,0 +1 @@
328 +Subproject commit $fullhead7
329 EOF
330 "
332 test_done