/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
5273.1.8 by Vincent Ladeuil
Merge bzr.dev into cleanup
1
# Copyright (C) 2006-2010 Canonical Ltd
1551.6.25 by Aaron Bentley
split out blackbox test for bzr remove
2
#
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.
7
#
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.
12
#
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
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1551.6.25 by Aaron Bentley
split out blackbox test for bzr remove
16
17
2655.2.5 by Marius Kruger
* Improve BzrRemoveChangedFilesError message.
18
import os
2804.4.1 by Alexander Belchenko
some win32-specific fixes for selftest
19
import sys
1551.6.25 by Aaron Bentley
split out blackbox test for bzr remove
20
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
21
from breezy.tests import (
5444.3.3 by Marius Kruger
* convert the touched tests to rather use ScriptRunner
22
    script,
5967.12.1 by Martin Pool
Move all test features into bzrlib.tests.features
23
    features,
5444.3.3 by Marius Kruger
* convert the touched tests to rather use ScriptRunner
24
    TestCaseWithTransport,
25
    TestSkipped,
26
    )
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
27
from breezy.workingtree import WorkingTree
28
from breezy import osutils
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
29
7045.1.1 by Jelmer Vernooij
Fix another 300 tests.
30
_id=b'-id'
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
31
a='a'
32
b='b/'
33
c='b/c'
2292.1.30 by Marius Kruger
* Minor text fixes.
34
d='d/'
35
files=(a, b, c, d)
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
36
37
5283.4.5 by Martin Pool
Update remaining subclasses of ExternalBase
38
class TestRemove(TestCaseWithTransport):
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
39
3619.5.3 by Robert Collins
Review feedback.
40
    def _make_tree_and_add(self, paths):
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
41
        tree = self.make_branch_and_tree('.')
3619.5.1 by Robert Collins
* ``bzr rm`` will now scan for files that are missing and remove just
42
        tree.lock_write()
43
        try:
44
            self.build_tree(paths)
45
            for path in paths:
7045.1.1 by Jelmer Vernooij
Fix another 300 tests.
46
                file_id=path.replace('/', '_').encode('utf-8') + _id
3619.5.1 by Robert Collins
* ``bzr rm`` will now scan for files that are missing and remove just
47
                tree.add(path, file_id)
48
        finally:
49
            tree.unlock()
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
50
        return tree
51
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
52
    def assertFilesDeleted(self, files):
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
53
        for f in files:
7045.1.1 by Jelmer Vernooij
Fix another 300 tests.
54
            id=f.encode('utf-8')+_id
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
55
            self.assertNotInWorkingTree(f)
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
56
            self.assertPathDoesNotExist(f)
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
57
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
58
    def assertFilesUnversioned(self, files):
2292.1.13 by Marius Kruger
* merge the unversion command back into the remove command,
59
        for f in files:
60
            self.assertNotInWorkingTree(f)
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
61
            self.assertPathExists(f)
2292.1.13 by Marius Kruger
* merge the unversion command back into the remove command,
62
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
63
    def changeFile(self, file_name):
6973.7.5 by Jelmer Vernooij
s/file/open.
64
        with open(file_name, 'ab') as f:
65
            f.write(b"\nsome other new content!")
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
66
5340.8.2 by Marius Kruger
* update the blackbox tests too (unsave removals are just backed up, and don't complain)
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)
2292.1.26 by Marius Kruger
* tests/__init__
70
3619.5.3 by Robert Collins
Review feedback.
71
    def test_remove_new_no_files_specified(self):
72
        tree = self.make_branch_and_tree('.')
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
73
        self.run_bzr_error(["brz: ERROR: No matching files."], 'remove --new')
74
        self.run_bzr_error(["brz: ERROR: No matching files."], 'remove --new .')
3619.5.3 by Robert Collins
Review feedback.
75
2292.1.13 by Marius Kruger
* merge the unversion command back into the remove command,
76
    def test_remove_no_files_specified(self):
