]>
Commit | Line | Data |
---|---|---|
d4a1cab5 CW |
1 | #!/bin/sh |
2 | # | |
3 | # Copyright (c) 2006 Carl D. Worth | |
4 | # | |
5 | ||
5be60078 | 6 | test_description='Test of the various options to git rm.' |
d4a1cab5 CW |
7 | |
8 | . ./test-lib.sh | |
9 | ||
3844cdc8 | 10 | # Setup some files to be removed, some with funny characters |
22669a04 SP |
11 | test_expect_success \ |
12 | 'Initialize test directory' \ | |
13 | "touch -- foo bar baz 'space embedded' -q && | |
5be60078 | 14 | git add -- foo bar baz 'space embedded' -q && |
56e78bfb JS |
15 | git commit -m 'add normal files'" |
16 | ||
17 | if touch -- 'tab embedded' 'newline | |
18 | embedded' 2>/dev/null | |
19 | then | |
20 | test_set_prereq FUNNYNAMES | |
21 | else | |
22 | say 'Your filesystem does not allow tabs in filenames.' | |
23 | fi | |
24 | ||
25 | test_expect_success FUNNYNAMES 'add files with funny names' " | |
5be60078 | 26 | git add -- 'tab embedded' 'newline |
22669a04 | 27 | embedded' && |
3604e7c5 | 28 | git commit -m 'add files with tabs and newlines' |
56e78bfb | 29 | " |
5b46a428 | 30 | |
56e78bfb | 31 | # Determine rm behavior |
2283645b | 32 | # Later we will try removing an unremovable path to make sure |
5be60078 | 33 | # git rm barfs, but if the test is run as root that cannot be |
2283645b | 34 | # arranged. |
56e78bfb JS |
35 | : >test-file |
36 | chmod a-w . | |
37 | rm -f test-file 2>/dev/null | |
38 | if test -f test-file | |
39 | then | |
40 | test_set_prereq RO_DIR | |
41 | else | |
42 | say 'skipping removal failure test (perhaps running as root?)' | |
43 | fi | |
44 | chmod 775 . | |
45 | rm -f test-file | |
2283645b | 46 | |
d4a1cab5 | 47 | test_expect_success \ |
5be60078 JH |
48 | 'Pre-check that foo exists and is in index before git rm foo' \ |
49 | '[ -f foo ] && git ls-files --error-unmatch foo' | |
d4a1cab5 CW |
50 | |
51 | test_expect_success \ | |
5be60078 JH |
52 | 'Test that git rm foo succeeds' \ |
53 | 'git rm --cached foo' | |
d4a1cab5 | 54 | |
bdecd9d4 MM |
55 | test_expect_success \ |
56 | 'Test that git rm --cached foo succeeds if the index matches the file' \ | |
57 | 'echo content > foo | |
58 | git add foo | |
59 | git rm --cached foo' | |
60 | ||
61 | test_expect_success \ | |
62 | 'Test that git rm --cached foo succeeds if the index matches the file' \ | |
63 | 'echo content > foo | |
64 | git add foo | |
65 | git commit -m foo | |
66 | echo "other content" > foo | |
67 | git rm --cached foo' | |
68 | ||
41ac414e JH |
69 | test_expect_success \ |
70 | 'Test that git rm --cached foo fails if the index matches neither the file nor HEAD' ' | |
71 | echo content > foo | |
bdecd9d4 MM |
72 | git add foo |
73 | git commit -m foo | |
74 | echo "other content" > foo | |
75 | git add foo | |
76 | echo "yet another content" > foo | |
d492b31c | 77 | test_must_fail git rm --cached foo |
41ac414e | 78 | ' |
bdecd9d4 MM |
79 | |
80 | test_expect_success \ | |
81 | 'Test that git rm --cached -f foo works in case where --cached only did not' \ | |
82 | 'echo content > foo | |
83 | git add foo | |
84 | git commit -m foo | |
85 | echo "other content" > foo | |
86 | git add foo | |
87 | echo "yet another content" > foo | |
88 | git rm --cached -f foo' | |
89 | ||
3844cdc8 | 90 | test_expect_success \ |
5be60078 | 91 | 'Post-check that foo exists but is not in index after git rm foo' \ |
d492b31c | 92 | '[ -f foo ] && test_must_fail git ls-files --error-unmatch foo' |
3844cdc8 CW |
93 | |
94 | test_expect_success \ | |
5be60078 JH |
95 | 'Pre-check that bar exists and is in index before "git rm bar"' \ |
96 | '[ -f bar ] && git ls-files --error-unmatch bar' | |
d4a1cab5 CW |
97 | |
98 | test_expect_success \ | |
5be60078 JH |
99 | 'Test that "git rm bar" succeeds' \ |
100 | 'git rm bar' | |
d4a1cab5 | 101 | |
3844cdc8 | 102 | test_expect_success \ |
5be60078 | 103 | 'Post-check that bar does not exist and is not in index after "git rm -f bar"' \ |
d492b31c | 104 | '! [ -f bar ] && test_must_fail git ls-files --error-unmatch bar' |
d4a1cab5 CW |
105 | |
106 | test_expect_success \ | |
5be60078 JH |
107 | 'Test that "git rm -- -q" succeeds (remove a file that looks like an option)' \ |
108 | 'git rm -- -q' | |
d4a1cab5 | 109 | |
56e78bfb | 110 | test_expect_success FUNNYNAMES \ |
5be60078 JH |
111 | "Test that \"git rm -f\" succeeds with embedded space, tab, or newline characters." \ |
112 | "git rm -f 'space embedded' 'tab embedded' 'newline | |
3844cdc8 CW |
113 | embedded'" |
114 | ||
56e78bfb JS |
115 | test_expect_success RO_DIR 'Test that "git rm -f" fails if its rm fails' ' |
116 | chmod a-w . && | |
117 | test_must_fail git rm -f baz && | |
118 | chmod 775 . | |
119 | ' | |
3844cdc8 CW |
120 | |
121 | test_expect_success \ | |
5be60078 JH |
122 | 'When the rm in "git rm -f" fails, it should not remove the file from the index' \ |
123 | 'git ls-files --error-unmatch baz' | |
3844cdc8 | 124 | |
bb1faf0d SG |
125 | test_expect_success 'Remove nonexistent file with --ignore-unmatch' ' |
126 | git rm --ignore-unmatch nonexistent | |
127 | ' | |
128 | ||
b48caa20 SG |
129 | test_expect_success '"rm" command printed' ' |
130 | echo frotz > test-file && | |
131 | git add test-file && | |
132 | git commit -m "add file for rm test" && | |
133 | git rm test-file > rm-output && | |
0feb4d1c | 134 | test `grep "^rm " rm-output | wc -l` = 1 && |
b48caa20 SG |
135 | rm -f test-file rm-output && |
136 | git commit -m "remove file from rm test" | |
137 | ' | |
138 | ||
139 | test_expect_success '"rm" command suppressed with --quiet' ' | |
140 | echo frotz > test-file && | |
141 | git add test-file && | |
142 | git commit -m "add file for rm --quiet test" && | |
143 | git rm --quiet test-file > rm-output && | |
144 | test `wc -l < rm-output` = 0 && | |
145 | rm -f test-file rm-output && | |
146 | git commit -m "remove file from rm --quiet test" | |
147 | ' | |
148 | ||
467e1b53 JH |
149 | # Now, failure cases. |
150 | test_expect_success 'Re-add foo and baz' ' | |
151 | git add foo baz && | |
152 | git ls-files --error-unmatch foo baz | |
153 | ' | |
154 | ||
155 | test_expect_success 'Modify foo -- rm should refuse' ' | |
156 | echo >>foo && | |
d492b31c | 157 | test_must_fail git rm foo baz && |
467e1b53 JH |
158 | test -f foo && |
159 | test -f baz && | |
160 | git ls-files --error-unmatch foo baz | |
161 | ' | |
162 | ||
163 | test_expect_success 'Modified foo -- rm -f should work' ' | |
164 | git rm -f foo baz && | |
165 | test ! -f foo && | |
166 | test ! -f baz && | |
d492b31c SB |
167 | test_must_fail git ls-files --error-unmatch foo && |
168 | test_must_fail git ls-files --error-unmatch bar | |
467e1b53 JH |
169 | ' |
170 | ||
171 | test_expect_success 'Re-add foo and baz for HEAD tests' ' | |
172 | echo frotz >foo && | |
173 | git checkout HEAD -- baz && | |
174 | git add foo baz && | |
175 | git ls-files --error-unmatch foo baz | |
176 | ' | |
177 | ||
178 | test_expect_success 'foo is different in index from HEAD -- rm should refuse' ' | |
d492b31c | 179 | test_must_fail git rm foo baz && |
467e1b53 JH |
180 | test -f foo && |
181 | test -f baz && | |
182 | git ls-files --error-unmatch foo baz | |
183 | ' | |
184 | ||
185 | test_expect_success 'but with -f it should work.' ' | |
186 | git rm -f foo baz && | |
187 | test ! -f foo && | |
188 | test ! -f baz && | |
d492b31c SB |
189 | test_must_fail git ls-files --error-unmatch foo |
190 | test_must_fail git ls-files --error-unmatch baz | |
467e1b53 JH |
191 | ' |
192 | ||
388b2acd JH |
193 | test_expect_success 'refuse to remove cached empty file with modifications' ' |
194 | >empty && | |
f55527f8 JK |
195 | git add empty && |
196 | echo content >empty && | |
197 | test_must_fail git rm --cached empty | |
198 | ' | |
199 | ||
200 | test_expect_success 'remove intent-to-add file without --force' ' | |
201 | echo content >intent-to-add && | |
202 | git add -N intent-to-add | |
203 | git rm --cached intent-to-add | |
204 | ' | |
205 | ||
467e1b53 JH |
206 | test_expect_success 'Recursive test setup' ' |
207 | mkdir -p frotz && | |
208 | echo qfwfq >frotz/nitfol && | |
209 | git add frotz && | |
210 | git commit -m "subdir test" | |
211 | ' | |
212 | ||
213 | test_expect_success 'Recursive without -r fails' ' | |
d492b31c | 214 | test_must_fail git rm frotz && |
467e1b53 JH |
215 | test -d frotz && |
216 | test -f frotz/nitfol | |
217 | ' | |
218 | ||
219 | test_expect_success 'Recursive with -r but dirty' ' | |
220 | echo qfwfq >>frotz/nitfol | |
d492b31c | 221 | test_must_fail git rm -r frotz && |
467e1b53 JH |
222 | test -d frotz && |
223 | test -f frotz/nitfol | |
224 | ' | |
225 | ||
226 | test_expect_success 'Recursive with -r -f' ' | |
227 | git rm -f -r frotz && | |
228 | ! test -f frotz/nitfol && | |
229 | ! test -d frotz | |
230 | ' | |
231 | ||
41ac414e | 232 | test_expect_success 'Remove nonexistent file returns nonzero exit status' ' |
d492b31c | 233 | test_must_fail git rm nonexistent |
b48caa20 SG |
234 | ' |
235 | ||
4d264672 OM |
236 | test_expect_success 'Call "rm" from outside the work tree' ' |
237 | mkdir repo && | |
cced48a8 JS |
238 | (cd repo && |
239 | git init && | |
240 | echo something > somefile && | |
241 | git add somefile && | |
242 | git commit -m "add a file" && | |
243 | (cd .. && | |
244 | git --git-dir=repo/.git --work-tree=repo rm somefile) && | |
245 | test_must_fail git ls-files --error-unmatch somefile) | |
246 | ' | |
247 | ||
248 | test_expect_success 'refresh index before checking if it is up-to-date' ' | |
249 | ||
250 | git reset --hard && | |
251 | test-chmtime -86400 frotz/nitfol && | |
252 | git rm frotz/nitfol && | |
253 | test ! -f frotz/nitfol | |
254 | ||
4d264672 OM |
255 | ' |
256 | ||
0693f9dd JH |
257 | test_expect_success 'choking "git rm" should not let it die with cruft' ' |
258 | git reset -q --hard && | |
259 | H=0000000000000000000000000000000000000000 && | |
260 | i=0 && | |
261 | while test $i -lt 12000 | |
262 | do | |
263 | echo "100644 $H 0 some-file-$i" | |
264 | i=$(( $i + 1 )) | |
265 | done | git update-index --index-info && | |
266 | git rm -n "some-file-*" | :; | |
267 | test -f .git/index.lock | |
268 | status=$? | |
269 | rm -f .git/index.lock | |
270 | git reset -q --hard | |
271 | test "$status" != 0 | |
272 | ' | |
273 | ||
d4a1cab5 | 274 | test_done |