1
# Copyright (C) 2006, 2007 Canonical Ltd
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
# GNU General Public License for more details.
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
"""Tests for interface conformance of 'WorkingTree.remove'"""
20
from bzrlib.tests.workingtree_implementations import TestCaseWithWorkingTree
21
from bzrlib import errors, osutils
23
class TestRemove(TestCaseWithWorkingTree):
24
"""Tests WorkingTree.remove"""
26
files=['a', 'b/', 'b/c', 'd/']
32
tree = self.make_branch_and_tree('.')
33
self.build_tree(TestRemove.files)
36
def test_remove_keep(self):
37
"""Check that files are unversioned but not deleted."""
39
tree.add(TestRemove.files)
40
self.assertInWorkingTree(TestRemove.files)
42
tree.remove(TestRemove.files)
43
self.assertNotInWorkingTree(TestRemove.files)
44
self.failUnlessExists(TestRemove.files)
46
def test_remove_unchanged_files(self):
47
"""Check that unchanged files are removed and deleted."""
49
tree.add(TestRemove.files)
50
tree.commit("files must not have changes")
51
self.assertInWorkingTree(TestRemove.files)
53
tree.remove(TestRemove.files, keep_files=False)
55
self.assertNotInWorkingTree(TestRemove.files)
56
self.failIfExists(TestRemove.files)
58
def test_remove_added_files(self):
59
"""Removal of newly added files must fail."""
61
tree.add(TestRemove.files)
62
self.assertInWorkingTree(TestRemove.files)
64
tree.remove(TestRemove.files, keep_files=False)
65
self.fail('Should throw BzrRemoveChangedFilesError')
66
except errors.BzrRemoveChangedFilesError, e:
67
self.assertTrue(re.match('Can\'t remove changed or unknown files:'
68
'.*added:.*a.*b.*b/c.*d.*',
70
self.assertInWorkingTree(TestRemove.files)
71
self.failUnlessExists(TestRemove.files)
73
def test_remove_changed_file(self):
74
"""Removal of a changed files must fail."""
76
tree.add(TestRemove.a)
77
tree.commit("make sure a is versioned")
79
f.write("some other new content!")
81
self.assertInWorkingTree(TestRemove.a)
83
tree.remove(TestRemove.a, keep_files=False)
84
self.fail('Should throw BzrRemoveChangedFilesError')
85
except errors.BzrRemoveChangedFilesError, e:
86
self.assertTrue(re.match('Can\'t remove changed or unknown files:'
89
self.assertInWorkingTree(TestRemove.a)
90
self.failUnlessExists(TestRemove.a)
92
def test_remove_deleted_files(self):
93
"""Check that files are removed if they don't exist any more."""
95
tree.add(TestRemove.files)
96
tree.commit("make sure files are versioned")
97
for f in ['b/c', 'b', 'a', 'd']:
99
self.assertInWorkingTree(TestRemove.files)
100
self.failIfExists(TestRemove.files)
102
tree.remove(TestRemove.files, keep_files=False)
104
self.assertNotInWorkingTree(TestRemove.files)
105
self.failIfExists(TestRemove.files)
107
def test_force_remove_changed_files(self):
108
"""Check that changed files are removed and deleted when forced."""
109
tree = self.getTree()
110
tree.add(TestRemove.files)
111
self.assertInWorkingTree(TestRemove.files)
113
tree.remove(TestRemove.files, keep_files=False, force=True)
115
self.assertNotInWorkingTree(TestRemove.files)
116
self.failIfExists(TestRemove.files)
118
def test_remove_unknown_files(self):
119
"""Try to delete unknown files."""
120
tree = self.getTree()
122
tree.remove(TestRemove.files, keep_files=False)
123
self.fail('Should throw BzrRemoveChangedFilesError')
124
except errors.BzrRemoveChangedFilesError, e:
125
self.assertTrue(re.match('Can\'t remove changed or unknown files:'
126
'.*unknown:.*b/c.*b.*a.*d.*',
129
def test_remove_nonexisting_files(self):
130
"""Try to delete non-existing files."""
131
tree = self.getTree()
132
tree.remove([''], keep_files=False)
134
tree.remove(['xyz', 'abc/def'], keep_files=False)
135
self.fail('Should throw BzrRemoveChangedFilesError')
136
except errors.BzrRemoveChangedFilesError, e:
137
self.assertTrue(re.match('Can\'t remove changed or unknown files:'
138
'.*unknown:.*xyz.*abc/def.*',
141
def test_remove_nonempty_directory(self):
142
"""Unchanged non-empty directories should be deleted."""
143
tree = self.getTree()
144
tree.add(TestRemove.files)
145
tree.commit("make sure b is versioned")
146
self.assertInWorkingTree(TestRemove.files)
147
self.failUnlessExists(TestRemove.files)
148
tree.remove(TestRemove.b, keep_files=False)
149
self.assertNotInWorkingTree(TestRemove.b)
150
self.failIfExists(TestRemove.b)
152
def test_remove_nonempty_directory_with_unknowns(self):
153
"""Unchanged non-empty directories should be deleted."""
154
tree = self.getTree()
155
tree.add(TestRemove.files)
156
tree.commit("make sure b is versioned")
157
self.assertInWorkingTree(TestRemove.files)
158
self.failUnlessExists(TestRemove.files)
159
f = file('b/my_unknown_file', 'wb')
160
f.write("some content!")
163
tree.remove(TestRemove.b, keep_files=False)
164
self.fail('Should throw BzrRemoveChangedFilesError')
165
except errors.BzrRemoveChangedFilesError, e:
166
self.assertTrue(re.match('Can\'t remove changed or unknown files:'
167
'.*unknown:.*b/my_unknown_file.*',
169
self.assertInWorkingTree(TestRemove.b)
170
self.failUnlessExists(TestRemove.b)
172
def test_force_remove_nonempty_directory(self):
173
tree = self.getTree()
174
tree.add(TestRemove.files)
175
tree.commit("make sure b is versioned")
176
self.assertInWorkingTree(TestRemove.files)
177
self.failUnlessExists(TestRemove.files)
178
tree.remove(TestRemove.b, keep_files=False, force=True)
179
self.assertNotInWorkingTree(TestRemove.b_c)
180
self.failIfExists(TestRemove.b_c)
182
def test_remove_directory_with_changed_file(self):
183
"""Refuse to delete directories with changed files."""
184
tree = self.getTree()
185
tree.add(TestRemove.b_c)
186
tree.commit("make sure b and c are versioned")
187
f = file('b/c', 'wb')
188
f.write("some other new content!")
190
self.assertInWorkingTree(TestRemove.b_c)
192
tree.remove(TestRemove.b, keep_files=False)
193
self.fail('Should throw BzrRemoveChangedFilesError')
194
except errors.BzrRemoveChangedFilesError, e:
195
self.assertTrue(re.match('Can\'t remove changed or unknown files:'
196
'.*modified:.*b/c.*',
198
self.assertInWorkingTree(TestRemove.b_c)
199
self.failUnlessExists(TestRemove.b_c)
201
#see if we can force it now..
202
tree.remove(TestRemove.b, keep_files=False, force=True)
203
self.assertNotInWorkingTree(TestRemove.b_c)
204
self.failIfExists(TestRemove.b_c)
206
def test_remove_subtree(self):
207
tree = self.make_branch_and_tree('.')
208
subtree = self.make_branch_and_tree('subtree')
209
tree.add('subtree', 'subtree-id')
210
tree.remove('subtree')
211
self.assertIs(None, tree.path2id('subtree'))
213
def test_non_cwd(self):
214
tree = self.make_branch_and_tree('tree')
215
self.build_tree(['tree/dir/', 'tree/dir/file'])
216
tree.add(['dir', 'dir/file'])
217
tree.commit('add file')
218
tree.remove('dir/', keep_files=False)
219
self.failIfExists('tree/dir/file')