Rev 3560: Change the logic for selecting a real _walkdirs_utf8 implementation, in http://bzr.arbash-meinel.com/branches/bzr/1.6-dev/win32_find_files
John Arbash Meinel
john at arbash-meinel.com
Thu Jul 17 16:15:06 BST 2008
At http://bzr.arbash-meinel.com/branches/bzr/1.6-dev/win32_find_files
------------------------------------------------------------
revno: 3560
revision-id: john at arbash-meinel.com-20080717151458-1qou6e4hkyr309f7
parent: john at arbash-meinel.com-20080717151332-h4hwscv2jom8898r
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: win32_find_files
timestamp: Thu 2008-07-17 10:14:58 -0500
message:
Change the logic for selecting a real _walkdirs_utf8 implementation,
and put it under test, so that we know it is actively being used.
-------------- next part --------------
=== modified file 'bzrlib/osutils.py'
--- a/bzrlib/osutils.py 2008-07-17 12:55:11 +0000
+++ b/bzrlib/osutils.py 2008-07-17 15:14:58 +0000
@@ -1179,6 +1179,8 @@
pending.extend(d for d in reversed(dirblock) if d[2] == _directory)
+_real_walkdirs_utf8 = None
+
def _walkdirs_utf8(top, prefix=""):
"""Yield data about all the directories in a tree.
@@ -1193,18 +1195,22 @@
path-from-top might be unicode or utf8, but it is the correct path to
pass to os functions to affect the file in question. (such as os.lstat)
"""
- fs_encoding = _fs_enc.upper()
- if sys.platform == 'win32':
- try:
- from bzrlib._walkdirs_win32 import _walkdirs_utf8_win32_find_file
- except ImportError:
- return _walkdirs_unicode_to_utf8(top, prefix=prefix)
+ global _real_walkdirs_utf8
+ if _real_walkdirs_utf8 is None:
+ fs_encoding = _fs_enc.upper()
+ if sys.platform == 'win32':
+ try:
+ from bzrlib._walkdirs_win32 import _walkdirs_utf8_win32_find_file
+ except ImportError:
+ _real_walkdirs_utf8 = _walkdirs_unicode_to_utf8
+ else:
+ _real_walkdirs_utf8 = _walkdirs_utf8_win32_find_file
+ elif fs_encoding not in ('UTF-8', 'US-ASCII', 'ANSI_X3.4-1968'):
+ # ANSI_X3.4-1968 is a form of ASCII
+ _real_walkdirs_utf8 = _walkdirs_unicode_to_utf8
else:
- return _walkdirs_utf8_win32_find_file(top, prefix=prefix)
- if fs_encoding not in ('UTF-8', 'US-ASCII', 'ANSI_X3.4-1968'): # ascii
- return _walkdirs_unicode_to_utf8(top, prefix=prefix)
- else:
- return _walkdirs_fs_utf8(top, prefix=prefix)
+ _real_walkdirs_utf8 = _walkdirs_fs_utf8
+ return _real_walkdirs_utf8(top, prefix=prefix)
def _walkdirs_fs_utf8(top, prefix=""):
=== modified file 'bzrlib/tests/test_osutils.py'
--- a/bzrlib/tests/test_osutils.py 2008-07-17 12:21:19 +0000
+++ b/bzrlib/tests/test_osutils.py 2008-07-17 15:14:58 +0000
@@ -822,6 +822,72 @@
new_dirblock.append((info[0], info[1], info[2], info[4]))
dirblock[:] = new_dirblock
+ def test__walkdirs_utf8_selection(self):
+ # Just trigger the function once, to make sure it has selected a real
+ # implementation.
+ list(osutils._walkdirs_utf8('.'))
+ if WalkdirsWin32Feature.available():
+ # If the compiled form is available, make sure it is used
+ from bzrlib._walkdirs_win32 import _walkdirs_utf8_win32_find_file
+ self.assertIs(_walkdirs_utf8_win32_find_file,
+ osutils._real_walkdirs_utf8)
+ elif sys.platform == 'win32':
+ self.assertIs(osutils._walkdirs_unicode_to_utf8,
+ osutils._real_walkdirs_utf8)
+ elif osutils._fs_enc.upper() in ('UTF-8', 'ASCII', 'ANSI_X3.4-1968'): # ascii
+ self.assertIs(osutils._walkdirs_fs_utf8,
+ osutils._real_walkdirs_utf8)
+ else:
+ self.assertIs(osutils._walkdirs_unicode_to_utf8,
+ osutils._real_walkdirs_utf8)
+
+ def _save_platform_info(self):
+ cur_platform = sys.platform
+ cur_fs_enc = osutils._fs_enc
+ cur_real_walkdirs_utf8 = osutils._real_walkdirs_utf8
+ def restore():
+ sys.platform = cur_platform
+ osutils._fs_enc = cur_fs_enc
+ osutils._real_walkdirs_utf8 = cur_real_walkdirs_utf8
+ self.addCleanup(restore)
+
+ def test__force_walkdirs_utf8_fs_utf8(self):
+ self._save_platform_info()
+ sys.platform = 'not-win32' # Avoid the win32 detection code
+ osutils._fs_enc = 'UTF-8'
+ osutils._real_walkdirs_utf8 = None # Force a redetect
+ # Nothing to list, but should still trigger the selection logic
+ list(osutils._walkdirs_utf8('.'))
+ self.assertIs(osutils._walkdirs_fs_utf8, osutils._real_walkdirs_utf8)
+
+ def test__force_walkdirs_utf8_fs_ascii(self):
+ self._save_platform_info()
+ sys.platform = 'not-win32' # Avoid the win32 detection code
+ osutils._fs_enc = 'US-ASCII'
+ osutils._real_walkdirs_utf8 = None # Force a redetect
+ # Nothing to list, but should still trigger the selection logic
+ list(osutils._walkdirs_utf8('.'))
+ self.assertIs(osutils._walkdirs_fs_utf8, osutils._real_walkdirs_utf8)
+
+ def test__force_walkdirs_utf8_fs_ANSI(self):
+ self._save_platform_info()
+ sys.platform = 'not-win32' # Avoid the win32 detection code
+ osutils._fs_enc = 'ANSI_X3.4-1968'
+ osutils._real_walkdirs_utf8 = None # Force a redetect
+ # Nothing to list, but should still trigger the selection logic
+ list(osutils._walkdirs_utf8('.'))
+ self.assertIs(osutils._walkdirs_fs_utf8, osutils._real_walkdirs_utf8)
+
+ def test__force_walkdirs_utf8_fs_latin1(self):
+ self._save_platform_info()
+ sys.platform = 'not-win32' # Avoid the win32 detection code
+ osutils._fs_enc = 'latin1'
+ osutils._real_walkdirs_utf8 = None # Force a redetect
+ # Nothing to list, but should still trigger the selection logic
+ list(osutils._walkdirs_utf8('.'))
+ self.assertIs(osutils._walkdirs_unicode_to_utf8,
+ osutils._real_walkdirs_utf8)
+
def test_unicode_walkdirs(self):
"""Walkdirs should always return unicode paths."""
name0 = u'0file-\xb6'
More information about the bazaar-commits
mailing list