3619.5.3 by Robert Collins
Review feedback.
77
        tree = self._make_tree_and_add(['foo'])
3619.5.1 by Robert Collins
* ``bzr rm`` will now scan for files that are missing and remove just
78
        out, err = self.run_bzr(['rm'])
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
79
        self.assertEqual('', err)
80
        self.assertEqual('', out)
3619.5.1 by Robert Collins
* ``bzr rm`` will now scan for files that are missing and remove just
81
        self.assertInWorkingTree('foo', tree=tree)
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
82
        self.assertPathExists('foo')
3619.5.1 by Robert Collins
* ``bzr rm`` will now scan for files that are missing and remove just
83
84
    def test_remove_no_files_specified_missing_dir_and_contents(self):
3619.5.3 by Robert Collins
Review feedback.
85
        tree = self._make_tree_and_add(
3619.5.1 by Robert Collins
* ``bzr rm`` will now scan for files that are missing and remove just
86
            ['foo', 'dir/', 'dir/missing/', 'dir/missing/child'])
87
        self.get_transport('.').delete_tree('dir/missing')
88
        out, err = self.run_bzr(['rm'])
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
89
        self.assertEqual('', out)
3619.5.1 by Robert Collins
* ``bzr rm`` will now scan for files that are missing and remove just
90
        self.assertEqual(
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
91
            'removed dir/missing/child\n'
92
            'removed dir/missing\n',
3619.5.1 by Robert Collins
* ``bzr rm`` will now scan for files that are missing and remove just
93
            err)
94
        # non-missing paths not touched:
95
        self.assertInWorkingTree('foo', tree=tree)
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
96
        self.assertPathExists('foo')
3619.5.1 by Robert Collins
* ``bzr rm`` will now scan for files that are missing and remove just
97
        self.assertInWorkingTree('dir', tree=tree)
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
98
        self.assertPathExists('dir')
3619.5.1 by Robert Collins
* ``bzr rm`` will now scan for files that are missing and remove just
99
        # missing files unversioned
100
        self.assertNotInWorkingTree('dir/missing', tree=tree)
101
        self.assertNotInWorkingTree('dir/missing/child', tree=tree)
102
3619.5.3 by Robert Collins
Review feedback.
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')
106
        os.unlink('bar')
107
        self.run_bzr(['rm'])
6852.3.1 by Jelmer Vernooij
add Tree.is_versioned.
108
        self.assertFalse(tree.is_versioned('bar'))
3619.5.3 by Robert Collins
Review feedback.
109
        # Running rm with a deleted file does not error.
110
        out, err = self.run_bzr(['rm'])
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
111
        self.assertEqual('', out)
112
        self.assertEqual('', err)
3619.5.3 by Robert Collins
Review feedback.
113
3619.5.1 by Robert Collins
* ``bzr rm`` will now scan for files that are missing and remove just
114
    def test_remove_no_files_specified_missing_file(self):
3619.5.3 by Robert Collins
Review feedback.
115
        tree = self._make_tree_and_add(['foo', 'bar'])
3619.5.1 by Robert Collins
* ``bzr rm`` will now scan for files that are missing and remove just
116
        os.unlink('bar')
117
        out, err = self.run_bzr(['rm'])
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
118
        self.assertEqual('', out)
119
        self.assertEqual('removed bar\n', err)
3619.5.1 by Robert Collins
* ``bzr rm`` will now scan for files that are missing and remove just
120
        # non-missing files not touched:
121
        self.assertInWorkingTree('foo', tree=tree)
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
122
        self.assertPathExists('foo')
3619.5.1 by Robert Collins
* ``bzr rm`` will now scan for files that are missing and remove just
123
        # missing files unversioned
124
        self.assertNotInWorkingTree('bar', tree=tree)
125
126
    def test_remove_no_files_specified_missing_link(self):
5967.12.1 by Martin Pool
Move all test features into bzrlib.tests.features
127
        self.requireFeature(features.SymlinkFeature)
