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.
--- 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
--- 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: