[PATCH] show: new extension for displaying various repository data
Yuya Nishihara
yuya at tcha.org
Mon Mar 13 22:21:28 EDT 2017
On Sun, 12 Mar 2017 21:38:00 -0700, Gregory Szorc wrote:
> # HG changeset patch
> # User Gregory Szorc <gregory.szorc at gmail.com>
> # Date 1489378362 25200
> # Sun Mar 12 21:12:42 2017 -0700
> # Node ID d30057d358076cbe7d632cd573095af97543f932
> # Parent 1c3352d7eaf24533ad52d4b8a024211e9189fb0b
> show: new extension for displaying various repository data
The idea sounds nice to me. I just checked minor implementation details
about formatter.
> + at command('show', commands.formatteropts, _('[VIEW]'))
> +def show(ui, repo, view=None, template=None):
> + """show various repository information
> +
> + A requested view of repository data is displayed.
> +
> + If no view is requested, the list of available views is shown.
> +
> + .. note::
> +
> + The default output from this command is not covered under Mercurial's
> + default backwards-compatible mechanism (which puts an emphasis on
> + not changing behavior). This means output from this command may change
> + in any future release. However, the values fed to the formatter are
> + covered under the default backwards-compatible mechanism.
> +
> + Automated consumers of this command should specify an explicit template
> + via ``-T/--template`` to guarantee output is stable.
> +
> + List of available views:
> +
> + """
> + views = showview._table
> +
> + if not view:
> + ui.write(_('available views:\n'))
> + ui.write('\n')
> +
> + for name, func in sorted(views.items()):
> + ui.write(_('%s\n') % func.__doc__)
> +
> + ui.write('\n')
> + raise error.Abort(_('no view requested'),
> + hint=_('use `hg show <view>` to choose a view'))
> +
> + if view not in views:
> + raise error.Abort(_('unknown view: %s') % view,
> + hint=_('run `hg show` to see available views'))
> +
> + template = template or 'show'
> + fmtopic = views[view]._formatter
> + formatter = ui.formatter(fmtopic, {'template': template})
> +
> + return views[view](ui, repo, formatter)
s/formatter/fm/ seems better for consistency. Also, I prefer calling fm.end()
here as it should be paired with the construction.
with ui.formatter(...) as fm:
return views[view](...)
> + at showview('bookmarks', formatter='bookmarks')
s/formatter=/topic=/ or /fmtopic=/ ?
If this 'bookmarks' template can't be compatible with the default template
used by "hg bookmarks" command, we'll need another topic name.
> +def showbookmarks(ui, repo, fm):
> + """bookmarks and their associated changeset"""
> + marks = repo._bookmarks
> + if not len(marks):
> + ui.write_err('(no bookmarks set)\n')
> + return 0
If this is an error, it should error out. Otherwise, use fm.plain().
> + active = repo._activebookmark
> + longest = max(len(b) for b in marks)
> +
> + for bm, node in sorted(marks.items()):
> + fm.startitem()
> + fm.write('bookmark', '%s', bm)
> + fm.write('node', fm.hexfunc(node), fm.hexfunc(node))
> + fm.data(ctx=repo[node],
> + active=bm == active,
> + longestlen=longest)
As changectx can't be serialized, it shouldn't be passed to e.g. jsonformatter.
fm.context(ctx=repo[node]) can be used. It's unfortunate that 'longestlen'
appears in JSON output, but I have no better idea other than abusing
fm.context().
More information about the Mercurial-devel
mailing list