~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
2655.2.12 by Marius Kruger
Remove unknown ignored files wihtout needing --force'
20
from bzrlib import errors, ignores, 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.24 by Marius Kruger
minor text cleanups
27
2655.2.15 by Marius Kruger
Apply Alexander's comments:
28
    def get_tree(self, files):
2292.1.20 by Marius Kruger
move test_workingtree.TestRemove to workingtree_implementations/test_remove
29
        tree = self.make_branch_and_tree('.')
2655.2.8 by Marius Kruger
* workingtree_implementations/test_remove
30
        self.build_tree(files)
31
        self.failUnlessExists(files)
32
        return tree
33
2655.2.15 by Marius Kruger
Apply Alexander's comments:
34
    def get_committed_tree(self, files, message="Committing"):
35
        tree = self.get_tree(files)
2655.2.8 by Marius Kruger
* workingtree_implementations/test_remove
36
        tree.add(files)
37
        tree.commit(message)
38
        self.assertInWorkingTree(files)
2292.1.20 by Marius Kruger
move test_workingtree.TestRemove to workingtree_implementations/test_remove
39
        return tree
40
2655.2.15 by Marius Kruger
Apply Alexander's comments:
41
    def assertRemovedAndDeleted(self, files):
42
        self.assertNotInWorkingTree(files)
43
        self.failIfExists(files)
44
45
    def assertRemovedAndNotDeleted(self, files):
46
        self.assertNotInWorkingTree(files)
47
        self.failUnlessExists(files)
48
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
49
    def test_remove_keep(self):
2655.2.4 by Marius Kruger
* workingtree.remove
50
        """Check that files and directories are unversioned but not deleted."""
2655.2.15 by Marius Kruger
Apply Alexander's comments:
51
        tree = self.get_tree(TestRemove.files)
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
52
        tree.add(TestRemove.files)
53
        self.assertInWorkingTree(TestRemove.files)
54
55
        tree.remove(TestRemove.files)
2655.2.15 by Marius Kruger
Apply Alexander's comments:
56
        self.assertRemovedAndNotDeleted(TestRemove.files)
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
57
2655.2.4 by Marius Kruger
* workingtree.remove
58
    def test_remove_keep_subtree(self):
59
        """Check that a directory is unversioned but not deleted."""
60
        tree = self.make_branch_and_tree('.')
61
        subtree = self.make_branch_and_tree('subtree')
62
        tree.add('subtree', 'subtree-id')
63
64
        tree.remove('subtree')
2655.2.15 by Marius Kruger
Apply Alexander's comments:
65
        self.assertRemovedAndNotDeleted('subtree')
2655.2.4 by Marius Kruger
* workingtree.remove
66
2292.1.20 by Marius Kruger
move test_workingtree.TestRemove to workingtree_implementations/test_remove
67
    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()
68
        """Check that unchanged files are removed and deleted."""
2655.2.15 by Marius Kruger
Apply Alexander's comments:
69
        tree = self.get_committed_tree(TestRemove.files)
2292.1.20 by Marius Kruger
move test_workingtree.TestRemove to workingtree_implementations/test_remove
70
71
        tree.remove(TestRemove.files, keep_files=False)
2655.2.15 by Marius Kruger
Apply Alexander's comments:
72
        self.assertRemovedAndDeleted(TestRemove.files)
2292.1.20 by Marius Kruger
move test_workingtree.TestRemove to workingtree_implementations/test_remove
73
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
74
    def test_remove_added_files(self):
75
        """Removal of newly added files must fail."""
2655.2.15 by Marius Kruger
Apply Alexander's comments:
76
        tree = self.get_tree(TestRemove.files)
2292.1.20 by Marius Kruger
move test_workingtree.TestRemove to workingtree_implementations/test_remove
77
        tree.add(TestRemove.files)
78
        self.assertInWorkingTree(TestRemove.files)
2475.5.6 by Marius Kruger
* test_remove
79
        err = self.assertRaises(errors.BzrRemoveChangedFilesError, tree.remove,
2475.5.2 by Marius Kruger
* blackbox/test_remove
80
            TestRemove.files, keep_files=False)
