1176
1176
# (It would be ok if it happened earlier but at the moment it
1178
1178
e = self.assertRaises(OSError, list, osutils._walkdirs_utf8("."))
1179
self.assertEqual('./test-unreadable', e.filename)
1179
self.assertEqual('./test-unreadable', osutils.safe_unicode(e.filename))
1180
1180
self.assertEqual(errno.EACCES, e.errno)
1181
1181
# Ensure the message contains the file name
1182
1182
self.assertContainsRe(str(e), "\\./test-unreadable")
1185
1184
def test_walkdirs_encoding_error(self):
1186
1185
# <https://bugs.launchpad.net/bzr/+bug/488519>
1187
1186
# walkdirs didn't raise a useful message when the filenames
1250
1249
# this tests the filtering of selected paths
1251
1250
found_bzrdir = True
1252
1251
del dirblock[0]
1253
dirdetail = (dirdetail[0].decode('utf-8'), dirdetail[1])
1252
dirdetail = (dirdetail[0].decode('utf-8'), osutils.safe_unicode(dirdetail[1]))
1255
1254
(entry[0].decode('utf-8'), entry[1].decode('utf-8'), entry[2])
1256
1255
for entry in dirblock]
1278
1277
self.overrideAttr(osutils, '_fs_enc')
1279
1278
self.overrideAttr(osutils, '_selected_dir_reader')
1281
def assertDirReaderIs(self, expected):
1280
def assertDirReaderIs(self, expected, top):
1282
1281
"""Assert the right implementation for _walkdirs_utf8 is chosen."""
1283
1282
# Force it to redetect
1284
1283
osutils._selected_dir_reader = None
1285
1284
# Nothing to list, but should still trigger the selection logic
1286
self.assertEqual([((b'', '.'), [])], list(osutils._walkdirs_utf8('.')))
1285
self.assertEqual([((b'', top), [])], list(osutils._walkdirs_utf8('.')))
1287
1286
self.assertIsInstance(osutils._selected_dir_reader, expected)
1289
1288
def test_force_walkdirs_utf8_fs_utf8(self):
1290
1289
self.requireFeature(UTF8DirReaderFeature)
1291
1290
self._save_platform_info()
1292
1291
osutils._fs_enc = 'utf-8'
1293
self.assertDirReaderIs(
1294
UTF8DirReaderFeature.module.UTF8DirReader)
1292
self.assertDirReaderIs(UTF8DirReaderFeature.module.UTF8DirReader, b".")
1296
1294
def test_force_walkdirs_utf8_fs_ascii(self):
1297
1295
self.requireFeature(UTF8DirReaderFeature)
1298
1296
self._save_platform_info()
1299
1297
osutils._fs_enc = 'ascii'
1300
1298
self.assertDirReaderIs(
1301
UTF8DirReaderFeature.module.UTF8DirReader)
1299
UTF8DirReaderFeature.module.UTF8DirReader, b".")
1303
1301
def test_force_walkdirs_utf8_fs_latin1(self):
1304
1302
self._save_platform_info()
1305
1303
osutils._fs_enc = 'iso-8859-1'
1306
self.assertDirReaderIs(osutils.UnicodeDirReader)
1304
self.assertDirReaderIs(osutils.UnicodeDirReader, ".")
1308
1306
def test_force_walkdirs_utf8_nt(self):
1309
1307
# Disabled because the thunk of the whole walkdirs api is disabled.
1310
1308
self.requireFeature(test__walkdirs_win32.win32_readdir_feature)
1311
1309
self._save_platform_info()
1312
1310
from .._walkdirs_win32 import Win32ReadDir
1313
self.assertDirReaderIs(Win32ReadDir)
1311
self.assertDirReaderIs(Win32ReadDir, ".")
1315
1313
def test_unicode_walkdirs(self):
1316
1314
"""Walkdirs should always return unicode paths."""
1814
1812
expected_dirblocks = [
1816
[(b'0file', b'0file', 'file'),
1817
(b'1dir', b'1dir', 'directory'),
1818
(b'2file', b'2file', 'file'),
1814
[(b'0file', b'0file', 'file', './0file'),
1815
(b'1dir', b'1dir', 'directory', './1dir'),
1816
(b'2file', b'2file', 'file', './2file'),
1821
1819
((b'1dir', './1dir'),
1822
[(b'1dir/0file', b'0file', 'file'),
1823
(b'1dir/1dir', b'1dir', 'directory'),
1820
[(b'1dir/0file', b'0file', 'file', './1dir/0file'),
1821
(b'1dir/1dir', b'1dir', 'directory', './1dir/1dir'),
1826
1824
((b'1dir/1dir', './1dir/1dir'),
1836
1834
result = list(osutils._walkdirs_utf8('.'))
1837
1835
# Filter out stat and abspath
1838
1836
self.assertEqual(expected_dirblocks,
1839
[(dirinfo, [line[0:3] for line in block])
1840
for dirinfo, block in result])
1837
self._filter_out(result))
1842
1839
def test_walk_sub_dir(self):
1843
1840
tree, expected_dirblocks = self._get_ascii_tree()
1844
1841
self.build_tree(tree)
1845
1842
# you can search a subdir only, with a supplied prefix.
1846
result = list(osutils._walkdirs_utf8('./1dir', '1dir'))
1843
result = list(osutils._walkdirs_utf8(b'./1dir', b'1dir'))
1847
1844
# Filter out stat and abspath
1848
1845
self.assertEqual(expected_dirblocks[1:],
1849
[(dirinfo, [line[0:3] for line in block])
1850
for dirinfo, block in result])
1846
self._filter_out(result))
1852
1848
def _get_unicode_tree(self):
1853
1849
name0u = u'0file-\xb6'