[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