hgext/show.py
author Gregory Szorc <gregory.szorc@gmail.com>
Mon, 22 Jan 2018 12:23:47 -0800
changeset 35792 1d118f9f4f57
parent 35498 dfaf9f10e2e5
child 35888 c8e2d6ed1f9e
permissions -rw-r--r--
bundle2: always advertise client support for stream parts Previously, enabling of stream clone over bundle2 was a server-side only change. And clients would only advertise bundle2 support for stream clones if an experimental config option was set. This situation wasn't forward compatible because in the future (when the feature is enabled on servers by default), an old client would send a request to the server but it wouldn't send its own bundle2 capability support for stream parts. Servers would have to infer that clients not sending this capability were old Mercurial clients that only sent the capability if the feature was explicitly enabled. Implicit and inferred behavior makes implementing servers hard. It's much better to be explicit about client features. We should either make the config option for bundle2 stream clones disable the feature client-side as well (so a server doesn't see a request from a client not advertising stream support). Or we should always advertise stream support if a client is willing to accept stream parts. Since I anticipating stabilizing stream clone support in bundle2 quickly, I think it's safe to always advertise client support in the bundle2 capabilities. So this commit changes things to do that. Because capabilities now vary between client and server, we had to create variations of the variable substitutions for those strings. Differential Revision: https://phab.mercurial-scm.org/D1931
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
31765
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     1
# show.py - Extension implementing `hg show`
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     2
#
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     3
# Copyright 2017 Gregory Szorc <gregory.szorc@gmail.com>
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     4
#
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     5
# This software may be used and distributed according to the terms of the
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     6
# GNU General Public License version 2 or any later version.
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     7
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     8
"""unified command to show various repository information (EXPERIMENTAL)
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     9
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    10
This extension provides the :hg:`show` command, which provides a central
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    11
command for displaying commonly-accessed repository data and views of that
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    12
data.
33137
99ce2f586cd4 show: config option to register aliases for views
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33046
diff changeset
    13
99ce2f586cd4 show: config option to register aliases for views
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33046
diff changeset
    14
The following config options can influence operation.
99ce2f586cd4 show: config option to register aliases for views
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33046
diff changeset
    15
99ce2f586cd4 show: config option to register aliases for views
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33046
diff changeset
    16
``commands``
99ce2f586cd4 show: config option to register aliases for views
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33046
diff changeset
    17
------------
99ce2f586cd4 show: config option to register aliases for views
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33046
diff changeset
    18
99ce2f586cd4 show: config option to register aliases for views
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33046
diff changeset
    19
``show.aliasprefix``
99ce2f586cd4 show: config option to register aliases for views
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33046
diff changeset
    20
   List of strings that will register aliases for views. e.g. ``s`` will
99ce2f586cd4 show: config option to register aliases for views
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33046
diff changeset
    21
   effectively set config options ``alias.s<view> = show <view>`` for all
99ce2f586cd4 show: config option to register aliases for views
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33046
diff changeset
    22
   views. i.e. `hg swork` would execute `hg show work`.
99ce2f586cd4 show: config option to register aliases for views
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33046
diff changeset
    23
99ce2f586cd4 show: config option to register aliases for views
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33046
diff changeset
    24
   Aliases that would conflict with existing registrations will not be
99ce2f586cd4 show: config option to register aliases for views
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33046
diff changeset
    25
   performed.
31765
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    26
"""
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    27
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    28
from __future__ import absolute_import
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    29
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    30
from mercurial.i18n import _
35498
dfaf9f10e2e5 show: use revlog function to compute length of the longest shortest node
Yuya Nishihara <yuya@tcha.org>
parents: 35469
diff changeset
    31
