~bzr-pqm/bzr/bzr.dev

2052.3.2 by John Arbash Meinel
Change Copyright .. by Canonical to Copyright ... Canonical
1
# Copyright (C) 2005, 2006 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
3619.5.1 by Robert Collins
* ``bzr rm`` will now scan for files that are missing and remove just
21
from bzrlib.tests import SymlinkFeature, TestSkipped
1551.6.25 by Aaron Bentley
split out blackbox test for bzr remove
22
from bzrlib.tests.blackbox import ExternalBase
1551.6.26 by Aaron Bentley
Add support for remove --new
23
from bzrlib.workingtree import WorkingTree
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
24
from bzrlib import osutils
25
26
_id='-id'
27
a='a'
28
b='b/'
29
c='b/c'
2292.1.30 by Marius Kruger
* Minor text fixes.
30
d='d/'
31
files=(a, b, c, d)
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
32
33
2292.1.13 by Marius Kruger
* merge the unversion command back into the remove command,
34
class TestRemove(ExternalBase):
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
35
3619.5.3 by Robert Collins
Review feedback.
36
    def _make_tree_and_add(self, paths):
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
37
        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
38
        tree.lock_write()
39
        try:
40
            self.build_tree(paths)
41
            for path in paths:
42
                file_id=str(path).replace('/', '_') + _id
43
                tree.add(path, file_id)
44
        finally:
45
            tree.unlock()
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
46
        return tree
47
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
48
    def assertFilesDeleted(self, files):
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
49
        for f in files:
50
            id=f+_id
51
            self.assertNotInWorkingTree(f)
2292.1.14 by Marius Kruger
* blackbox/test_remove
52
            self.failIfExists(f)
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
53
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
54
    def assertFilesUnversioned(self, files):
2292.1.13 by Marius Kruger
* merge the unversion command back into the remove command,
55
        for f in files:
56
            self.assertNotInWorkingTree(f)
2292.1.14 by Marius Kruger
* blackbox/test_remove
57
            self.failUnlessExists(f)
2292.1.13 by Marius Kruger
* merge the unversion command back into the remove command,
58
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
59
    def changeFile(self, file_name):
60
        f = file(file_name, 'ab')
61
        f.write("\nsome other new content!")
62
        f.close()
63
64
    def run_bzr_remove_changed_files(self, error_regexes, files_to_remove):
2655.2.5 by Marius Kruger
* Improve BzrRemoveChangedFilesError message.
65
        error_regexes.extend(["Can't safely remove modified or unknown files:",
2292.1.26 by Marius Kruger
* tests/__init__
66
            'Use --keep to not delete them,'
67
            ' or --force to delete them regardless.'
68
            ])
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
69
        self.run_bzr_error(error_regexes,
2605.1.2 by Martin Pool
Fix up run_bzr calls
70
            ['remove'] + list(files_to_remove))
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
71
        #see if we can force it now
2605.1.2 by Martin Pool
Fix up run_bzr calls
72
        self.run_bzr(['remove', '--force'] + list(files_to_remove))
2292.1.26 by Marius Kruger
* tests/__init__
73
3619.5.3 by Robert Collins
Review feedback.
74
    def test_remove_new_no_files_specified(self):
75
        tree = self.make_branch_and_tree('.')
76
        self.run_bzr_error(["bzr: ERROR: No matching files."], 'remove --new')
77
        self.run_bzr_error(["bzr: ERROR: No matching files."], 'remove --new .')
78
2292.1.13 by Marius Kruger
* merge the unversion command back into the remove command,
79
    def test_remove_no_files_specified(self):
3619.5.3 by Robert Collins
Review feedback.
80
        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
81
        out, err = self.run_bzr(['rm'])
82
        self.assertEqual('', err)
83
        self.assertEqual('', out)
84
        self.assertInWorkingTree('foo', tree=tree)
85
        self.failUnlessExists('foo')
86
87
    def test_remove_no_files_specified_missing_dir_and_contents(self):
3619.5.3 by Robert Collins
Review feedback.
88
        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
89
            ['foo', 'dir/', 'dir/missing/', 'dir/missing/child'])
