Patchwork [5,of,5] paths: port to generic templater

login
register
mail settings
Submitter Yuya Nishihara
Date Jan. 9, 2016, 9:45 a.m.
Message ID <b6945b81e3a3453c305e.1452332745@mimosa>
Download mbox | patch
Permalink /patch/12623/
State Superseded
Commit 294037159c6443f46f18dc7200f36c568874a2da
Delegated to: Martin von Zweigbergk
Headers show

Comments

Yuya Nishihara - Jan. 9, 2016, 9:45 a.m.
# HG changeset patch
# User Yuya Nishihara <yuya@tcha.org>
# Date 1450012197 -32400
#      Sun Dec 13 22:09:57 2015 +0900
# Node ID b6945b81e3a3453c305ee21b762868826044d22e
# Parent  488822d5766bd4dd9a479fea4c1c513ffcc6f3c4
paths: port to generic templater

Embedded passwords are masked only in plain output because we'll want raw
values in machine-readable format such as JSON. For custom template, we can
add a filter to mask passwords (e.g. "{url|hidepassword}").

path.rawloc field is called as "url" than "path" because we have "pushurl"
sub-option. Also, "name" and "url" are not allowed as sub-options as they
conflict with the field names.

Patch

diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -5380,8 +5380,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,
@@ -5418,6 +5418,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:
@@ -5425,13 +5430,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