[PATCH 5 of 5] version: add formatter support

Yuya Nishihara yuya at tcha.org
Mon Aug 22 10:44:37 EDT 2016


# HG changeset patch
# User Yuya Nishihara <yuya at tcha.org>
# Date 1471331947 -32400
#      Tue Aug 16 16:19:07 2016 +0900
# Node ID fc30d32758af268847d2b9b200071c7b58cd6050
# Parent  f6e34ad8025ba31a7ef463205c14a450c44baea6
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.

diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -7241,36 +7241,49 @@ def verify(ui, repo):
     """
     return hg.verify(repo)
 
- at command('version', [], norepo=True)
-def version_(ui):
+ at 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
diff --git a/tests/test-completion.t b/tests/test-completion.t
--- a/tests/test-completion.t
+++ b/tests/test-completion.t
@@ -301,7 +301,7 @@ Show all commands + options
   tip: patch, git, style, template
   unbundle: update
   verify: 
-  version: 
+  version: template
 
   $ hg init a
   $ cd a
diff --git a/tests/test-extension.t b/tests/test-extension.t
--- a/tests/test-extension.t
+++ b/tests/test-extension.t
@@ -1240,6 +1240,39 @@ Test version number support in 'hg versi
   $ 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


More information about the Mercurial-devel mailing list