90
        self.get_transport('.').delete_tree('dir/missing')
91
        out, err = self.run_bzr(['rm'])
92
        self.assertEqual('', out)
93
        self.assertEqual(
94
            'removed dir/missing/child\n'
95
            'removed dir/missing\n',
96
            err)
97
        # non-missing paths not touched:
98
        self.assertInWorkingTree('foo', tree=tree)
99
        self.failUnlessExists('foo')
100
        self.assertInWorkingTree('dir', tree=tree)
101
        self.failUnlessExists('dir')
102
        # missing files unversioned
103
        self.assertNotInWorkingTree('dir/missing', tree=tree)
104
        self.assertNotInWorkingTree('dir/missing/child', tree=tree)
105
3619.5.3 by Robert Collins
Review feedback.
106
    def test_remove_no_files_specified_already_deleted(self):
107
        tree = self._make_tree_and_add(['foo', 'bar'])
108
        tree.commit('save foo and bar')
109
        os.unlink('bar')
110
        self.run_bzr(['rm'])
111
        self.assertEqual(None, tree.path2id('bar'))
112
        # Running rm with a deleted file does not error.
113
        out, err = self.run_bzr(['rm'])
114
        self.assertEqual('', out)
115
        self.assertEqual('', err)
116
3619.5.1 by Robert Collins
* ``bzr rm`` will now scan for files that are missing and remove just
117
    def test_remove_no_files_specified_missing_file(self):
3619.5.3 by Robert Collins
Review feedback.
118
        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
119
        os.unlink('bar')
120
        out, err = self.run_bzr(['rm'])
121
        self.assertEqual('', out)
122
        self.assertEqual('removed bar\n', err)
123
        # non-missing files not touched:
124
        self.assertInWorkingTree('foo', tree=tree)
125
        self.failUnlessExists('foo')
126
        # missing files unversioned
127
        self.assertNotInWorkingTree('bar', tree=tree)
128
129
    def test_remove_no_files_specified_missing_link(self):
130
        self.requireFeature(SymlinkFeature)
3619.5.3 by Robert Collins
Review feedback.
131
        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
132
        os.symlink('foo', 'linkname')
133
        tree.add(['linkname'])
134
        os.unlink('linkname')
135
        out, err = self.run_bzr(['rm'])
136
        self.assertEqual('', out)
137
        self.assertEqual('removed linkname\n', err)
138
        # non-missing files not touched:
139
        self.assertInWorkingTree('foo', tree=tree)
140
        self.failUnlessExists('foo')
141
        # missing files unversioned
142
        self.assertNotInWorkingTree('linkname', tree=tree)
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
143
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
144
    def test_rm_one_file(self):
3619.5.3 by Robert Collins
Review feedback.
145
        tree = self._make_tree_and_add([a])
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
146
        self.run_bzr("commit -m 'added a'")
147
        self.run_bzr('rm a', error_regexes=["deleted a"])
148
        self.assertFilesDeleted([a])
149
150
    def test_remove_one_file(self):
3619.5.3 by Robert Collins
Review feedback.
151
        tree = self._make_tree_and_add([a])
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
152
        self.run_bzr("commit -m 'added a'")
153
        self.run_bzr('remove a', error_regexes=["deleted a"])
154
        self.assertFilesDeleted([a])
155
156
    def test_remove_keep_one_file(self):
3619.5.3 by Robert Collins
Review feedback.
157
        tree = self._make_tree_and_add([a])
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
158
        self.run_bzr('remove --keep a', error_regexes=["removed a"])
159
        self.assertFilesUnversioned([a])
160
161
    def test_remove_one_deleted_file(self):
3619.5.3 by Robert Collins
Review feedback.
162
        tree = self._make_tree_and_add([a])
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
163
        self.run_bzr("commit -m 'added a'")
164
        os.unlink(a)
165
        self.assertInWorkingTree(a)
166
        self.run_bzr('remove a')
167
        self.assertNotInWorkingTree(a)
168
2292.1.13 by Marius Kruger
* merge the unversion command back into the remove command,
169
    def test_remove_invalid_files(self):
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
170
        self.build_tree(files)
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
171
        tree = self.make_branch_and_tree('.')
