Mercurial > hg-stable
changeset 42176:b6387a65851d stable
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'>
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Sun, 16 Jun 2019 12:31:07 +0900 |
parents | d532292eff22 |
children | c1850798f995 7a9e038d38a2 |
files | mercurial/utils/cborutil.py tests/test-template-functions.t |
diffstat | 2 files changed, 22 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/utils/cborutil.py Fri May 31 22:37:14 2019 -0700 +++ b/mercurial/utils/cborutil.py Sun Jun 16 12:31:07 2019 +0900 @@ -214,6 +214,14 @@ 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)
--- a/tests/test-template-functions.t Fri May 31 22:37:14 2019 -0700 +++ b/tests/test-template-functions.t Sun Jun 16 12:31:07 2019 +0900 @@ -1562,6 +1562,20 @@ $ 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