diff --git a/mercurial/templatefilters.py b/mercurial/templatefilters.py --- a/mercurial/templatefilters.py +++ b/mercurial/templatefilters.py @@ -23,6 +23,7 @@ from . import ( util, ) from .utils import ( + cborutil, dateutil, stringutil, ) @@ -99,6 +100,11 @@ def basename(path): """ return os.path.basename(path) +@templatefilter('cbor') +def cbor(obj): + """Any object. Serializes the object to CBOR bytes.""" + return b''.join(cborutil.streamencode(obj)) + @templatefilter('commondir') def commondir(filelist): """List of text. Treats each list item as file name with / 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 @@ -1495,6 +1495,32 @@ Test with non-strings like dates 1200000.00 1300000.00 +Test cbor filter: + + $ cat <<'EOF' > "$TESTTMP/decodecbor.py" + > from __future__ import absolute_import + > from mercurial import pycompat + > from mercurial.utils import ( + > cborutil, + > stringutil, + > ) + > items = cborutil.decodeall(pycompat.stdin.read()) + > pycompat.stdout.write(stringutil.pprint(items, indent=1) + b'\n') + > EOF + + $ hg log -T "{rev|cbor}" -R a -l2 | "$PYTHON" "$TESTTMP/decodecbor.py" + [ + 10, + 9 + ] + + $ hg log -T "{extras|cbor}" -R a -l1 | "$PYTHON" "$TESTTMP/decodecbor.py" + [ + { + 'branch': 'default' + } + ] + json filter should escape HTML tags so that the output can be embedded in hgweb: $ hg log -T "{''|json}\n" -R a -l1