2605.1.1 by Martin Pool
Merge fix for rm renamed files
172
        self.run_bzr(['remove', '.', 'xyz', 'abc/def'])
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
173
2292.1.13 by Marius Kruger
* merge the unversion command back into the remove command,
174
    def test_remove_unversioned_files(self):
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
175
        self.build_tree(files)
2292.1.13 by Marius Kruger
* merge the unversion command back into the remove command,
176
        tree = self.make_branch_and_tree('.')
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
177
        self.run_bzr_remove_changed_files(
178
            ['unknown:[.\s]*d/[.\s]*b/c[.\s]*b/[.\s]*a'], files)
179
180
    def test_remove_changed_files(self):
3619.5.3 by Robert Collins
Review feedback.
181
        tree = self._make_tree_and_add(files)
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
182
        self.run_bzr("commit -m 'added files'")
183
        self.changeFile(a)
184
        self.changeFile(c)
185
        self.run_bzr_remove_changed_files(['modified:[.\s]*a[.\s]*b/c'], files)
186
3042.2.1 by Lukáš Lalinský
Fix ``bzr rm`` to not delete modified and ignored files.
187
    def test_remove_changed_ignored_files(self):
3619.5.3 by Robert Collins
Review feedback.
188
        tree = self._make_tree_and_add(['a'])
3042.2.1 by Lukáš Lalinský
Fix ``bzr rm`` to not delete modified and ignored files.
189
        self.run_bzr(['ignore', 'a'])
190
        self.run_bzr_remove_changed_files(['added:[.\s]*a'], ['a'])
191
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
192
    def test_remove_changed_files_from_child_dir(self):
2804.4.1 by Alexander Belchenko
some win32-specific fixes for selftest
193
        if sys.platform == 'win32':
194
            raise TestSkipped("Windows unable to remove '.' directory")
3619.5.3 by Robert Collins
Review feedback.
195
        tree = self._make_tree_and_add(files)
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
196
        self.run_bzr("commit -m 'added files'")
197
        self.changeFile(a)
198
        self.changeFile(c)
199
        os.chdir('b')
200
        self.run_bzr_remove_changed_files(['modified:[.\s]*a[.\s]*b/c'],
201
            ['../a', 'c', '.', '../d'])
202
        os.chdir('..')
203
        self.assertNotInWorkingTree(files)
204
        self.failIfExists(files)
2292.1.13 by Marius Kruger
* merge the unversion command back into the remove command,
205
206
    def test_remove_keep_unversioned_files(self):
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
207
        self.build_tree(files)
2292.1.13 by Marius Kruger
* merge the unversion command back into the remove command,
208
        tree = self.make_branch_and_tree('.')
2292.1.27 by Marius Kruger
* tests/__init__.TestCase.run_bzr_captured
209
        self.run_bzr('remove --keep a', error_regexes=["a is not versioned."])
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
210
        self.assertFilesUnversioned(files)
2292.1.13 by Marius Kruger
* merge the unversion command back into the remove command,
211
212
    def test_remove_force_unversioned_files(self):
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
213
        self.build_tree(files)
2292.1.13 by Marius Kruger
* merge the unversion command back into the remove command,
214
        tree = self.make_branch_and_tree('.')
2605.1.2 by Martin Pool
Fix up run_bzr calls
215
        self.run_bzr(['remove', '--force'] + list(files),
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
216
                     error_regexes=["deleted a", "deleted b",
217
                                    "deleted b/c", "deleted d"])
218
        self.assertFilesDeleted(files)
219
220
    def test_remove_deleted_files(self):
3619.5.3 by Robert Collins
Review feedback.
221
        tree = self._make_tree_and_add(files)
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
222
        self.run_bzr("commit -m 'added files'")
223
        my_files=[f for f in files]
224
        my_files.sort(reverse=True)
225
        for f in my_files:
226
            osutils.delete_any(f)
227
        self.assertInWorkingTree(files)
228
        self.failIfExists(files)
229
        self.run_bzr('remove ' + ' '.join(files))
230
        self.assertNotInWorkingTree(a)
231
        self.failIfExists(files)
