[PATCH] pycompat: only accept a bytestring filepath in Python 2

Martijn Pieters mj at zopatista.com
Mon Oct 10 22:11:20 UTC 2016


# HG changeset patch
# User Martijn Pieters <mjpieters at fb.com>
# Date 1476137475 -3600
#      Mon Oct 10 23:11:15 2016 +0100
# Node ID d74c594b68768d14d9414b0ebe062d1b0bdd542a
# Parent  8d079c0594b35dfbf57baf8d83fde686a946920a
pycompat: only accept a bytestring filepath in Python 2

diff --git a/mercurial/pycompat.py b/mercurial/pycompat.py
--- a/mercurial/pycompat.py
+++ b/mercurial/pycompat.py
@@ -66,33 +66,15 @@
     def sysstr(s):
         return s
 
-    # Partial backport from os.py in Python 3
-    def _fscodec():
-        encoding = sys.getfilesystemencoding()
-        if encoding == 'mbcs':
-            errors = 'strict'
+    # Partial backport from os.py in Python 3, which only accepts bytes.
+    # In Python 2, our paths should only ever be bytes, a unicode path
+    # indicates a bug.
+    def fsencode(filename):
+        if isinstance(filename, str):
+            return filename
         else:
-            errors = 'surrogateescape'
-
-        def fsencode(filename):
-            """
-            Encode filename to the filesystem encoding with 'surrogateescape'
-            error handler, return bytes unchanged. On Windows, use 'strict'
-            error handler if the file system encoding is 'mbcs' (which is the
-            default encoding).
-            """
-            if isinstance(filename, str):
-                return filename
-            elif isinstance(filename, unicode):
-                return filename.encode(encoding, errors)
-            else:
-                raise TypeError(
-                    "expect str or unicode, not %s" % type(filename).__name__)
-
-        return fsencode
-
-    fsencode = _fscodec()
-    del _fscodec
+            raise TypeError(
+                "expect str, not %s" % type(filename).__name__)
 
 stringio = io.StringIO
 empty = _queue.Empty


More information about the Mercurial-devel mailing list