from mercurial.node import (
dfaf9f10e2e5 show: use revlog function to compute length of the longest shortest node
Yuya Nishihara <yuya@tcha.org>
parents: 35469
diff changeset
    32
    hex,
dfaf9f10e2e5 show: use revlog function to compute length of the longest shortest node
Yuya Nishihara <yuya@tcha.org>
parents: 35469
diff changeset
    33
    nullrev,
dfaf9f10e2e5 show: use revlog function to compute length of the longest shortest node
Yuya Nishihara <yuya@tcha.org>
parents: 35469
diff changeset
    34
)
31765
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    35
from mercurial import (
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    36
    cmdutil,
33137
99ce2f586cd4 show: config option to register aliases for views
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33046
diff changeset
    37
    commands,
33197
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
    38
    destutil,
31765
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    39
    error,
31859
8e282aa3c3ff show: fix corrupt json output with no bookmarks
Ryan McElroy <rmcelroy@fb.com>
parents: 31858
diff changeset
    40
    formatter,
31944
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
    41
    graphmod,
33197
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
    42
    phases,
31820
45761ef1bc93 py3: have registrar process docstrings in bytes
Yuya Nishihara <yuya@tcha.org>
parents: 31765
diff changeset
    43
    pycompat,
31765
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    44
    registrar,
31944
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
    45
    revset,
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
    46
    revsetlang,
31765
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    47
)
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    48
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    49
# Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    50
# extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    51
# be specifying the version(s) of Mercurial they are tested with, or
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    52
# leave the attribute unspecified.
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    53
testedwith = 'ships-with-hg-core'
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    54
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    55
cmdtable = {}
32337
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32291
diff changeset
    56
command = registrar.command(cmdtable)
34518
592a3cc1ebc4 configitems: register the 'commands.show.aliasprefix' config
Boris Feld <boris.feld@octobus.net>
parents: 34191
diff changeset
    57
31944
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
    58
revsetpredicate = registrar.revsetpredicate()
31765
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    59
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    60
class showcmdfunc(registrar._funcregistrarbase):
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    61
    """Register a function to be invoked for an `hg show <thing>`."""
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    62
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    63
    # Used by _formatdoc().
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    64
    _docformat = '%s -- %s'
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    65
33046
11f768258dcc show: construct changeset templater during dispatch
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32837
diff changeset
    66
    def _extrasetup(self, name, func, fmtopic=None, csettopic=None):
31765
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    67
        """Called with decorator arguments to register a show view.
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    68
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    69
        ``name`` is the sub-command name.
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    70
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    71
        ``func`` is the function being decorated.
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    72
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    73
        ``fmtopic`` is the topic in the style that will be rendered for
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    74
        this view.
33046
11f768258dcc show: construct changeset templater during dispatch
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32837
diff changeset
    75
11f768258dcc show: construct changeset templater during dispatch
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32837
diff changeset
    76
        ``csettopic`` is the topic in the style to be used for a changeset
11f768258dcc show: construct changeset templater during dispatch
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32837
diff changeset
    77
        printer.
11f768258dcc show: construct changeset templater during dispatch
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32837
diff changeset
    78
11f768258dcc show: construct changeset templater during dispatch
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32837
diff changeset
    79
        If ``fmtopic`` is specified, the view function will receive a
11f768258dcc show: construct changeset templater during dispatch
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32837
diff changeset
    80
        formatter instance. If ``csettopic`` is specified, the view
11f768258dcc show: construct changeset templater during dispatch
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32837
diff changeset
    81
        function will receive a changeset printer.
31765
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    82
        """
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    83
        func._fmtopic = fmtopic
33046
11f768258dcc show: construct changeset templater during dispatch
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32837
diff changeset
    84
        func._csettopic = csettopic
31765
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    85
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    86
showview = showcmdfunc()
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    87
31945
02c3b1f396de show: make template option actually show up in help
Ryan McElroy <rmcelroy@fb.com>
parents: 31944
diff changeset
    88
@command('show', [
32375
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32337
diff changeset
    89
    # TODO: Switch this template flag to use cmdutil.formatteropts if
31945
02c3b1f396de show: make template option actually show up in help
Ryan McElroy <rmcelroy@fb.com>
parents: 31944
diff changeset
    90
    # 'hg show' becomes stable before --template/-T is stable. For now,
02c3b1f396de show: make template option actually show up in help
Ryan McElroy <rmcelroy@fb.com>
parents: 31944
diff changeset
    91
    # we are putting it here without the '(EXPERIMENTAL)' flag because it
02c3b1f396de show: make template option actually show up in help
Ryan McElroy <rmcelroy@fb.com>
parents: 31944
diff changeset
    92
    # is an important part of the 'hg show' user experience and the entire
02c3b1f396de show: make template option actually show up in help
Ryan McElroy <rmcelroy@fb.com>
parents: 31944
diff changeset
    93
    # 'hg show' experience is experimental.
02c3b1f396de show: make template option actually show up in help
Ryan McElroy <rmcelroy@fb.com>
parents: 31944
diff changeset
    94
    ('T', 'template', '', ('display with template'), _('TEMPLATE')),
02c3b1f396de show: make template option actually show up in help
Ryan McElroy <rmcelroy@fb.com>
parents: 31944
diff changeset
    95
    ], _('VIEW'))
