Code

Submodules: Use "ignore" settings from .gitmodules too for diff and status
[git.git] / t / t4027-diff-submodule.sh
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 &&
12         (
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 &&
24         (
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
37 '
39 test_expect_success 'git diff --raw HEAD' '
40         git diff --raw --abbrev=40 HEAD >actual &&
41         test_cmp expect actual
42 '
44 test_expect_success 'git diff-index --raw HEAD' '
45         git diff-index --raw HEAD >actual.index &&
46         test_cmp expect actual.index
47 '
49 test_expect_success 'git diff-files --raw' '
50         git diff-files --raw >actual.files &&
51         test_cmp expect actual.files
52 '
54 expect_from_to () {
55         printf "%sSubproject commit %s\n+Subproject commit %s\n" \
56                 "-" "$1" "$2"
57 }
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
64 '
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
72 '
74 test_expect_success 'git diff HEAD with dirty submodule (index)' '
75         (
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
85 '
87 test_expect_success 'git diff HEAD with dirty submodule (untracked)' '
88         (
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
98 '
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)' '
173         (
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)' '
186         (
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
312         (
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