~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

  • Committer: Marius Kruger
  • Date: 2010-07-10 21:28:56 UTC
  • mto: (5384.1.1 integration)
  • mto: This revision was merged to the branch mainline in revision 5385.
  • Revision ID: marius.kruger@enerweb.co.za-20100710212856-uq4ji3go0u5se7hx
* Update documentation
* add NEWS

Show diffs side-by-side

added added

removed removed

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