31765
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    96
def show(ui, repo, view=None, template=None):
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    97
    """show various repository information
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    98
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    99
    A requested view of repository data is displayed.
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   100
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   101
    If no view is requested, the list of available views is shown and the
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   102
    command aborts.
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   103
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   104
    .. note::
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   105
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   106
       There are no backwards compatibility guarantees for the output of this
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   107
       command. Output may change in any future Mercurial release.
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   108
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   109
       Consumers wanting stable command output should specify a template via
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   110
       ``-T/--template``.
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   111
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   112
    List of available views:
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   113
    """
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   114
    if ui.plain() and not template:
31858
ad366d57d574 show: tweak plain abort language for clarity
Ryan McElroy <rmcelroy@fb.com>
parents: 31820
diff changeset
   115
        hint = _('invoke with -T/--template to control output format')
ad366d57d574 show: tweak plain abort language for clarity
Ryan McElroy <rmcelroy@fb.com>
parents: 31820
diff changeset
   116
        raise error.Abort(_('must specify a template in plain mode'), hint=hint)
31765
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   117
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   118
    views = showview._table
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   119
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   120
    if not view:
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   121
        ui.pager('show')
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   122
        # TODO consider using formatter here so available views can be
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   123
        # rendered to custom format.
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   124
        ui.write(_('available views:\n'))
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   125
        ui.write('\n')
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   126
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   127
        for name, func in sorted(views.items()):
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   128
            ui.write(('%s\n') % func.__doc__)
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   129
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   130
        ui.write('\n')
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   131
        raise error.Abort(_('no view requested'),
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   132
                          hint=_('use "hg show VIEW" to choose a view'))
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   133
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   134
    # TODO use same logic as dispatch to perform prefix matching.
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   135
    if view not in views:
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   136
        raise error.Abort(_('unknown view: %s') % view,
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   137
                          hint=_('run "hg show" to see available views'))
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   138
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   139
    template = template or 'show'
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   140
33046
11f768258dcc show: construct changeset templater during dispatch
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32837
diff changeset
   141
    fn = views[view]
31765
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   142
    ui.pager('show')
33046
11f768258dcc show: construct changeset templater during dispatch
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32837
diff changeset
   143
11f768258dcc show: construct changeset templater during dispatch
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32837
diff changeset
   144
    if fn._fmtopic:
11f768258dcc show: construct changeset templater during dispatch
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32837
diff changeset
   145
        fmtopic = 'show%s' % fn._fmtopic
11f768258dcc show: construct changeset templater during dispatch
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32837
diff changeset
   146
        with ui.formatter(fmtopic, {'template': template}) as fm:
11f768258dcc show: construct changeset templater during dispatch
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32837
diff changeset
   147
            return fn(ui, repo, fm)
11f768258dcc show: construct changeset templater during dispatch
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32837
diff changeset
   148
    elif fn._csettopic:
11f768258dcc show: construct changeset templater during dispatch
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32837
diff changeset
   149
        ref = 'show%s' % fn._csettopic
11f768258dcc show: construct changeset templater during dispatch
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32837
diff changeset
   150
        spec = formatter.lookuptemplate(ui, ref, template)
11f768258dcc show: construct changeset templater during dispatch
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32837
diff changeset
   151
        displayer = cmdutil.changeset_templater(ui, repo, spec, buffered=True)
11f768258dcc show: construct changeset templater during dispatch
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32837
diff changeset
   152
        return fn(ui, repo, displayer)
11f768258dcc show: construct changeset templater during dispatch
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32837
diff changeset
   153
    else:
11f768258dcc show: construct changeset templater during dispatch
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32837
diff changeset
   154
        return fn(ui, repo)
31765
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   155
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   156
@showview('bookmarks', fmtopic='bookmarks')
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   157
def showbookmarks(ui, repo, fm):
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   158
    """bookmarks and their associated changeset"""
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   159
    marks = repo._bookmarks
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   160
    if not len(marks):
