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
--- 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):