# HG changeset patch # User Yuya Nishihara # Date 1585148832 -32400 # Node ID 7333e8bb9781890d47bb72d050dbe995c6855d74 # Parent 47c1226463a1967071476982c54853a59b032279 templater: fix cbor() filter to recursively convert smartset to list The previous attempt, e3e44e6e7245 "templater: fix cbor() filter to accept smartset", was incomplete since obj may be a collection containing a smartset. This works around the problem by converting smartsets recursively. Another option is to teach cborutil how to encode a smartset. That should be okay, but I hesitated to add "import smartset" to cborutil.py as the cborutil is pretty generic. diff -r 47c1226463a1 -r 7333e8bb9781 mercurial/templatefilters.py --- a/mercurial/templatefilters.py Mon Mar 23 15:14:42 2020 -0700 +++ b/mercurial/templatefilters.py Thu Mar 26 00:07:12 2020 +0900 @@ -106,12 +106,17 @@ return os.path.basename(path) +def _tocborencodable(obj): + if isinstance(obj, smartset.abstractsmartset): + return list(obj) + return obj + + @templatefilter(b'cbor') def cbor(obj): """Any object. Serializes the object to CBOR bytes.""" - if isinstance(obj, smartset.abstractsmartset): - # cborutil is stricter about type than json() filter - obj = list(obj) + # cborutil is stricter about type than json() filter + obj = pycompat.rapply(_tocborencodable, obj) return b''.join(cborutil.streamencode(obj)) diff -r 47c1226463a1 -r 7333e8bb9781 tests/test-template-functions.t --- a/tests/test-template-functions.t Mon Mar 23 15:14:42 2020 -0700 +++ b/tests/test-template-functions.t Thu Mar 26 00:07:12 2020 +0900 @@ -1616,6 +1616,15 @@ ] ] + $ hg log -T "{dict(foo=revset('.'))|cbor}" -R a -l1 | "$PYTHON" "$TESTTMP/decodecbor.py" + [ + { + 'foo': [ + 10 + ] + } + ] + json filter should escape HTML tags so that the output can be embedded in hgweb: $ hg log -T "{''|json}\n" -R a -l1