changeset 29840:4435d4c951ec

version: add formatter support The license message isn't exported, which I don't think is useful and I couldn't find a way to restructure it for JSON or template outputs.
author Yuya Nishihara <yuya@tcha.org>
date Thu, 25 Aug 2016 01:00:26 -0400
parents 110ed1868f86
children d5883fd055c6
files mercurial/commands.py tests/test-completion.t tests/test-extension.t
diffstat 3 files changed, 62 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/commands.py	Tue Aug 16 16:09:12 2016 +0900
+++ b/mercurial/commands.py	Thu Aug 25 01:00:26 2016 -0400
@@ -7241,36 +7241,49 @@
     """
     return hg.verify(repo)
 
-@command('version', [], norepo=True)
-def version_(ui):
+@command('version', [] + formatteropts, norepo=True)
+def version_(ui, **opts):
     """output version and copyright information"""
-    ui.write(_("Mercurial Distributed SCM (version %s)\n")
-             % util.version())
-    ui.status(_(
+    fm = ui.formatter("version", opts)
+    fm.startitem()
+    fm.write("ver", _("Mercurial Distributed SCM (version %s)\n"),
+             util.version())
+    license = _(
         "(see https://mercurial-scm.org for more information)\n"
         "\nCopyright (C) 2005-2016 Matt Mackall and others\n"
         "This is free software; see the source for copying conditions. "
         "There is NO\nwarranty; "
         "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
-    ))
-
-    ui.note(_("\nEnabled extensions:\n\n"))
+    )
+    if not ui.quiet:
+        fm.plain(license)
+
+    if ui.verbose:
+        fm.plain(_("\nEnabled extensions:\n\n"))
     # format names and versions into columns
     names = []
     vers = []
     isinternals = []
     for name, module in extensions.extensions():
         names.append(name)
-        vers.append(extensions.moduleversion(module))
+        vers.append(extensions.moduleversion(module) or None)
         isinternals.append(extensions.ismoduleinternal(module))
+    fn = fm.nested("extensions")
     if names:
-        maxnamelen = max(len(n) for n in names)
-        places = [_("external"), _("internal")]
-        for i, name in enumerate(names):
-            p = isinternals[i]
+        namefmt = "  %%-%ds  " % max(len(n) for n in names)
+        if fn:
+            places = ["external", "internal"]
+        else:
+            places = [_("external"), _("internal")]
+        for n, v, p in zip(names, vers, isinternals):
+            fn.startitem()
+            fn.condwrite(ui.verbose, "name", namefmt, n)
+            fn.condwrite(ui.verbose, "place", "%s  ", places[p])
+            fn.condwrite(ui.verbose and v, "ver", "%s", v)
             if ui.verbose:
-                ui.write("  %-*s  %s  %s\n" %
-                         (maxnamelen, name, places[p], vers[i]))
+                fn.plain("\n")
+    fn.end()
+    fm.end()
 
 def loadcmdtable(ui, name, cmdtable):
     """Load command functions from specified cmdtable
--- a/tests/test-completion.t	Tue Aug 16 16:09:12 2016 +0900
+++ b/tests/test-completion.t	Thu Aug 25 01:00:26 2016 -0400
@@ -301,7 +301,7 @@
   tip: patch, git, style, template
   unbundle: update
   verify: 
-  version: 
+  version: template
 
   $ hg init a
   $ cd a
--- a/tests/test-extension.t	Tue Aug 16 16:09:12 2016 +0900
+++ b/tests/test-extension.t	Thu Aug 25 01:00:26 2016 -0400
@@ -1240,6 +1240,39 @@
   $ hg version -q --config extensions.throw=throw.py
   Mercurial Distributed SCM (version *) (glob)
 
+Test JSON output of version:
+
+  $ hg version -Tjson
+  [
+   {
+    "extensions": [],
+    "ver": "*" (glob)
+   }
+  ]
+
+  $ hg version --config extensions.throw=throw.py -Tjson
+  [
+   {
+    "extensions": [{"name": "throw", "place": "external", "ver": "1.twentythree"}],
+    "ver": "3.2.2"
+   }
+  ]
+
+  $ LANGUAGE= LC_ALL=ja_JP.UTF-8 hg version --config extensions.strip= -Tjson
+  [
+   {
+    "extensions": [{"name": "strip", "place": "internal", "ver": null}],
+    "ver": "*" (glob)
+   }
+  ]
+
+Test template output of version:
+
+  $ hg version --config extensions.throw=throw.py --config extensions.strip= \
+  > -T'{extensions % "{name}  {pad(ver, 16)}  ({place})\n"}'
+  throw  1.twentythree     (external)
+  strip                    (internal)
+
 Refuse to load extensions with minimum version requirements
 
   $ cat > minversion1.py << EOF