Merge branch 'bc/log-decoration' into maint
[git] / t / t3701-add-interactive.sh
1 #!/bin/sh
2
3 test_description='add -i basic tests'
4 . ./test-lib.sh
5 . "$TEST_DIRECTORY"/lib-prereq-FILEMODE.sh
6
7 if ! test_have_prereq PERL
8 then
9         skip_all='skipping add -i tests, perl not available'
10         test_done
11 fi
12
13 test_expect_success 'setup (initial)' '
14         echo content >file &&
15         git add file &&
16         echo more >>file &&
17         echo lines >>file
18 '
19 test_expect_success 'status works (initial)' '
20         git add -i </dev/null >output &&
21         grep "+1/-0 *+2/-0 file" output
22 '
23
24 test_expect_success 'setup expected' '
25 cat >expected <<EOF
26 new file mode 100644
27 index 0000000..d95f3ad
28 --- /dev/null
29 +++ b/file
30 @@ -0,0 +1 @@
31 +content
32 EOF
33 '
34
35 test_expect_success 'diff works (initial)' '
36         (echo d; echo 1) | git add -i >output &&
37         sed -ne "/new file/,/content/p" <output >diff &&
38         test_cmp expected diff
39 '
40 test_expect_success 'revert works (initial)' '
41         git add file &&
42         (echo r; echo 1) | git add -i &&
43         git ls-files >output &&
44         ! grep . output
45 '
46
47 test_expect_success 'setup (commit)' '
48         echo baseline >file &&
49         git add file &&
50         git commit -m commit &&
51         echo content >>file &&
52         git add file &&
53         echo more >>file &&
54         echo lines >>file
55 '
56 test_expect_success 'status works (commit)' '
57         git add -i </dev/null >output &&
58         grep "+1/-0 *+2/-0 file" output
59 '
60
61 test_expect_success 'setup expected' '
62 cat >expected <<EOF
63 index 180b47c..b6f2c08 100644
64 --- a/file
65 +++ b/file
66 @@ -1 +1,2 @@
67  baseline
68 +content
69 EOF
70 '
71
72 test_expect_success 'diff works (commit)' '
73         (echo d; echo 1) | git add -i >output &&
74         sed -ne "/^index/,/content/p" <output >diff &&
75         test_cmp expected diff
76 '
77 test_expect_success 'revert works (commit)' '
78         git add file &&
79         (echo r; echo 1) | git add -i &&
80         git add -i </dev/null >output &&
81         grep "unchanged *+3/-0 file" output
82 '
83
84
85 test_expect_success 'setup expected' '
86 cat >expected <<EOF
87 EOF
88 '
89
90 test_expect_success 'setup fake editor' '
91         >fake_editor.sh &&
92         chmod a+x fake_editor.sh &&
93         test_set_editor "$(pwd)/fake_editor.sh"
94 '
95
96 test_expect_success 'dummy edit works' '
97         (echo e; echo a) | git add -p &&
98         git diff > diff &&
99         test_cmp expected diff
100 '
101
102 test_expect_success 'setup patch' '
103 cat >patch <<EOF
104 @@ -1,1 +1,4 @@
105  this
106 +patch
107 -does not
108  apply
109 EOF
110 '
111
112 test_expect_success 'setup fake editor' '
113         echo "#!$SHELL_PATH" >fake_editor.sh &&
114         cat >>fake_editor.sh <<\EOF &&
115 mv -f "$1" oldpatch &&
116 mv -f patch "$1"
117 EOF
118         chmod a+x fake_editor.sh &&
119         test_set_editor "$(pwd)/fake_editor.sh"
120 '
121
122 test_expect_success 'bad edit rejected' '
123         git reset &&
124         (echo e; echo n; echo d) | git add -p >output &&
125         grep "hunk does not apply" output
126 '
127
128 test_expect_success 'setup patch' '
129 cat >patch <<EOF
130 this patch
131 is garbage
132 EOF
133 '
134
135 test_expect_success 'garbage edit rejected' '
136         git reset &&
137         (echo e; echo n; echo d) | git add -p >output &&
138         grep "hunk does not apply" output
139 '
140
141 test_expect_success 'setup patch' '
142 cat >patch <<EOF
143 @@ -1,0 +1,0 @@
144  baseline
145 +content
146 +newcontent
147 +lines
148 EOF
149 '
150
151 test_expect_success 'setup expected' '
152 cat >expected <<EOF
153 diff --git a/file b/file
154 index b5dd6c9..f910ae9 100644
155 --- a/file
156 +++ b/file
157 @@ -1,4 +1,4 @@
158  baseline
159  content
160 -newcontent
161 +more
162  lines
163 EOF
164 '
165
166 test_expect_success 'real edit works' '
167         (echo e; echo n; echo d) | git add -p &&
168         git diff >output &&
169         test_cmp expected output
170 '
171
172 test_expect_success 'skip files similarly as commit -a' '
173         git reset &&
174         echo file >.gitignore &&
175         echo changed >file &&
176         echo y | git add -p file &&
177         git diff >output &&
178         git reset &&
179         git commit -am commit &&
180         git diff >expected &&
181         test_cmp expected output &&
182         git reset --hard HEAD^
183 '
184 rm -f .gitignore
185
186 test_expect_success FILEMODE 'patch does not affect mode' '
187         git reset --hard &&
188         echo content >>file &&
189         chmod +x file &&
190         printf "n\\ny\\n" | git add -p &&
191         git show :file | grep content &&
192         git diff file | grep "new mode"
193 '
194
195 test_expect_success FILEMODE 'stage mode but not hunk' '
196         git reset --hard &&
197         echo content >>file &&
198         chmod +x file &&
199         printf "y\\nn\\n" | git add -p &&
200         git diff --cached file | grep "new mode" &&
201         git diff          file | grep "+content"
202 '
203
204
205 test_expect_success FILEMODE 'stage mode and hunk' '
206         git reset --hard &&
207         echo content >>file &&
208         chmod +x file &&
209         printf "y\\ny\\n" | git add -p &&
210         git diff --cached file | grep "new mode" &&
211         git diff --cached file | grep "+content" &&
212         test -z "$(git diff file)"
213 '
214
215 # end of tests disabled when filemode is not usable
216
217 test_expect_success 'setup again' '
218         git reset --hard &&
219         test_chmod +x file &&
220         echo content >>file
221 '
222
223 # Write the patch file with a new line at the top and bottom
224 test_expect_success 'setup patch' '
225 cat >patch <<EOF
226 index 180b47c..b6f2c08 100644
227 --- a/file
228 +++ b/file
229 @@ -1,2 +1,4 @@
230 +firstline
231  baseline
232  content
233 +lastline
234 EOF
235 '
236
237 # Expected output, similar to the patch but w/ diff at the top
238 test_expect_success 'setup expected' '
239 cat >expected <<EOF
240 diff --git a/file b/file
241 index b6f2c08..61b9053 100755
242 --- a/file
243 +++ b/file
244 @@ -1,2 +1,4 @@
245 +firstline
246  baseline
247  content
248 +lastline
249 EOF
250 '
251
252 # Test splitting the first patch, then adding both
253 test_expect_success 'add first line works' '
254         git commit -am "clear local changes" &&
255         git apply patch &&
256         (echo s; echo y; echo y) | git add -p file &&
257         git diff --cached > diff &&
258         test_cmp expected diff
259 '
260
261 test_expect_success 'setup expected' '
262 cat >expected <<EOF
263 diff --git a/non-empty b/non-empty
264 deleted file mode 100644
265 index d95f3ad..0000000
266 --- a/non-empty
267 +++ /dev/null
268 @@ -1 +0,0 @@
269 -content
270 EOF
271 '
272
273 test_expect_success 'deleting a non-empty file' '
274         git reset --hard &&
275         echo content >non-empty &&
276         git add non-empty &&
277         git commit -m non-empty &&
278         rm non-empty &&
279         echo y | git add -p non-empty &&
280         git diff --cached >diff &&
281         test_cmp expected diff
282 '
283
284 test_expect_success 'setup expected' '
285 cat >expected <<EOF
286 diff --git a/empty b/empty
287 deleted file mode 100644
288 index e69de29..0000000
289 EOF
290 '
291
292 test_expect_success 'deleting an empty file' '
293         git reset --hard &&
294         > empty &&
295         git add empty &&
296         git commit -m empty &&
297         rm empty &&
298         echo y | git add -p empty &&
299         git diff --cached >diff &&
300         test_cmp expected diff
301 '
302
303 test_expect_success 'split hunk setup' '
304         git reset --hard &&
305         for i in 10 20 30 40 50 60
306         do
307                 echo $i
308         done >test &&
309         git add test &&
310         test_tick &&
311         git commit -m test &&
312
313         for i in 10 15 20 21 22 23 24 30 40 50 60
314         do
315                 echo $i
316         done >test
317 '
318
319 test_expect_success 'split hunk "add -p (edit)"' '
320         # Split, say Edit and do nothing.  Then:
321         #
322         # 1. Broken version results in a patch that does not apply and
323         # only takes [y/n] (edit again) so the first q is discarded
324         # and then n attempts to discard the edit. Repeat q enough
325         # times to get out.
326         #
327         # 2. Correct version applies the (not)edited version, and asks
328         #    about the next hunk, against which we say q and program
329         #    exits.
330         for a in s e     q n q q
331         do
332                 echo $a
333         done |
334         EDITOR=: git add -p &&
335         git diff >actual &&
336         ! grep "^+15" actual
337 '
338
339 test_expect_success 'patch mode ignores unmerged entries' '
340         git reset --hard &&
341         test_commit conflict &&
342         test_commit non-conflict &&
343         git checkout -b side &&
344         test_commit side conflict.t &&
345         git checkout master &&
346         test_commit master conflict.t &&
347         test_must_fail git merge side &&
348         echo changed >non-conflict.t &&
349         echo y | git add -p >output &&
350         ! grep a/conflict.t output &&
351         cat >expected <<-\EOF &&
352         * Unmerged path conflict.t
353         diff --git a/non-conflict.t b/non-conflict.t
354         index f766221..5ea2ed4 100644
355         --- a/non-conflict.t
356         +++ b/non-conflict.t
357         @@ -1 +1 @@
358         -non-conflict
359         +changed
360         EOF
361         git diff --cached >diff &&
362         test_cmp expected diff
363 '
364
365 test_done