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) -@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 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