31859
8e282aa3c3ff show: fix corrupt json output with no bookmarks
Ryan McElroy <rmcelroy@fb.com>
parents: 31858
diff changeset
   161
        # This is a bit hacky. Ideally, templates would have a way to
8e282aa3c3ff show: fix corrupt json output with no bookmarks
Ryan McElroy <rmcelroy@fb.com>
parents: 31858
diff changeset
   162
        # specify an empty output, but we shouldn't corrupt JSON while
8e282aa3c3ff show: fix corrupt json output with no bookmarks
Ryan McElroy <rmcelroy@fb.com>
parents: 31858
diff changeset
   163
        # waiting for this functionality.
8e282aa3c3ff show: fix corrupt json output with no bookmarks
Ryan McElroy <rmcelroy@fb.com>
parents: 31858
diff changeset
   164
        if not isinstance(fm, formatter.jsonformatter):
8e282aa3c3ff show: fix corrupt json output with no bookmarks
Ryan McElroy <rmcelroy@fb.com>
parents: 31858
diff changeset
   165
            ui.write(_('(no bookmarks set)\n'))
31765
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   166
        return
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   167
34191
e6b5e7329ff2 show: use consistent (and possibly shorter) node lengths
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34190
diff changeset
   168
    revs = [repo[node].rev() for node in marks.values()]
31765
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   169
    active = repo._activebookmark
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   170
    longestname = max(len(b) for b in marks)
34191
e6b5e7329ff2 show: use consistent (and possibly shorter) node lengths
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34190
diff changeset
   171
    nodelen = longestshortest(repo, revs)
31765
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   172
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   173
    for bm, node in sorted(marks.items()):
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   174
        fm.startitem()
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   175
        fm.context(ctx=repo[node])
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   176
        fm.write('bookmark', '%s', bm)
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   177
        fm.write('node', fm.hexfunc(node), fm.hexfunc(node))
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   178
        fm.data(active=bm == active,
34190
4441c1113eb2 show: pass the minimum length for nodes as a template keyword
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33211
diff changeset
   179
                longestbookmarklen=longestname,
34191
e6b5e7329ff2 show: use consistent (and possibly shorter) node lengths
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34190
diff changeset
   180
                nodelen=nodelen)
31765
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   181
33197
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   182
@showview('stack', csettopic='stack')
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   183
def showstack(ui, repo, displayer):
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   184
    """current line of work"""
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   185
    wdirctx = repo['.']
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   186
    if wdirctx.rev() == nullrev:
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   187
        raise error.Abort(_('stack view only available when there is a '
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   188
                            'working directory'))
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   189
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   190
    if wdirctx.phase() == phases.public:
33208
9e7efe421395 show: tweak warning message
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33197
diff changeset
   191
        ui.write(_('(empty stack; working directory parent is a published '
33197
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   192
                   'changeset)\n'))
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   193
        return
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   194
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   195
    # TODO extract "find stack" into a function to facilitate
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   196
    # customization and reuse.
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   197
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   198
    baserev = destutil.stackbase(ui, repo)
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   199
    basectx = None
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   200
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   201
    if baserev is None:
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   202
        baserev = wdirctx.rev()
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   203
        stackrevs = {wdirctx.rev()}
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   204
    else:
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   205
        stackrevs = set(repo.revs('%d::.', baserev))
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   206
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   207
    ctx = repo[baserev]
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   208
    if ctx.p1().rev() != nullrev:
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   209
        basectx = ctx.p1()
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   210
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   211
    # And relevant descendants.
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   212
    branchpointattip = False
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   213
    cl = repo.changelog
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   214
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   215
    for rev in cl.descendants([wdirctx.rev()]):
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   216
        ctx = repo[rev]
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   217
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   218
        # Will only happen if . is public.
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   219
        if ctx.phase() == phases.public:
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   220
            break
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   221
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   222
        stackrevs.add(ctx.rev())
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   223
33211
f48422ab81aa show: document why accidentally quadratic is (probably) acceptable
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33210
diff changeset
   224
        # ctx.children() within a function iterating on descandants
f48422ab81aa show: document why accidentally quadratic is (probably) acceptable
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33210
diff changeset
   225
        # potentially has severe performance concerns because revlog.children()
f48422ab81aa show: document why accidentally quadratic is (probably) acceptable
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33210
diff changeset
   226
        # iterates over all revisions after ctx's node. However, the number of