3619.5.3 by Robert Collins
Review feedback.
128
        tree = self._make_tree_and_add(['foo'])
3619.5.1 by Robert Collins
* ``bzr rm`` will now scan for files that are missing and remove just
129
        os.symlink('foo', 'linkname')
130
        tree.add(['linkname'])
131
        os.unlink('linkname')
132
        out, err = self.run_bzr(['rm'])
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
133
        self.assertEqual('', out)
134
        self.assertEqual('removed linkname\n', err)
3619.5.1 by Robert Collins
* ``bzr rm`` will now scan for files that are missing and remove just
135
        # non-missing files not touched:
136
        self.assertInWorkingTree('foo', tree=tree)
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
137
        self.assertPathExists('foo')
3619.5.1 by Robert Collins
* ``bzr rm`` will now scan for files that are missing and remove just
138
        # missing files unversioned
139
        self.assertNotInWorkingTree('linkname', tree=tree)
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
140
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
141
    def test_rm_one_file(self):
3619.5.3 by Robert Collins
Review feedback.
142
        tree = self._make_tree_and_add([a])
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
143
        self.run_bzr("commit -m 'added a'")
144
        self.run_bzr('rm a', error_regexes=["deleted a"])
145
        self.assertFilesDeleted([a])
146
147
    def test_remove_one_file(self):
3619.5.3 by Robert Collins
Review feedback.
148
        tree = self._make_tree_and_add([a])
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
149
        self.run_bzr("commit -m 'added a'")
150
        self.run_bzr('remove a', error_regexes=["deleted a"])
151
        self.assertFilesDeleted([a])
152
153
    def test_remove_keep_one_file(self):
3619.5.3 by Robert Collins
Review feedback.
154
        tree = self._make_tree_and_add([a])
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
155
        self.run_bzr('remove --keep a', error_regexes=["removed a"])
156
        self.assertFilesUnversioned([a])
157
158
    def test_remove_one_deleted_file(self):
3619.5.3 by Robert Collins
Review feedback.
159
        tree = self._make_tree_and_add([a])
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
160
        self.run_bzr("commit -m 'added a'")
161
        os.unlink(a)
162
        self.assertInWorkingTree(a)
163
        self.run_bzr('remove a')
164
        self.assertNotInWorkingTree(a)
165
2292.1.13 by Marius Kruger
* merge the unversion command back into the remove command,
166
    def test_remove_invalid_files(self):
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
167
        self.build_tree(files)
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
168
        tree = self.make_branch_and_tree('.')
2605.1.1 by Martin Pool
Merge fix for rm renamed files
169
        self.run_bzr(['remove', '.', 'xyz', 'abc/def'])
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
170
2292.1.13 by Marius Kruger
* merge the unversion command back into the remove command,
171
    def test_remove_unversioned_files(self):
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
172
        self.build_tree(files)
2292.1.13 by Marius Kruger
* merge the unversion command back into the remove command,
173
        tree = self.make_branch_and_tree('.')