2292.1.13 by Marius Kruger
* merge the unversion command back into the remove command,
232
233
    def test_remove_non_existing_files(self):
3619.5.3 by Robert Collins
Review feedback.
234
        tree = self._make_tree_and_add([])
2605.1.1 by Martin Pool
Merge fix for rm renamed files
235
        self.run_bzr(['remove', 'b'])
2292.1.13 by Marius Kruger
* merge the unversion command back into the remove command,
236
237
    def test_remove_keep_non_existing_files(self):
3619.5.3 by Robert Collins
Review feedback.
238
        tree = self._make_tree_and_add([])
2292.1.27 by Marius Kruger
* tests/__init__.TestCase.run_bzr_captured
239
        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.
240
2292.1.23 by Marius Kruger
Revert test_too_much.py and just do the minimum te get the tests to pass.
241
    def test_remove_files(self):
3619.5.3 by Robert Collins
Review feedback.
242
        tree = self._make_tree_and_add(files)
2292.1.27 by Marius Kruger
* tests/__init__.TestCase.run_bzr_captured
243
        self.run_bzr("commit -m 'added files'")
2292.1.30 by Marius Kruger
* Minor text fixes.
244
        self.run_bzr('remove a b b/c d',
245
                     error_regexes=["deleted a", "deleted b", "deleted b/c",
246
                     "deleted d"])
2292.1.23 by Marius Kruger
Revert test_too_much.py and just do the minimum te get the tests to pass.
247
        self.assertFilesDeleted(files)
248
249
    def test_remove_keep_files(self):
3619.5.3 by Robert Collins
Review feedback.
250
        tree = self._make_tree_and_add(files)
2292.1.27 by Marius Kruger
* tests/__init__.TestCase.run_bzr_captured
251
        self.run_bzr("commit -m 'added files'")
2292.1.30 by Marius Kruger
* Minor text fixes.
252
        self.run_bzr('remove --keep a b b/c d',
253
                     error_regexes=["removed a", "removed b", "removed b/c",
254
                     "removed d"])
2292.1.23 by Marius Kruger
Revert test_too_much.py and just do the minimum te get the tests to pass.
255
        self.assertFilesUnversioned(files)
256
2292.1.27 by Marius Kruger
* tests/__init__.TestCase.run_bzr_captured
257
    def test_remove_with_new(self):
3619.5.3 by Robert Collins
Review feedback.
258
        tree = self._make_tree_and_add(files)
2292.1.27 by Marius Kruger
* tests/__init__.TestCase.run_bzr_captured
259
        self.run_bzr('remove --new --keep',
260
                     error_regexes=["removed a", "removed b", "removed b/c"])
2292.1.14 by Marius Kruger
* blackbox/test_remove
261
        self.assertFilesUnversioned(files)
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
262
2292.1.27 by Marius Kruger
* tests/__init__.TestCase.run_bzr_captured
263
    def test_remove_with_new_in_dir1(self):
3619.5.3 by Robert Collins
Review feedback.
264
        tree = self._make_tree_and_add(files)
2292.1.27 by Marius Kruger
* tests/__init__.TestCase.run_bzr_captured
265
        self.run_bzr('remove --new --keep b b/c',
266
                     error_regexes=["removed b", "removed b/c"])
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
267
        tree = WorkingTree.open('.')
268
        self.assertInWorkingTree(a)
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
269
        self.assertEqual(tree.path2id(a), a + _id)
2292.1.14 by Marius Kruger
* blackbox/test_remove
270
        self.assertFilesUnversioned([b,c])
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
271
2292.1.27 by Marius Kruger
* tests/__init__.TestCase.run_bzr_captured
272
    def test_remove_with_new_in_dir2(self):
3619.5.3 by Robert Collins
Review feedback.
273
        tree = self._make_tree_and_add(files)
2292.1.27 by Marius Kruger
* tests/__init__.TestCase.run_bzr_captured
274
        self.run_bzr('remove --new --keep .',
275
                     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.
276
        tree = WorkingTree.open('.')
2292.1.32 by Marius Kruger
* tests/__init__.run_bzr
277
        self.assertFilesUnversioned(files)