~bzr-pqm/bzr/bzr.dev

2292.1.20 by Marius Kruger
move test_workingtree.TestRemove to workingtree_implementations/test_remove
1
# Copyright (C) 2006, 2007 Canonical Ltd
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
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
17
"""Tests for interface conformance of 'WorkingTree.remove'"""
18
19
from bzrlib.tests.workingtree_implementations import TestCaseWithWorkingTree
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
20
from bzrlib import errors, osutils
2292.1.20 by Marius Kruger
move test_workingtree.TestRemove to workingtree_implementations/test_remove
21
22
class TestRemove(TestCaseWithWorkingTree):
23
    """Tests WorkingTree.remove"""
24
2475.5.2 by Marius Kruger
* blackbox/test_remove
25
    files = ['a', 'b/', 'b/c', 'd/']
26
    rfiles = ['b/c', 'b', 'a', 'd']
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
27
    a = ['a']
2292.1.20 by Marius Kruger
move test_workingtree.TestRemove to workingtree_implementations/test_remove
28
    b = ['b']
2292.1.24 by Marius Kruger
minor text cleanups
29
    b_c = ['b', 'b/c']
30
2292.1.20 by Marius Kruger
move test_workingtree.TestRemove to workingtree_implementations/test_remove
31
    def getTree(self):
32
        tree = self.make_branch_and_tree('.')
33
        self.build_tree(TestRemove.files)
34
        return tree
35
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
36
    def test_remove_keep(self):
37
        """Check that files are unversioned but not deleted."""
38
        tree = self.getTree()
39
        tree.add(TestRemove.files)
40
        self.assertInWorkingTree(TestRemove.files)
41
42
        tree.remove(TestRemove.files)
43
        self.assertNotInWorkingTree(TestRemove.files)
44
        self.failUnlessExists(TestRemove.files)
45
2292.1.20 by Marius Kruger
move test_workingtree.TestRemove to workingtree_implementations/test_remove
46
    def test_remove_unchanged_files(self):
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
47
        """Check that unchanged files are removed and deleted."""
2292.1.20 by Marius Kruger
move test_workingtree.TestRemove to workingtree_implementations/test_remove
48
        tree = self.getTree()
49
        tree.add(TestRemove.files)
50
        tree.commit("files must not have changes")
51
        self.assertInWorkingTree(TestRemove.files)
52
53
        tree.remove(TestRemove.files, keep_files=False)
54
55
        self.assertNotInWorkingTree(TestRemove.files)
56
        self.failIfExists(TestRemove.files)
57
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
58
    def test_remove_added_files(self):
59
        """Removal of newly added files must fail."""
2292.1.20 by Marius Kruger
move test_workingtree.TestRemove to workingtree_implementations/test_remove
60
        tree = self.getTree()
61
        tree.add(TestRemove.files)
62
        self.assertInWorkingTree(TestRemove.files)
2475.5.6 by Marius Kruger
* test_remove
63
        err = self.assertRaises(errors.BzrRemoveChangedFilesError, tree.remove,
2475.5.2 by Marius Kruger
* blackbox/test_remove
64
            TestRemove.files, keep_files=False)
2475.5.6 by Marius Kruger
* test_remove
65
        self.assertContainsRe(err.changes_as_text,
66
            '(?s)added:.*a.*b/.*b/c.*d/')
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
67
        self.assertInWorkingTree(TestRemove.files)
2292.1.20 by Marius Kruger
move test_workingtree.TestRemove to workingtree_implementations/test_remove
68
        self.failUnlessExists(TestRemove.files)
69
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
70
    def test_remove_changed_file(self):
71
        """Removal of a changed files must fail."""
72
        tree = self.getTree()
73
        tree.add(TestRemove.a)
74
        tree.commit("make sure a is versioned")
2475.5.2 by Marius Kruger
* blackbox/test_remove
75
        self.build_tree_contents([('a', "some other new content!")])
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
76
        self.assertInWorkingTree(TestRemove.a)
2475.5.6 by Marius Kruger
* test_remove
77
        err = self.assertRaises(errors.BzrRemoveChangedFilesError, tree.remove,
2475.5.2 by Marius Kruger
* blackbox/test_remove
78
            TestRemove.a, keep_files=False)
2475.5.6 by Marius Kruger
* test_remove
79
        self.assertContainsRe(err.changes_as_text, '(?s)modified:.*a')
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
80
        self.assertInWorkingTree(TestRemove.a)
81
        self.failUnlessExists(TestRemove.a)
82
83
    def test_remove_deleted_files(self):
84
        """Check that files are removed if they don't exist any more."""
85
        tree = self.getTree()
86
        tree.add(TestRemove.files)