f48422ab81aa show: document why accidentally quadratic is (probably) acceptable
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33210
diff changeset
   227
        # draft changesets should be a reasonably small number. So even if
f48422ab81aa show: document why accidentally quadratic is (probably) acceptable
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33210
diff changeset
   228
        # this is quadratic, the perf impact should be minimal.
33197
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   229
        if len(ctx.children()) > 1:
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   230
            branchpointattip = True
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   231
            break
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   232
33209
9718725dc02a show: avoid extra list operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33208
diff changeset
   233
    stackrevs = list(sorted(stackrevs, reverse=True))
33197
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   234
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   235
    # Find likely target heads for the current stack. These are likely
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   236
    # merge or rebase targets.
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   237
    if basectx:
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   238
        # TODO make this customizable?
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   239
        newheads = set(repo.revs('heads(%d::) - %ld - not public()',
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   240
                                 basectx.rev(), stackrevs))
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   241
    else:
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   242
        newheads = set()
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   243
34191
e6b5e7329ff2 show: use consistent (and possibly shorter) node lengths
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34190
diff changeset
   244
    allrevs = set(stackrevs) | newheads | set([baserev])
e6b5e7329ff2 show: use consistent (and possibly shorter) node lengths
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34190
diff changeset
   245
    nodelen = longestshortest(repo, allrevs)
e6b5e7329ff2 show: use consistent (and possibly shorter) node lengths
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34190
diff changeset
   246
33197
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   247
    try:
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   248
        cmdutil.findcmd('rebase', commands.table)
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   249
        haverebase = True
33210
b93df142485e show: also catch AmbiguousCommand
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33209
diff changeset
   250
    except (error.AmbiguousCommand, error.UnknownCommand):
33197
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   251
        haverebase = False
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   252
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   253
    # TODO use templating.
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   254
    # TODO consider using graphmod. But it may not be necessary given
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   255
    # our simplicity and the customizations required.
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   256
    # TODO use proper graph symbols from graphmod
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   257
35469
f1c54d003327 templater: move repo, ui and cache to per-engine resources
Yuya Nishihara <yuya@tcha.org>
parents: 34888
diff changeset
   258
    tres = formatter.templateresources(ui, repo)
f1c54d003327 templater: move repo, ui and cache to per-engine resources
Yuya Nishihara <yuya@tcha.org>
parents: 34888
diff changeset
   259
    shortesttmpl = formatter.maketemplater(ui, '{shortest(node, %d)}' % nodelen,
f1c54d003327 templater: move repo, ui and cache to per-engine resources
Yuya Nishihara <yuya@tcha.org>
parents: 34888
diff changeset
   260
                                           resources=tres)
33197
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   261
    def shortest(ctx):
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   262
        return shortesttmpl.render({'ctx': ctx, 'node': ctx.hex()})
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   263
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   264
    # We write out new heads to aid in DAG awareness and to help with decision
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   265
    # making on how the stack should be reconciled with commits made since the
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   266
    # branch point.
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   267
    if newheads:
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   268
        # Calculate distance from base so we can render the count and so we can
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   269
        # sort display order by commit distance.
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   270
        revdistance = {}
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   271
        for head in newheads:
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   272
            # There is some redundancy in DAG traversal here and therefore
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   273
            # room to optimize.
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   274
            ancestors = cl.ancestors([head], stoprev=basectx.rev())
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   275
            revdistance[head] = len(list(ancestors))
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   276
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   277
        sourcectx = repo[stackrevs[-1]]
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   278
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   279
        sortedheads = sorted(newheads, key=lambda x: revdistance[x],
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   280
                             reverse=True)
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   281
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   282
        for i, rev in enumerate(sortedheads):
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   283
            ctx = repo[rev]
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   284
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   285
            if i:
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   286
                ui.write(': ')
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   287
            else:
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   288
                ui.write('  ')
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   289
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   290
            ui.write(('o  '))
34191
e6b5e7329ff2 show: use consistent (and possibly shorter) node lengths
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34190
diff changeset
   291
            displayer.show(ctx, nodelen=nodelen)
