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