Merge branch 'ar/string-list-foreach'
[git] / t / t3701-add-interactive.sh
1 #!/bin/sh
2
3 test_description='add -i basic tests'
4 . ./test-lib.sh
5
6 if ! test_have_prereq PERL; then
7         skip_all='skipping git add -i tests, perl not available'
8         test_done
9 fi
10
11 test_expect_success 'setup (initial)' '
12         echo content >file &&
13         git add file &&
14         echo more >>file &&
15         echo lines >>file
16 '
17 test_expect_success 'status works (initial)' '
18         git add -i </dev/null >output &&
19         grep "+1/-0 *+2/-0 file" output
20 '
21 cat >expected <<EOF
22 new file mode 100644
23 index 0000000..d95f3ad
24 --- /dev/null
25 +++ b/file
26 @@ -0,0 +1 @@
27 +content
28 EOF
29 test_expect_success 'diff works (initial)' '
30         (echo d; echo 1) | git add -i >output &&
31         sed -ne "/new file/,/content/p" <output >diff &&
32         test_cmp expected diff
33 '
34 test_expect_success 'revert works (initial)' '
35         git add file &&
36         (echo r; echo 1) | git add -i &&
37         git ls-files >output &&
38         ! grep . output
39 '
40
41 test_expect_success 'setup (commit)' '
42         echo baseline >file &&
43         git add file &&
44         git commit -m commit &&
45         echo content >>file &&
46         git add file &&
47         echo more >>file &&
48         echo lines >>file
49 '
50 test_expect_success 'status works (commit)' '
51         git add -i </dev/null >output &&
52         grep "+1/-0 *+2/-0 file" output
53 '
54 cat >expected <<EOF
55 index 180b47c..b6f2c08 100644
56 --- a/file
57 +++ b/file
58 @@ -1 +1,2 @@
59  baseline
60 +content
61 EOF
62 test_expect_success 'diff works (commit)' '
63         (echo d; echo 1) | git add -i >output &&
64         sed -ne "/^index/,/content/p" <output >diff &&
65         test_cmp expected diff
66 '
67 test_expect_success 'revert works (commit)' '
68         git add file &&
69         (echo r; echo 1) | git add -i &&
70         git add -i </dev/null >output &&
71         grep "unchanged *+3/-0 file" output
72 '
73
74 cat >expected <<EOF
75 EOF
76 cat >fake_editor.sh <<EOF
77 EOF
78 chmod a+x fake_editor.sh
79 test_set_editor "$(pwd)/fake_editor.sh"
80 test_expect_success 'dummy edit works' '
81         (echo e; echo a) | git add -p &&
82         git diff > diff &&
83         test_cmp expected diff
84 '
85
86 cat >patch <<EOF
87 @@ -1,1 +1,4 @@
88  this
89 +patch
90 -doesn't
91  apply
92 EOF
93 echo "#!$SHELL_PATH" >fake_editor.sh
94 cat >>fake_editor.sh <<\EOF
95 mv -f "$1" oldpatch &&
96 mv -f patch "$1"
97 EOF
98 chmod a+x fake_editor.sh
99 test_set_editor "$(pwd)/fake_editor.sh"
100 test_expect_success 'bad edit rejected' '
101         git reset &&
102         (echo e; echo n; echo d) | git add -p >output &&
103         grep "hunk does not apply" output
104 '
105
106 cat >patch <<EOF
107 this patch
108 is garbage
109 EOF
110 test_expect_success 'garbage edit rejected' '
111         git reset &&
112         (echo e; echo n; echo d) | git add -p >output &&
113         grep "hunk does not apply" output
114 '
115
116 cat >patch <<EOF
117 @@ -1,0 +1,0 @@
118  baseline
119 +content
120 +newcontent
121 +lines
122 EOF
123 cat >expected <<EOF
124 diff --git a/file b/file
125 index b5dd6c9..f910ae9 100644
126 --- a/file
127 +++ b/file
128 @@ -1,4 +1,4 @@
129  baseline
130  content
131 -newcontent
132 +more
133  lines
134 EOF
135 test_expect_success 'real edit works' '
136         (echo e; echo n; echo d) | git add -p &&
137         git diff >output &&
138         test_cmp expected output
139 '
140
141 test_expect_success 'skip files similarly as commit -a' '
142         git reset &&
143         echo file >.gitignore &&
144         echo changed >file &&
145         echo y | git add -p file &&
146         git diff >output &&
147         git reset &&
148         git commit -am commit &&
149         git diff >expected &&
150         test_cmp expected output &&
151         git reset --hard HEAD^
152 '
153 rm -f .gitignore
154
155 if test "$(git config --bool core.filemode)" = false
156 then
157         say '# skipping filemode tests (filesystem does not properly support modes)'
158 else
159         test_set_prereq FILEMODE
160 fi
161
162 test_expect_success FILEMODE 'patch does not affect mode' '
163         git reset --hard &&
164         echo content >>file &&
165         chmod +x file &&
166         printf "n\\ny\\n" | git add -p &&
167         git show :file | grep content &&
168         git diff file | grep "new mode"
169 '
170
171 test_expect_success FILEMODE 'stage mode but not hunk' '
172         git reset --hard &&
173         echo content >>file &&
174         chmod +x file &&
175         printf "y\\nn\\n" | git add -p &&
176         git diff --cached file | grep "new mode" &&
177         git diff          file | grep "+content"
178 '
179
180
181 test_expect_success FILEMODE 'stage mode and hunk' '
182         git reset --hard &&
183         echo content >>file &&
184         chmod +x file &&
185         printf "y\\ny\\n" | git add -p &&
186         git diff --cached file | grep "new mode" &&
187         git diff --cached file | grep "+content" &&
188         test -z "$(git diff file)"
189 '
190
191 # end of tests disabled when filemode is not usable
192
193 test_expect_success 'setup again' '
194         git reset --hard &&
195         test_chmod +x file &&
196         echo content >>file
197 '
198
199 # Write the patch file with a new line at the top and bottom
200 cat >patch <<EOF
201 index 180b47c..b6f2c08 100644
202 --- a/file
203 +++ b/file
204 @@ -1,2 +1,4 @@
205 +firstline
206  baseline
207  content
208 +lastline
209 EOF
210 # Expected output, similar to the patch but w/ diff at the top
211 cat >expected <<EOF
212 diff --git a/file b/file
213 index b6f2c08..61b9053 100755
214 --- a/file
215 +++ b/file
216 @@ -1,2 +1,4 @@
217 +firstline
218  baseline
219  content
220 +lastline
221 EOF
222 # Test splitting the first patch, then adding both
223 test_expect_success 'add first line works' '
224         git commit -am "clear local changes" &&
225         git apply patch &&
226         (echo s; echo y; echo y) | git add -p file &&
227         git diff --cached > diff &&
228         test_cmp expected diff
229 '
230
231 cat >expected <<EOF
232 diff --git a/non-empty b/non-empty
233 deleted file mode 100644
234 index d95f3ad..0000000
235 --- a/non-empty
236 +++ /dev/null
237 @@ -1 +0,0 @@
238 -content
239 EOF
240 test_expect_success 'deleting a non-empty file' '
241         git reset --hard &&
242         echo content >non-empty &&
243         git add non-empty &&
244         git commit -m non-empty &&
245         rm non-empty &&
246         echo y | git add -p non-empty &&
247         git diff --cached >diff &&
248         test_cmp expected diff
249 '
250
251 cat >expected <<EOF
252 diff --git a/empty b/empty
253 deleted file mode 100644
254 index e69de29..0000000
255 EOF
256
257 test_expect_success 'deleting an empty file' '
258         git reset --hard &&
259         > empty &&
260         git add empty &&
261         git commit -m empty &&
262         rm empty &&
263         echo y | git add -p empty &&
264         git diff --cached >diff &&
265         test_cmp expected diff
266 '
267
268 test_done