87
        tree.commit("make sure files are versioned")
2475.5.1 by Marius Kruger
Fix bug and test: bzr rm refuses to delete renamed files
88
        for f in TestRemove.rfiles:
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
89
            osutils.delete_any(f)
90
        self.assertInWorkingTree(TestRemove.files)
91
        self.failIfExists(TestRemove.files)
92
93
        tree.remove(TestRemove.files, keep_files=False)
94
95
        self.assertNotInWorkingTree(TestRemove.files)
96
        self.failIfExists(TestRemove.files)
97
2475.5.1 by Marius Kruger
Fix bug and test: bzr rm refuses to delete renamed files
98
    def test_remove_renamed_files(self):
2475.5.2 by Marius Kruger
* blackbox/test_remove
99
        """Check that files are removed even if they are renamed."""
2475.5.1 by Marius Kruger
Fix bug and test: bzr rm refuses to delete renamed files
100
        tree = self.getTree()
101
        tree.add(TestRemove.files)
102
        tree.commit("make sure files are versioned")
103
104
        for f in TestRemove.rfiles:
105
            tree.rename_one(f,f+'x')
106
        rfilesx = ['bx/cx', 'bx', 'ax', 'dx']
107
        self.assertInWorkingTree(rfilesx)
108
        self.failUnlessExists(rfilesx)
109
110
        tree.remove(rfilesx, keep_files=False)
111
112
        self.assertNotInWorkingTree(rfilesx)
113
        self.failIfExists(rfilesx)
114
2475.5.2 by Marius Kruger
* blackbox/test_remove
115
    def test_remove_renamed_changed_files(self):
116
        """Check that files are not removed if they are renamed and changed."""
117
        tree = self.getTree()
118
        tree.add(TestRemove.files)
119
        tree.commit("make sure files are versioned")
120
121
        for f in TestRemove.rfiles:
122
            tree.rename_one(f,f+'x')
123
        rfilesx = ['bx/cx', 'bx', 'ax', 'dx']
124
        self.build_tree_contents([('ax','changed and renamed!'),
125
                                  ('bx/cx','changed and renamed!')])
126
        self.assertInWorkingTree(rfilesx)
127
        self.failUnlessExists(rfilesx)
128
2475.5.6 by Marius Kruger
* test_remove
129
        err = self.assertRaises(errors.BzrRemoveChangedFilesError, tree.remove,
2475.5.2 by Marius Kruger
* blackbox/test_remove
130
            rfilesx, keep_files=False)
2475.5.6 by Marius Kruger
* test_remove
131
        self.assertContainsRe(err.changes_as_text,
132
            '(?s)modified:.*ax.*bx/cx')
2475.5.2 by Marius Kruger
* blackbox/test_remove
133
        self.assertInWorkingTree(rfilesx)
134
        self.failUnlessExists(rfilesx)
135
2292.1.20 by Marius Kruger
move test_workingtree.TestRemove to workingtree_implementations/test_remove
136
    def test_force_remove_changed_files(self):
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
137
        """Check that changed files are removed and deleted when forced."""
2292.1.20 by Marius Kruger
move test_workingtree.TestRemove to workingtree_implementations/test_remove
138
        tree = self.getTree()
139
        tree.add(TestRemove.files)
140
        self.assertInWorkingTree(TestRemove.files)
141
142
        tree.remove(TestRemove.files, keep_files=False, force=True)
143
144
        self.assertNotInWorkingTree(TestRemove.files)
145
        self.failIfExists(TestRemove.files)
146
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
147
    def test_remove_unknown_files(self):
148
        """Try to delete unknown files."""
149
        tree = self.getTree()
2475.5.6 by Marius Kruger
* test_remove
150
        err = self.assertRaises(errors.BzrRemoveChangedFilesError, tree.remove,
2475.5.2 by Marius Kruger
* blackbox/test_remove
151
            TestRemove.files, keep_files=False)
2475.5.6 by Marius Kruger
* test_remove
152
        self.assertContainsRe(err.changes_as_text,
153
            '(?s)unknown:.*d/.*b/c.*b/.*a.*')
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
154
2292.1.20 by Marius Kruger
move test_workingtree.TestRemove to workingtree_implementations/test_remove
155
    def test_remove_nonexisting_files(self):
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
156
        """Try to delete non-existing files."""
2292.1.20 by Marius Kruger
move test_workingtree.TestRemove to workingtree_implementations/test_remove
157
        tree = self.getTree()
158
        tree.remove([''], keep_files=False)
2475.5.2 by Marius Kruger
* blackbox/test_remove
159
        tree.remove(['xyz', 'abc/def'], keep_files=False)
