config: add template support
authorMathias De Maré <mathias.demare@gmail.com>
Mon, 29 Aug 2016 07:07:15 +0200
changeset 29950 80fef5251099
parent 29949 e7cacb45c4be
child 29951 e7acbe538baf
config: add template support V2: - Limit escaping to plain formatting only - Use the formatter consistently (no more ui.debug) - Always include 'name' and 'value' V3: - Always convert 'value' to string (this also makes sure we handle functions) - Keep real debug message as ui.debug for now - Add additional tests. Note: I'm not quite sure about the best approach to handling the 'print the full config' case. For me, it printed the 'ui.promptecho' key at the end. I went with globs there as that at least tests the json display reliably. Example output: [ { "name": "ui.username", "source": "/home/mathias/.hgrc:2", "value": "Mathias De Maré <mathias.demare@gmail.com>" } ]
mercurial/commands.py
tests/test-completion.t
tests/test-config.t
--- a/mercurial/commands.py	Mon Aug 29 17:19:09 2016 +0200
+++ b/mercurial/commands.py	Mon Aug 29 07:07:15 2016 +0200
@@ -1788,7 +1788,7 @@
     [('u', 'untrusted', None, _('show untrusted configuration options')),
      ('e', 'edit', None, _('edit user config')),
      ('l', 'local', None, _('edit repository config')),
-     ('g', 'global', None, _('edit global config'))],
+     ('g', 'global', None, _('edit global config'))] + formatteropts,
     _('[-u] [NAME]...'),
     optionalrepo=True)
 def config(ui, repo, *values, **opts):
@@ -1849,6 +1849,7 @@
                   onerr=error.Abort, errprefix=_("edit failed"))
         return
 
+    fm = ui.formatter('config', opts)
     for f in scmutil.rcpath():
         ui.debug('read config from: %s\n' % f)
     untrusted = bool(opts.get('untrusted'))
@@ -1859,25 +1860,32 @@
             raise error.Abort(_('only one config item permitted'))
     matched = False
     for section, name, value in ui.walkconfig(untrusted=untrusted):
-        value = str(value).replace('\n', '\\n')
-        sectname = section + '.' + name
+        value = str(value)
+        if fm.isplain():
+            value = value.replace('\n', '\\n')
+        entryname = section + '.' + name
         if values:
             for v in values:
                 if v == section:
-                    ui.debug('%s: ' %
-                             ui.configsource(section, name, untrusted))
-                    ui.write('%s=%s\n' % (sectname, value))
+                    fm.startitem()
+                    fm.condwrite(ui.debugflag, 'source', '%s: ',
+                                 ui.configsource(section, name, untrusted))
+                    fm.write('name value', '%s=%s\n', entryname, value)
                     matched = True
-                elif v == sectname:
-                    ui.debug('%s: ' %
-                             ui.configsource(section, name, untrusted))
-                    ui.write(value, '\n')
+                elif v == entryname:
+                    fm.startitem()
+                    fm.condwrite(ui.debugflag, 'source', '%s: ',
+                                 ui.configsource(section, name, untrusted))
+                    fm.write('value', '%s\n', value)
+                    fm.data(name=entryname)
                     matched = True
         else:
-            ui.debug('%s: ' %
-                     ui.configsource(section, name, untrusted))
-            ui.write('%s=%s\n' % (sectname, value))
+            fm.startitem()
+            fm.condwrite(ui.debugflag, 'source', '%s: ',
+                         ui.configsource(section, name, untrusted))
+            fm.write('name value', '%s=%s\n', entryname, value)
             matched = True
+    fm.end()
     if matched:
         return 0
     return 1
--- a/tests/test-completion.t	Mon Aug 29 17:19:09 2016 +0200
+++ b/tests/test-completion.t	Mon Aug 29 07:07:15 2016 +0200
@@ -232,7 +232,7 @@
   branches: active, closed, template
   bundle: force, rev, branch, base, all, type, ssh, remotecmd, insecure
   cat: output, rev, decode, include, exclude
-  config: untrusted, edit, local, global
+  config: untrusted, edit, local, global, template
   copy: after, force, include, exclude, dry-run
   debugancestor: 
   debugapplystreamclonebundle: 
--- a/tests/test-config.t	Mon Aug 29 17:19:09 2016 +0200
+++ b/tests/test-config.t	Mon Aug 29 07:07:15 2016 +0200
@@ -54,6 +54,36 @@
   Section.KeY=Case Sensitive
   Section.key=lower case
 
+  $ hg showconfig Section -Tjson
+  [
+   {
+    "name": "Section.KeY",
+    "source": "*.hgrc:16", (glob)
+    "value": "Case Sensitive"
+   },
+   {
+    "name": "Section.key",
+    "source": "*.hgrc:17", (glob)
+    "value": "lower case"
+   }
+  ]
+  $ hg showconfig Section.KeY -Tjson
+  [
+   {
+    "name": "Section.KeY",
+    "source": "*.hgrc:16", (glob)
+    "value": "Case Sensitive"
+   }
+  ]
+  $ hg showconfig -Tjson | tail -7
+   },
+   {
+    "name": "*", (glob)
+    "source": "*", (glob)
+    "value": "*" (glob)
+   }
+  ]
+
 Test "%unset"
 
   $ cat >> $HGRCPATH <<EOF