~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

  • Committer: John Arbash Meinel
  • Date: 2009-08-25 18:45:40 UTC
  • mto: (4634.6.15 2.0)
  • mto: This revision was merged to the branch mainline in revision 4667.
  • Revision ID: john@arbash-meinel.com-20090825184540-6dn3xjq62xhgj2gq
Add support for skipping ghost nodes.

Show diffs side-by-side

added added

removed removed

Lines of Context:
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
 
 
 
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
20
22
from bzrlib.tests.blackbox import ExternalBase
21
23
from bzrlib.workingtree import WorkingTree
22
24
from bzrlib import osutils
31
33
 
32
34
class TestRemove(ExternalBase):
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):
59
62
        f.close()
60
63
 
61
64
    def run_bzr_remove_changed_files(self, error_regexes, files_to_remove):
62
 
        error_regexes.extend(["Can't remove changed or unknown files:",
 
65
        error_regexes.extend(["Can't safely remove modified or unknown files:",
63
66
            'Use --keep to not delete them,'
64
67
            ' or --force to delete them regardless.'
65
68
            ])
68
71
        #see if we can force it now
69
72
        self.run_bzr(['remove', '--force'] + list(files_to_remove))
70
73
 
 
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
 
71
79
    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 .')
 
80
        tree = self._make_tree_and_add(['foo'])
 
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):
 
88
        tree = self._make_tree_and_add(
 
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
 
 
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
 
 
117
    def test_remove_no_files_specified_missing_file(self):
 
118
        tree = self._make_tree_and_add(['foo', 'bar'])
 
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)
 
131
        tree = self._make_tree_and_add(['foo'])
 
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)
80
143
 
81
144
    def test_rm_one_file(self):
82
 
        tree = self._make_add_and_assert_tree([a])
 
145
        tree = self._make_tree_and_add([a])
83
146
        self.run_bzr("commit -m 'added a'")
84
147
        self.run_bzr('rm a', error_regexes=["deleted a"])
85
148
        self.assertFilesDeleted([a])
86
149
 
87
150
    def test_remove_one_file(self):
88
 
        tree = self._make_add_and_assert_tree([a])
 
151
        tree = self._make_tree_and_add([a])
89
152
        self.run_bzr("commit -m 'added a'")
90
153
        self.run_bzr('remove a', error_regexes=["deleted a"])
91
154
        self.assertFilesDeleted([a])
92
155
 
93
156
    def test_remove_keep_one_file(self):
94
 
        tree = self._make_add_and_assert_tree([a])
 
157
        tree = self._make_tree_and_add([a])
95
158
        self.run_bzr('remove --keep a', error_regexes=["removed a"])
96
159
        self.assertFilesUnversioned([a])
97
160
 
98
161
    def test_remove_one_deleted_file(self):
99
 
        tree = self._make_add_and_assert_tree([a])
 
162
        tree = self._make_tree_and_add([a])
100
163
        self.run_bzr("commit -m 'added a'")
101
164
        os.unlink(a)
102
165
        self.assertInWorkingTree(a)
115
178
            ['unknown:[.\s]*d/[.\s]*b/c[.\s]*b/[.\s]*a'], files)
116
179
 
117
180
    def test_remove_changed_files(self):
118
 
        tree = self._make_add_and_assert_tree(files)
 
181
        tree = self._make_tree_and_add(files)
119
182
        self.run_bzr("commit -m 'added files'")
120
183
        self.changeFile(a)
121
184
        self.changeFile(c)
122
185
        self.run_bzr_remove_changed_files(['modified:[.\s]*a[.\s]*b/c'], files)
123
186
 
 
187
    def test_remove_changed_ignored_files(self):
 
188
        tree = self._make_tree_and_add(['a'])
 
189
        self.run_bzr(['ignore', 'a'])
 
190
        self.run_bzr_remove_changed_files(['added:[.\s]*a'], ['a'])
 
191
 
124
192
    def test_remove_changed_files_from_child_dir(self):
125
 
        tree = self._make_add_and_assert_tree(files)
 
193
        if sys.platform == 'win32':
 
194
            raise TestSkipped("Windows unable to remove '.' directory")
 
195
        tree = self._make_tree_and_add(files)
126
196
        self.run_bzr("commit -m 'added files'")
127
197
        self.changeFile(a)
128
198
        self.changeFile(c)
148
218
        self.assertFilesDeleted(files)
149
219
 
150
220
    def test_remove_deleted_files(self):
151
 
        tree = self._make_add_and_assert_tree(files)
 
221
        tree = self._make_tree_and_add(files)
152
222
        self.run_bzr("commit -m 'added files'")
153
223
        my_files=[f for f in files]
154
224
        my_files.sort(reverse=True)
161
231
        self.failIfExists(files)
162
232
 
163
233
    def test_remove_non_existing_files(self):
164
 
        tree = self._make_add_and_assert_tree([])
 
234
        tree = self._make_tree_and_add([])
165
235
        self.run_bzr(['remove', 'b'])
166
236
 
167
237
    def test_remove_keep_non_existing_files(self):
168
 
        tree = self._make_add_and_assert_tree([])
 
238
        tree = self._make_tree_and_add([])
169
239
        self.run_bzr('remove --keep b', error_regexes=["b is not versioned."])
170
240
 
171
241
    def test_remove_files(self):
172
 
        tree = self._make_add_and_assert_tree(files)
 
242
        tree = self._make_tree_and_add(files)
173
243
        self.run_bzr("commit -m 'added files'")
174
244
        self.run_bzr('remove a b b/c d',
175
245
                     error_regexes=["deleted a", "deleted b", "deleted b/c",
177
247
        self.assertFilesDeleted(files)
178
248
 
179
249
    def test_remove_keep_files(self):
180
 
        tree = self._make_add_and_assert_tree(files)
 
250
        tree = self._make_tree_and_add(files)
181
251
        self.run_bzr("commit -m 'added files'")
182
252
        self.run_bzr('remove --keep a b b/c d',
183
253
                     error_regexes=["removed a", "removed b", "removed b/c",
185
255
        self.assertFilesUnversioned(files)
186
256
 
187
257
    def test_remove_with_new(self):
188
 
        tree = self._make_add_and_assert_tree(files)
 
258
        tree = self._make_tree_and_add(files)
189
259
        self.run_bzr('remove --new --keep',
190
260
                     error_regexes=["removed a", "removed b", "removed b/c"])
191
261
        self.assertFilesUnversioned(files)
192
262
 
193
263
    def test_remove_with_new_in_dir1(self):
194
 
        tree = self._make_add_and_assert_tree(files)
 
264
        tree = self._make_tree_and_add(files)
195
265
        self.run_bzr('remove --new --keep b b/c',
196
266
                     error_regexes=["removed b", "removed b/c"])
197
267
        tree = WorkingTree.open('.')
200
270
        self.assertFilesUnversioned([b,c])
201
271
 
202
272
    def test_remove_with_new_in_dir2(self):
203
 
        tree = self._make_add_and_assert_tree(files)
 
273
        tree = self._make_tree_and_add(files)
204
274
        self.run_bzr('remove --new --keep .',
205
275
                     error_regexes=["removed a", "removed b", "removed b/c"])
206
276
        tree = WorkingTree.open('.')