# HG changeset patch # User Martijn Pieters # Date 1476137475 -3600 # Node ID f6dcda7505f9bcc45812be4c4050d2f9420bad3f # Parent 72f75eda02bac1eeb1c9a07d2ccf893f80af4775 pycompat: only accept a bytestring filepath in Python 2 diff -r 72f75eda02ba -r f6dcda7505f9 mercurial/pycompat.py --- a/mercurial/pycompat.py Mon Oct 10 05:31:31 2016 -0700 +++ b/mercurial/pycompat.py Mon Oct 10 23:11:15 2016 +0100 @@ -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