2292.1.20 by Marius Kruger
move test_workingtree.TestRemove to workingtree_implementations/test_remove
160
161
    def test_remove_nonempty_directory(self):
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
162
        """Unchanged non-empty directories should be deleted."""
2292.1.20 by Marius Kruger
move test_workingtree.TestRemove to workingtree_implementations/test_remove
163
        tree = self.getTree()
164
        tree.add(TestRemove.files)
165
        tree.commit("make sure b is versioned")
166
        self.assertInWorkingTree(TestRemove.files)
167
        self.failUnlessExists(TestRemove.files)
168
        tree.remove(TestRemove.b, keep_files=False)
169
        self.assertNotInWorkingTree(TestRemove.b)
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
170
        self.failIfExists(TestRemove.b)
2292.1.30 by Marius Kruger
* Minor text fixes.
171
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
172
    def test_remove_nonempty_directory_with_unknowns(self):
173
        """Unchanged non-empty directories should be deleted."""
174
        tree = self.getTree()
175
        tree.add(TestRemove.files)
176
        tree.commit("make sure b is versioned")
177
        self.assertInWorkingTree(TestRemove.files)
178
        self.failUnlessExists(TestRemove.files)
2475.5.2 by Marius Kruger
* blackbox/test_remove
179
        self.build_tree(['b/my_unknown_file'])
2475.5.6 by Marius Kruger
* test_remove
180
        err = self.assertRaises(errors.BzrRemoveChangedFilesError, tree.remove,
2475.5.2 by Marius Kruger
* blackbox/test_remove
181
            TestRemove.b, keep_files=False)
2475.5.6 by Marius Kruger
* test_remove
182
        self.assertContainsRe(err.changes_as_text,
183
            '(?s)unknown:.*b/my_unknown_file')
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
184
        self.assertInWorkingTree(TestRemove.b)
2292.1.20 by Marius Kruger
move test_workingtree.TestRemove to workingtree_implementations/test_remove
185
        self.failUnlessExists(TestRemove.b)
186
187
    def test_force_remove_nonempty_directory(self):
188
        tree = self.getTree()
189
        tree.add(TestRemove.files)
190
        tree.commit("make sure b is versioned")
191
        self.assertInWorkingTree(TestRemove.files)
192
        self.failUnlessExists(TestRemove.files)
193
        tree.remove(TestRemove.b, keep_files=False, force=True)
194
        self.assertNotInWorkingTree(TestRemove.b_c)
195
        self.failIfExists(TestRemove.b_c)
196
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
197
    def test_remove_directory_with_changed_file(self):
198
        """Refuse to delete directories with changed files."""
2292.1.20 by Marius Kruger
move test_workingtree.TestRemove to workingtree_implementations/test_remove
199
        tree = self.getTree()
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
200
        tree.add(TestRemove.b_c)
201
        tree.commit("make sure b and c are versioned")
2475.5.2 by Marius Kruger
* blackbox/test_remove
202
        self.build_tree_contents([('b/c', "some other new content!")])
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
203
        self.assertInWorkingTree(TestRemove.b_c)
2475.5.6 by Marius Kruger
* test_remove
204
        err = self.assertRaises(errors.BzrRemoveChangedFilesError, tree.remove,
2475.5.2 by Marius Kruger
* blackbox/test_remove
205
            TestRemove.b, keep_files=False)
2475.5.6 by Marius Kruger
* test_remove
206
        self.assertContainsRe(err.changes_as_text, '(?s)modified:.*b/c')
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
207
        self.assertInWorkingTree(TestRemove.b_c)
208
        self.failUnlessExists(TestRemove.b_c)
2292.1.20 by Marius Kruger
move test_workingtree.TestRemove to workingtree_implementations/test_remove
209
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
210
        #see if we can force it now..
211
        tree.remove(TestRemove.b, keep_files=False, force=True)
212
        self.assertNotInWorkingTree(TestRemove.b_c)
213
        self.failIfExists(TestRemove.b_c)
1551.15.11 by Aaron Bentley
Bugfix WorkingTree.remove to handle subtrees, and non-cwd trees
214
215
    def test_remove_subtree(self):
216
        tree = self.make_branch_and_tree('.')
217
        subtree = self.make_branch_and_tree('subtree')
218
        tree.add('subtree', 'subtree-id')
219
        tree.remove('subtree')
220
        self.assertIs(None, tree.path2id('subtree'))
221
222
    def test_non_cwd(self):
223
        tree = self.make_branch_and_tree('tree')
224
        self.build_tree(['tree/dir/', 'tree/dir/file'])
225
        tree.add(['dir', 'dir/file'])
226
        tree.commit('add file')
227
        tree.remove('dir/', keep_files=False)
228
        self.failIfExists('tree/dir/file')