17
17
"""Tests for interface conformance of 'WorkingTree.remove'"""
20
19
from bzrlib.tests.workingtree_implementations import TestCaseWithWorkingTree
21
20
from bzrlib import errors, osutils
23
22
class TestRemove(TestCaseWithWorkingTree):
24
23
"""Tests WorkingTree.remove"""
26
files=['a', 'b/', 'b/c', 'd/']
25
files = ['a', 'b/', 'b/c', 'd/']
26
rfiles = ['b/c', 'b', 'a', 'd']
32
self.makeAndChdirToTestDir()
33
32
tree = self.make_branch_and_tree('.')
34
33
self.build_tree(TestRemove.files)
61
60
tree = self.getTree()
62
61
tree.add(TestRemove.files)
63
62
self.assertInWorkingTree(TestRemove.files)
65
tree.remove(TestRemove.files, keep_files=False)
66
self.fail('Should throw BzrRemoveChangedFilesError')
67
except errors.BzrRemoveChangedFilesError, e:
68
self.assertTrue(re.match('Can\'t remove changed or unknown files:'
69
'.*added:.*a.*b.*b/c.*d.*',
63
err = self.assertRaises(errors.BzrRemoveChangedFilesError, tree.remove,
64
TestRemove.files, keep_files=False)
65
self.assertContainsRe(err.changes_as_text,
66
'(?s)added:.*a.*b/.*b/c.*d/')
71
67
self.assertInWorkingTree(TestRemove.files)
72
68
self.failUnlessExists(TestRemove.files)
76
72
tree = self.getTree()
77
73
tree.add(TestRemove.a)
78
74
tree.commit("make sure a is versioned")
80
f.write("some other new content!")
75
self.build_tree_contents([('a', "some other new content!")])
82
76
self.assertInWorkingTree(TestRemove.a)
84
tree.remove(TestRemove.a, keep_files=False)
85
self.fail('Should throw BzrRemoveChangedFilesError')
86
except errors.BzrRemoveChangedFilesError, e:
87
self.assertTrue(re.match('Can\'t remove changed or unknown files:'
77
err = self.assertRaises(errors.BzrRemoveChangedFilesError, tree.remove,
78
TestRemove.a, keep_files=False)
79
self.assertContainsRe(err.changes_as_text, '(?s)modified:.*a')
90
80
self.assertInWorkingTree(TestRemove.a)
91
81
self.failUnlessExists(TestRemove.a)
95
85
tree = self.getTree()
96
86
tree.add(TestRemove.files)
97
87
tree.commit("make sure files are versioned")
98
for f in ['b/c', 'b', 'a', 'd']:
88
for f in TestRemove.rfiles:
99
89
osutils.delete_any(f)
100
90
self.assertInWorkingTree(TestRemove.files)
101
91
self.failIfExists(TestRemove.files)
105
95
self.assertNotInWorkingTree(TestRemove.files)
106
96
self.failIfExists(TestRemove.files)
98
def test_remove_renamed_files(self):
99
"""Check that files are removed even if they are renamed."""
100
tree = self.getTree()
101
tree.add(TestRemove.files)
102
tree.commit("make sure files are versioned")
104
for f in TestRemove.rfiles:
105
tree.rename_one(f,f+'x')
106
rfilesx = ['bx/cx', 'bx', 'ax', 'dx']
107
self.assertInWorkingTree(rfilesx)
108
self.failUnlessExists(rfilesx)
110
tree.remove(rfilesx, keep_files=False)
112
self.assertNotInWorkingTree(rfilesx)
113
self.failIfExists(rfilesx)
115
def test_remove_renamed_changed_files(self):
116
"""Check that files are not removed if they are renamed and changed."""
117
tree = self.getTree()
118
tree.add(TestRemove.files)
119
tree.commit("make sure files are versioned")
121
for f in TestRemove.rfiles:
122
tree.rename_one(f,f+'x')
123
rfilesx = ['bx/cx', 'bx', 'ax', 'dx']
124
self.build_tree_contents([('ax','changed and renamed!'),
125
('bx/cx','changed and renamed!')])
126
self.assertInWorkingTree(rfilesx)
127
self.failUnlessExists(rfilesx)
129
err = self.assertRaises(errors.BzrRemoveChangedFilesError, tree.remove,
130
rfilesx, keep_files=False)
131
self.assertContainsRe(err.changes_as_text,
132
'(?s)modified:.*ax.*bx/cx')
133
self.assertInWorkingTree(rfilesx)
134
self.failUnlessExists(rfilesx)
108
136
def test_force_remove_changed_files(self):
109
137
"""Check that changed files are removed and deleted when forced."""
110
138
tree = self.getTree()
119
147
def test_remove_unknown_files(self):
120
148
"""Try to delete unknown files."""
121
149
tree = self.getTree()
123
tree.remove(TestRemove.files, keep_files=False)
124
self.fail('Should throw BzrRemoveChangedFilesError')
125
except errors.BzrRemoveChangedFilesError, e:
126
self.assertTrue(re.match('Can\'t remove changed or unknown files:'
127
'.*unknown:.*b/c.*b.*a.*d.*',
150
err = self.assertRaises(errors.BzrRemoveChangedFilesError, tree.remove,
151
TestRemove.files, keep_files=False)
152
self.assertContainsRe(err.changes_as_text,
153
'(?s)unknown:.*d/.*b/c.*b/.*a.*')
130
155
def test_remove_nonexisting_files(self):
131
156
"""Try to delete non-existing files."""
132
157
tree = self.getTree()
133
158
tree.remove([''], keep_files=False)
135
tree.remove(['xyz', 'abc/def'], keep_files=False)
136
self.fail('Should throw BzrRemoveChangedFilesError')
137
except errors.BzrRemoveChangedFilesError, e:
138
self.assertTrue(re.match('Can\'t remove changed or unknown files:'
139
'.*unknown:.*xyz.*abc/def.*',
159
tree.remove(['xyz', 'abc/def'], keep_files=False)
142
161
def test_remove_nonempty_directory(self):
143
162
"""Unchanged non-empty directories should be deleted."""
157
176
tree.commit("make sure b is versioned")
158
177
self.assertInWorkingTree(TestRemove.files)
159
178
self.failUnlessExists(TestRemove.files)
160
f = file('b/my_unknown_file', 'wb')
161
f.write("some content!")
164
tree.remove(TestRemove.b, keep_files=False)
165
self.fail('Should throw BzrRemoveChangedFilesError')
166
except errors.BzrRemoveChangedFilesError, e:
167
self.assertTrue(re.match('Can\'t remove changed or unknown files:'
168
'.*unknown:.*b/my_unknown_file.*',
179
self.build_tree(['b/my_unknown_file'])
180
err = self.assertRaises(errors.BzrRemoveChangedFilesError, tree.remove,
181
TestRemove.b, keep_files=False)
182
self.assertContainsRe(err.changes_as_text,
183
'(?s)unknown:.*b/my_unknown_file')
170
184
self.assertInWorkingTree(TestRemove.b)
171
185
self.failUnlessExists(TestRemove.b)
185
199
tree = self.getTree()
186
200
tree.add(TestRemove.b_c)
187
201
tree.commit("make sure b and c are versioned")
188
f = file('b/c', 'wb')
189
f.write("some other new content!")
202
self.build_tree_contents([('b/c', "some other new content!")])
191
203
self.assertInWorkingTree(TestRemove.b_c)
193
tree.remove(TestRemove.b, keep_files=False)
194
self.fail('Should throw BzrRemoveChangedFilesError')
195
except errors.BzrRemoveChangedFilesError, e:
196
self.assertTrue(re.match('Can\'t remove changed or unknown files:'
197
'.*modified:.*b/c.*',
204
err = self.assertRaises(errors.BzrRemoveChangedFilesError, tree.remove,
205
TestRemove.b, keep_files=False)
206
self.assertContainsRe(err.changes_as_text, '(?s)modified:.*b/c')
199
207
self.assertInWorkingTree(TestRemove.b_c)
200
208
self.failUnlessExists(TestRemove.b_c)
203
211
tree.remove(TestRemove.b, keep_files=False, force=True)
204
212
self.assertNotInWorkingTree(TestRemove.b_c)
205
213
self.failIfExists(TestRemove.b_c)
215
def test_remove_subtree(self):
216
tree = self.make_branch_and_tree('.')
217
subtree = self.make_branch_and_tree('subtree')
218
tree.add('subtree', 'subtree-id')
219
tree.remove('subtree')
220
self.assertIs(None, tree.path2id('subtree'))
222
def test_non_cwd(self):
223
tree = self.make_branch_and_tree('tree')
224
self.build_tree(['tree/dir/', 'tree/dir/file'])
225
tree.add(['dir', 'dir/file'])
226
tree.commit('add file')
227
tree.remove('dir/', keep_files=False)
228
self.failIfExists('tree/dir/file')