2475.5.6 by Marius Kruger
* test_remove
81
        self.assertContainsRe(err.changes_as_text,
82
            '(?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()
83
        self.assertInWorkingTree(TestRemove.files)
2292.1.20 by Marius Kruger
move test_workingtree.TestRemove to workingtree_implementations/test_remove
84
        self.failUnlessExists(TestRemove.files)
85
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
86
    def test_remove_changed_file(self):
87
        """Removal of a changed files must fail."""
3044.1.1 by Martin Pool
Fix up calls to TestCase.build_tree passing a string rather than a list
88
        tree = self.get_committed_tree(['a'])
2475.5.2 by Marius Kruger
* blackbox/test_remove
89
        self.build_tree_contents([('a', "some other new content!")])
2655.2.9 by Marius Kruger
* workingtree_implementations/test_remove
90
        self.assertInWorkingTree('a')
2475.5.6 by Marius Kruger
* test_remove
91
        err = self.assertRaises(errors.BzrRemoveChangedFilesError, tree.remove,
2655.2.9 by Marius Kruger
* workingtree_implementations/test_remove
92
            'a', keep_files=False)
2475.5.6 by Marius Kruger
* test_remove
93
        self.assertContainsRe(err.changes_as_text, '(?s)modified:.*a')
2655.2.9 by Marius Kruger
* workingtree_implementations/test_remove
94
        self.assertInWorkingTree('a')
95
        self.failUnlessExists('a')
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
96
97
    def test_remove_deleted_files(self):
98
        """Check that files are removed if they don't exist any more."""
2655.2.15 by Marius Kruger
Apply Alexander's comments:
99
        tree = self.get_committed_tree(TestRemove.files)
2475.5.1 by Marius Kruger
Fix bug and test: bzr rm refuses to delete renamed files
100
        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()
101
            osutils.delete_any(f)
102
        self.assertInWorkingTree(TestRemove.files)
103
        self.failIfExists(TestRemove.files)
104
105
        tree.remove(TestRemove.files, keep_files=False)
2655.2.15 by Marius Kruger
Apply Alexander's comments:
106
        self.assertRemovedAndDeleted(TestRemove.files)
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
107
2475.5.1 by Marius Kruger
Fix bug and test: bzr rm refuses to delete renamed files
108
    def test_remove_renamed_files(self):
2475.5.2 by Marius Kruger
* blackbox/test_remove
109
        """Check that files are removed even if they are renamed."""
2655.2.15 by Marius Kruger
Apply Alexander's comments:
110
        tree = self.get_committed_tree(TestRemove.files)
2475.5.1 by Marius Kruger
Fix bug and test: bzr rm refuses to delete renamed files
111
112
        for f in TestRemove.rfiles:
113
            tree.rename_one(f,f+'x')
114
        rfilesx = ['bx/cx', 'bx', 'ax', 'dx']
115
        self.assertInWorkingTree(rfilesx)
116
        self.failUnlessExists(rfilesx)
117
118
        tree.remove(rfilesx, keep_files=False)
2655.2.15 by Marius Kruger
Apply Alexander's comments:
119
        self.assertRemovedAndDeleted(rfilesx)
2475.5.1 by Marius Kruger
Fix bug and test: bzr rm refuses to delete renamed files
120
2475.5.2 by Marius Kruger
* blackbox/test_remove
121
    def test_remove_renamed_changed_files(self):
122
        """Check that files are not removed if they are renamed and changed."""
2655.2.15 by Marius Kruger
Apply Alexander's comments:
123
        tree = self.get_committed_tree(TestRemove.files)
2475.5.2 by Marius Kruger
* blackbox/test_remove
124
125
        for f in TestRemove.rfiles:
126
            tree.rename_one(f,f+'x')
127
        rfilesx = ['bx/cx', 'bx', 'ax', 'dx']
128
        self.build_tree_contents([('ax','changed and renamed!'),
129
                                  ('bx/cx','changed and renamed!')])
130
        self.assertInWorkingTree(rfilesx)
131
        self.failUnlessExists(rfilesx)
132
2475.5.6 by Marius Kruger
* test_remove
133
        err = self.assertRaises(errors.BzrRemoveChangedFilesError, tree.remove,
2475.5.2 by Marius Kruger
* blackbox/test_remove
134
            rfilesx, keep_files=False)
2475.5.6 by Marius Kruger
* test_remove
135
        self.assertContainsRe(err.changes_as_text,
136
            '(?s)modified:.*ax.*bx/cx')
2475.5.2 by Marius Kruger
* blackbox/test_remove
137
        self.assertInWorkingTree(rfilesx)
138
        self.failUnlessExists(rfilesx)
139
2292.1.20 by Marius Kruger
move test_workingtree.TestRemove to workingtree_implementations/test_remove
140
    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()
141
        """Check that changed files are removed and deleted when forced."""
2655.2.15 by Marius Kruger
Apply Alexander's comments:
142
        tree = self.get_tree(TestRemove.files)
2292.1.20 by Marius Kruger
move test_workingtree.TestRemove to workingtree_implementations/test_remove
143
        tree.add(TestRemove.files)
144
        self.assertInWorkingTree(TestRemove.files)
145
146
        tree.remove(TestRemove.files, keep_files=False, force=True)
2655.2.15 by Marius Kruger
Apply Alexander's comments:
147
        self.assertRemovedAndDeleted(TestRemove.files)
2292.1.20 by Marius Kruger
move test_workingtree.TestRemove to workingtree_implementations/test_remove
148
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
149
    def test_remove_unknown_files(self):
150
        """Try to delete unknown files."""
2655.2.15 by Marius Kruger
Apply Alexander's comments:
151
        tree = self.get_tree(TestRemove.files)
2475.5.6 by Marius Kruger
* test_remove
152
        err = self.assertRaises(errors.BzrRemoveChangedFilesError, tree.remove,
2475.5.2 by Marius Kruger
* blackbox/test_remove
153
            TestRemove.files, keep_files=False)
2475.5.6 by Marius Kruger
* test_remove
154
        self.assertContainsRe(err.changes_as_text,
155
            '(?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()
156
2292.1.20 by Marius Kruger
move test_workingtree.TestRemove to workingtree_implementations/test_remove
157
    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()
158
        """Try to delete non-existing files."""
2655.2.15 by Marius Kruger
Apply Alexander's comments:
159
        tree = self.get_tree(TestRemove.files)
2292.1.20 by Marius Kruger
move test_workingtree.TestRemove to workingtree_implementations/test_remove
160
        tree.remove([''], keep_files=False)
2475.5.2 by Marius Kruger
* blackbox/test_remove
161
        tree.remove(['xyz', 'abc/def'], keep_files=False)
2292.1.20 by Marius Kruger
move test_workingtree.TestRemove to workingtree_implementations/test_remove
162
2655.2.12 by Marius Kruger
Remove unknown ignored files wihtout needing --force'
163
    def test_remove_unchanged_directory(self):
2655.2.8 by Marius Kruger
* workingtree_implementations/test_remove
164
        """Unchanged directories should be deleted."""
2655.2.6 by Marius Kruger
* workingtree.remove
165
        files = ['b/', 'b/c', 'b/sub_directory/', 'b/sub_directory/with_file']
2655.2.15 by Marius Kruger
Apply Alexander's comments:
166
        tree = self.get_committed_tree(files)
2655.2.6 by Marius Kruger
* workingtree.remove
167
        tree.remove('b', keep_files=False)
2655.2.15 by Marius Kruger
Apply Alexander's comments:
168
        self.assertRemovedAndDeleted('b')
2292.1.30 by Marius Kruger
* Minor text fixes.
169
2655.2.12 by Marius Kruger
Remove unknown ignored files wihtout needing --force'
170
    def test_remove_unknown_ignored_files(self):
2655.2.15 by Marius Kruger
Apply Alexander's comments:
171
        """Unknown ignored files should be deleted."""
172
        tree = self.get_committed_tree(['b/'])
2655.2.12 by Marius Kruger
Remove unknown ignored files wihtout needing --force'
173
        ignores.add_runtime_ignores(["*ignored*"])
174
175
        self.build_tree(['unknown_ignored_file'])
2655.2.15 by Marius Kruger
Apply Alexander's comments:
176
        self.assertNotEquals(None, tree.is_ignored('unknown_ignored_file'))
2655.2.12 by Marius Kruger
Remove unknown ignored files wihtout needing --force'
177
        tree.remove('unknown_ignored_file', keep_files=False)
2655.2.15 by Marius Kruger
Apply Alexander's comments:
178
        self.assertRemovedAndDeleted('unknown_ignored_file')
2655.2.12 by Marius Kruger
Remove unknown ignored files wihtout needing --force'
179
180
        self.build_tree(['b/unknown_ignored_file', 'b/unknown_ignored_dir/'])
2655.2.15 by Marius Kruger
Apply Alexander's comments:
181
        self.assertNotEquals(None, tree.is_ignored('b/unknown_ignored_file'))
182
        self.assertNotEquals(None, tree.is_ignored('b/unknown_ignored_dir'))
2655.2.12 by Marius Kruger
Remove unknown ignored files wihtout needing --force'
183
        tree.remove('b', keep_files=False)
2655.2.15 by Marius Kruger
Apply Alexander's comments:
184
        self.assertRemovedAndDeleted('b')
2655.2.12 by Marius Kruger
Remove unknown ignored files wihtout needing --force'
185
3042.2.1 by Lukáš Lalinský
Fix ``bzr rm`` to not delete modified and ignored files.
186
    def test_remove_changed_ignored_files(self):
187
        """Changed ignored files should not be deleted."""
188
        files = ['an_ignored_file']
189
        tree = self.get_tree(files)
190
        tree.add(files)
191
        ignores.add_runtime_ignores(["*ignored*"])
192
        self.assertInWorkingTree(files)
193
        self.assertNotEquals(None, tree.is_ignored(files[0]))
194
        err = self.assertRaises(errors.BzrRemoveChangedFilesError, tree.remove,
195
            files, keep_files=False)
196
        self.assertContainsRe(err.changes_as_text,
197
            '(?s)added:.*' + files[0])
198
        self.assertInWorkingTree(files)
199
2655.2.8 by Marius Kruger
* workingtree_implementations/test_remove
200
    def test_dont_remove_directory_with_unknowns(self):
201
        """Directories with unknowns should not be deleted."""
202
        directories = ['a/', 'b/', 'c/', 'c/c/']
2655.2.15 by Marius Kruger
Apply Alexander's comments:
203
        tree = self.get_committed_tree(directories)
2655.2.8 by Marius Kruger
* workingtree_implementations/test_remove
204
205
        self.build_tree(['a/unknown_file'])
206
        err = self.assertRaises(errors.BzrRemoveChangedFilesError, tree.remove,
207
            'a', keep_files=False)
208
        self.assertContainsRe(err.changes_as_text,
209
            '(?s)unknown:.*a/unknown_file')
210
211
        self.build_tree(['b/unknown_directory'])
212
        err = self.assertRaises(errors.BzrRemoveChangedFilesError, tree.remove,
213
            'b', keep_files=False)
214
        self.assertContainsRe(err.changes_as_text,
215
            '(?s)unknown:.*b/unknown_directory')
216
217
        self.build_tree(['c/c/unknown_file'])
218
        err = self.assertRaises(errors.BzrRemoveChangedFilesError, tree.remove,
219
            'c/c', keep_files=False)
220
        self.assertContainsRe(err.changes_as_text,
221
            '(?s)unknown:.*c/c/unknown_file')
222
223
        self.assertInWorkingTree(directories)
224
        self.failUnlessExists(directories)
225
226
    def test_force_remove_directory_with_unknowns(self):
2655.2.4 by Marius Kruger
* workingtree.remove
227
        """Unchanged non-empty directories should be deleted when forced."""
2655.2.9 by Marius Kruger
* workingtree_implementations/test_remove
228
        files = ['b/', 'b/c']
2655.2.15 by Marius Kruger
Apply Alexander's comments:
229
        tree = self.get_committed_tree(files)
2655.2.4 by Marius Kruger
* workingtree.remove
230
231
        other_files = ['b/unknown_file', 'b/sub_directory/',
2655.2.6 by Marius Kruger
* workingtree.remove
232
            'b/sub_directory/with_file', 'b/sub_directory/sub_directory/']
2655.2.4 by Marius Kruger
* workingtree.remove
233
        self.build_tree(other_files)
234
2655.2.9 by Marius Kruger
* workingtree_implementations/test_remove
235
        self.assertInWorkingTree(files)
236
        self.failUnlessExists(files)
237
238
        tree.remove('b', keep_files=False, force=True)
239
2655.2.15 by Marius Kruger
Apply Alexander's comments:
240
        self.assertRemovedAndDeleted(files)
241
        self.assertRemovedAndDeleted(other_files)
2292.1.20 by Marius Kruger
move test_workingtree.TestRemove to workingtree_implementations/test_remove
242
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
243
    def test_remove_directory_with_changed_file(self):
244
        """Refuse to delete directories with changed files."""
2655.2.9 by Marius Kruger
* workingtree_implementations/test_remove
245
        files = ['b/', 'b/c']
2655.2.15 by Marius Kruger
Apply Alexander's comments:
246
        tree = self.get_committed_tree(files)
2475.5.2 by Marius Kruger
* blackbox/test_remove
247
        self.build_tree_contents([('b/c', "some other new content!")])
2655.2.6 by Marius Kruger
* workingtree.remove
248
2475.5.6 by Marius Kruger
* test_remove
249
        err = self.assertRaises(errors.BzrRemoveChangedFilesError, tree.remove,
2655.2.9 by Marius Kruger
* workingtree_implementations/test_remove
250
            'b', keep_files=False)
2475.5.6 by Marius Kruger
* test_remove
251
        self.assertContainsRe(err.changes_as_text, '(?s)modified:.*b/c')
2655.2.9 by Marius Kruger
* workingtree_implementations/test_remove
252
        self.assertInWorkingTree(files)
253
        self.failUnlessExists(files)
2292.1.20 by Marius Kruger
move test_workingtree.TestRemove to workingtree_implementations/test_remove
254
2655.2.15 by Marius Kruger
Apply Alexander's comments:
255
        # see if we can force it now..
2655.2.9 by Marius Kruger
* workingtree_implementations/test_remove
256
        tree.remove('b', keep_files=False, force=True)
2655.2.15 by Marius Kruger
Apply Alexander's comments:
257
        self.assertRemovedAndDeleted(files)
1551.15.11 by Aaron Bentley
Bugfix WorkingTree.remove to handle subtrees, and non-cwd trees
258
2655.2.11 by Marius Kruger
* Update NEWS
259
    def test_remove_directory_with_renames(self):
260
        """Delete directory with renames in or out."""
2655.2.10 by Marius Kruger
add test for removing a direcory with something that has been moved out
261
2655.2.11 by Marius Kruger
* Update NEWS
262
        files = ['a/', 'a/file', 'a/directory/', 'b/']
2655.2.10 by Marius Kruger
add test for removing a direcory with something that has been moved out
263
        files_to_move = ['a/file', 'a/directory/']
264
2655.2.15 by Marius Kruger
Apply Alexander's comments:
265
        tree = self.get_committed_tree(files)
266
        # move stuff from a=>b
2655.2.10 by Marius Kruger
add test for removing a direcory with something that has been moved out
267
        tree.move(['a/file', 'a/directory'], to_dir='b')
268
269
        moved_files = ['b/file', 'b/directory/']
2655.2.15 by Marius Kruger
Apply Alexander's comments:
270
        self.assertRemovedAndDeleted(files_to_move)
2655.2.10 by Marius Kruger
add test for removing a direcory with something that has been moved out
271
        self.assertInWorkingTree(moved_files)
272
        self.failUnlessExists(moved_files)
273
2655.2.11 by Marius Kruger
* Update NEWS
274
        # check if it works with renames out
2655.2.10 by Marius Kruger
add test for removing a direcory with something that has been moved out
275
        tree.remove('a', keep_files=False)
2655.2.15 by Marius Kruger
Apply Alexander's comments:
276
        self.assertRemovedAndDeleted(['a/'])
2655.2.11 by Marius Kruger
* Update NEWS
277
278
        # check if it works with renames in
279
        tree.remove('b', keep_files=False)
2655.2.15 by Marius Kruger
Apply Alexander's comments:
280
        self.assertRemovedAndDeleted(['b/'])
2655.2.10 by Marius Kruger
add test for removing a direcory with something that has been moved out
281
1551.15.11 by Aaron Bentley
Bugfix WorkingTree.remove to handle subtrees, and non-cwd trees
282
    def test_non_cwd(self):
283
        tree = self.make_branch_and_tree('tree')
284
        self.build_tree(['tree/dir/', 'tree/dir/file'])
285
        tree.add(['dir', 'dir/file'])
286
        tree.commit('add file')
287
        tree.remove('dir/', keep_files=False)
288
        self.failIfExists('tree/dir/file')
2655.2.15 by Marius Kruger
Apply Alexander's comments:
289
        self.assertNotInWorkingTree('tree/dir/file', 'tree')
2967.5.8 by Daniel Watkins
Moved tests to correct location.
290
291
    def test_remove_uncommitted_removed_file(self):
292
        # As per bug #152811
293
        tree = self.get_committed_tree(['a'])
294
        tree.remove('a', keep_files=False)
295
        tree.remove('a', keep_files=False)
2967.5.12 by Daniel Watkins
Modified tests as suggested on-list.
296
        self.failIfExists('a')
2967.5.8 by Daniel Watkins
Moved tests to correct location.
297
298
    def test_remove_file_and_containing_dir(self):
299
        tree = self.get_committed_tree(['config/', 'config/file'])
300
        tree.remove('config/file', keep_files=False)
301
        tree.remove('config', keep_files=False)
2967.5.12 by Daniel Watkins
Modified tests as suggested on-list.
302
        self.failIfExists('config/file')
303
        self.failIfExists('config')