Merge branch 'sb/repack-in-c'
[git] / t / t3600-rm.sh
1 #!/bin/sh
2 #
3 # Copyright (c) 2006 Carl D. Worth
4 #
5
6 test_description='Test of the various options to git rm.'
7
8 . ./test-lib.sh
9
10 # Setup some files to be removed, some with funny characters
11 test_expect_success \
12     'Initialize test directory' \
13     "touch -- foo bar baz 'space embedded' -q &&
14      git add -- foo bar baz 'space embedded' -q &&
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' "
26      git add -- 'tab    embedded' 'newline
27 embedded' &&
28      git commit -m 'add files with tabs and newlines'
29 "
30
31 test_expect_success \
32     'Pre-check that foo exists and is in index before git rm foo' \
33     '[ -f foo ] && git ls-files --error-unmatch foo'
34
35 test_expect_success \
36     'Test that git rm foo succeeds' \
37     'git rm --cached foo'
38
39 test_expect_success \
40     'Test that git rm --cached foo succeeds if the index matches the file' \
41     'echo content > foo
42      git add foo
43      git rm --cached foo'
44
45 test_expect_success \
46     'Test that git rm --cached foo succeeds if the index matches the file' \
47     'echo content > foo
48      git add foo
49      git commit -m foo
50      echo "other content" > foo
51      git rm --cached foo'
52
53 test_expect_success \
54     'Test that git rm --cached foo fails if the index matches neither the file nor HEAD' '
55      echo content > foo
56      git add foo
57      git commit -m foo
58      echo "other content" > foo
59      git add foo
60      echo "yet another content" > foo
61      test_must_fail git rm --cached foo
62 '
63
64 test_expect_success \
65     'Test that git rm --cached -f foo works in case where --cached only did not' \
66     'echo content > foo
67      git add foo
68      git commit -m foo
69      echo "other content" > foo
70      git add foo
71      echo "yet another content" > foo
72      git rm --cached -f foo'
73
74 test_expect_success \
75     'Post-check that foo exists but is not in index after git rm foo' \
76     '[ -f foo ] && test_must_fail git ls-files --error-unmatch foo'
77
78 test_expect_success \
79     'Pre-check that bar exists and is in index before "git rm bar"' \
80     '[ -f bar ] && git ls-files --error-unmatch bar'
81
82 test_expect_success \
83     'Test that "git rm bar" succeeds' \
84     'git rm bar'
85
86 test_expect_success \
87     'Post-check that bar does not exist and is not in index after "git rm -f bar"' \
88     '! [ -f bar ] && test_must_fail git ls-files --error-unmatch bar'
89
90 test_expect_success \
91     'Test that "git rm -- -q" succeeds (remove a file that looks like an option)' \
92     'git rm -- -q'
93
94 test_expect_success FUNNYNAMES \
95     "Test that \"git rm -f\" succeeds with embedded space, tab, or newline characters." \
96     "git rm -f 'space embedded' 'tab    embedded' 'newline
97 embedded'"
98
99 test_expect_success SANITY 'Test that "git rm -f" fails if its rm fails' '
100         chmod a-w . &&
101         test_must_fail git rm -f baz &&
102         chmod 775 .
103 '
104
105 test_expect_success \
106     'When the rm in "git rm -f" fails, it should not remove the file from the index' \
107     'git ls-files --error-unmatch baz'
108
109 test_expect_success 'Remove nonexistent file with --ignore-unmatch' '
110         git rm --ignore-unmatch nonexistent
111 '
112
113 test_expect_success '"rm" command printed' '
114         echo frotz > test-file &&
115         git add test-file &&
116         git commit -m "add file for rm test" &&
117         git rm test-file > rm-output &&
118         test `grep "^rm " rm-output | wc -l` = 1 &&
119         rm -f test-file rm-output &&
120         git commit -m "remove file from rm test"
121 '
122
123 test_expect_success '"rm" command suppressed with --quiet' '
124         echo frotz > test-file &&
125         git add test-file &&
126         git commit -m "add file for rm --quiet test" &&
127         git rm --quiet test-file > rm-output &&
128         test `wc -l < rm-output` = 0 &&
129         rm -f test-file rm-output &&
130         git commit -m "remove file from rm --quiet test"
131 '
132
133 # Now, failure cases.
134 test_expect_success 'Re-add foo and baz' '
135         git add foo baz &&
136         git ls-files --error-unmatch foo baz
137 '
138
139 test_expect_success 'Modify foo -- rm should refuse' '
140         echo >>foo &&
141         test_must_fail git rm foo baz &&
142         test -f foo &&
143         test -f baz &&
144         git ls-files --error-unmatch foo baz
145 '
146
147 test_expect_success 'Modified foo -- rm -f should work' '
148         git rm -f foo baz &&
149         test ! -f foo &&
150         test ! -f baz &&
151         test_must_fail git ls-files --error-unmatch foo &&
152         test_must_fail git ls-files --error-unmatch bar
153 '
154
155 test_expect_success 'Re-add foo and baz for HEAD tests' '
156         echo frotz >foo &&
157         git checkout HEAD -- baz &&
158         git add foo baz &&
159         git ls-files --error-unmatch foo baz
160 '
161
162 test_expect_success 'foo is different in index from HEAD -- rm should refuse' '
163         test_must_fail git rm foo baz &&
164         test -f foo &&
165         test -f baz &&
166         git ls-files --error-unmatch foo baz
167 '
168
169 test_expect_success 'but with -f it should work.' '
170         git rm -f foo baz &&
171         test ! -f foo &&
172         test ! -f baz &&
173         test_must_fail git ls-files --error-unmatch foo
174         test_must_fail git ls-files --error-unmatch baz
175 '
176
177 test_expect_success 'refuse to remove cached empty file with modifications' '
178         >empty &&
179         git add empty &&
180         echo content >empty &&
181         test_must_fail git rm --cached empty
182 '
183
184 test_expect_success 'remove intent-to-add file without --force' '
185         echo content >intent-to-add &&
186         git add -N intent-to-add
187         git rm --cached intent-to-add
188 '
189
190 test_expect_success 'Recursive test setup' '
191         mkdir -p frotz &&
192         echo qfwfq >frotz/nitfol &&
193         git add frotz &&
194         git commit -m "subdir test"
195 '
196
197 test_expect_success 'Recursive without -r fails' '
198         test_must_fail git rm frotz &&
199         test -d frotz &&
200         test -f frotz/nitfol
201 '
202
203 test_expect_success 'Recursive with -r but dirty' '
204         echo qfwfq >>frotz/nitfol
205         test_must_fail git rm -r frotz &&
206         test -d frotz &&
207         test -f frotz/nitfol
208 '
209
210 test_expect_success 'Recursive with -r -f' '
211         git rm -f -r frotz &&
212         ! test -f frotz/nitfol &&
213         ! test -d frotz
214 '
215
216 test_expect_success 'Remove nonexistent file returns nonzero exit status' '
217         test_must_fail git rm nonexistent
218 '
219
220 test_expect_success 'Call "rm" from outside the work tree' '
221         mkdir repo &&
222         (cd repo &&
223          git init &&
224          echo something > somefile &&
225          git add somefile &&
226          git commit -m "add a file" &&
227          (cd .. &&
228           git --git-dir=repo/.git --work-tree=repo rm somefile) &&
229         test_must_fail git ls-files --error-unmatch somefile)
230 '
231
232 test_expect_success 'refresh index before checking if it is up-to-date' '
233
234         git reset --hard &&
235         test-chmtime -86400 frotz/nitfol &&
236         git rm frotz/nitfol &&
237         test ! -f frotz/nitfol
238
239 '
240
241 test_expect_success 'choking "git rm" should not let it die with cruft' '
242         git reset -q --hard &&
243         i=0 &&
244         while test $i -lt 12000
245         do
246             echo "100644 $_z40 0        some-file-$i"
247             i=$(( $i + 1 ))
248         done | git update-index --index-info &&
249         git rm -n "some-file-*" | :;
250         test -f .git/index.lock
251         status=$?
252         rm -f .git/index.lock
253         git reset -q --hard
254         test "$status" != 0
255 '
256
257 test_expect_success 'rm removes subdirectories recursively' '
258         mkdir -p dir/subdir/subsubdir &&
259         echo content >dir/subdir/subsubdir/file &&
260         git add dir/subdir/subsubdir/file &&
261         git rm -f dir/subdir/subsubdir/file &&
262         ! test -d dir
263 '
264
265 cat >expect <<EOF
266 M  .gitmodules
267 D  submod
268 EOF
269
270 cat >expect.modified <<EOF
271  M submod
272 EOF
273
274 cat >expect.cached <<EOF
275 D  submod
276 EOF
277
278 cat >expect.both_deleted<<EOF
279 D  .gitmodules
280 D  submod
281 EOF
282
283 test_expect_success 'rm removes empty submodules from work tree' '
284         mkdir submod &&
285         git update-index --add --cacheinfo 160000 $(git rev-parse HEAD) submod &&
286         git config -f .gitmodules submodule.sub.url ./. &&
287         git config -f .gitmodules submodule.sub.path submod &&
288         git submodule init &&
289         git add .gitmodules &&
290         git commit -m "add submodule" &&
291         git rm submod &&
292         test ! -e submod &&
293         git status -s -uno --ignore-submodules=none > actual &&
294         test_cmp expect actual &&
295         test_must_fail git config -f .gitmodules submodule.sub.url &&
296         test_must_fail git config -f .gitmodules submodule.sub.path
297 '
298
299 test_expect_success 'rm removes removed submodule from index and .gitmodules' '
300         git reset --hard &&
301         git submodule update &&
302         rm -rf submod &&
303         git rm submod &&
304         git status -s -uno --ignore-submodules=none > actual &&
305         test_cmp expect actual &&
306         test_must_fail git config -f .gitmodules submodule.sub.url &&
307         test_must_fail git config -f .gitmodules submodule.sub.path
308 '
309
310 test_expect_success 'rm removes work tree of unmodified submodules' '
311         git reset --hard &&
312         git submodule update &&
313         git rm submod &&
314         test ! -d submod &&
315         git status -s -uno --ignore-submodules=none > actual &&
316         test_cmp expect actual &&
317         test_must_fail git config -f .gitmodules submodule.sub.url &&
318         test_must_fail git config -f .gitmodules submodule.sub.path
319 '
320
321 test_expect_success 'rm removes a submodule with a trailing /' '
322         git reset --hard &&
323         git submodule update &&
324         git rm submod/ &&
325         test ! -d submod &&
326         git status -s -uno --ignore-submodules=none > actual &&
327         test_cmp expect actual
328 '
329
330 test_expect_success 'rm fails when given a file with a trailing /' '
331         test_must_fail git rm empty/
332 '
333
334 test_expect_success 'rm succeeds when given a directory with a trailing /' '
335         git rm -r frotz/
336 '
337
338 test_expect_success 'rm of a populated submodule with different HEAD fails unless forced' '
339         git reset --hard &&
340         git submodule update &&
341         (cd submod &&
342                 git checkout HEAD^
343         ) &&
344         test_must_fail git rm submod &&
345         test -d submod &&
346         test -f submod/.git &&
347         git status -s -uno --ignore-submodules=none > actual &&
348         test_cmp expect.modified actual &&
349         git rm -f submod &&
350         test ! -d submod &&
351         git status -s -uno --ignore-submodules=none > actual &&
352         test_cmp expect actual &&
353         test_must_fail git config -f .gitmodules submodule.sub.url &&
354         test_must_fail git config -f .gitmodules submodule.sub.path
355 '
356
357 test_expect_success 'rm --cached leaves work tree of populated submodules and .gitmodules alone' '
358         git reset --hard &&
359         git submodule update &&
360         git rm --cached submod &&
361         test -d submod &&
362         test -f submod/.git &&
363         git status -s -uno >actual &&
364         test_cmp expect.cached actual &&
365         git config -f .gitmodules submodule.sub.url &&
366         git config -f .gitmodules submodule.sub.path
367 '
368
369 test_expect_success 'rm --dry-run does not touch the submodule or .gitmodules' '
370         git reset --hard &&
371         git submodule update &&
372         git rm -n submod &&
373         test -f submod/.git &&
374         git diff-index --exit-code HEAD
375 '
376
377 test_expect_success 'rm does not complain when no .gitmodules file is found' '
378         git reset --hard &&
379         git submodule update &&
380         git rm .gitmodules &&
381         git rm submod >actual 2>actual.err &&
382         ! test -s actual.err &&
383         ! test -d submod &&
384         ! test -f submod/.git &&
385         git status -s -uno >actual &&
386         test_cmp expect.both_deleted actual
387 '
388
389 test_expect_success 'rm will error out on a modified .gitmodules file unless staged' '
390         git reset --hard &&
391         git submodule update &&
392         git config -f .gitmodules foo.bar true &&
393         test_must_fail git rm submod >actual 2>actual.err &&
394         test -s actual.err &&
395         test -d submod &&
396         test -f submod/.git &&
397         git diff-files --quiet -- submod &&
398         git add .gitmodules &&
399         git rm submod >actual 2>actual.err &&
400         ! test -s actual.err &&
401         ! test -d submod &&
402         ! test -f submod/.git &&
403         git status -s -uno >actual &&
404         test_cmp expect actual
405 '
406
407 test_expect_success 'rm issues a warning when section is not found in .gitmodules' '
408         git reset --hard &&
409         git submodule update &&
410         git config -f .gitmodules --remove-section submodule.sub &&
411         git add .gitmodules &&
412         echo "warning: Could not find section in .gitmodules where path=submod" >expect.err &&
413         git rm submod >actual 2>actual.err &&
414         test_i18ncmp expect.err actual.err &&
415         ! test -d submod &&
416         ! test -f submod/.git &&
417         git status -s -uno >actual &&
418         test_cmp expect actual
419 '
420
421 test_expect_success 'rm of a populated submodule with modifications fails unless forced' '
422         git reset --hard &&
423         git submodule update &&
424         (cd submod &&
425                 echo X >empty
426         ) &&
427         test_must_fail git rm submod &&
428         test -d submod &&
429         test -f submod/.git &&
430         git status -s -uno --ignore-submodules=none > actual &&
431         test_cmp expect.modified actual &&
432         git rm -f submod &&
433         test ! -d submod &&
434         git status -s -uno --ignore-submodules=none > actual &&
435         test_cmp expect actual
436 '
437
438 test_expect_success 'rm of a populated submodule with untracked files fails unless forced' '
439         git reset --hard &&
440         git submodule update &&
441         (cd submod &&
442                 echo X >untracked
443         ) &&
444         test_must_fail git rm submod &&
445         test -d submod &&
446         test -f submod/.git &&
447         git status -s -uno --ignore-submodules=none > actual &&
448         test_cmp expect.modified actual &&
449         git rm -f submod &&
450         test ! -d submod &&
451         git status -s -uno --ignore-submodules=none > actual &&
452         test_cmp expect actual
453 '
454
455 test_expect_success 'setup submodule conflict' '
456         git reset --hard &&
457         git submodule update &&
458         git checkout -b branch1 &&
459         echo 1 >nitfol &&
460         git add nitfol &&
461         git commit -m "added nitfol 1" &&
462         git checkout -b branch2 master &&
463         echo 2 >nitfol &&
464         git add nitfol &&
465         git commit -m "added nitfol 2" &&
466         git checkout -b conflict1 master &&
467         (cd submod &&
468                 git fetch &&
469                 git checkout branch1
470         ) &&
471         git add submod &&
472         git commit -m "submod 1" &&
473         git checkout -b conflict2 master &&
474         (cd submod &&
475                 git checkout branch2
476         ) &&
477         git add submod &&
478         git commit -m "submod 2"
479 '
480
481 cat >expect.conflict <<EOF
482 UU submod
483 EOF
484
485 test_expect_success 'rm removes work tree of unmodified conflicted submodule' '
486         git checkout conflict1 &&
487         git reset --hard &&
488         git submodule update &&
489         test_must_fail git merge conflict2 &&
490         git rm submod &&
491         test ! -d submod &&
492         git status -s -uno --ignore-submodules=none > actual &&
493         test_cmp expect actual
494 '
495
496 test_expect_success 'rm of a conflicted populated submodule with different HEAD fails unless forced' '
497         git checkout conflict1 &&
498         git reset --hard &&
499         git submodule update &&
500         (cd submod &&
501                 git checkout HEAD^
502         ) &&
503         test_must_fail git merge conflict2 &&
504         test_must_fail git rm submod &&
505         test -d submod &&
506         test -f submod/.git &&
507         git status -s -uno --ignore-submodules=none > actual &&
508         test_cmp expect.conflict actual &&
509         git rm -f submod &&
510         test ! -d submod &&
511         git status -s -uno --ignore-submodules=none > actual &&
512         test_cmp expect actual &&
513         test_must_fail git config -f .gitmodules submodule.sub.url &&
514         test_must_fail git config -f .gitmodules submodule.sub.path
515 '
516
517 test_expect_success 'rm of a conflicted populated submodule with modifications fails unless forced' '
518         git checkout conflict1 &&
519         git reset --hard &&
520         git submodule update &&
521         (cd submod &&
522                 echo X >empty
523         ) &&
524         test_must_fail git merge conflict2 &&
525         test_must_fail git rm submod &&
526         test -d submod &&
527         test -f submod/.git &&
528         git status -s -uno --ignore-submodules=none > actual &&
529         test_cmp expect.conflict actual &&
530         git rm -f submod &&
531         test ! -d submod &&
532         git status -s -uno --ignore-submodules=none > actual &&
533         test_cmp expect actual &&
534         test_must_fail git config -f .gitmodules submodule.sub.url &&
535         test_must_fail git config -f .gitmodules submodule.sub.path
536 '
537
538 test_expect_success 'rm of a conflicted populated submodule with untracked files fails unless forced' '
539         git checkout conflict1 &&
540         git reset --hard &&
541         git submodule update &&
542         (cd submod &&
543                 echo X >untracked
544         ) &&
545         test_must_fail git merge conflict2 &&
546         test_must_fail git rm submod &&
547         test -d submod &&
548         test -f submod/.git &&
549         git status -s -uno --ignore-submodules=none > actual &&
550         test_cmp expect.conflict actual &&
551         git rm -f submod &&
552         test ! -d submod &&
553         git status -s -uno --ignore-submodules=none > actual &&
554         test_cmp expect actual
555 '
556
557 test_expect_success 'rm of a conflicted populated submodule with a .git directory fails even when forced' '
558         git checkout conflict1 &&
559         git reset --hard &&
560         git submodule update &&
561         (cd submod &&
562                 rm .git &&
563                 cp -R ../.git/modules/sub .git &&
564                 GIT_WORK_TREE=. git config --unset core.worktree
565         ) &&
566         test_must_fail git merge conflict2 &&
567         test_must_fail git rm submod &&
568         test -d submod &&
569         test -d submod/.git &&
570         git status -s -uno --ignore-submodules=none > actual &&
571         test_cmp expect.conflict actual &&
572         test_must_fail git rm -f submod &&
573         test -d submod &&
574         test -d submod/.git &&
575         git status -s -uno --ignore-submodules=none > actual &&
576         test_cmp expect.conflict actual &&
577         git merge --abort &&
578         rm -rf submod
579 '
580
581 test_expect_success 'rm of a conflicted unpopulated submodule succeeds' '
582         git checkout conflict1 &&
583         git reset --hard &&
584         test_must_fail git merge conflict2 &&
585         git rm submod &&
586         test ! -d submod &&
587         git status -s -uno --ignore-submodules=none > actual &&
588         test_cmp expect actual
589 '
590
591 test_expect_success 'rm of a populated submodule with a .git directory fails even when forced' '
592         git checkout -f master &&
593         git reset --hard &&
594         git submodule update &&
595         (cd submod &&
596                 rm .git &&
597                 cp -R ../.git/modules/sub .git &&
598                 GIT_WORK_TREE=. git config --unset core.worktree
599         ) &&
600         test_must_fail git rm submod &&
601         test -d submod &&
602         test -d submod/.git &&
603         git status -s -uno --ignore-submodules=none > actual &&
604         ! test -s actual &&
605         test_must_fail git rm -f submod &&
606         test -d submod &&
607         test -d submod/.git &&
608         git status -s -uno --ignore-submodules=none > actual &&
609         ! test -s actual &&
610         rm -rf submod
611 '
612
613 cat >expect.deepmodified <<EOF
614  M submod/subsubmod
615 EOF
616
617 test_expect_success 'setup subsubmodule' '
618         git reset --hard &&
619         git submodule update &&
620         (cd submod &&
621                 git update-index --add --cacheinfo 160000 $(git rev-parse HEAD) subsubmod &&
622                 git config -f .gitmodules submodule.sub.url ../. &&
623                 git config -f .gitmodules submodule.sub.path subsubmod &&
624                 git submodule init &&
625                 git add .gitmodules &&
626                 git commit -m "add subsubmodule" &&
627                 git submodule update subsubmod
628         ) &&
629         git commit -a -m "added deep submodule"
630 '
631
632 test_expect_success 'rm recursively removes work tree of unmodified submodules' '
633         git rm submod &&
634         test ! -d submod &&
635         git status -s -uno --ignore-submodules=none > actual &&
636         test_cmp expect actual
637 '
638
639 test_expect_success 'rm of a populated nested submodule with different nested HEAD fails unless forced' '
640         git reset --hard &&
641         git submodule update --recursive &&
642         (cd submod/subsubmod &&
643                 git checkout HEAD^
644         ) &&
645         test_must_fail git rm submod &&
646         test -d submod &&
647         test -f submod/.git &&
648         git status -s -uno --ignore-submodules=none > actual &&
649         test_cmp expect.modified actual &&
650         git rm -f submod &&
651         test ! -d submod &&
652         git status -s -uno --ignore-submodules=none > actual &&
653         test_cmp expect actual
654 '
655
656 test_expect_success 'rm of a populated nested submodule with nested modifications fails unless forced' '
657         git reset --hard &&
658         git submodule update --recursive &&
659         (cd submod/subsubmod &&
660                 echo X >empty
661         ) &&
662         test_must_fail git rm submod &&
663         test -d submod &&
664         test -f submod/.git &&
665         git status -s -uno --ignore-submodules=none > actual &&
666         test_cmp expect.modified actual &&
667         git rm -f submod &&
668         test ! -d submod &&
669         git status -s -uno --ignore-submodules=none > actual &&
670         test_cmp expect actual
671 '
672
673 test_expect_success 'rm of a populated nested submodule with nested untracked files fails unless forced' '
674         git reset --hard &&
675         git submodule update --recursive &&
676         (cd submod/subsubmod &&
677                 echo X >untracked
678         ) &&
679         test_must_fail git rm submod &&
680         test -d submod &&
681         test -f submod/.git &&
682         git status -s -uno --ignore-submodules=none > actual &&
683         test_cmp expect.modified actual &&
684         git rm -f submod &&
685         test ! -d submod &&
686         git status -s -uno --ignore-submodules=none > actual &&
687         test_cmp expect actual
688 '
689
690 test_expect_success 'rm of a populated nested submodule with a nested .git directory fails even when forced' '
691         git reset --hard &&
692         git submodule update --recursive &&
693         (cd submod/subsubmod &&
694                 rm .git &&
695                 cp -R ../../.git/modules/sub/modules/sub .git &&
696                 GIT_WORK_TREE=. git config --unset core.worktree
697         ) &&
698         test_must_fail git rm submod &&
699         test -d submod &&
700         test -d submod/subsubmod/.git &&
701         git status -s -uno --ignore-submodules=none > actual &&
702         ! test -s actual &&
703         test_must_fail git rm -f submod &&
704         test -d submod &&
705         test -d submod/subsubmod/.git &&
706         git status -s -uno --ignore-submodules=none > actual &&
707         ! test -s actual &&
708         rm -rf submod
709 '
710
711 test_expect_success 'rm of d/f when d has become a non-directory' '
712         rm -rf d &&
713         mkdir d &&
714         >d/f &&
715         git add d &&
716         rm -rf d &&
717         >d &&
718         git rm d/f &&
719         test_must_fail git rev-parse --verify :d/f &&
720         test_path_is_file d
721 '
722
723 test_expect_success SYMLINKS 'rm of d/f when d has become a dangling symlink' '
724         rm -rf d &&
725         mkdir d &&
726         >d/f &&
727         git add d &&
728         rm -rf d &&
729         ln -s nonexistent d &&
730         git rm d/f &&
731         test_must_fail git rev-parse --verify :d/f &&
732         test -h d &&
733         test_path_is_missing d
734 '
735
736 test_expect_success 'rm of file when it has become a directory' '
737         rm -rf d &&
738         >d &&
739         git add d &&
740         rm -f d &&
741         mkdir d &&
742         >d/f &&
743         test_must_fail git rm d &&
744         git rev-parse --verify :d &&
745         test_path_is_file d/f
746 '
747
748 test_expect_success SYMLINKS 'rm across a symlinked leading path (no index)' '
749         rm -rf d e &&
750         mkdir e &&
751         echo content >e/f &&
752         ln -s e d &&
753         git add -A e d &&
754         git commit -m "symlink d to e, e/f exists" &&
755         test_must_fail git rm d/f &&
756         git rev-parse --verify :d &&
757         git rev-parse --verify :e/f &&
758         test -h d &&
759         test_path_is_file e/f
760 '
761
762 test_expect_failure SYMLINKS 'rm across a symlinked leading path (w/ index)' '
763         rm -rf d e &&
764         mkdir d &&
765         echo content >d/f &&
766         git add -A e d &&
767         git commit -m "d/f exists" &&
768         mv d e &&
769         ln -s e d &&
770         test_must_fail git rm d/f &&
771         git rev-parse --verify :d/f &&
772         test -h d &&
773         test_path_is_file e/f
774 '
775
776 test_expect_success 'setup for testing rm messages' '
777         >bar.txt &&
778         >foo.txt &&
779         git add bar.txt foo.txt
780 '
781
782 test_expect_success 'rm files with different staged content' '
783         cat >expect <<-\EOF &&
784         error: the following files have staged content different from both the
785         file and the HEAD:
786             bar.txt
787             foo.txt
788         (use -f to force removal)
789         EOF
790         echo content1 >foo.txt &&
791         echo content1 >bar.txt &&
792         test_must_fail git rm foo.txt bar.txt 2>actual &&
793         test_i18ncmp expect actual
794 '
795
796 test_expect_success 'rm files with different staged content without hints' '
797         cat >expect <<-\EOF &&
798         error: the following files have staged content different from both the
799         file and the HEAD:
800             bar.txt
801             foo.txt
802         EOF
803         echo content2 >foo.txt &&
804         echo content2 >bar.txt &&
805         test_must_fail git -c advice.rmhints=false rm foo.txt bar.txt 2>actual &&
806         test_i18ncmp expect actual
807 '
808
809 test_expect_success 'rm file with local modification' '
810         cat >expect <<-\EOF &&
811         error: the following file has local modifications:
812             foo.txt
813         (use --cached to keep the file, or -f to force removal)
814         EOF
815         git commit -m "testing rm 3" &&
816         echo content3 >foo.txt &&
817         test_must_fail git rm foo.txt 2>actual &&
818         test_i18ncmp expect actual
819 '
820
821 test_expect_success 'rm file with local modification without hints' '
822         cat >expect <<-\EOF &&
823         error: the following file has local modifications:
824             bar.txt
825         EOF
826         echo content4 >bar.txt &&
827         test_must_fail git -c advice.rmhints=false rm bar.txt 2>actual &&
828         test_i18ncmp expect actual
829 '
830
831 test_expect_success 'rm file with changes in the index' '
832         cat >expect <<-\EOF &&
833         error: the following file has changes staged in the index:
834             foo.txt
835         (use --cached to keep the file, or -f to force removal)
836         EOF
837         git reset --hard &&
838         echo content5 >foo.txt &&
839         git add foo.txt &&
840         test_must_fail git rm foo.txt 2>actual &&
841         test_i18ncmp expect actual
842 '
843
844 test_expect_success 'rm file with changes in the index without hints' '
845         cat >expect <<-\EOF &&
846         error: the following file has changes staged in the index:
847             foo.txt
848         EOF
849         test_must_fail git -c advice.rmhints=false rm foo.txt 2>actual &&
850         test_i18ncmp expect actual
851 '
852
853 test_expect_success 'rm files with two different errors' '
854         cat >expect <<-\EOF &&
855         error: the following file has staged content different from both the
856         file and the HEAD:
857             foo1.txt
858         (use -f to force removal)
859         error: the following file has changes staged in the index:
860             bar1.txt
861         (use --cached to keep the file, or -f to force removal)
862         EOF
863         echo content >foo1.txt &&
864         git add foo1.txt &&
865         echo content6 >foo1.txt &&
866         echo content6 >bar1.txt &&
867         git add bar1.txt &&
868         test_must_fail git rm bar1.txt foo1.txt 2>actual &&
869         test_i18ncmp expect actual
870 '
871
872 test_done