[PATCH STABLE] cborutil: fix streamencode() to handle subtypes
Yuya Nishihara
yuya at tcha.org
Sun Jun 16 04:07:17 UTC 2019
# HG changeset patch
# User Yuya Nishihara <yuya at tcha.org>
# Date 1560655867 -32400
# Sun Jun 16 12:31:07 2019 +0900
# Branch stable
# Node ID 3dd649ffcd1ad2409813bd0977653db02dc3374c
# Parent d532292eff22b095c994ffedcd4bf98f84f873aa
cborutil: fix streamencode() to handle subtypes
Otherwise the template filter 'cbor' could crash because of bytes subclass:
ValueError: do not know how to encode
<class 'mercurial.encoding.safelocalstr'>
diff --git a/mercurial/utils/cborutil.py b/mercurial/utils/cborutil.py
--- a/mercurial/utils/cborutil.py
+++ b/mercurial/utils/cborutil.py
@@ -214,6 +214,14 @@ def streamencode(v):
fn = STREAM_ENCODERS.get(v.__class__)
if not fn:
+ # handle subtypes such as encoding.localstr and util.sortdict
+ for ty in STREAM_ENCODERS:
+ if not isinstance(v, ty):
+ continue
+ fn = STREAM_ENCODERS[ty]
+ break
+
+ if not fn:
raise ValueError('do not know how to encode %s' % type(v))
return fn(v)
diff --git a/tests/test-template-functions.t b/tests/test-template-functions.t
--- a/tests/test-template-functions.t
+++ b/tests/test-template-functions.t
@@ -1562,6 +1562,20 @@ json filter takes input as utf-8b:
$ HGENCODING=ascii hg log -T "{'`cat latin1`'|json}\n" -l1
"\udce9"
+cbor filter is bytes transparent, which should handle bytes subtypes
+as bytes:
+
+ $ HGENCODING=ascii hg log -T "{branch|cbor}" -r0 \
+ > | "$PYTHON" "$TESTTMP/decodecbor.py"
+ [
+ '?'
+ ]
+ $ HGENCODING=latin-1 hg log -T "{branch|cbor}" -r0 \
+ > | "$PYTHON" "$TESTTMP/decodecbor.py"
+ [
+ '\xe9'
+ ]
+
utf8 filter:
$ HGENCODING=ascii hg log -T "round-trip: {branch|utf8|hex}\n" -r0
More information about the Mercurial-devel
mailing list