# HG changeset patch # User Yuya Nishihara # Date 2019-10-27 03:49:09 # Node ID 7e20b705da5bbefcbfc9fc437df01a6b5d5a25c4 # Parent a71578ec6257a5ca2d95624d2eee538dd716d09c formatter: fix handling of None value in templater mapping For historical reasons, None in mapping dict means there's no such keyword, and falls back to b"". That's fine in log templates where mapping item is generally a callable returning a value (which may be None,) but the formatter directly puts an "evaluated" value in the mapping. So the None value has to be lifted to wrappedvalue(None) to avoid confusion in the template engine. diff --git a/mercurial/formatter.py b/mercurial/formatter.py --- a/mercurial/formatter.py +++ b/mercurial/formatter.py @@ -515,6 +515,10 @@ class templateformatter(baseformatter): if part not in self._parts: return ref = self._parts[part] + # None can't be put in the mapping dict since it means + for k, v in item.items(): + if v is None: + item[k] = templateutil.wrappedvalue(v) self._out.write(self._t.render(ref, item)) @util.propertycache diff --git a/tests/test-config.t b/tests/test-config.t --- a/tests/test-config.t +++ b/tests/test-config.t @@ -122,7 +122,7 @@ Test config default of various types: ] $ hg config --config auth.cookiefile= auth -T'json(defaultvalue)' [ - {"defaultvalue": ""} + {"defaultvalue": null} ] $ hg config --config auth.cookiefile= auth -T'{defaultvalue}\n'