~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/blackbox/test_remove.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2008-03-16 14:01:20 UTC
  • mfrom: (3280.2.5 integration)
  • Revision ID: pqm@pqm.ubuntu.com-20080316140120-i3yq8yr1l66m11h7
Start 1.4 development

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2010 Canonical Ltd
 
1
# Copyright (C) 2005, 2006 Canonical Ltd
2
2
#
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
12
12
#
13
13
# You should have received a copy of the GNU General Public License
14
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
 
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
17
 
18
18
import os
19
19
import sys
20
20
 
21
 
from bzrlib.tests import SymlinkFeature, TestSkipped
22
 
from bzrlib.tests import TestCaseWithTransport
 
21
from bzrlib.tests import TestSkipped
 
22
from bzrlib.tests.blackbox import ExternalBase
23
23
from bzrlib.workingtree import WorkingTree
24
24
from bzrlib import osutils
25
25
 
31
31
files=(a, b, c, d)
32
32
 
33
33
 
34
 
class TestRemove(TestCaseWithTransport):
 
34
class TestRemove(ExternalBase):
35
35
 
36
 
    def _make_tree_and_add(self, paths):
 
36
    def _make_add_and_assert_tree(self, files):
37
37
        tree = self.make_branch_and_tree('.')
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()
 
38
        self.build_tree(files)
 
39
        for f in files:
 
40
            id=str(f).replace('/', '_') + _id
 
41
            tree.add(f, id)
 
42
            self.assertEqual(tree.path2id(f), id)
 
43
            self.failUnlessExists(f)
 
44
            self.assertInWorkingTree(f)
46
45
        return tree
47
46
 
48
47
    def assertFilesDeleted(self, files):
61
60
        f.write("\nsome other new content!")
62
61
        f.close()
63
62
 
64
 
    def run_bzr_remove_changed_files(self, files_to_remove, working_dir=None):
65
 
        self.run_bzr(['remove'] + list(files_to_remove),
66
 
           working_dir=working_dir)
67
 
 
68
 
    def test_remove_new_no_files_specified(self):
69
 
        tree = self.make_branch_and_tree('.')
 
63
    def run_bzr_remove_changed_files(self, error_regexes, files_to_remove):
 
64
        error_regexes.extend(["Can't safely remove modified or unknown files:",
 
65
            'Use --keep to not delete them,'
 
66
            ' or --force to delete them regardless.'
 
67
            ])
 
68
        self.run_bzr_error(error_regexes,
 
69
            ['remove'] + list(files_to_remove))
 
70
        #see if we can force it now
 
71
        self.run_bzr(['remove', '--force'] + list(files_to_remove))
 
72
 
 
73
    def test_remove_no_files_specified(self):
 
74
        tree = self._make_add_and_assert_tree([])
 
75
        self.run_bzr_error(["bzr: ERROR: Specify one or more files to remove, "
 
76
            "or use --new."], 'remove')
 
77
 
70
78
        self.run_bzr_error(["bzr: ERROR: No matching files."], 'remove --new')
71
 
        self.run_bzr_error(["bzr: ERROR: No matching files."], 'remove --new .')
72
 
 
73
 
    def test_remove_no_files_specified(self):
74
 
        tree = self._make_tree_and_add(['foo'])
75
 
        out, err = self.run_bzr(['rm'])
76
 
        self.assertEqual('', err)
77
 
        self.assertEqual('', out)
78
 
        self.assertInWorkingTree('foo', tree=tree)
79
 
        self.failUnlessExists('foo')
80
 
 
81
 
    def test_remove_no_files_specified_missing_dir_and_contents(self):
82
 
        tree = self._make_tree_and_add(
83
 
            ['foo', 'dir/', 'dir/missing/', 'dir/missing/child'])
84
 
        self.get_transport('.').delete_tree('dir/missing')
85
 
        out, err = self.run_bzr(['rm'])
86
 
        self.assertEqual('', out)
87
 
        self.assertEqual(
88
 
            'removed dir/missing/child\n'
89
 
            'removed dir/missing\n',
90
 
            err)
91
 
        # non-missing paths not touched:
92
 
        self.assertInWorkingTree('foo', tree=tree)
93
 
        self.failUnlessExists('foo')
94
 
        self.assertInWorkingTree('dir', tree=tree)
95
 
        self.failUnlessExists('dir')
96
 
        # missing files unversioned
97
 
        self.assertNotInWorkingTree('dir/missing', tree=tree)
98
 
        self.assertNotInWorkingTree('dir/missing/child', tree=tree)
