changeset 30077:8f42d8c412c8

py3: make encodefun in store.py compatible with py3k This ensures that the filename encoding functions always map bytestrings to bytestrings regardless of python version.
author Mateusz Kwapich <mitrandir@fb.com>
date Sat, 08 Oct 2016 08:54:05 -0700
parents 400dfded8a29
children 173bdb502503
files mercurial/store.py tests/test-check-py3-compat.t
diffstat 2 files changed, 14 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/store.py	Sat Oct 08 08:45:28 2016 -0700
+++ b/mercurial/store.py	Sat Oct 08 08:54:05 2016 -0700
@@ -16,6 +16,7 @@
 from . import (
     error,
     parsers,
+    pycompat,
     scmutil,
     util,
 )
@@ -98,11 +99,20 @@
     'the\\x07quick\\xadshot'
     '''
     e = '_'
-    cmap = dict([(chr(x), chr(x)) for x in xrange(127)])
+    if pycompat.ispy3:
+        xchr = lambda x: bytes([x])
+        asciistr = bytes(xrange(127))
+    else:
+        xchr = chr
+        asciistr = map(chr, xrange(127))
+    capitals = list(range(ord("A"), ord("Z") + 1))
+
+    cmap = {x:x for x in asciistr}
     for x in _reserved():
-        cmap[chr(x)] = "~%02x" % x
-    for x in list(range(ord("A"), ord("Z") + 1)) + [ord(e)]:
-        cmap[chr(x)] = e + chr(x).lower()
+        cmap[xchr(x)] = "~%02x" % x
+    for x in capitals + [ord(e)]:
+        cmap[xchr(x)] = e + xchr(x).lower()
+
     dmap = {}
     for k, v in cmap.iteritems():
         dmap[v] = k
--- a/tests/test-check-py3-compat.t	Sat Oct 08 08:45:28 2016 -0700
+++ b/tests/test-check-py3-compat.t	Sat Oct 08 08:54:05 2016 -0700
@@ -134,7 +134,6 @@
   mercurial/sshserver.py: error importing: <AttributeError> module 'mercurial.util' has no attribute 'stringio' (error at patch.py:*)
   mercurial/statichttprepo.py: error importing: <AttributeError> module 'mercurial.util' has no attribute 'urlerr' (error at byterange.py:*)
   mercurial/store.py: error importing module: <NameError> name 'xrange' is not defined (line *)
-  mercurial/streamclone.py: error importing: <TypeError> can't concat bytes to str (error at store.py:*)
   mercurial/subrepo.py: error importing: <AttributeError> module 'mercurial.util' has no attribute 'stringio' (error at patch.py:*)
   mercurial/templatefilters.py: error importing: <AttributeError> module 'mercurial.util' has no attribute 'stringio' (error at patch.py:*)
   mercurial/templatekw.py: error importing: <AttributeError> module 'mercurial.util' has no attribute 'stringio' (error at patch.py:*)