# HG changeset patch # User Yuya Nishihara # Date 1499873754 -32400 # Node ID 16ed67164002b5cdb9ce8f35ee24c4408076ce0f # Parent a339027902c4b3287572be8c608e5007146eb772 templatekw: export ui.paths as {peerpaths} It's sometimes useful to show hyperlinks in log output. "{get(peerpaths, "default")}/rev/{node}" Since each path may have sub options, "{peerpaths}" is structured as a dict of dicts, but the inner dict is rendered as if it were a string URL. The implementation is ad-hoc, so there are some weird behaviors described in the test. We might need to introduce a proper way of handling a hybrid scalar object. This patch adds _hybrid.__getitem__() so d['path']['url'] works. The keyword is named as "peerpaths" since "paths" seemed too generic in log context. diff -r a339027902c4 -r 16ed67164002 mercurial/templatekw.py --- a/mercurial/templatekw.py Fri Jul 07 23:13:04 2017 +0900 +++ b/mercurial/templatekw.py Thu Jul 13 00:35:54 2017 +0900 @@ -59,6 +59,8 @@ yield makemap(x) def __contains__(self, x): return x in self._values + def __getitem__(self, key): + return self._values[key] def __len__(self): return len(self._values) def __iter__(self): @@ -591,6 +593,25 @@ return 'obsolete' return '' +@templatekeyword('peerpaths') +def showpeerpaths(repo, **args): + """A dictionary of repository locations defined in the [paths] section + of your configuration file.""" + # see commands.paths() for naming of dictionary keys + paths = util.sortdict() + for k, p in sorted(repo.ui.paths.iteritems()): + d = util.sortdict() + d['url'] = p.rawloc + d.update((o, v) for o, v in sorted(p.suboptions.iteritems())) + def f(): + yield d['url'] + paths[k] = hybriddict(d, gen=f()) + + # no hybriddict() since d['path'] can't be formatted as a string. perhaps + # hybriddict() should call templatefilters.stringify(d[value]). + return _hybrid(None, paths, lambda k: {'name': k, 'path': paths[k]}, + lambda d: '%s=%s' % (d['name'], d['path']['url'])) + @templatekeyword("predecessors") def showpredecessors(repo, ctx, **args): """Returns the list if the closest visible successors diff -r a339027902c4 -r 16ed67164002 tests/test-paths.t --- a/tests/test-paths.t Fri Jul 07 23:13:04 2017 +0900 +++ b/tests/test-paths.t Thu Jul 13 00:35:54 2017 +0900 @@ -84,7 +84,46 @@ ] [1] -password should be masked in plain output, but not in machine-readable output: +log template: + + (behaves as a {name: path-string} dict by default) + + $ hg log -rnull -T '{peerpaths}\n' + dupe=$TESTTMP/b#tip expand=$TESTTMP/a/$SOMETHING/bar (glob) + $ hg log -rnull -T '{join(peerpaths, "\n")}\n' + dupe=$TESTTMP/b#tip (glob) + expand=$TESTTMP/a/$SOMETHING/bar (glob) + $ hg log -rnull -T '{peerpaths % "{name}: {path}\n"}' + dupe: $TESTTMP/a/$SOMETHING/bar (glob) + expand: $TESTTMP/a/$SOMETHING/bar (glob) + $ hg log -rnull -T '{get(peerpaths, "dupe")}\n' + $TESTTMP/a/$SOMETHING/bar (glob) + + (but a path is actually a dict of url and sub-options) + + $ hg log -rnull -T '{join(get(peerpaths, "dupe"), "\n")}\n' + url=$TESTTMP/b#tip (glob) + pushurl=https://example.com/dupe + $ hg log -rnull -T '{get(peerpaths, "dupe") % "{key}: {value}\n"}' + url: $TESTTMP/b#tip (glob) + pushurl: https://example.com/dupe + $ hg log -rnull -T '{get(get(peerpaths, "dupe"), "pushurl")}\n' + https://example.com/dupe + + (so there's weird behavior) + + $ hg log -rnull -T '{get(peerpaths, "dupe")|count}\n' + 2 + $ hg log -rnull -T '{get(peerpaths, "dupe")|stringify|count}\n' + [0-9]{2,} (re) + + (in JSON, it's a dict of dicts) + + $ hg log -rnull -T '{peerpaths|json}\n' + {"dupe": {"pushurl": "https://example.com/dupe", "url": "$TESTTMP/b#tip"}, "expand": {"url": "$TESTTMP/a/$SOMETHING/bar"}} (glob) + +password should be masked in plain output, but not in machine-readable/template +output: $ echo 'insecure = http://foo:insecure@example.com/' >> .hg/hgrc $ hg paths insecure @@ -96,6 +135,8 @@ "url": "http://foo:insecure@example.com/" } ] + $ hg log -rnull -T '{get(peerpaths, "insecure")}\n' + http://foo:insecure@example.com/ zeroconf wraps ui.configitems(), which shouldn't crash at least: