Merge branch 'ab/mailmap'
[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 $ZERO_OID M     sub" >expect &&
35         subtip=$3 subprev=$2
36 '
37
38 test_expect_success 'git diff --raw HEAD' '
39         hexsz=$(test_oid hexsz) &&
40         git diff --raw --abbrev=$hexsz HEAD >actual &&
41         test_cmp expect actual
42 '
43
44 test_expect_success 'git diff-index --raw HEAD' '
45         git diff-index --raw HEAD >actual.index &&
46         test_cmp expect actual.index
47 '
48
49 test_expect_success 'git diff-files --raw' '
50         git diff-files --raw >actual.files &&
51         test_cmp expect actual.files
52 '
53
54 expect_from_to () {
55         printf "%sSubproject commit %s\n+Subproject commit %s\n" \
56                 "-" "$1" "$2"
57 }
58
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 '
65
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 '
73
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 '
86
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 &&
97         test_cmp expect.body actual.body
98 '
99
100 test_expect_success 'git diff HEAD with dirty submodule (untracked) (none ignored)' '
101         test_config diff.ignoreSubmodules none &&
102         git diff HEAD >actual &&
103         sed -e "1,/^@@/d" actual >actual.body &&
104         expect_from_to >expect.body $subtip $subprev-dirty &&
105         test_cmp expect.body actual.body
106 '
107
108 test_expect_success 'git diff HEAD with dirty submodule (work tree, refs match)' '
109         git commit -m "x" sub &&
110         echo >>sub/world &&
111         git diff HEAD >actual &&
112         sed -e "1,/^@@/d" actual >actual.body &&
113         expect_from_to >expect.body $subprev $subprev-dirty &&
114         test_cmp expect.body actual.body &&
115         git diff --ignore-submodules HEAD >actual2 &&
116         test_must_be_empty actual2 &&
117         git diff --ignore-submodules=untracked HEAD >actual3 &&
118         sed -e "1,/^@@/d" actual3 >actual3.body &&
119         expect_from_to >expect.body $subprev $subprev-dirty &&
120         test_cmp expect.body actual3.body &&
121         git diff --ignore-submodules=dirty HEAD >actual4 &&
122         test_must_be_empty actual4
123 '
124
125 test_expect_success 'git diff HEAD with dirty submodule (work tree, refs match) [.gitmodules]' '
126         git config diff.ignoreSubmodules dirty &&
127         git diff HEAD >actual &&
128         test_must_be_empty actual &&
129         git config --add -f .gitmodules submodule.subname.ignore none &&
130         git config --add -f .gitmodules submodule.subname.path sub &&
131         git diff HEAD >actual &&
132         sed -e "1,/^@@/d" actual >actual.body &&
133         expect_from_to >expect.body $subprev $subprev-dirty &&
134         test_cmp expect.body actual.body &&
135         git config -f .gitmodules submodule.subname.ignore all &&
136         git config -f .gitmodules submodule.subname.path sub &&
137         git diff HEAD >actual2 &&
138         test_must_be_empty actual2 &&
139         git config -f .gitmodules submodule.subname.ignore untracked &&
140         git diff HEAD >actual3 &&
141         sed -e "1,/^@@/d" actual3 >actual3.body &&
142         expect_from_to >expect.body $subprev $subprev-dirty &&
143         test_cmp expect.body actual3.body &&
144         git config -f .gitmodules submodule.subname.ignore dirty &&
145         git diff HEAD >actual4 &&
146         test_must_be_empty actual4 &&
147         git config submodule.subname.ignore none &&
148         git config submodule.subname.path sub &&
149         git diff HEAD >actual &&
150         sed -e "1,/^@@/d" actual >actual.body &&
151         expect_from_to >expect.body $subprev $subprev-dirty &&
152         test_cmp expect.body actual.body &&
153         git config --remove-section submodule.subname &&
154         git config --remove-section -f .gitmodules submodule.subname &&
155         git config --unset diff.ignoreSubmodules &&
156         rm .gitmodules
157 '
158
159 test_expect_success 'git diff HEAD with dirty submodule (index, refs match)' '
160         (
161                 cd sub &&
162                 git reset --hard &&
163                 echo >>world &&
164                 git add world
165         ) &&
166         git diff HEAD >actual &&
167         sed -e "1,/^@@/d" actual >actual.body &&
168         expect_from_to >expect.body $subprev $subprev-dirty &&
169         test_cmp expect.body actual.body
170 '
171
172 test_expect_success 'git diff HEAD with dirty submodule (untracked, refs match)' '
173         (
174                 cd sub &&
175                 git reset --hard &&
176                 git clean -qfdx &&
177                 >cruft
178         ) &&
179         git diff --ignore-submodules=none 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 &&
183         git diff --ignore-submodules=all HEAD >actual2 &&
184         test_must_be_empty actual2 &&
185         git diff HEAD >actual3 &&
186         test_must_be_empty actual3 &&
187         git diff --ignore-submodules=dirty HEAD >actual4 &&
188         test_must_be_empty actual4
189 '
190
191 test_expect_success 'git diff HEAD with dirty submodule (untracked, refs match) [.gitmodules]' '
192         git config --add -f .gitmodules submodule.subname.ignore all &&
193         git config --add -f .gitmodules submodule.subname.path sub &&
194         git diff HEAD >actual2 &&
195         test_must_be_empty actual2 &&
196         git config -f .gitmodules submodule.subname.ignore untracked &&
197         git diff HEAD >actual3 &&
198         test_must_be_empty actual3 &&
199         git config -f .gitmodules submodule.subname.ignore dirty &&
200         git diff HEAD >actual4 &&
201         test_must_be_empty actual4 &&
202         git config submodule.subname.ignore none &&
203         git config submodule.subname.path sub &&
204         git diff HEAD >actual &&
205         sed -e "1,/^@@/d" actual >actual.body &&
206         expect_from_to >expect.body $subprev $subprev-dirty &&
207         test_cmp expect.body actual.body &&
208         git config --remove-section submodule.subname &&
209         git config --remove-section -f .gitmodules submodule.subname &&
210         rm .gitmodules
211 '
212
213 test_expect_success 'git diff between submodule commits' '
214         git diff HEAD^..HEAD >actual &&
215         sed -e "1,/^@@/d" actual >actual.body &&
216         expect_from_to >expect.body $subtip $subprev &&
217         test_cmp expect.body actual.body &&
218         git diff --ignore-submodules=dirty HEAD^..HEAD >actual &&
219         sed -e "1,/^@@/d" actual >actual.body &&
220         expect_from_to >expect.body $subtip $subprev &&
221         test_cmp expect.body actual.body &&
222         git diff --ignore-submodules HEAD^..HEAD >actual &&
223         test_must_be_empty actual
224 '
225
226 test_expect_success 'git diff between submodule commits [.gitmodules]' '
227         git diff HEAD^..HEAD >actual &&
228         sed -e "1,/^@@/d" actual >actual.body &&
229         expect_from_to >expect.body $subtip $subprev &&
230         test_cmp expect.body actual.body &&
231         git config --add -f .gitmodules submodule.subname.ignore dirty &&
232         git config --add -f .gitmodules submodule.subname.path sub &&
233         git diff HEAD^..HEAD >actual &&
234         sed -e "1,/^@@/d" actual >actual.body &&
235         expect_from_to >expect.body $subtip $subprev &&
236         test_cmp expect.body actual.body &&
237         git config -f .gitmodules submodule.subname.ignore all &&
238         git diff HEAD^..HEAD >actual &&
239         test_must_be_empty actual &&
240         git config submodule.subname.ignore dirty &&
241         git config submodule.subname.path sub &&
242         git diff  HEAD^..HEAD >actual &&
243         sed -e "1,/^@@/d" actual >actual.body &&
244         expect_from_to >expect.body $subtip $subprev &&
245         git config --remove-section submodule.subname &&
246         git config --remove-section -f .gitmodules submodule.subname &&
247         rm .gitmodules
248 '
249
250 test_expect_success 'git diff (empty submodule dir)' '
251         rm -rf sub/* sub/.git &&
252         git diff > actual.empty &&
253         test_must_be_empty actual.empty
254 '
255
256 test_expect_success 'conflicted submodule setup' '
257         c=$(test_oid ff_1) &&
258         (
259                 echo "000000 $ZERO_OID 0        sub" &&
260                 echo "160000 1$c 1      sub" &&
261                 echo "160000 2$c 2      sub" &&
262                 echo "160000 3$c 3      sub"
263         ) | git update-index --index-info &&
264         echo >expect.nosub "diff --cc sub
265 index 2ffffff,3ffffff..0000000
266 --- a/sub
267 +++ b/sub
268 @@@ -1,1 -1,1 +1,1 @@@
269 - Subproject commit 2$c
270  -Subproject commit 3$c
271 ++Subproject commit $ZERO_OID" &&
272
273         hh=$(git rev-parse HEAD) &&
274         sed -e "s/$ZERO_OID/$hh/" expect.nosub >expect.withsub
275
276 '
277
278 test_expect_success 'combined (empty submodule)' '
279         rm -fr sub && mkdir sub &&
280         git diff >actual &&
281         test_cmp expect.nosub actual
282 '
283
284 test_expect_success 'combined (with submodule)' '
285         rm -fr sub &&
286         git clone --no-checkout . sub &&
287         git diff >actual &&
288         test_cmp expect.withsub actual
289 '
290
291
292
293 test_done