add -p: do not attempt to coalesce mode changes
[git/git.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 say '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 if test "$(git config --bool core.filemode)" = false
142 then
143 say 'skipping filemode tests (filesystem does not properly support modes)'
144 else
145 test_set_prereq FILEMODE
146 fi
147
148 test_expect_success FILEMODE 'patch does not affect mode' '
149 git reset --hard &&
150 echo content >>file &&
151 chmod +x file &&
152 printf "n\\ny\\n" | git add -p &&
153 git show :file | grep content &&
154 git diff file | grep "new mode"
155 '
156
157 test_expect_success FILEMODE 'stage mode but not hunk' '
158 git reset --hard &&
159 echo content >>file &&
160 chmod +x file &&
161 printf "y\\nn\\n" | git add -p &&
162 git diff --cached file | grep "new mode" &&
163 git diff file | grep "+content"
164 '
165
166
167 test_expect_success FILEMODE 'stage mode and hunk' '
168 git reset --hard &&
169 echo content >>file &&
170 chmod +x file &&
171 printf "y\\ny\\n" | git add -p &&
172 git diff --cached file | grep "new mode" &&
173 git diff --cached file | grep "+content" &&
174 test -z "$(git diff file)"
175 '
176
177 # end of tests disabled when filemode is not usable
178
179 # Write the patch file with a new line at the top and bottom
180 cat >patch <<EOF
181 index 180b47c..b6f2c08 100644
182 --- a/file
183 +++ b/file
184 @@ -1,2 +1,4 @@
185 +firstline
186 baseline
187 content
188 +lastline
189 EOF
190 # Expected output, similar to the patch but w/ diff at the top
191 cat >expected <<EOF
192 diff --git a/file b/file
193 index b6f2c08..61b9053 100755
194 --- a/file
195 +++ b/file
196 @@ -1,2 +1,4 @@
197 +firstline
198 baseline
199 content
200 +lastline
201 EOF
202 # Test splitting the first patch, then adding both
203 test_expect_success 'add first line works' '
204 git commit -am "clear local changes" &&
205 git apply patch &&
206 (echo s; echo y; echo y) | git add -p file &&
207 git diff --cached > diff &&
208 test_cmp expected diff
209 '
210
211 test_done