1
# Copyright (C) 2005, 2006 Canonical Ltd
1
# Copyright (C) 2006-2010 Canonical Ltd
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
21
from bzrlib.tests import SymlinkFeature, TestSkipped
22
from bzrlib.tests.blackbox import ExternalBase
23
from bzrlib.workingtree import WorkingTree
24
from bzrlib import osutils
21
from breezy.tests import (
24
TestCaseWithTransport,
27
from breezy.workingtree import WorkingTree
28
from breezy import osutils
34
class TestRemove(ExternalBase):
38
class TestRemove(TestCaseWithTransport):
36
40
def _make_tree_and_add(self, paths):
37
41
tree = self.make_branch_and_tree('.')
48
52
def assertFilesDeleted(self, files):
54
id=f.encode('utf-8')+_id
51
55
self.assertNotInWorkingTree(f)
56
self.assertPathDoesNotExist(f)
54
58
def assertFilesUnversioned(self, files):
56
60
self.assertNotInWorkingTree(f)
57
self.failUnlessExists(f)
61
self.assertPathExists(f)
59
63
def changeFile(self, file_name):
60
f = file(file_name, 'ab')
61
f.write("\nsome other new content!")
64
with open(file_name, 'ab') as f:
65
f.write(b"\nsome other new content!")
64
def run_bzr_remove_changed_files(self, error_regexes, files_to_remove,
66
error_regexes.extend(["Can't safely remove modified or unknown files:",
67
'Use --keep to not delete them,'
68
' or --force to delete them regardless.'
70
self.run_bzr_error(error_regexes,
71
['remove'] + list(files_to_remove),
72
working_dir=working_dir)
73
#see if we can force it now
74
self.run_bzr(['remove', '--force'] + list(files_to_remove),
75
working_dir=working_dir)
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)
77
71
def test_remove_new_no_files_specified(self):
78
72
tree = self.make_branch_and_tree('.')
79
self.run_bzr_error(["bzr: ERROR: No matching files."], 'remove --new')
80
self.run_bzr_error(["bzr: ERROR: No matching files."], 'remove --new .')
73
self.run_bzr_error(["brz: ERROR: No matching files."], 'remove --new')
74
self.run_bzr_error(["brz: ERROR: No matching files."], 'remove --new .')
82
76
def test_remove_no_files_specified(self):
83
77
tree = self._make_tree_and_add(['foo'])
85
79
self.assertEqual('', err)
86
80
self.assertEqual('', out)
87
81
self.assertInWorkingTree('foo', tree=tree)
88
self.failUnlessExists('foo')
82
self.assertPathExists('foo')
90
84
def test_remove_no_files_specified_missing_dir_and_contents(self):
91
85
tree = self._make_tree_and_add(
100
94
# non-missing paths not touched:
101
95
self.assertInWorkingTree('foo', tree=tree)
102
self.failUnlessExists('foo')
96
self.assertPathExists('foo')
103
97
self.assertInWorkingTree('dir', tree=tree)
104
self.failUnlessExists('dir')
98
self.assertPathExists('dir')
105
99
# missing files unversioned
106
100
self.assertNotInWorkingTree('dir/missing', tree=tree)
107
101
self.assertNotInWorkingTree('dir/missing/child', tree=tree)
111
105
tree.commit('save foo and bar')
113
107
self.run_bzr(['rm'])
114
self.assertEqual(None, tree.path2id('bar'))
108
self.assertFalse(tree.is_versioned('bar'))
115
109
# Running rm with a deleted file does not error.
116
110
out, err = self.run_bzr(['rm'])
117
111
self.assertEqual('', out)
125
119
self.assertEqual('removed bar\n', err)
126
120
# non-missing files not touched:
127
121
self.assertInWorkingTree('foo', tree=tree)
128
self.failUnlessExists('foo')
122
self.assertPathExists('foo')
129
123
# missing files unversioned
130
124
self.assertNotInWorkingTree('bar', tree=tree)
132
126
def test_remove_no_files_specified_missing_link(self):
133
self.requireFeature(SymlinkFeature)
127
self.requireFeature(features.SymlinkFeature)
134
128
tree = self._make_tree_and_add(['foo'])
135
129
os.symlink('foo', 'linkname')
136
130
tree.add(['linkname'])
140
134
self.assertEqual('removed linkname\n', err)
141
135
# non-missing files not touched:
142
136
self.assertInWorkingTree('foo', tree=tree)
143
self.failUnlessExists('foo')
137
self.assertPathExists('foo')
144
138
# missing files unversioned
145
139
self.assertNotInWorkingTree('linkname', tree=tree)
177
171
def test_remove_unversioned_files(self):
178
172
self.build_tree(files)
179
173
tree = self.make_branch_and_tree('.')
180
self.run_bzr_remove_changed_files(
181
['unknown:[.\s]*d/[.\s]*b/c[.\s]*b/[.\s]*a'], files)
174
self.run_bzr_remove_changed_files(files)
183
176
def test_remove_changed_files(self):
184
177
tree = self._make_tree_and_add(files)
185
178
self.run_bzr("commit -m 'added files'")
186
179
self.changeFile(a)
187
180
self.changeFile(c)
188
self.run_bzr_remove_changed_files(['modified:[.\s]*a[.\s]*b/c'], files)
181
self.run_bzr_remove_changed_files(files)
190
183
def test_remove_changed_ignored_files(self):
191
184
tree = self._make_tree_and_add(['a'])
192
185
self.run_bzr(['ignore', 'a'])
193
self.run_bzr_remove_changed_files(['added:[.\s]*a'], ['a'])
186
self.run_bzr_remove_changed_files(['a'])
195
188
def test_remove_changed_files_from_child_dir(self):
196
189
if sys.platform == 'win32':
200
193
self.changeFile(a)
201
194
self.changeFile(c)
202
195
self.run_bzr_remove_changed_files(
203
['modified:[.\s]*a[.\s]*b/c'],
204
196
['../a', 'c', '.', '../d'], working_dir='b')
205
197
self.assertNotInWorkingTree(files)
206
self.failIfExists(files)
198
self.assertPathDoesNotExist(files)
208
200
def test_remove_keep_unversioned_files(self):
209
201
self.build_tree(files)
211
203
self.run_bzr('remove --keep a', error_regexes=["a is not versioned."])
212
204
self.assertFilesUnversioned(files)
214
def test_remove_force_unversioned_files(self):
206
def test_remove_no_backup_unversioned_files(self):
215
207
self.build_tree(files)
216
208
tree = self.make_branch_and_tree('.')
217
self.run_bzr(['remove', '--force'] + list(files),
218
error_regexes=["deleted a", "deleted b",
219
"deleted b/c", "deleted d"])
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~)
220
216
self.assertFilesDeleted(files)
222
218
def test_remove_deleted_files(self):
227
223
for f in my_files:
228
224
osutils.delete_any(f)
229
225
self.assertInWorkingTree(files)
230
self.failIfExists(files)
226
self.assertPathDoesNotExist(files)
231
227
self.run_bzr('remove ' + ' '.join(files))
232
228
self.assertNotInWorkingTree(a)
233
self.failIfExists(files)
229
self.assertPathDoesNotExist(files)
235
231
def test_remove_non_existing_files(self):
236
232
tree = self._make_tree_and_add([])
268
264
error_regexes=["removed b", "removed b/c"])
269
265
tree = WorkingTree.open('.')
270
266
self.assertInWorkingTree(a)
271
self.assertEqual(tree.path2id(a), a + _id)
272
self.assertFilesUnversioned([b,c])
267
self.assertEqual(tree.path2id(a), a.encode('utf-8') + _id)
268
self.assertFilesUnversioned([b, c])
274
270
def test_remove_with_new_in_dir2(self):
275
271
tree = self._make_tree_and_add(files)