33197
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   292
            displayer.flush(ctx)
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   293
            ui.write('\n')
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   294
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   295
            if i:
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   296
                ui.write(':/')
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   297
            else:
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   298
                ui.write(' /')
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   299
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   300
            ui.write('    (')
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   301
            ui.write(_('%d commits ahead') % revdistance[rev],
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   302
                     label='stack.commitdistance')
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   303
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   304
            if haverebase:
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   305
                # TODO may be able to omit --source in some scenarios
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   306
                ui.write('; ')
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   307
                ui.write(('hg rebase --source %s --dest %s' % (
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   308
                         shortest(sourcectx), shortest(ctx))),
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   309
                         label='stack.rebasehint')
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   310
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   311
            ui.write(')\n')
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   312
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   313
        ui.write(':\n:    ')
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   314
        ui.write(_('(stack head)\n'), label='stack.label')
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   315
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   316
    if branchpointattip:
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   317
        ui.write(' \\ /  ')
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   318
        ui.write(_('(multiple children)\n'), label='stack.label')
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   319
        ui.write('  |\n')
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   320
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   321
    for rev in stackrevs:
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   322
        ctx = repo[rev]
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   323
        symbol = '@' if rev == wdirctx.rev() else 'o'
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   324
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   325
        if newheads:
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   326
            ui.write(': ')
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   327
        else:
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   328
            ui.write('  ')
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   329
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   330
        ui.write(symbol, '  ')
34191
e6b5e7329ff2 show: use consistent (and possibly shorter) node lengths
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34190
diff changeset
   331
        displayer.show(ctx, nodelen=nodelen)
33197
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   332
        displayer.flush(ctx)
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   333
        ui.write('\n')
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   334
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   335
    # TODO display histedit hint?
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   336
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   337
    if basectx:
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   338
        # Vertically and horizontally separate stack base from parent
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   339
        # to reinforce stack boundary.
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   340
        if newheads:
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   341
            ui.write(':/   ')
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   342
        else:
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   343
            ui.write(' /   ')
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   344
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   345
        ui.write(_('(stack base)'), '\n', label='stack.label')
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   346
        ui.write(('o  '))
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   347
34191
e6b5e7329ff2 show: use consistent (and possibly shorter) node lengths
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34190
diff changeset
   348
        displayer.show(basectx, nodelen=nodelen)
33197
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   349
        displayer.flush(basectx)
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   350
        ui.write('\n')
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33137
diff changeset
   351
31944
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   352
@revsetpredicate('_underway([commitage[, headage]])')
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   353
def underwayrevset(repo, subset, x):
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   354
    args = revset.getargsdict(x, 'underway', 'commitage headage')
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   355
    if 'commitage' not in args:
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   356
        args['commitage'] = None
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   357
    if 'headage' not in args:
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   358
        args['headage'] = None
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   359
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   360
    # We assume callers of this revset add a topographical sort on the
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   361
    # result. This means there is no benefit to making the revset lazy
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   362
    # since the topographical sort needs to consume all revs.
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   363
    #
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   364
    # With this in mind, we build up the set manually instead of constructing
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   365
    # a complex revset. This enables faster execution.
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   366
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   367
    # Mutable changesets (non-public) are the most important changesets
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   368
    # to return. ``not public()`` will also pull in obsolete changesets if
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   369
    # there is a non-obsolete changeset with obsolete ancestors. This is
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   370
    # why we exclude obsolete changesets from this query.
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   371
    rs = 'not public() and not obsolete()'
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   372
    rsargs = []
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   373
    if args['commitage']:
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   374
        rs += ' and date(%s)'
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   375
        rsargs.append(revsetlang.getstring(args['commitage'],
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   376
                                           _('commitage requires a string')))
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   377
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   378
    mutable = repo.revs(rs, *rsargs)
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   379
    relevant = revset.baseset(mutable)
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   380
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   381
    # Add parents of mutable changesets to provide context.
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   382
    relevant += repo.revs('parents(%ld)', mutable)
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   383
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   384
    # We also pull in (public) heads if they a) aren't closing a branch
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   385
    # b) are recent.
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   386
    rs = 'head() and not closed()'
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   387
    rsargs = []
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   388
    if args['headage']:
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   389
        rs += ' and date(%s)'
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   390
        rsargs.append(revsetlang.getstring(args['headage'],
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   391
                                           _('headage requires a string')))
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   392
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   393
    relevant += repo.revs(rs, *rsargs)
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   394
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   395
    # Add working directory parent.
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   396
    wdirrev = repo['.'].rev()
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   397
    if wdirrev != nullrev:
