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