15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
from StringIO import StringIO
24
from bzrlib import tests, ui
25
21
from bzrlib.bzrdir import (
46
42
BzrDir.create_standalone_workingtree('branch')
47
43
os.symlink(os.path.realpath('no-die-please'), 'branch/die-please')
48
44
os.mkdir('no-die-please')
49
self.assertPathExists('branch/die-please')
45
self.failUnlessExists('branch/die-please')
50
46
os.mkdir('no-die-please/child')
52
48
clean_tree('branch', unknown=True, no_prompt=True)
53
self.assertPathExists('no-die-please')
54
self.assertPathExists('no-die-please/child')
49
self.failUnlessExists('no-die-please')
50
self.failUnlessExists('no-die-please/child')
56
52
def test_iter_deletable(self):
57
53
"""Files are selected for deletion appropriately"""
80
76
self.assertEqual([], dels)
84
def test_delete_items_warnings(self):
85
"""Ensure delete_items issues warnings on EACCES. (bug #430785)
87
def _dummy_unlink(path):
88
"""unlink() files other than files named '0foo'.
90
if path.endswith('0foo'):
91
# Simulate 'permission denied' error.
92
# This should show up as a warning for the
95
e.errno = errno.EACCES
98
def _dummy_rmtree(path, ignore_errors=False, onerror=None):
99
"""Call user supplied error handler onerror.
101
self.assertTrue(isinstance(onerror, types.FunctionType))
102
# Indicate failure in removing 'path' if path is subdir0
103
# We later check to ensure that this is indicated
104
# to the user as a warning. We raise OSError to construct
105
# proper excinfo that needs to be passed to onerror
109
e.errno = errno.EACCES
110
excinfo = sys.exc_info()
112
if 'subdir0' not in path:
113
# onerror should show warning only for os.remove
114
# error. For any other failures the error should
115
# be shown to the user.
116
function = os.listdir
117
onerror(function=function,
118
path=path, excinfo=excinfo)
120
self.overrideAttr(os, 'unlink', _dummy_unlink)
121
self.overrideAttr(shutil, 'rmtree', _dummy_rmtree)
122
stdout = tests.StringIOWrapper()
123
stderr = tests.StringIOWrapper()
124
ui.ui_factory = tests.TestUIFactory(stdout=stdout, stderr=stderr)
126
BzrDir.create_standalone_workingtree('.')
127
self.build_tree(['0foo', '1bar', '2baz', 'subdir0/'])
128
clean_tree('.', unknown=True, no_prompt=True)
129
self.assertContainsRe(stderr.getvalue(),
130
'bzr: warning: unable to remove.*0foo')
131
self.assertContainsRe(stderr.getvalue(),
132
'bzr: warning: unable to remove.*subdir0')
134
# Ensure that error other than EACCES during os.remove are
135
# not turned into warnings.
136
self.build_tree(['subdir1/'])
137
self.assertRaises(OSError, clean_tree, '.',
138
unknown=True, no_prompt=True)