32291
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32058
diff changeset
   398
        relevant += revset.baseset({wdirrev})
31944
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   399
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   400
    return subset & relevant
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   401
33046
11f768258dcc show: construct changeset templater during dispatch
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32837
diff changeset
   402
@showview('work', csettopic='work')
11f768258dcc show: construct changeset templater during dispatch
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32837
diff changeset
   403
def showwork(ui, repo, displayer):
31944
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   404
    """changesets that aren't finished"""
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   405
    # TODO support date-based limiting when calling revset.
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   406
    revs = repo.revs('sort(_underway(), topo)')
34191
e6b5e7329ff2 show: use consistent (and possibly shorter) node lengths
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34190
diff changeset
   407
    nodelen = longestshortest(repo, revs)
31944
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   408
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   409
    revdag = graphmod.dagwalker(repo, revs)
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   410
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   411
    ui.setconfig('experimental', 'graphshorten', True)
34190
4441c1113eb2 show: pass the minimum length for nodes as a template keyword
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33211
diff changeset
   412
    cmdutil.displaygraph(ui, repo, revdag, displayer, graphmod.asciiedges,
34191
e6b5e7329ff2 show: use consistent (and possibly shorter) node lengths
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34190
diff changeset
   413
                         props={'nodelen': nodelen})
31944
99bc93147d87 show: implement underway view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31943
diff changeset
   414
33137
99ce2f586cd4 show: config option to register aliases for views
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33046
diff changeset
   415
def extsetup(ui):
99ce2f586cd4 show: config option to register aliases for views
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33046
diff changeset
   416
    # Alias `hg <prefix><view>` to `hg show <view>`.
99ce2f586cd4 show: config option to register aliases for views
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33046
diff changeset
   417
    for prefix in ui.configlist('commands', 'show.aliasprefix'):
99ce2f586cd4 show: config option to register aliases for views
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33046
diff changeset
   418
        for view in showview._table:
99ce2f586cd4 show: config option to register aliases for views
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33046
diff changeset
   419
            name = '%s%s' % (prefix, view)
99ce2f586cd4 show: config option to register aliases for views
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33046
diff changeset
   420
99ce2f586cd4 show: config option to register aliases for views
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33046
diff changeset
   421
            choice, allcommands = cmdutil.findpossible(name, commands.table,
99ce2f586cd4 show: config option to register aliases for views
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33046
diff changeset
   422
                                                       strict=True)
99ce2f586cd4 show: config option to register aliases for views
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33046
diff changeset
   423
99ce2f586cd4 show: config option to register aliases for views
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33046
diff changeset
   424
            # This alias is already a command name. Don't set it.
99ce2f586cd4 show: config option to register aliases for views
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33046
diff changeset
   425
            if name in choice:
99ce2f586cd4 show: config option to register aliases for views
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33046
diff changeset
   426
                continue
99ce2f586cd4 show: config option to register aliases for views
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33046
diff changeset
   427
99ce2f586cd4 show: config option to register aliases for views
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33046
diff changeset
   428
            # Same for aliases.
99ce2f586cd4 show: config option to register aliases for views
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33046
diff changeset
   429
            if ui.config('alias', name):
99ce2f586cd4 show: config option to register aliases for views
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33046
diff changeset
   430
                continue
99ce2f586cd4 show: config option to register aliases for views
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33046
diff changeset
   431
99ce2f586cd4 show: config option to register aliases for views
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33046
diff changeset
   432
            ui.setconfig('alias', name, 'show %s' % view, source='show')
99ce2f586cd4 show: config option to register aliases for views
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33046
diff changeset
   433
34191
e6b5e7329ff2 show: use consistent (and possibly shorter) node lengths
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34190
diff changeset
   434