5340.8.2 by Marius Kruger
* update the blackbox tests too (unsave removals are just backed up, and don't complain)
174
        self.run_bzr_remove_changed_files(files)
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
175
176
    def test_remove_changed_files(self):
3619.5.3 by Robert Collins
Review feedback.
177
        tree = self._make_tree_and_add(files)
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
178
        self.run_bzr("commit -m 'added files'")
179
        self.changeFile(a)
180
        self.changeFile(c)
5340.8.2 by Marius Kruger
* update the blackbox tests too (unsave removals are just backed up, and don't complain)
181
        self.run_bzr_remove_changed_files(files)
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
182
3042.2.1 by Lukáš Lalinský
Fix ``bzr rm`` to not delete modified and ignored files.
183
    def test_remove_changed_ignored_files(self):
3619.5.3 by Robert Collins
Review feedback.
184
        tree = self._make_tree_and_add(['a'])
3042.2.1 by Lukáš Lalinský
Fix ``bzr rm`` to not delete modified and ignored files.
185
        self.run_bzr(['ignore', 'a'])
5340.8.2 by Marius Kruger
* update the blackbox tests too (unsave removals are just backed up, and don't complain)
186
        self.run_bzr_remove_changed_files(['a'])
3042.2.1 by Lukáš Lalinský
Fix ``bzr rm`` to not delete modified and ignored files.
187
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
188
    def test_remove_changed_files_from_child_dir(self):
2804.4.1 by Alexander Belchenko
some win32-specific fixes for selftest
189
        if sys.platform == 'win32':
190
            raise TestSkipped("Windows unable to remove '.' directory")
3619.5.3 by Robert Collins
Review feedback.
191
        tree = self._make_tree_and_add(files)
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
192
        self.run_bzr("commit -m 'added files'")
193
        self.changeFile(a)
194
        self.changeFile(c)
4676.2.3 by Vincent Ladeuil
FreeBSD is more strict than other OSes about deleting the working dir.
195
        self.run_bzr_remove_changed_files(
196
            ['../a', 'c', '.', '../d'], working_dir='b')
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
197
        self.assertNotInWorkingTree(files)
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
198
        self.assertPathDoesNotExist(files)
2292.1.13 by Marius Kruger
* merge the unversion command back into the remove command,
199
200
    def test_remove_keep_unversioned_files(self):
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
201
        self.build_tree(files)
2292.1.13 by Marius Kruger
* merge the unversion command back into the remove command,
202
        tree = self.make_branch_and_tree('.')
2292.1.27 by Marius Kruger
* tests/__init__.TestCase.run_bzr_captured
203
        self.run_bzr('remove --keep a', error_regexes=["a is not versioned."])
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
204
        self.assertFilesUnversioned(files)
2292.1.13 by Marius Kruger
* merge the unversion command back into the remove command,
205
5444.3.1 by Marius Kruger
add 'bzr rm --no-backup' and deprecate the --force opting to be consitent with revert
206
    def test_remove_no_backup_unversioned_files(self):
207
        self.build_tree(files)
208
        tree = self.make_branch_and_tree('.')
5444.3.3 by Marius Kruger
* convert the touched tests to rather use ScriptRunner
209
        script.ScriptRunner().run_script(self, '''
6622.1.29 by Jelmer Vernooij
Fix some more tests.
210
        $ brz remove --no-backup a b/ b/c d/
5444.3.3 by Marius Kruger
* convert the touched tests to rather use ScriptRunner
211
        2>deleted d
212
        2>removed b/c (but kept a copy: b/c.~1~)
213
        2>deleted b
214
        2>deleted a
215
        ''')
5444.3.1 by Marius Kruger
add 'bzr rm --no-backup' and deprecate the --force opting to be consitent with revert
216
        self.assertFilesDeleted(files)
217
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
218
    def test_remove_deleted_files(self):
3619.5.3 by Robert Collins
Review feedback.
219
        tree = self._make_tree_and_add(files)
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
220
        self.run_bzr("commit -m 'added files'")
221
        my_files=[f for f in files]
222
        my_files.sort(reverse=True)
223
        for f in my_files:
224
            osutils.delete_any(f)
225
        self.assertInWorkingTree(files)
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
226
        self.assertPathDoesNotExist(files)
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
227
        self.run_bzr('remove ' + ' '.join(files))
228
        self.assertNotInWorkingTree(a)
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
229
        self.assertPathDoesNotExist(files)
2292.1.13 by Marius Kruger
* merge the unversion command back into the remove command,
230
231
    def test_remove_non_existing_files(self):
3619.5.3 by Robert Collins
Review feedback.
232
        tree = self._make_tree_and_add([])
2605.1.1 by Martin Pool
Merge fix for rm renamed files
233
        self.run_bzr(['remove', 'b'])
2292.1.13 by Marius Kruger
* merge the unversion command back into the remove command,
234
235
    def test_remove_keep_non_existing_files(self):
3619.5.3 by Robert Collins
Review feedback.
236
        tree = self._make_tree_and_add([])
2292.1.27 by Marius Kruger
* tests/__init__.TestCase.run_bzr_captured
237
        self.run_bzr('remove --keep b', error_regexes=["b is not versioned."])
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
238
2292.1.23 by Marius Kruger
Revert test_too_much.py and just do the minimum te get the tests to pass.
239
    def test_remove_files(self):
3619.5.3 by Robert Collins
Review feedback.
240
        tree = self._make_tree_and_add(files)
2292.1.27 by Marius Kruger
* tests/__init__.TestCase.run_bzr_captured
241
        self.run_bzr("commit -m 'added files'")
2292.1.30 by Marius Kruger
* Minor text fixes.
242
        self.run_bzr('remove a b b/c d',
243
                     error_regexes=["deleted a", "deleted b", "deleted b/c",
244
                     "deleted d"])
2292.1.23 by Marius Kruger
Revert test_too_much.py and just do the minimum te get the tests to pass.
245
        self.assertFilesDeleted(files)
246
247
    def test_remove_keep_files(self):
3619.5.3 by Robert Collins
Review feedback.
248
        tree = self._make_tree_and_add(files)
2292.1.27 by Marius Kruger
* tests/__init__.TestCase.run_bzr_captured
249
        self.run_bzr("commit -m 'added files'")
2292.1.30 by Marius Kruger
* Minor text fixes.
250
        self.run_bzr('remove --keep a b b/c d',
251
                     error_regexes=["removed a", "removed b", "removed b/c",
252
                     "removed d"])
2292.1.23 by Marius Kruger
Revert test_too_much.py and just do the minimum te get the tests to pass.
253
        self.assertFilesUnversioned(files)
254
2292.1.27 by Marius Kruger
* tests/__init__.TestCase.run_bzr_captured
255
    def test_remove_with_new(self):
3619.5.3 by Robert Collins
Review feedback.
256
        tree = self._make_tree_and_add(files)
2292.1.27 by Marius Kruger
* tests/__init__.TestCase.run_bzr_captured
257
        self.run_bzr('remove --new --keep',
258
                     error_regexes=["removed a", "removed b", "removed b/c"])
2292.1.14 by Marius Kruger
* blackbox/test_remove
259
        self.assertFilesUnversioned(files)
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
260
2292.1.27 by Marius Kruger
* tests/__init__.TestCase.run_bzr_captured
261
    def test_remove_with_new_in_dir1(self):
3619.5.3 by Robert Collins
Review feedback.
262
        tree = self._make_tree_and_add(files)
2292.1.27 by Marius Kruger
* tests/__init__.TestCase.run_bzr_captured
263
        self.run_bzr('remove --new --keep b b/c',
264
                     error_regexes=["removed b", "removed b/c"])
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
265
        tree = WorkingTree.open('.')
266
        self.assertInWorkingTree(a)
7045.1.1 by Jelmer Vernooij
Fix another 300 tests.
267
        self.assertEqual(tree.path2id(a), a.encode('utf-8') + _id)
6809.1.1 by Martin
Apply 2to3 ws_comma fixer
268
        self.assertFilesUnversioned([b, c])
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
269
2292.1.27 by Marius Kruger
* tests/__init__.TestCase.run_bzr_captured
270
    def test_remove_with_new_in_dir2(self):
3619.5.3 by Robert Collins
Review feedback.
271
        tree = self._make_tree_and_add(files)
2292.1.27 by Marius Kruger
* tests/__init__.TestCase.run_bzr_captured
272
        self.run_bzr('remove --new --keep .',
273
                     error_regexes=["removed a", "removed b", "removed b/c"])
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
274
        tree = WorkingTree.open('.')
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
275
        self.assertFilesUnversioned(files)