1
# Copyright (C) 2006-2010 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21
from breezy.tests import (
24
TestCaseWithTransport,
27
from breezy.workingtree import WorkingTree
28
from breezy import osutils
38
class TestRemove(TestCaseWithTransport):
40
def _make_tree_and_add(self, paths):
41
tree = self.make_branch_and_tree('.')
44
self.build_tree(paths)
46
file_id=path.replace('/', '_').encode('utf-8') + _id
47
tree.add(path, file_id)
52
def assertFilesDeleted(self, files):
54
id=f.encode('utf-8')+_id
55
self.assertNotInWorkingTree(f)
56
self.assertPathDoesNotExist(f)
58
def assertFilesUnversioned(self, files):
60
self.assertNotInWorkingTree(f)
61
self.assertPathExists(f)
63
def changeFile(self, file_name):
64
with open(file_name, 'ab') as f:
65
f.write(b"\nsome other new content!")
67
def run_bzr_remove_changed_files(self, files_to_remove, working_dir=None):
68
self.run_bzr(['remove'] + list(files_to_remove),
69
working_dir=working_dir)
71
def test_remove_new_no_files_specified(self):
72
tree = self.make_branch_and_tree('.')
73
self.run_bzr_error(["brz: ERROR: No matching files."], 'remove --new')
74
self.run_bzr_error(["brz: ERROR: No matching files."], 'remove --new .')
76
def test_remove_no_files_specified(self):
77
tree = self._make_tree_and_add(['foo'])
78
out, err = self.run_bzr(['rm'])
79
self.assertEqual('', err)
80
self.assertEqual('', out)
81
self.assertInWorkingTree('foo', tree=tree)
82
self.assertPathExists('foo')
84
def test_remove_no_files_specified_missing_dir_and_contents(self):
85
tree = self._make_tree_and_add(
86
['foo', 'dir/', 'dir/missing/', 'dir/missing/child'])
87
self.get_transport('.').delete_tree('dir/missing')
88
out, err = self.run_bzr(['rm'])
89
self.assertEqual('', out)
91
'removed dir/missing/child\n'
92
'removed dir/missing\n',
94
# non-missing paths not touched:
95
self.assertInWorkingTree('foo', tree=tree)
96
self.assertPathExists('foo')
97
self.assertInWorkingTree('dir', tree=tree)
98
self.assertPathExists('dir')
99
# missing files unversioned
100
self.assertNotInWorkingTree('dir/missing', tree=tree)
101
self.assertNotInWorkingTree('dir/missing/child', tree=tree)
103
def test_remove_no_files_specified_already_deleted(self):
104
tree = self._make_tree_and_add(['foo', 'bar'])
105
tree.commit('save foo and bar')
108
self.assertFalse(tree.is_versioned('bar'))
109
# Running rm with a deleted file does not error.
110
out, err = self.run_bzr(['rm'])
111
self.assertEqual('', out)
112
self.assertEqual('', err)
114
def test_remove_no_files_specified_missing_file(self):
115
tree = self._make_tree_and_add(['foo', 'bar'])
117
out, err = self.run_bzr(['rm'])
118
self.assertEqual('', out)
119
self.assertEqual('removed bar\n', err)
120
# non-missing files not touched:
121
self.assertInWorkingTree('foo', tree=tree)
122
self.assertPathExists('foo')
123
# missing files unversioned
124
self.assertNotInWorkingTree('bar', tree=tree)
126
def test_remove_no_files_specified_missing_link(self):
127
self.requireFeature(features.SymlinkFeature)
128
tree = self._make_tree_and_add(['foo'])
129
os.symlink('foo', 'linkname')
130
tree.add(['linkname'])
131
os.unlink('linkname')
132
out, err = self.run_bzr(['rm'])
133
self.assertEqual('', out)
134
self.assertEqual('removed linkname\n', err)
135
# non-missing files not touched:
136
self.assertInWorkingTree('foo', tree=tree)
137
self.assertPathExists('foo')
138
# missing files unversioned
139
self.assertNotInWorkingTree('linkname', tree=tree)
141
def test_rm_one_file(self):
142
tree = self._make_tree_and_add([a])
143
self.run_bzr("commit -m 'added a'")
144
self.run_bzr('rm a', error_regexes=["deleted a"])
145
self.assertFilesDeleted([a])
147
def test_remove_one_file(self):
148
tree = self._make_tree_and_add([a])
149
self.run_bzr("commit -m 'added a'")
150
self.run_bzr('remove a', error_regexes=["deleted a"])
151
self.assertFilesDeleted([a])
153
def test_remove_keep_one_file(self):
154
tree = self._make_tree_and_add([a])
155
self.run_bzr('remove --keep a', error_regexes=["removed a"])
156
self.assertFilesUnversioned([a])
158
def test_remove_one_deleted_file(self):
159
tree = self._make_tree_and_add([a])
160
self.run_bzr("commit -m 'added a'")
162
self.assertInWorkingTree(a)
163
self.run_bzr('remove a')
164
self.assertNotInWorkingTree(a)
166
def test_remove_invalid_files(self):
167
self.build_tree(files)
168
tree = self.make_branch_and_tree('.')
169
self.run_bzr(['remove', '.', 'xyz', 'abc/def'])
171
def test_remove_unversioned_files(self):
172
self.build_tree(files)
173
tree = self.make_branch_and_tree('.')
174
self.run_bzr_remove_changed_files(files)
176
def test_remove_changed_files(self):
177
tree = self._make_tree_and_add(files)
178
self.run_bzr("commit -m 'added files'")
181
self.run_bzr_remove_changed_files(files)
183
def test_remove_changed_ignored_files(self):
184
tree = self._make_tree_and_add(['a'])
185
self.run_bzr(['ignore', 'a'])
186
self.run_bzr_remove_changed_files(['a'])
188
def test_remove_changed_files_from_child_dir(self):
189
if sys.platform == 'win32':
190
raise TestSkipped("Windows unable to remove '.' directory")
191
tree = self._make_tree_and_add(files)
192
self.run_bzr("commit -m 'added files'")
195
self.run_bzr_remove_changed_files(
196
['../a', 'c', '.', '../d'], working_dir='b')
197
self.assertNotInWorkingTree(files)
198
self.assertPathDoesNotExist(files)
200
def test_remove_keep_unversioned_files(self):
201
self.build_tree(files)
202
tree = self.make_branch_and_tree('.')
203
self.run_bzr('remove --keep a', error_regexes=["a is not versioned."])
204
self.assertFilesUnversioned(files)
206
def test_remove_no_backup_unversioned_files(self):
207
self.build_tree(files)
208
tree = self.make_branch_and_tree('.')
209
script.ScriptRunner().run_script(self, '''
210
$ brz remove --no-backup a b/ b/c d/
212
2>removed b/c (but kept a copy: b/c.~1~)
216
self.assertFilesDeleted(files)
218
def test_remove_deleted_files(self):
219
tree = self._make_tree_and_add(files)
220
self.run_bzr("commit -m 'added files'")
221
my_files=[f for f in files]
222
my_files.sort(reverse=True)
224
osutils.delete_any(f)
225
self.assertInWorkingTree(files)
226
self.assertPathDoesNotExist(files)
227
self.run_bzr('remove ' + ' '.join(files))
228
self.assertNotInWorkingTree(a)
229
self.assertPathDoesNotExist(files)
231
def test_remove_non_existing_files(self):
232
tree = self._make_tree_and_add([])
233
self.run_bzr(['remove', 'b'])
235
def test_remove_keep_non_existing_files(self):
236
tree = self._make_tree_and_add([])
237
self.run_bzr('remove --keep b', error_regexes=["b is not versioned."])
239
def test_remove_files(self):
240
tree = self._make_tree_and_add(files)
241
self.run_bzr("commit -m 'added files'")
242
self.run_bzr('remove a b b/c d',
243
error_regexes=["deleted a", "deleted b", "deleted b/c",
245
self.assertFilesDeleted(files)
247
def test_remove_keep_files(self):
248
tree = self._make_tree_and_add(files)
249
self.run_bzr("commit -m 'added files'")
250
self.run_bzr('remove --keep a b b/c d',
251
error_regexes=["removed a", "removed b", "removed b/c",
253
self.assertFilesUnversioned(files)
255
def test_remove_with_new(self):
256
tree = self._make_tree_and_add(files)
257
self.run_bzr('remove --new --keep',
258
error_regexes=["removed a", "removed b", "removed b/c"])
259
self.assertFilesUnversioned(files)
261
def test_remove_with_new_in_dir1(self):
262
tree = self._make_tree_and_add(files)
263
self.run_bzr('remove --new --keep b b/c',
264
error_regexes=["removed b", "removed b/c"])
265
tree = WorkingTree.open('.')
266
self.assertInWorkingTree(a)
267
self.assertEqual(tree.path2id(a), a.encode('utf-8') + _id)
268
self.assertFilesUnversioned([b, c])
270
def test_remove_with_new_in_dir2(self):
271
tree = self._make_tree_and_add(files)
272
self.run_bzr('remove --new --keep .',
273
error_regexes=["removed a", "removed b", "removed b/c"])
274
tree = WorkingTree.open('.')
275
self.assertFilesUnversioned(files)