def longestshortest(repo, revs, minlen=4):
e6b5e7329ff2 show: use consistent (and possibly shorter) node lengths
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34190
diff changeset
   435
    """Return the length of the longest shortest node to identify revisions.
e6b5e7329ff2 show: use consistent (and possibly shorter) node lengths
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34190
diff changeset
   436
e6b5e7329ff2 show: use consistent (and possibly shorter) node lengths
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34190
diff changeset
   437
    The result of this function can be used with the ``shortest()`` template
e6b5e7329ff2 show: use consistent (and possibly shorter) node lengths
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34190
diff changeset
   438
    function to ensure that a value is unique and unambiguous for a given
e6b5e7329ff2 show: use consistent (and possibly shorter) node lengths
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34190
diff changeset
   439
    set of nodes.
e6b5e7329ff2 show: use consistent (and possibly shorter) node lengths
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34190
diff changeset
   440
e6b5e7329ff2 show: use consistent (and possibly shorter) node lengths
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34190
diff changeset
   441
    The number of revisions in the repo is taken into account to prevent
e6b5e7329ff2 show: use consistent (and possibly shorter) node lengths
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34190
diff changeset
   442
    a numeric node prefix from conflicting with an integer revision number.
e6b5e7329ff2 show: use consistent (and possibly shorter) node lengths
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34190
diff changeset
   443
    If we fail to do this, a value of e.g. ``10023`` could mean either
e6b5e7329ff2 show: use consistent (and possibly shorter) node lengths
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34190
diff changeset
   444
    revision 10023 or node ``10023abc...``.
e6b5e7329ff2 show: use consistent (and possibly shorter) node lengths
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34190
diff changeset
   445
    """
35498
dfaf9f10e2e5 show: use revlog function to compute length of the longest shortest node
Yuya Nishihara <yuya@tcha.org>
parents: 35469
diff changeset
   446
    if not revs:
dfaf9f10e2e5 show: use revlog function to compute length of the longest shortest node
Yuya Nishihara <yuya@tcha.org>
parents: 35469
diff changeset
   447
        return minlen
dfaf9f10e2e5 show: use revlog function to compute length of the longest shortest node
Yuya Nishihara <yuya@tcha.org>
parents: 35469
diff changeset
   448
    # don't use filtered repo because it's slow. see templater.shortest().
dfaf9f10e2e5 show: use revlog function to compute length of the longest shortest node
Yuya Nishihara <yuya@tcha.org>
parents: 35469
diff changeset
   449
    cl = repo.unfiltered().changelog
dfaf9f10e2e5 show: use revlog function to compute length of the longest shortest node
Yuya Nishihara <yuya@tcha.org>
parents: 35469
diff changeset
   450
    return max(len(cl.shortest(hex(cl.node(r)), minlen)) for r in revs)
34191
e6b5e7329ff2 show: use consistent (and possibly shorter) node lengths
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34190
diff changeset
   451
31765
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   452
# Adjust the docstring of the show command so it shows all registered views.
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   453
# This is a bit hacky because it runs at the end of module load. When moved
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   454
# into core or when another extension wants to provide a view, we'll need
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   455
# to do this more robustly.
264baeef3588 show: new extension for displaying various repository data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   456
# TODO make this more robust.
31943
3e9f118cc834 show: fix formatting of multiple commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31859
diff changeset
   457
def _updatedocstring():
3e9f118cc834 show: fix formatting of multiple commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31859
diff changeset
   458
    longest = max(map(len, showview._table.keys()))
3e9f118cc834 show: fix formatting of multiple commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31859
diff changeset
   459
    entries = []
3e9f118cc834 show: fix formatting of multiple commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31859
diff changeset
   460
    for key in sorted(showview._table.keys()):
3e9f118cc834 show: fix formatting of multiple commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31859
diff changeset
   461
        entries.append(pycompat.sysstr('    %s   %s' % (
3e9f118cc834 show: fix formatting of multiple commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31859
diff changeset
   462
            key.ljust(longest), showview._table[key]._origdoc)))
3e9f118cc834 show: fix formatting of multiple commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31859
diff changeset
   463
3e9f118cc834 show: fix formatting of multiple commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31859
diff changeset
   464
    cmdtable['show'][0].__doc__ = pycompat.sysstr('%s\n\n%s\n    ') % (
3e9f118cc834 show: fix formatting of multiple commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31859
diff changeset
   465
        cmdtable['show'][0].__doc__.rstrip(),
3e9f118cc834 show: fix formatting of multiple commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31859
diff changeset
   466
        pycompat.sysstr('\n\n').join(entries))
3e9f118cc834 show: fix formatting of multiple commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31859
diff changeset
   467
3e9f118cc834 show: fix formatting of multiple commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31859
diff changeset
   468
_updatedocstring()