diff --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -5365,8 +5365,8 @@ def parents(ui, repo, file_=None, **opts displayer.show(repo[n]) displayer.close() -@command('paths', [], _('[NAME]'), optionalrepo=True) -def paths(ui, repo, search=None): +@command('paths', formatteropts, _('[NAME]'), optionalrepo=True) +def paths(ui, repo, search=None, **opts): """show aliases for remote repositories Show definition of symbolic path name NAME. If no name is given, @@ -5403,6 +5403,11 @@ def paths(ui, repo, search=None): else: pathitems = sorted(ui.paths.iteritems()) + fm = ui.formatter('paths', opts) + if fm: + hidepassword = str + else: + hidepassword = util.hidepassword if ui.quiet: namefmt = '%s\n' else: @@ -5410,13 +5415,16 @@ def paths(ui, repo, search=None): showsubopts = not search and not ui.quiet for name, path in pathitems: - if not search: - ui.write(namefmt % name) - if not ui.quiet: - ui.write("%s\n" % util.hidepassword(path.rawloc)) + fm.startitem() + fm.condwrite(not search, 'name', namefmt, name) + fm.condwrite(not ui.quiet, 'url', '%s\n', hidepassword(path.rawloc)) for subopt, value in sorted(path.suboptions.items()): + assert subopt not in ('name', 'url') if showsubopts: - ui.write('%s:%s = %s\n' % (name, subopt, value)) + fm.plain('%s:%s = ' % (name, subopt)) + fm.condwrite(showsubopts, subopt, '%s\n', value) + + fm.end() if search and not pathitems: if not ui.quiet: diff --git a/tests/test-completion.t b/tests/test-completion.t --- a/tests/test-completion.t +++ b/tests/test-completion.t @@ -286,7 +286,7 @@ Show all commands + options manifest: rev, all, template outgoing: force, rev, newest-first, bookmarks, branch, patch, git, limit, no-merges, stat, graph, style, template, ssh, remotecmd, insecure, subrepos parents: rev, style, template - paths: + paths: template phase: public, draft, secret, force, rev recover: rename: after, force, include, exclude, dry-run diff --git a/tests/test-paths.t b/tests/test-paths.t --- a/tests/test-paths.t +++ b/tests/test-paths.t @@ -10,6 +10,9 @@ with no paths: $ hg paths unknown not found! [1] + $ hg paths -Tjson + [ + ] with paths: @@ -52,6 +55,48 @@ with paths: [1] $ hg paths -q unknown [1] + +formatter output with paths: + + $ echo 'dupe:pushurl = https://example.com/dupe' >> .hg/hgrc + $ hg paths -Tjson + [ + { + "name": "dupe", + "pushurl": "https://example.com/dupe", + "url": "$TESTTMP/b#tip" + }, + { + "name": "expand", + "url": "$TESTTMP/a/$SOMETHING/bar" + } + ] + $ hg paths -Tjson dupe + [ + { + "name": "dupe", + "pushurl": "https://example.com/dupe", + "url": "$TESTTMP/b#tip" + } + ] + $ hg paths -Tjson -q unknown + [ + ] + [1] + +password should be masked in plain output, but not in machine-readable output: + + $ echo 'insecure = http://foo:insecure@example.com/' >> .hg/hgrc + $ hg paths insecure + http://foo:***@example.com/ + $ hg paths -Tjson insecure + [ + { + "name": "insecure", + "url": "http://foo:insecure@example.com/" + } + ] + $ cd .. sub-options for an undeclared path are ignored