cmdutil: add a kludge to make bytes repr() the same on 2 and 3
authorAugie Fackler <augie@google.com>
Thu, 18 Jan 2018 12:59:40 -0500
changeset 35874 1bee7762fd46
parent 35873 29759c46aa1a
child 35875 c0a6733f7e7a
cmdutil: add a kludge to make bytes repr() the same on 2 and 3 This fixes the output formatting problems I see in debugobsolete. I still am seeing some effectflag differences, which we'll need to tackle separately. I'm not in love with this approach. There might be something better we could do, and I'd love it if someone else wanted to take a run at this. Differential Revision: https://phab.mercurial-scm.org/D1909
mercurial/cmdutil.py
--- a/mercurial/cmdutil.py	Wed Jan 31 11:32:21 2018 -0800
+++ b/mercurial/cmdutil.py	Thu Jan 18 12:59:40 2018 -0500
@@ -2077,6 +2077,19 @@
 
     return changeset_templater(ui, repo, spec, match, opts, buffered)
 
+class _regrettablereprbytes(bytes):
+    """Bytes subclass that makes the repr the same on Python 3 as Python 2.
+
+    This is a huge hack.
+    """
+    def __repr__(self):
+        return repr(pycompat.sysstr(self))
+
+def _maybebytestr(v):
+    if pycompat.ispy3 and isinstance(v, bytes):
+        return _regrettablereprbytes(v)
+    return v
+
 def showmarker(fm, marker, index=None):
     """utility function to display obsolescence marker in a readable way
 
@@ -2095,7 +2108,8 @@
     fm.write('date', '(%s) ', fm.formatdate(marker.date()))
     meta = marker.metadata().copy()
     meta.pop('date', None)
-    fm.write('metadata', '{%s}', fm.formatdict(meta, fmt='%r: %r', sep=', '))
+    smeta = {_maybebytestr(k): _maybebytestr(v) for k, v in meta.iteritems()}
+    fm.write('metadata', '{%s}', fm.formatdict(smeta, fmt='%r: %r', sep=', '))
     fm.plain('\n')
 
 def finddate(ui, repo, date):