summaryrefslogtreecommitdiff
path: root/t/t3600-rm.sh
blob: e31cf93a00ab377355734b3d88d536d36fe734e1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#!/bin/sh
#
# Copyright (c) 2006 Carl D. Worth
#

test_description='Test of the various options to git-rm.'

. ./test-lib.sh

# Setup some files to be removed, some with funny characters
test_expect_success \
    'Initialize test directory' \
    "touch -- foo bar baz 'space embedded' -q &&
     git-add -- foo bar baz 'space embedded' -q &&
     git-commit -m 'add normal files' &&
     test_tabs=y &&
     if touch -- 'tab	embedded' 'newline
embedded'
     then
     git-add -- 'tab	embedded' 'newline
embedded' &&
     git-commit -m 'add files with tabs and newlines'
     else
         say 'Your filesystem does not allow tabs in filenames.'
         test_tabs=n
     fi"

# Later we will try removing an unremovable path to make sure
# git-rm barfs, but if the test is run as root that cannot be
# arranged.
test_expect_success \
    'Determine rm behavior' \
    ': >test-file
     chmod a-w .
     rm -f test-file
     test -f test-file && test_failed_remove=y
     chmod 775 .
     rm -f test-file'

test_expect_success \
    'Pre-check that foo exists and is in index before git-rm foo' \
    '[ -f foo ] && git-ls-files --error-unmatch foo'

test_expect_success \
    'Test that git-rm foo succeeds' \
    'git-rm --cached foo'

test_expect_success \
    'Post-check that foo exists but is not in index after git-rm foo' \
    '[ -f foo ] && ! git-ls-files --error-unmatch foo'

test_expect_success \
    'Pre-check that bar exists and is in index before "git-rm bar"' \
    '[ -f bar ] && git-ls-files --error-unmatch bar'

test_expect_success \
    'Test that "git-rm bar" succeeds' \
    'git-rm bar'

test_expect_success \
    'Post-check that bar does not exist and is not in index after "git-rm -f bar"' \
    '! [ -f bar ] && ! git-ls-files --error-unmatch bar'

test_expect_success \
    'Test that "git-rm -- -q" succeeds (remove a file that looks like an option)' \
    'git-rm -- -q'

test "$test_tabs" = y && test_expect_success \
    "Test that \"git-rm -f\" succeeds with embedded space, tab, or newline characters." \
    "git-rm -f 'space embedded' 'tab	embedded' 'newline
embedded'"

if test "$test_failed_remove" = y; then
chmod a-w .
test_expect_failure \
    'Test that "git-rm -f" fails if its rm fails' \
    'git-rm -f baz'
chmod 775 .
else
    test_expect_success 'skipping removal failure (perhaps running as root?)' :
fi

test_expect_success \
    'When the rm in "git-rm -f" fails, it should not remove the file from the index' \
    'git-ls-files --error-unmatch baz'

# Now, failure cases.
test_expect_success 'Re-add foo and baz' '
	git add foo baz &&
	git ls-files --error-unmatch foo baz
'

test_expect_success 'Modify foo -- rm should refuse' '
	echo >>foo &&
	! git rm foo baz &&
	test -f foo &&
	test -f baz &&
	git ls-files --error-unmatch foo baz
'

test_expect_success 'Modified foo -- rm -f should work' '
	git rm -f foo baz &&
	test ! -f foo &&
	test ! -f baz &&
	! git ls-files --error-unmatch foo &&
	! git ls-files --error-unmatch bar
'

test_expect_success 'Re-add foo and baz for HEAD tests' '
	echo frotz >foo &&
	git checkout HEAD -- baz &&
	git add foo baz &&
	git ls-files --error-unmatch foo baz
'

test_expect_success 'foo is different in index from HEAD -- rm should refuse' '
	! git rm foo baz &&
	test -f foo &&
	test -f baz &&
	git ls-files --error-unmatch foo baz
'

test_expect_success 'but with -f it should work.' '
	git rm -f foo baz &&
	test ! -f foo &&
	test ! -f baz &&
	! git ls-files --error-unmatch foo
	! git ls-files --error-unmatch baz
'

test_expect_success 'Recursive test setup' '
	mkdir -p frotz &&
	echo qfwfq >frotz/nitfol &&
	git add frotz &&
	git commit -m "subdir test"
'

test_expect_success 'Recursive without -r fails' '
	! git rm frotz &&
	test -d frotz &&
	test -f frotz/nitfol
'

test_expect_success 'Recursive with -r but dirty' '
	echo qfwfq >>frotz/nitfol
	! git rm -r frotz &&
	test -d frotz &&
	test -f frotz/nitfol
'

test_expect_success 'Recursive with -r -f' '
	git rm -f -r frotz &&
	! test -f frotz/nitfol &&
	! test -d frotz
'

test_done