99
 
 
100
 
    def test_remove_no_files_specified_already_deleted(self):
101
 
        tree = self._make_tree_and_add(['foo', 'bar'])
102
 
        tree.commit('save foo and bar')
103
 
        os.unlink('bar')
104
 
        self.run_bzr(['rm'])
105
 
        self.assertEqual(None, tree.path2id('bar'))
106
 
        # Running rm with a deleted file does not error.
107
 
        out, err = self.run_bzr(['rm'])
108
 
        self.assertEqual('', out)
109
 
        self.assertEqual('', err)
110
 
 
111
 
    def test_remove_no_files_specified_missing_file(self):
112
 
        tree = self._make_tree_and_add(['foo', 'bar'])
113
 
        os.unlink('bar')
114
 
        out, err = self.run_bzr(['rm'])
115
 
        self.assertEqual('', out)
116
 
        self.assertEqual('removed bar\n', err)
117
 
        # non-missing files not touched:
118
 
        self.assertInWorkingTree('foo', tree=tree)
119
 
        self.failUnlessExists('foo')
120
 
        # missing files unversioned
121
 
        self.assertNotInWorkingTree('bar', tree=tree)
122
 
 
123
 
    def test_remove_no_files_specified_missing_link(self):
124
 
        self.requireFeature(SymlinkFeature)
125
 
        tree = self._make_tree_and_add(['foo'])
126
 
        os.symlink('foo', 'linkname')
127
 
        tree.add(['linkname'])
128
 
        os.unlink('linkname')
129
 
        out, err = self.run_bzr(['rm'])
130
 
        self.assertEqual('', out)
131
 
        self.assertEqual('removed linkname\n', err)
132
 
        # non-missing files not touched:
133
 
        self.assertInWorkingTree('foo', tree=tree)
134
 
        self.failUnlessExists('foo')
135
 
        # missing files unversioned
136
 
        self.assertNotInWorkingTree('linkname', tree=tree)
 
79
 
 
80
        self.run_bzr_error(["bzr: ERROR: No matching files."],
 
81
            'remove --new .')
137
82
 
138
83
    def test_rm_one_file(self):
139
 
        tree = self._make_tree_and_add([a])
 
84
        tree = self._make_add_and_assert_tree([a])
140
85
        self.run_bzr("commit -m 'added a'")
141
86
        self.run_bzr('rm a', error_regexes=["deleted a"])
142
87
        self.assertFilesDeleted([a])
143
88
 
144
89
    def test_remove_one_file(self):
145
 
        tree = self._make_tree_and_add([a])
 
90
        tree = self._make_add_and_assert_tree([a])
146
91
        self.run_bzr("commit -m 'added a'")
147
92
        self.run_bzr('remove a', error_regexes=["deleted a"])
148
93
        self.assertFilesDeleted([a])
149
94
 
150
95
    def test_remove_keep_one_file(self):
151
 
        tree = self._make_tree_and_add([a])
 
96
        tree = self._make_add_and_assert_tree([a])
152
97
        self.run_bzr('remove --keep a', error_regexes=["removed a"])
153
98
        self.assertFilesUnversioned([a])
154
99
 
155
100
    def test_remove_one_deleted_file(self):
156
 
        tree = self._make_tree_and_add([a])
 
101
        tree = self._make_add_and_assert_tree([a])
157
102
        self.run_bzr("commit -m 'added a'")
158
103
        os.unlink(a)
159
104
        self.assertInWorkingTree(a)
168
113
    def test_remove_unversioned_files(self):
169
114
        self.build_tree(files)
170
115
        tree = self.make_branch_and_tree('.')
171
 
        self.run_bzr_remove_changed_files(files)
 
116
        self.run_bzr_remove_changed_files(
 
117
            ['unknown:[.\s]*d/[.\s]*b/c[.\s]*b/[.\s]*a'], files)
172
118
 
173
119
    def test_remove_changed_files(self):
174
 
        tree = self._make_tree_and_add(files)
 
120
        tree = self._make_add_and_assert_tree(files)
175
121
        self.run_bzr("commit -m 'added files'")
176
122
        self.changeFile(a)
177
123
        self.changeFile(c)
178
 
        self.run_bzr_remove_changed_files(files)
 
124
        self.run_bzr_remove_changed_files(['modified:[.\s]*a[.\s]*b/c'], files)
179
125
 
180
126
    def test_remove_changed_ignored_files(self):
181
 
        tree = self._make_tree_and_add(['a'])
 
