Submodules: Use "ignore" settings from .gitmodules too for diff and status
[git.git] / t / t4027-diff-submodule.sh
blob1bc6e77a0d5914a7cbf0986bdabc44697e334c27
1 #!/bin/sh
3 test_description='difference in submodules'
5 . ./test-lib.sh
6 . "$TEST_DIRECTORY"/diff-lib.sh
8 _z40=0000000000000000000000000000000000000000
9 test_expect_success setup '
10 test_tick &&
11 test_create_repo sub &&
13 cd sub &&
14 echo hello >world &&
15 git add world &&
16 git commit -m submodule
17 ) &&
19 test_tick &&
20 echo frotz >nitfol &&
21 git add nitfol sub &&
22 git commit -m superproject &&
25 cd sub &&
26 echo goodbye >world &&
27 git add world &&
28 git commit -m "submodule #2"
29 ) &&
31 set x $(
32 cd sub &&
33 git rev-list HEAD
34 ) &&
35 echo ":160000 160000 $3 $_z40 M sub" >expect &&
36 subtip=$3 subprev=$2
39 test_expect_success 'git diff --raw HEAD' '
40 git diff --raw --abbrev=40 HEAD >actual &&
41 test_cmp expect actual
44 test_expect_success 'git diff-index --raw HEAD' '
45 git diff-index --raw HEAD >actual.index &&
46 test_cmp expect actual.index
49 test_expect_success 'git diff-files --raw' '
50 git diff-files --raw >actual.files &&
51 test_cmp expect actual.files
54 expect_from_to () {
55 printf "%sSubproject commit %s\n+Subproject commit %s\n" \
56 "-" "$1" "$2"
59 test_expect_success 'git diff HEAD' '
60 git diff HEAD >actual &&
61 sed -e "1,/^@@/d" actual >actual.body &&
62 expect_from_to >expect.body $subtip $subprev &&
63 test_cmp expect.body actual.body
66 test_expect_success 'git diff HEAD with dirty submodule (work tree)' '
67 echo >>sub/world &&
68 git diff HEAD >actual &&
69 sed -e "1,/^@@/d" actual >actual.body &&
70 expect_from_to >expect.body $subtip $subprev-dirty &&
71 test_cmp expect.body actual.body
74 test_expect_success 'git diff HEAD with dirty submodule (index)' '
76 cd sub &&
77 git reset --hard &&
78 echo >>world &&
79 git add world
80 ) &&
81 git diff HEAD >actual &&
82 sed -e "1,/^@@/d" actual >actual.body &&
83 expect_from_to >expect.body $subtip $subprev-dirty &&
84 test_cmp expect.body actual.body
87 test_expect_success 'git diff HEAD with dirty submodule (untracked)' '
89 cd sub &&
90 git reset --hard &&
91 git clean -qfdx &&
92 >cruft
93 ) &&
94 git diff HEAD >actual &&
95 sed -e "1,/^@@/d" actual >actual.body &&
96 expect_from_to >expect.body $subtip $subprev-dirty &&
97 test_cmp expect.body actual.body
100 test_expect_success 'git diff HEAD with dirty submodule (work tree, refs match)' '
101 git commit -m "x" sub &&
102 echo >>sub/world &&
103 git diff HEAD >actual &&
104 sed -e "1,/^@@/d" actual >actual.body &&
105 expect_from_to >expect.body $subprev $subprev-dirty &&
106 test_cmp expect.body actual.body &&
107 git diff --ignore-submodules HEAD >actual2 &&
108 ! test -s actual2 &&
109 git diff --ignore-submodules=untracked HEAD >actual3 &&
110 sed -e "1,/^@@/d" actual3 >actual3.body &&
111 expect_from_to >expect.body $subprev $subprev-dirty &&
112 test_cmp expect.body actual3.body &&
113 git diff --ignore-submodules=dirty HEAD >actual4 &&
114 ! test -s actual4
117 test_expect_success 'git diff HEAD with dirty submodule (work tree, refs match) [.git/config]' '
118 git config submodule.subname.ignore none &&
119 git config submodule.subname.path sub &&
120 git diff HEAD >actual &&
121 sed -e "1,/^@@/d" actual >actual.body &&
122 expect_from_to >expect.body $subprev $subprev-dirty &&
123 test_cmp expect.body actual.body &&
124 git config submodule.subname.ignore all &&
125 git diff HEAD >actual2 &&
126 ! test -s actual2 &&
127 git config submodule.subname.ignore untracked &&
128 git diff HEAD >actual3 &&
129 sed -e "1,/^@@/d" actual3 >actual3.body &&
130 expect_from_to >expect.body $subprev $subprev-dirty &&
131 test_cmp expect.body actual3.body &&
132 git config submodule.subname.ignore dirty &&
133 git diff HEAD >actual4 &&
134 ! test -s actual4 &&
135 git diff HEAD --ignore-submodules=none >actual &&
136 sed -e "1,/^@@/d" actual >actual.body &&
137 expect_from_to >expect.body $subprev $subprev-dirty &&
138 test_cmp expect.body actual.body &&
139 git config --remove-section submodule.subname
142 test_expect_success 'git diff HEAD with dirty submodule (work tree, refs match) [.gitmodules]' '
143 git config --add -f .gitmodules submodule.subname.ignore none &&
144 git config --add -f .gitmodules submodule.subname.path sub &&
145 git diff HEAD >actual &&
146 sed -e "1,/^@@/d" actual >actual.body &&
147 expect_from_to >expect.body $subprev $subprev-dirty &&
148 test_cmp expect.body actual.body &&
149 git config -f .gitmodules submodule.subname.ignore all &&
150 git config -f .gitmodules submodule.subname.path sub &&
151 git diff HEAD >actual2 &&
152 ! test -s actual2 &&
153 git config -f .gitmodules submodule.subname.ignore untracked &&
154 git diff HEAD >actual3 &&
155 sed -e "1,/^@@/d" actual3 >actual3.body &&
156 expect_from_to >expect.body $subprev $subprev-dirty &&
157 test_cmp expect.body actual3.body &&
158 git config -f .gitmodules submodule.subname.ignore dirty &&
159 git diff HEAD >actual4 &&
160 ! test -s actual4 &&
161 git config submodule.subname.ignore none &&
162 git config submodule.subname.path sub &&
163 git diff HEAD >actual &&
164 sed -e "1,/^@@/d" actual >actual.body &&
165 expect_from_to >expect.body $subprev $subprev-dirty &&
166 test_cmp expect.body actual.body &&
167 git config --remove-section submodule.subname &&
168 git config --remove-section -f .gitmodules submodule.subname &&
169 rm .gitmodules
172 test_expect_success 'git diff HEAD with dirty submodule (index, refs match)' '
174 cd sub &&
175 git reset --hard &&
176 echo >>world &&
177 git add world
178 ) &&
179 git diff HEAD >actual &&
180 sed -e "1,/^@@/d" actual >actual.body &&
181 expect_from_to >expect.body $subprev $subprev-dirty &&
182 test_cmp expect.body actual.body
185 test_expect_success 'git diff HEAD with dirty submodule (untracked, refs match)' '
187 cd sub &&
188 git reset --hard &&
189 git clean -qfdx &&
190 >cruft
191 ) &&
192 git diff HEAD >actual &&
193 sed -e "1,/^@@/d" actual >actual.body &&
194 expect_from_to >expect.body $subprev $subprev-dirty &&
195 test_cmp expect.body actual.body &&
196 git diff --ignore-submodules=all HEAD >actual2 &&
197 ! test -s actual2 &&
198 git diff --ignore-submodules=untracked HEAD >actual3 &&
199 ! test -s actual3 &&
200 git diff --ignore-submodules=dirty HEAD >actual4 &&
201 ! test -s actual4
204 test_expect_success 'git diff HEAD with dirty submodule (untracked, refs match) [.git/config]' '
205 git config submodule.subname.ignore all &&
206 git config submodule.subname.path sub &&
207 git diff HEAD >actual2 &&
208 ! test -s actual2 &&
209 git config submodule.subname.ignore untracked &&
210 git diff HEAD >actual3 &&
211 ! test -s actual3 &&
212 git config submodule.subname.ignore dirty &&
213 git diff HEAD >actual4 &&
214 ! test -s actual4 &&
215 git diff --ignore-submodules=none HEAD >actual &&
216 sed -e "1,/^@@/d" actual >actual.body &&
217 expect_from_to >expect.body $subprev $subprev-dirty &&
218 test_cmp expect.body actual.body &&
219 git config --remove-section submodule.subname
222 test_expect_success 'git diff HEAD with dirty submodule (untracked, refs match) [.gitmodules]' '
223 git config --add -f .gitmodules submodule.subname.ignore all &&
224 git config --add -f .gitmodules submodule.subname.path sub &&
225 git diff HEAD >actual2 &&
226 ! test -s actual2 &&
227 git config -f .gitmodules submodule.subname.ignore untracked &&
228 git diff HEAD >actual3 &&
229 ! test -s actual3 &&
230 git config -f .gitmodules submodule.subname.ignore dirty &&
231 git diff HEAD >actual4 &&
232 ! test -s actual4 &&
233 git config submodule.subname.ignore none &&
234 git config submodule.subname.path sub &&
235 git diff HEAD >actual &&
236 sed -e "1,/^@@/d" actual >actual.body &&
237 expect_from_to >expect.body $subprev $subprev-dirty &&
238 test_cmp expect.body actual.body &&
239 git config --remove-section submodule.subname &&
240 git config --remove-section -f .gitmodules submodule.subname &&
241 rm .gitmodules
244 test_expect_success 'git diff between submodule commits' '
245 git diff HEAD^..HEAD >actual &&
246 sed -e "1,/^@@/d" actual >actual.body &&
247 expect_from_to >expect.body $subtip $subprev &&
248 test_cmp expect.body actual.body &&
249 git diff --ignore-submodules=dirty HEAD^..HEAD >actual &&
250 sed -e "1,/^@@/d" actual >actual.body &&
251 expect_from_to >expect.body $subtip $subprev &&
252 test_cmp expect.body actual.body &&
253 git diff --ignore-submodules HEAD^..HEAD >actual &&
254 ! test -s actual
257 test_expect_success 'git diff between submodule commits [.git/config]' '
258 git diff HEAD^..HEAD >actual &&
259 sed -e "1,/^@@/d" actual >actual.body &&
260 expect_from_to >expect.body $subtip $subprev &&
261 test_cmp expect.body actual.body &&
262 git config submodule.subname.ignore dirty &&
263 git config submodule.subname.path sub &&
264 git diff HEAD^..HEAD >actual &&
265 sed -e "1,/^@@/d" actual >actual.body &&
266 expect_from_to >expect.body $subtip $subprev &&
267 test_cmp expect.body actual.body &&
268 git config submodule.subname.ignore all &&
269 git diff HEAD^..HEAD >actual &&
270 ! test -s actual &&
271 git diff --ignore-submodules=dirty HEAD^..HEAD >actual &&
272 sed -e "1,/^@@/d" actual >actual.body &&
273 expect_from_to >expect.body $subtip $subprev &&
274 git config --remove-section submodule.subname
277 test_expect_success 'git diff between submodule commits [.gitmodules]' '
278 git diff HEAD^..HEAD >actual &&
279 sed -e "1,/^@@/d" actual >actual.body &&
280 expect_from_to >expect.body $subtip $subprev &&
281 test_cmp expect.body actual.body &&
282 git config --add -f .gitmodules submodule.subname.ignore dirty &&
283 git config --add -f .gitmodules submodule.subname.path sub &&
284 git diff HEAD^..HEAD >actual &&
285 sed -e "1,/^@@/d" actual >actual.body &&
286 expect_from_to >expect.body $subtip $subprev &&
287 test_cmp expect.body actual.body &&
288 git config -f .gitmodules submodule.subname.ignore all &&
289 git diff HEAD^..HEAD >actual &&
290 ! test -s actual &&
291 git config submodule.subname.ignore dirty &&
292 git config submodule.subname.path sub &&
293 git diff HEAD^..HEAD >actual &&
294 sed -e "1,/^@@/d" actual >actual.body &&
295 expect_from_to >expect.body $subtip $subprev &&
296 git config --remove-section submodule.subname &&
297 git config --remove-section -f .gitmodules submodule.subname &&
298 rm .gitmodules
301 test_expect_success 'git diff (empty submodule dir)' '
302 : >empty &&
303 rm -rf sub/* sub/.git &&
304 git diff > actual.empty &&
305 test_cmp empty actual.empty
308 test_expect_success 'conflicted submodule setup' '
310 # 39 efs
311 c=fffffffffffffffffffffffffffffffffffffff
313 echo "000000 $_z40 0 sub"
314 echo "160000 1$c 1 sub"
315 echo "160000 2$c 2 sub"
316 echo "160000 3$c 3 sub"
317 ) | git update-index --index-info &&
318 echo >expect.nosub '\''diff --cc sub
319 index 2ffffff,3ffffff..0000000
320 --- a/sub
321 +++ b/sub
322 @@@ -1,1 -1,1 +1,1 @@@
323 - Subproject commit 2fffffffffffffffffffffffffffffffffffffff
324 -Subproject commit 3fffffffffffffffffffffffffffffffffffffff
325 ++Subproject commit 0000000000000000000000000000000000000000'\'' &&
327 hh=$(git rev-parse HEAD) &&
328 sed -e "s/$_z40/$hh/" expect.nosub >expect.withsub
332 test_expect_success 'combined (empty submodule)' '
333 rm -fr sub && mkdir sub &&
334 git diff >actual &&
335 test_cmp expect.nosub actual
338 test_expect_success 'combined (with submodule)' '
339 rm -fr sub &&
340 git clone --no-checkout . sub &&
341 git diff >actual &&
342 test_cmp expect.withsub actual
347 test_done