127
        tree = self._make_add_and_assert_tree(['a'])
182
128
        self.run_bzr(['ignore', 'a'])
183
 
        self.run_bzr_remove_changed_files(['a'])
 
129
        self.run_bzr_remove_changed_files(['added:[.\s]*a'], ['a'])
184
130
 
185
131
    def test_remove_changed_files_from_child_dir(self):
186
132
        if sys.platform == 'win32':
187
133
            raise TestSkipped("Windows unable to remove '.' directory")
188
 
        tree = self._make_tree_and_add(files)
 
134
        tree = self._make_add_and_assert_tree(files)
189
135
        self.run_bzr("commit -m 'added files'")
190
136
        self.changeFile(a)
191
137
        self.changeFile(c)
192
 
        self.run_bzr_remove_changed_files(
193
 
            ['../a', 'c', '.', '../d'], working_dir='b')
 
138
        os.chdir('b')
 
139
        self.run_bzr_remove_changed_files(['modified:[.\s]*a[.\s]*b/c'],
 
140
            ['../a', 'c', '.', '../d'])
 
141
        os.chdir('..')
194
142
        self.assertNotInWorkingTree(files)
195
143
        self.failIfExists(files)
196
144
 
205
153
        tree = self.make_branch_and_tree('.')
206
154
        self.run_bzr(['remove', '--force'] + list(files),
207
155
                     error_regexes=["deleted a", "deleted b",
208
 
                                    "removed b/c", "deleted d"])
 
156
                                    "deleted b/c", "deleted d"])
209
157
        self.assertFilesDeleted(files)
210
158
 
211
159
    def test_remove_deleted_files(self):
212
 
        tree = self._make_tree_and_add(files)
 
160
        tree = self._make_add_and_assert_tree(files)
213
161
        self.run_bzr("commit -m 'added files'")
214
162
        my_files=[f for f in files]
215
163
        my_files.sort(reverse=True)
222
170
        self.failIfExists(files)
223
171
 
224
172
    def test_remove_non_existing_files(self):
225
 
        tree = self._make_tree_and_add([])
 
173
        tree = self._make_add_and_assert_tree([])
226
174
        self.run_bzr(['remove', 'b'])
227
175
 
228
176
    def test_remove_keep_non_existing_files(self):
229
 
        tree = self._make_tree_and_add([])
 
177
        tree = self._make_add_and_assert_tree([])
230
178
        self.run_bzr('remove --keep b', error_regexes=["b is not versioned."])
231
179
 
232
180
    def test_remove_files(self):
233
 
        tree = self._make_tree_and_add(files)
 
181
        tree = self._make_add_and_assert_tree(files)
234
182
        self.run_bzr("commit -m 'added files'")
235
183
        self.run_bzr('remove a b b/c d',
236
184
                     error_regexes=["deleted a", "deleted b", "deleted b/c",
238
186
        self.assertFilesDeleted(files)
239
187
 
240
188
    def test_remove_keep_files(self):
241
 
        tree = self._make_tree_and_add(files)
 
189
        tree = self._make_add_and_assert_tree(files)
242
190
        self.run_bzr("commit -m 'added files'")
243
191
        self.run_bzr('remove --keep a b b/c d',
244
192
                     error_regexes=["removed a", "removed b", "removed b/c",
246
194
        self.assertFilesUnversioned(files)
247
195
 
248
196
    def test_remove_with_new(self):
249
 
        tree = self._make_tree_and_add(files)
 
197
        tree = self._make_add_and_assert_tree(files)
250
198
        self.run_bzr('remove --new --keep',
251
199
                     error_regexes=["removed a", "removed b", "removed b/c"])
252
200
        self.assertFilesUnversioned(files)
253
201
 
254
202
    def test_remove_with_new_in_dir1(self):
255
 
        tree = self._make_tree_and_add(files)
 
203
        tree = self._make_add_and_assert_tree(files)
256
204
        self.run_bzr('remove --new --keep b b/c',
257
205
                     error_regexes=["removed b", "removed b/c"])
258
206
        tree = WorkingTree.open('.')
261
209
        self.assertFilesUnversioned([b,c])
262
210
 
263
211
    def test_remove_with_new_in_dir2(self):
264
 
        tree = self._make_tree_and_add(files)
 
212
        tree = self._make_add_and_assert_tree(files)
265
213
        self.run_bzr('remove --new --keep .',
266
214
                     error_regexes=["removed a", "removed b", "removed b/c"])
267
215
        tree = WorkingTree.open('.')