mercurial/logcmdutil.py
author Gregory Szorc <gregory.szorc@gmail.com>
Mon, 21 Feb 2022 13:08:28 -0700
changeset 48946 642e31cb55f0
parent 48913 f254fc73d956
child 49029 eb8aed493a56
permissions -rw-r--r--
py3: use class X: instead of class X(object): The inheritance from object is implied in Python 3. So this should be equivalent. This change was generated via an automated search and replace. So there may have been some accidental changes. Differential Revision: https://phab.mercurial-scm.org/D12352
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
35885
7625b4f7db70 cmdutil: split functions of log-like commands to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35874
diff changeset
     1
# logcmdutil.py - utility for log-like commands
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
     2
#
46819
d4ba4d51f85f contributor: change mentions of mpm to olivia
Raphaël Gomès <rgomes@octobus.net>
parents: 46794
diff changeset
     3
# Copyright 2005-2007 Olivia Mackall <olivia@selenic.com>
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
     4
#
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8210
diff changeset
     5
# This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 10249
diff changeset
     6
# GNU General Public License version 2 or any later version.
2874
4ec58b157265 refactor text diff/patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
     7
28322
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
     8
31807
e6eb86b154c5 templater: provide loop counter as "index" keyword
Yuya Nishihara <yuya@tcha.org>
parents: 31698
diff changeset
     9
import itertools
28322
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    10
import os
41646
d4c9eebdd72d patch: replace "prefix" and "relroot" arguments by "pathfn" (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41630
diff changeset
    11
import posixpath
28322
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    12
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    13
from .i18n import _
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
    14
from .node import nullrev, wdirrev
28322
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    15
45565
c1d0f83d62c4 log: introduce struct that carries log traversal options
Yuya Nishihara <yuya@tcha.org>
parents: 45564
diff changeset
    16
from .thirdparty import attr
c1d0f83d62c4 log: introduce struct that carries log traversal options
Yuya Nishihara <yuya@tcha.org>
parents: 45564
diff changeset
    17
28322
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    18
from . import (
34857
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
    19
    dagop,
28322
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    20
    error,
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    21
    formatter,
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    22
    graphmod,
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    23
    match as matchmod,
34857
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
    24
    mdiff,
46497
4a012e531066 diff: extract function for getting possibly re-merged parent to diff against
Martin von Zweigbergk <martinvonz@google.com>
parents: 46042
diff changeset
    25
    merge,
28322
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    26
    patch,
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    27
    pathutil,
30519
20a42325fdef py3: use pycompat.getcwd() instead of os.getcwd()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30506
diff changeset
    28
    pycompat,
28322
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    29
    revset,
35644
7a0a90d63a8c log: use revsetlang.formatspec() to concatenate list expression
Yuya Nishihara <yuya@tcha.org>
parents: 35643
diff changeset
    30
    revsetlang,
28322
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    31
    scmutil,
31023
aea06029919e revset: import set classes directly from smartset module
Yuya Nishihara <yuya@tcha.org>
parents: 30877
diff changeset
    32
    smartset,
28322
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    33
    templatekw,
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    34
    templater,
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    35
    util,
ebd0e86bdf89 cmdutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28313
diff changeset
    36
)
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37072
diff changeset
    37
from .utils import (
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37072
diff changeset
    38
    dateutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37072
diff changeset
    39
    stringutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37072
diff changeset
    40
)
21405
dcf20f244c2a cmdutil: introduce "getcommiteditor()" to simplify code paths to choose editor
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21241
diff changeset
    41
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
    42
43773
7b14d649af1b typing: consolidate "if not globals():" trick
Yuya Nishihara <yuya@tcha.org>
parents: 43701
diff changeset
    43
if pycompat.TYPE_CHECKING:
43701
c9301ac73b95 logcmdutil: add a type annotation
Augie Fackler <augie@google.com>
parents: 43648
diff changeset
    44
    from typing import (
c9301ac73b95 logcmdutil: add a type annotation
Augie Fackler <augie@google.com>
parents: 43648
diff changeset
    45
        Any,
45628
7f033a587414 log: extract function that builds (revs, makefilematcher) from walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45627
diff changeset
    46
        Callable,
45565
c1d0f83d62c4 log: introduce struct that carries log traversal options
Yuya Nishihara <yuya@tcha.org>
parents: 45564
diff changeset
    47
        Dict,
43774
064c9a4ced4a typing: fix return type of logcmdutil.getrevs()
Yuya Nishihara <yuya@tcha.org>
parents: 43773
diff changeset
    48
        Optional,
46682
8f8fce2dd594 typing: switch an argument type to the generic form
Matt Harbison <matt_harbison@yahoo.com>
parents: 46549
diff changeset
    49
        Sequence,
43701
c9301ac73b95 logcmdutil: add a type annotation
Augie Fackler <augie@google.com>
parents: 43648
diff changeset
    50
        Tuple,
c9301ac73b95 logcmdutil: add a type annotation
Augie Fackler <augie@google.com>
parents: 43648
diff changeset
    51
    )
c9301ac73b95 logcmdutil: add a type annotation
Augie Fackler <augie@google.com>
parents: 43648
diff changeset
    52
48014
0dc4cc654d96 typing: drop annotations on `mercurial/logcmdutil.walkopts` attributes
Matt Harbison <matt_harbison@yahoo.com>
parents: 47437
diff changeset
    53
    for t in (Any, Callable, Dict, Optional, Tuple):
43701
c9301ac73b95 logcmdutil: add a type annotation
Augie Fackler <augie@google.com>
parents: 43648
diff changeset
    54
        assert t
c9301ac73b95 logcmdutil: add a type annotation
Augie Fackler <augie@google.com>
parents: 43648
diff changeset
    55
c9301ac73b95 logcmdutil: add a type annotation
Augie Fackler <augie@google.com>
parents: 43648
diff changeset
    56
35887
572f36e9a780 logcmdutil: drop redundant "log" from function names (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35886
diff changeset
    57
def getlimit(opts):
6190
a79d9408806f Move finding/checking the log limit to cmdutil
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6145
diff changeset
    58
    """get the log limit according to option -l/--limit"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    59
    limit = opts.get(b'limit')
6190
a79d9408806f Move finding/checking the log limit to cmdutil
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6145
diff changeset
    60
    if limit:
a79d9408806f Move finding/checking the log limit to cmdutil
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6145
diff changeset
    61
        try:
a79d9408806f Move finding/checking the log limit to cmdutil
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6145
diff changeset
    62
            limit = int(limit)
a79d9408806f Move finding/checking the log limit to cmdutil
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6145
diff changeset
    63
        except ValueError:
48552
91017508a785 logcmdutil: raise `InputError` on bad CLI arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 48118
diff changeset
    64
            raise error.InputError(_(b'limit must be a positive integer'))
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
    65
        if limit <= 0:
48552
91017508a785 logcmdutil: raise `InputError` on bad CLI arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 48118
diff changeset
    66
            raise error.InputError(_(b'limit must be positive'))
6190
a79d9408806f Move finding/checking the log limit to cmdutil
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6145
diff changeset
    67
    else:
10111
27457d31ae3f cmdutil: replace sys.maxint with None as default value in loglimit
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 10061
diff changeset
    68
        limit = None
6190
a79d9408806f Move finding/checking the log limit to cmdutil
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6145
diff changeset
    69
    return limit
a79d9408806f Move finding/checking the log limit to cmdutil
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6145
diff changeset
    70
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
    71
46497
4a012e531066 diff: extract function for getting possibly re-merged parent to diff against
Martin von Zweigbergk <martinvonz@google.com>
parents: 46042
diff changeset
    72
def diff_parent(ctx):
4a012e531066 diff: extract function for getting possibly re-merged parent to diff against
Martin von Zweigbergk <martinvonz@google.com>
parents: 46042
diff changeset
    73
    """get the context object to use as parent when diffing
4a012e531066 diff: extract function for getting possibly re-merged parent to diff against
Martin von Zweigbergk <martinvonz@google.com>
parents: 46042
diff changeset
    74
4a012e531066 diff: extract function for getting possibly re-merged parent to diff against
Martin von Zweigbergk <martinvonz@google.com>
parents: 46042
diff changeset
    75
4a012e531066 diff: extract function for getting possibly re-merged parent to diff against
Martin von Zweigbergk <martinvonz@google.com>
parents: 46042
diff changeset
    76
    If diff.merge is enabled, an overlayworkingctx of the auto-merged parents will be returned.
4a012e531066 diff: extract function for getting possibly re-merged parent to diff against
Martin von Zweigbergk <martinvonz@google.com>
parents: 46042
diff changeset
    77
    """
4a012e531066 diff: extract function for getting possibly re-merged parent to diff against
Martin von Zweigbergk <martinvonz@google.com>
parents: 46042
diff changeset
    78
    repo = ctx.repo()
46843
728d89f6f9b1 refactor: prefer checks against nullrev over nullid
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
    79
    if repo.ui.configbool(b"diff", b"merge") and ctx.p2().rev() != nullrev:
46497
4a012e531066 diff: extract function for getting possibly re-merged parent to diff against
Martin von Zweigbergk <martinvonz@google.com>
parents: 46042
diff changeset
    80
        # avoid cycle context -> subrepo -> cmdutil -> logcmdutil
4a012e531066 diff: extract function for getting possibly re-merged parent to diff against
Martin von Zweigbergk <martinvonz@google.com>
parents: 46042
diff changeset
    81
        from . import context
4a012e531066 diff: extract function for getting possibly re-merged parent to diff against
Martin von Zweigbergk <martinvonz@google.com>
parents: 46042
diff changeset
    82
4a012e531066 diff: extract function for getting possibly re-merged parent to diff against
Martin von Zweigbergk <martinvonz@google.com>
parents: 46042
diff changeset
    83
        wctx = context.overlayworkingctx(repo)
4a012e531066 diff: extract function for getting possibly re-merged parent to diff against
Martin von Zweigbergk <martinvonz@google.com>
parents: 46042
diff changeset
    84
        wctx.setbase(ctx.p1())
4a012e531066 diff: extract function for getting possibly re-merged parent to diff against
Martin von Zweigbergk <martinvonz@google.com>
parents: 46042
diff changeset
    85
        with repo.ui.configoverride(
4a012e531066 diff: extract function for getting possibly re-merged parent to diff against
Martin von Zweigbergk <martinvonz@google.com>
parents: 46042
diff changeset
    86
            {
4a012e531066 diff: extract function for getting possibly re-merged parent to diff against
Martin von Zweigbergk <martinvonz@google.com>
parents: 46042
diff changeset
    87
                (
4a012e531066 diff: extract function for getting possibly re-merged parent to diff against
Martin von Zweigbergk <martinvonz@google.com>
parents: 46042
diff changeset
    88
                    b"ui",
4a012e531066 diff: extract function for getting possibly re-merged parent to diff against
Martin von Zweigbergk <martinvonz@google.com>
parents: 46042
diff changeset
    89
                    b"forcemerge",
4a012e531066 diff: extract function for getting possibly re-merged parent to diff against
Martin von Zweigbergk <martinvonz@google.com>
parents: 46042
diff changeset
    90
                ): b"internal:merge3-lie-about-conflicts",
4a012e531066 diff: extract function for getting possibly re-merged parent to diff against
Martin von Zweigbergk <martinvonz@google.com>
parents: 46042
diff changeset
    91
            },
4a012e531066 diff: extract function for getting possibly re-merged parent to diff against
Martin von Zweigbergk <martinvonz@google.com>
parents: 46042
diff changeset
    92
            b"merge-diff",
4a012e531066 diff: extract function for getting possibly re-merged parent to diff against
Martin von Zweigbergk <martinvonz@google.com>
parents: 46042
diff changeset
    93
        ):
47437
7a430116f639 ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents: 47012
diff changeset
    94
            with repo.ui.silent():
7a430116f639 ui: add a context manager for silencing the ui (pushbuffer+popbuffer)
Martin von Zweigbergk <martinvonz@google.com>
parents: 47012
diff changeset
    95
                merge.merge(ctx.p2(), wc=wctx)
46497
4a012e531066 diff: extract function for getting possibly re-merged parent to diff against
Martin von Zweigbergk <martinvonz@google.com>
parents: 46042
diff changeset
    96
        return wctx
4a012e531066 diff: extract function for getting possibly re-merged parent to diff against
Martin von Zweigbergk <martinvonz@google.com>
parents: 46042
diff changeset
    97
    else:
4a012e531066 diff: extract function for getting possibly re-merged parent to diff against
Martin von Zweigbergk <martinvonz@google.com>
parents: 46042
diff changeset
    98
        return ctx.p1()
4a012e531066 diff: extract function for getting possibly re-merged parent to diff against
Martin von Zweigbergk <martinvonz@google.com>
parents: 46042
diff changeset
    99
4a012e531066 diff: extract function for getting possibly re-merged parent to diff against
Martin von Zweigbergk <martinvonz@google.com>
parents: 46042
diff changeset
   100
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   101
def diffordiffstat(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   102
    ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   103
    repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   104
    diffopts,
44823
3b7aabd02e11 cleanup: avoid extra node/ctx conversions in logcmdutil.diffordiffstat
Augie Fackler <augie@google.com>
parents: 44345
diff changeset
   105
    ctx1,
3b7aabd02e11 cleanup: avoid extra node/ctx conversions in logcmdutil.diffordiffstat
Augie Fackler <augie@google.com>
parents: 44345
diff changeset
   106
    ctx2,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   107
    match,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   108
    changes=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   109
    stat=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   110
    fp=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   111
    graphwidth=0,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   112
    prefix=b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   113
    root=b'',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   114
    listsubrepos=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   115
    hunksfilterfn=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   116
):
11050
5d35f7d93514 commands: refactor diff --stat and qdiff --stat
Yuya Nishihara <yuya@tcha.org>
parents: 11017
diff changeset
   117
    '''show diff or diffstat.'''
24455
16961d43dc89 diff: rename --relative option to --root
Sean Farley <sean@farley.io>
parents: 24451
diff changeset
   118
    if root:
16961d43dc89 diff: rename --relative option to --root
Sean Farley <sean@farley.io>
parents: 24451
diff changeset
   119
        relroot = pathutil.canonpath(repo.root, repo.getcwd(), root)
24431
a0004402776b cmdutil.diffordiffstat: add support for diffs relative to a subdirectory
Siddharth Agarwal <sid0@fb.com>
parents: 24422
diff changeset
   120
    else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   121
        relroot = b''
41620
74f53d3bd685 patch: accept second matcher that applies only to copy sources (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41619
diff changeset
   122
    copysourcematch = None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   123
41647
ec37db02fc72 diff: make `hg diff --root=subrepo` work
Martin von Zweigbergk <martinvonz@google.com>
parents: 41646
diff changeset
   124
    def compose(f, g):
ec37db02fc72 diff: make `hg diff --root=subrepo` work
Martin von Zweigbergk <martinvonz@google.com>
parents: 41646
diff changeset
   125
        return lambda x: f(g(x))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   126
41646
d4c9eebdd72d patch: replace "prefix" and "relroot" arguments by "pathfn" (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41630
diff changeset
   127
    def pathfn(f):
d4c9eebdd72d patch: replace "prefix" and "relroot" arguments by "pathfn" (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41630
diff changeset
   128
        return posixpath.join(prefix, f)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   129
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   130
    if relroot != b'':
24431
a0004402776b cmdutil.diffordiffstat: add support for diffs relative to a subdirectory
Siddharth Agarwal <sid0@fb.com>
parents: 24422
diff changeset
   131
        # XXX relative roots currently don't work if the root is within a
a0004402776b cmdutil.diffordiffstat: add support for diffs relative to a subdirectory
Siddharth Agarwal <sid0@fb.com>
parents: 24422
diff changeset
   132
        # subrepo
41655
df59b1078983 diff: respect ui.relative-paths for warning about path outside --root
Martin von Zweigbergk <martinvonz@google.com>
parents: 41647
diff changeset
   133
        uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True)
df59b1078983 diff: respect ui.relative-paths for warning about path outside --root
Martin von Zweigbergk <martinvonz@google.com>
parents: 41647
diff changeset
   134
        uirelroot = uipathfn(pathfn(relroot))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   135
        relroot += b'/'
24431
a0004402776b cmdutil.diffordiffstat: add support for diffs relative to a subdirectory
Siddharth Agarwal <sid0@fb.com>
parents: 24422
diff changeset
   136
        for matchroot in match.files():
a0004402776b cmdutil.diffordiffstat: add support for diffs relative to a subdirectory
Siddharth Agarwal <sid0@fb.com>
parents: 24422
diff changeset
   137
            if not matchroot.startswith(relroot):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   138
                ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   139
                    _(b'warning: %s not inside relative root %s\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   140
                    % (uipathfn(pathfn(matchroot)), uirelroot)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   141
                )
24431
a0004402776b cmdutil.diffordiffstat: add support for diffs relative to a subdirectory
Siddharth Agarwal <sid0@fb.com>
parents: 24422
diff changeset
   142
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   143
        relrootmatch = scmutil.match(ctx2, pats=[relroot], default=b'path')
41619
035cae1d197f patch: let caller pass in root-filtering matcher (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41610
diff changeset
   144
        match = matchmod.intersectmatchers(match, relrootmatch)
41620
74f53d3bd685 patch: accept second matcher that applies only to copy sources (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41619
diff changeset
   145
        copysourcematch = relrootmatch
41619
035cae1d197f patch: let caller pass in root-filtering matcher (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41610
diff changeset
   146
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   147
        checkroot = repo.ui.configbool(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   148
            b'devel', b'all-warnings'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   149
        ) or repo.ui.configbool(b'devel', b'check-relroot')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   150
41647
ec37db02fc72 diff: make `hg diff --root=subrepo` work
Martin von Zweigbergk <martinvonz@google.com>
parents: 41646
diff changeset
   151
        def relrootpathfn(f):
41646
d4c9eebdd72d patch: replace "prefix" and "relroot" arguments by "pathfn" (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41630
diff changeset
   152
            if checkroot and not f.startswith(relroot):
d4c9eebdd72d patch: replace "prefix" and "relroot" arguments by "pathfn" (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41630
diff changeset
   153
                raise AssertionError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   154
                    b"file %s doesn't start with relroot %s" % (f, relroot)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   155
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   156
            return f[len(relroot) :]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   157
41647
ec37db02fc72 diff: make `hg diff --root=subrepo` work
Martin von Zweigbergk <martinvonz@google.com>
parents: 41646
diff changeset
   158
        pathfn = compose(relrootpathfn, pathfn)
41646
d4c9eebdd72d patch: replace "prefix" and "relroot" arguments by "pathfn" (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41630
diff changeset
   159
11050
5d35f7d93514 commands: refactor diff --stat and qdiff --stat
Yuya Nishihara <yuya@tcha.org>
parents: 11017
diff changeset
   160
    if stat:
35430
058c725925e3 diff: disable diff.noprefix option for diffstat (issue5759)
Yuya Nishihara <yuya@tcha.org>
parents: 35026
diff changeset
   161
        diffopts = diffopts.copy(context=0, noprefix=False)
11050
5d35f7d93514 commands: refactor diff --stat and qdiff --stat
Yuya Nishihara <yuya@tcha.org>
parents: 11017
diff changeset
   162
        width = 80
5d35f7d93514 commands: refactor diff --stat and qdiff --stat
Yuya Nishihara <yuya@tcha.org>
parents: 11017
diff changeset
   163
        if not ui.plain():
41097
6a63ba61e71f log: fix line wrap on diffstat with -G/--graph (issue5800)
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 40285
diff changeset
   164
            width = ui.termwidth() - graphwidth
41670
db69a763bc89 diff: make --stat respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41655
diff changeset
   165
        # If an explicit --root was given, don't respect ui.relative-paths
db69a763bc89 diff: make --stat respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41655
diff changeset
   166
        if not relroot:
db69a763bc89 diff: make --stat respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41655
diff changeset
   167
            pathfn = compose(scmutil.getuipathfn(repo), pathfn)
35961
0ff41ced4c12 diff: improve ui.write performance when not coloring on Windows
Joerg Sonnenberger <joerg@bec.de>
parents: 35955
diff changeset
   168
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   169
    chunks = ctx2.diff(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   170
        ctx1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   171
        match,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   172
        changes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   173
        opts=diffopts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   174
        pathfn=pathfn,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   175
        copysourcematch=copysourcematch,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   176
        hunksfilterfn=hunksfilterfn,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   177
    )
35961
0ff41ced4c12 diff: improve ui.write performance when not coloring on Windows
Joerg Sonnenberger <joerg@bec.de>
parents: 35955
diff changeset
   178
0ff41ced4c12 diff: improve ui.write performance when not coloring on Windows
Joerg Sonnenberger <joerg@bec.de>
parents: 35955
diff changeset
   179
    if fp is not None or ui.canwritewithoutlabels():
36008
006ff7268c5c diff: remove fp.write() wrapper which drops label argument
Yuya Nishihara <yuya@tcha.org>
parents: 36007
diff changeset
   180
        out = fp or ui
35961
0ff41ced4c12 diff: improve ui.write performance when not coloring on Windows
Joerg Sonnenberger <joerg@bec.de>
parents: 35955
diff changeset
   181
        if stat:
36115
c1104fe76e69 py3: preserve chunks as an iterable of bytes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36008
diff changeset
   182
            chunks = [patch.diffstat(util.iterlines(chunks), width=width)]
35961
0ff41ced4c12 diff: improve ui.write performance when not coloring on Windows
Joerg Sonnenberger <joerg@bec.de>
parents: 35955
diff changeset
   183
        for chunk in util.filechunkiter(util.chunkbuffer(chunks)):
36008
006ff7268c5c diff: remove fp.write() wrapper which drops label argument
Yuya Nishihara <yuya@tcha.org>
parents: 36007
diff changeset
   184
            out.write(chunk)
11050
5d35f7d93514 commands: refactor diff --stat and qdiff --stat
Yuya Nishihara <yuya@tcha.org>
parents: 11017
diff changeset
   185
    else:
35961
0ff41ced4c12 diff: improve ui.write performance when not coloring on Windows
Joerg Sonnenberger <joerg@bec.de>
parents: 35955
diff changeset
   186
        if stat:
0ff41ced4c12 diff: improve ui.write performance when not coloring on Windows
Joerg Sonnenberger <joerg@bec.de>
parents: 35955
diff changeset
   187
            chunks = patch.diffstatui(util.iterlines(chunks), width=width)
0ff41ced4c12 diff: improve ui.write performance when not coloring on Windows
Joerg Sonnenberger <joerg@bec.de>
parents: 35955
diff changeset
   188
        else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   189
            chunks = patch.difflabel(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   190
                lambda chunks, **kwargs: chunks, chunks, opts=diffopts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   191
            )
35961
0ff41ced4c12 diff: improve ui.write performance when not coloring on Windows
Joerg Sonnenberger <joerg@bec.de>
parents: 35955
diff changeset
   192
        if ui.canbatchlabeledwrites():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   193
35961
0ff41ced4c12 diff: improve ui.write performance when not coloring on Windows
Joerg Sonnenberger <joerg@bec.de>
parents: 35955
diff changeset
   194
            def gen():
0ff41ced4c12 diff: improve ui.write performance when not coloring on Windows
Joerg Sonnenberger <joerg@bec.de>
parents: 35955
diff changeset
   195
                for chunk, label in chunks:
0ff41ced4c12 diff: improve ui.write performance when not coloring on Windows
Joerg Sonnenberger <joerg@bec.de>
parents: 35955
diff changeset
   196
                    yield ui.label(chunk, label=label)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   197
35961
0ff41ced4c12 diff: improve ui.write performance when not coloring on Windows
Joerg Sonnenberger <joerg@bec.de>
parents: 35955
diff changeset
   198
            for chunk in util.filechunkiter(util.chunkbuffer(gen())):
36008
006ff7268c5c diff: remove fp.write() wrapper which drops label argument
Yuya Nishihara <yuya@tcha.org>
parents: 36007
diff changeset
   199
                ui.write(chunk)
35961
0ff41ced4c12 diff: improve ui.write performance when not coloring on Windows
Joerg Sonnenberger <joerg@bec.de>
parents: 35955
diff changeset
   200
        else:
0ff41ced4c12 diff: improve ui.write performance when not coloring on Windows
Joerg Sonnenberger <joerg@bec.de>
parents: 35955
diff changeset
   201
            for chunk, label in chunks:
36008
006ff7268c5c diff: remove fp.write() wrapper which drops label argument
Yuya Nishihara <yuya@tcha.org>
parents: 36007
diff changeset
   202
                ui.write(chunk, label=label)
11050
5d35f7d93514 commands: refactor diff --stat and qdiff --stat
Yuya Nishihara <yuya@tcha.org>
parents: 11017
diff changeset
   203
44823
3b7aabd02e11 cleanup: avoid extra node/ctx conversions in logcmdutil.diffordiffstat
Augie Fackler <augie@google.com>
parents: 44345
diff changeset
   204
    node2 = ctx2.node()
42010
db26dbbee74d diff: support diffing explicit files in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 41996
diff changeset
   205
    for subpath, sub in scmutil.itersubrepos(ctx1, ctx2):
db26dbbee74d diff: support diffing explicit files in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 41996
diff changeset
   206
        tempnode2 = node2
db26dbbee74d diff: support diffing explicit files in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 41996
diff changeset
   207
        try:
db26dbbee74d diff: support diffing explicit files in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 41996
diff changeset
   208
            if node2 is not None:
db26dbbee74d diff: support diffing explicit files in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 41996
diff changeset
   209
                tempnode2 = ctx2.substate[subpath][1]
db26dbbee74d diff: support diffing explicit files in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 41996
diff changeset
   210
        except KeyError:
db26dbbee74d diff: support diffing explicit files in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 41996
diff changeset
   211
            # A subrepo that existed in node1 was deleted between node1 and
db26dbbee74d diff: support diffing explicit files in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 41996
diff changeset
   212
            # node2 (inclusive). Thus, ctx2's substate won't contain that
db26dbbee74d diff: support diffing explicit files in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 41996
diff changeset
   213
            # subpath. The best we can do is to ignore it.
db26dbbee74d diff: support diffing explicit files in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 41996
diff changeset
   214
            tempnode2 = None
db26dbbee74d diff: support diffing explicit files in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 41996
diff changeset
   215
        submatch = matchmod.subdirmatcher(subpath, match)
db26dbbee74d diff: support diffing explicit files in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 41996
diff changeset
   216
        subprefix = repo.wvfs.reljoin(prefix, subpath)
db26dbbee74d diff: support diffing explicit files in subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 41996
diff changeset
   217
        if listsubrepos or match.exact(subpath) or any(submatch.files()):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   218
            sub.diff(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   219
                ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   220
                diffopts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   221
                tempnode2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   222
                submatch,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   223
                changes=changes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   224
                stat=stat,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   225
                fp=fp,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   226
                prefix=subprefix,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   227
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   228
12167
d2c5b0927c28 diff: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12164
diff changeset
   229
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48913
diff changeset
   230
class changesetdiffer:
36007
29b83c08afe0 log: pack filematcher and hunksfilter into changesetdiffer object
Yuya Nishihara <yuya@tcha.org>
parents: 36005
diff changeset
   231
    """Generate diff of changeset with pre-configured filtering functions"""
29b83c08afe0 log: pack filematcher and hunksfilter into changesetdiffer object
Yuya Nishihara <yuya@tcha.org>
parents: 36005
diff changeset
   232
29b83c08afe0 log: pack filematcher and hunksfilter into changesetdiffer object
Yuya Nishihara <yuya@tcha.org>
parents: 36005
diff changeset
   233
    def _makefilematcher(self, ctx):
29b83c08afe0 log: pack filematcher and hunksfilter into changesetdiffer object
Yuya Nishihara <yuya@tcha.org>
parents: 36005
diff changeset
   234
        return scmutil.matchall(ctx.repo())
29b83c08afe0 log: pack filematcher and hunksfilter into changesetdiffer object
Yuya Nishihara <yuya@tcha.org>
parents: 36005
diff changeset
   235
29b83c08afe0 log: pack filematcher and hunksfilter into changesetdiffer object
Yuya Nishihara <yuya@tcha.org>
parents: 36005
diff changeset
   236
    def _makehunksfilter(self, ctx):
29b83c08afe0 log: pack filematcher and hunksfilter into changesetdiffer object
Yuya Nishihara <yuya@tcha.org>
parents: 36005
diff changeset
   237
        return None
29b83c08afe0 log: pack filematcher and hunksfilter into changesetdiffer object
Yuya Nishihara <yuya@tcha.org>
parents: 36005
diff changeset
   238
41097
6a63ba61e71f log: fix line wrap on diffstat with -G/--graph (issue5800)
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 40285
diff changeset
   239
    def showdiff(self, ui, ctx, diffopts, graphwidth=0, stat=False):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   240
        diffordiffstat(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   241
            ui,
44823
3b7aabd02e11 cleanup: avoid extra node/ctx conversions in logcmdutil.diffordiffstat
Augie Fackler <augie@google.com>
parents: 44345
diff changeset
   242
            ctx.repo(),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   243
            diffopts,
46498
3caa3698335e log: respect diff.merge in -p output
Martin von Zweigbergk <martinvonz@google.com>
parents: 46497
diff changeset
   244
            diff_parent(ctx),
44823
3b7aabd02e11 cleanup: avoid extra node/ctx conversions in logcmdutil.diffordiffstat
Augie Fackler <augie@google.com>
parents: 44345
diff changeset
   245
            ctx,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   246
            match=self._makefilematcher(ctx),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   247
            stat=stat,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   248
            graphwidth=graphwidth,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   249
            hunksfilterfn=self._makehunksfilter(ctx),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   250
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   251
36007
29b83c08afe0 log: pack filematcher and hunksfilter into changesetdiffer object
Yuya Nishihara <yuya@tcha.org>
parents: 36005
diff changeset
   252
35886
b0014780c7fc logcmdutil: rename classes and functions to conform to our coding style (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35885
diff changeset
   253
def changesetlabels(ctx):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   254
    labels = [b'log.changeset', b'changeset.%s' % ctx.phasestr()]
31698
9b3577796291 cmdutil: add a "changeset.obsolete" label in changeset_printer
Denis Laxalde <denis@laxalde.org>
parents: 31486
diff changeset
   255
    if ctx.obsolete():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   256
        labels.append(b'changeset.obsolete')
33730
52c5ff856b49 context: rename troubled into isunstable
Boris Feld <boris.feld@octobus.net>
parents: 33726
diff changeset
   257
    if ctx.isunstable():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   258
        labels.append(b'changeset.unstable')
33726
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33694
diff changeset
   259
        for instability in ctx.instabilities():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   260
            labels.append(b'instability.%s' % instability)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   261
    return b' '.join(labels)
30694
5289fd78017a cmdutil: extract a _changesetlabels function out of changeset_printer._show()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30615
diff changeset
   262
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   263
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48913
diff changeset
   264
class changesetprinter:
3643
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3531
diff changeset
   265
    '''show changeset information when templating not requested.'''
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3531
diff changeset
   266
36007
29b83c08afe0 log: pack filematcher and hunksfilter into changesetdiffer object
Yuya Nishihara <yuya@tcha.org>
parents: 36005
diff changeset
   267
    def __init__(self, ui, repo, differ=None, diffopts=None, buffered=False):
3643
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3531
diff changeset
   268
        self.ui = ui
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3531
diff changeset
   269
        self.repo = repo
3645
b984dcb1df71 Refactor log ui buffering and patch display
Matt Mackall <mpm@selenic.com>
parents: 3643
diff changeset
   270
        self.buffered = buffered
36007
29b83c08afe0 log: pack filematcher and hunksfilter into changesetdiffer object
Yuya Nishihara <yuya@tcha.org>
parents: 36005
diff changeset
   271
        self._differ = differ or changesetdiffer()
37837
e0f30c91dfd8 log: cache diffopts instance
Yuya Nishihara <yuya@tcha.org>
parents: 37773
diff changeset
   272
        self._diffopts = patch.diffallopts(ui, diffopts)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   273
        self._includestat = diffopts and diffopts.get(b'stat')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   274
        self._includediff = diffopts and diffopts.get(b'patch')
3738
cb48cd27d3f4 use ui buffering in changeset printer
Matt Mackall <mpm@selenic.com>
parents: 3718
diff changeset
   275
        self.header = {}
cb48cd27d3f4 use ui buffering in changeset printer
Matt Mackall <mpm@selenic.com>
parents: 3718
diff changeset
   276
        self.hunk = {}
cb48cd27d3f4 use ui buffering in changeset printer
Matt Mackall <mpm@selenic.com>
parents: 3718
diff changeset
   277
        self.lastheader = None
10152
56284451a22c Added support for templatevar "footer" to cmdutil.py
Robert Bachmann <rbachm@gmail.com>
parents: 10111
diff changeset
   278
        self.footer = None
35212
c7b45db8f317 log: translate column labels at once (issue5750)
Yuya Nishihara <yuya@tcha.org>
parents: 35211
diff changeset
   279
        self._columns = templatekw.getlogcolumns()
3645
b984dcb1df71 Refactor log ui buffering and patch display
Matt Mackall <mpm@selenic.com>
parents: 3643
diff changeset
   280
25763
60c791592aa7 changeset_printer: change flush() to accept ctx instead of rev
Yuya Nishihara <yuya@tcha.org>
parents: 25762
diff changeset
   281
    def flush(self, ctx):
60c791592aa7 changeset_printer: change flush() to accept ctx instead of rev
Yuya Nishihara <yuya@tcha.org>
parents: 25762
diff changeset
   282
        rev = ctx.rev()
3738
cb48cd27d3f4 use ui buffering in changeset printer
Matt Mackall <mpm@selenic.com>
parents: 3718
diff changeset
   283
        if rev in self.header:
cb48cd27d3f4 use ui buffering in changeset printer
Matt Mackall <mpm@selenic.com>
parents: 3718
diff changeset
   284
            h = self.header[rev]
cb48cd27d3f4 use ui buffering in changeset printer
Matt Mackall <mpm@selenic.com>
parents: 3718
diff changeset
   285
            if h != self.lastheader:
cb48cd27d3f4 use ui buffering in changeset printer
Matt Mackall <mpm@selenic.com>
parents: 3718
diff changeset
   286
                self.lastheader = h
cb48cd27d3f4 use ui buffering in changeset printer
Matt Mackall <mpm@selenic.com>
parents: 3718
diff changeset
   287
                self.ui.write(h)
cb48cd27d3f4 use ui buffering in changeset printer
Matt Mackall <mpm@selenic.com>
parents: 3718
diff changeset
   288
            del self.header[rev]
cb48cd27d3f4 use ui buffering in changeset printer
Matt Mackall <mpm@selenic.com>
parents: 3718
diff changeset
   289
        if rev in self.hunk:
cb48cd27d3f4 use ui buffering in changeset printer
Matt Mackall <mpm@selenic.com>
parents: 3718
diff changeset
   290
            self.ui.write(self.hunk[rev])
cb48cd27d3f4 use ui buffering in changeset printer
Matt Mackall <mpm@selenic.com>
parents: 3718
diff changeset
   291
            del self.hunk[rev]
3643
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3531
diff changeset
   292
10152
56284451a22c Added support for templatevar "footer" to cmdutil.py
Robert Bachmann <rbachm@gmail.com>
parents: 10111
diff changeset
   293
    def close(self):
56284451a22c Added support for templatevar "footer" to cmdutil.py
Robert Bachmann <rbachm@gmail.com>
parents: 10111
diff changeset
   294
        if self.footer:
56284451a22c Added support for templatevar "footer" to cmdutil.py
Robert Bachmann <rbachm@gmail.com>
parents: 10111
diff changeset
   295
            self.ui.write(self.footer)
56284451a22c Added support for templatevar "footer" to cmdutil.py
Robert Bachmann <rbachm@gmail.com>
parents: 10111
diff changeset
   296
36003
fcde8946c553 logcmdutil: hold makefilematcher/makehunksfilter() by changesetpriner (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36002
diff changeset
   297
    def show(self, ctx, copies=None, **props):
33100
05906b8e1d23 py3: use pycompat.byteskwargs() to convert kwargs' keys to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33045
diff changeset
   298
        props = pycompat.byteskwargs(props)
3738
cb48cd27d3f4 use ui buffering in changeset printer
Matt Mackall <mpm@selenic.com>
parents: 3718
diff changeset
   299
        if self.buffered:
27107
c57ebef70f6f cmdutil: pass labeled=True to pushbuffer()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27065
diff changeset
   300
            self.ui.pushbuffer(labeled=True)
36003
fcde8946c553 logcmdutil: hold makefilematcher/makehunksfilter() by changesetpriner (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36002
diff changeset
   301
            self._show(ctx, copies, props)
27109
a93d53f79e6e ui: remove labeled argument from popbuffer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27107
diff changeset
   302
            self.hunk[ctx.rev()] = self.ui.popbuffer()
3738
cb48cd27d3f4 use ui buffering in changeset printer
Matt Mackall <mpm@selenic.com>
parents: 3718
diff changeset
   303
        else:
36003
fcde8946c553 logcmdutil: hold makefilematcher/makehunksfilter() by changesetpriner (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36002
diff changeset
   304
            self._show(ctx, copies, props)
34856
890afefa7296 diff: pass a diff hunks filter function from changeset_printer to patch.diff()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34852
diff changeset
   305
36003
fcde8946c553 logcmdutil: hold makefilematcher/makehunksfilter() by changesetpriner (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36002
diff changeset
   306
    def _show(self, ctx, copies, props):
3643
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3531
diff changeset
   307
        '''show a single changeset or file revision'''
7369
87158be081b8 cmdutil: use change contexts for cset-printer and cset-templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7361
diff changeset
   308
        changenode = ctx.node()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   309
        graphwidth = props.get(b'graphwidth', 0)
24584
5a40b5d45396 changeset_printer: display p1rev:p1node with "+" suffix for workingctx
Yuya Nishihara <yuya@tcha.org>
parents: 24583
diff changeset
   310
5a40b5d45396 changeset_printer: display p1rev:p1node with "+" suffix for workingctx
Yuya Nishihara <yuya@tcha.org>
parents: 24583
diff changeset
   311
        if self.ui.quiet:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   312
            self.ui.write(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   313
                b"%s\n" % scmutil.formatchangeid(ctx), label=b'log.node'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   314
            )
24584
5a40b5d45396 changeset_printer: display p1rev:p1node with "+" suffix for workingctx
Yuya Nishihara <yuya@tcha.org>
parents: 24583
diff changeset
   315
            return
5a40b5d45396 changeset_printer: display p1rev:p1node with "+" suffix for workingctx
Yuya Nishihara <yuya@tcha.org>
parents: 24583
diff changeset
   316
35212
c7b45db8f317 log: translate column labels at once (issue5750)
Yuya Nishihara <yuya@tcha.org>
parents: 35211
diff changeset
   317
        columns = self._columns
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   318
        self.ui.write(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   319
            columns[b'changeset'] % scmutil.formatchangeid(ctx),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   320
            label=changesetlabels(ctx),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   321
        )
3643
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3531
diff changeset
   322
23772
07309e527df7 log: use new namespaces api to display names
Sean Farley <sean.michael.farley@gmail.com>
parents: 23735
diff changeset
   323
        # branches are shown first before any other names due to backwards
07309e527df7 log: use new namespaces api to display names
Sean Farley <sean.michael.farley@gmail.com>
parents: 23735
diff changeset
   324
        # compatibility
9637
64425c5a9257 cmdutil: minor refactoring of changeset_printer._show
Adrian Buehlmann <adrian@cadifra.com>
parents: 9547
diff changeset
   325
        branch = ctx.branch()
4176
f9bbcebcacea "default" is the default branch name
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4055
diff changeset
   326
        # don't show the default branch name
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   327
        if branch != b'default':
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   328
            self.ui.write(columns[b'branch'] % branch, label=b'log.branch')
23772
07309e527df7 log: use new namespaces api to display names
Sean Farley <sean.michael.farley@gmail.com>
parents: 23735
diff changeset
   329
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   330
        for nsname, ns in self.repo.names.items():
23772
07309e527df7 log: use new namespaces api to display names
Sean Farley <sean.michael.farley@gmail.com>
parents: 23735
diff changeset
   331
            # branches has special logic already handled above, so here we just
07309e527df7 log: use new namespaces api to display names
Sean Farley <sean.michael.farley@gmail.com>
parents: 23735
diff changeset
   332
            # skip it
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   333
            if nsname == b'branches':
23772
07309e527df7 log: use new namespaces api to display names
Sean Farley <sean.michael.farley@gmail.com>
parents: 23735
diff changeset
   334
                continue
07309e527df7 log: use new namespaces api to display names
Sean Farley <sean.michael.farley@gmail.com>
parents: 23735
diff changeset
   335
            # we will use the templatename as the color name since those two
07309e527df7 log: use new namespaces api to display names
Sean Farley <sean.michael.farley@gmail.com>
parents: 23735
diff changeset
   336
            # should be the same
07309e527df7 log: use new namespaces api to display names
Sean Farley <sean.michael.farley@gmail.com>
parents: 23735
diff changeset
   337
            for name in ns.names(self.repo, changenode):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   338
                self.ui.write(ns.logfmt % name, label=b'log.%s' % ns.colorname)
22765
55dcc7fb731c log: do not hide the public phase in debug mode (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22764
diff changeset
   339
        if self.ui.debugflag:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   340
            self.ui.write(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   341
                columns[b'phase'] % ctx.phasestr(), label=b'log.phase'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   342
            )
26433
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26426
diff changeset
   343
        for pctx in scmutil.meaningfulparents(self.repo, ctx):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   344
            label = b'log.parent changeset.%s' % pctx.phasestr()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   345
            self.ui.write(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   346
                columns[b'parent'] % scmutil.formatchangeid(pctx), label=label
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   347
            )
3643
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3531
diff changeset
   348
39796
94ca3579e84e log: fill in pseudo rev and node as wdir() manifest identifiers
Yuya Nishihara <yuya@tcha.org>
parents: 39795
diff changeset
   349
        if self.ui.debugflag:
9547
f57640bf10d4 cmdutil: changeset_printer: use methods of filectx/changectx.
Greg Ward <greg-hg@gerg.ca>
parents: 9536
diff changeset
   350
            mnode = ctx.manifestnode()
39796
94ca3579e84e log: fill in pseudo rev and node as wdir() manifest identifiers
Yuya Nishihara <yuya@tcha.org>
parents: 39795
diff changeset
   351
            if mnode is None:
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
   352
                mnode = self.repo.nodeconstants.wdirid
39796
94ca3579e84e log: fill in pseudo rev and node as wdir() manifest identifiers
Yuya Nishihara <yuya@tcha.org>
parents: 39795
diff changeset
   353
                mrev = wdirrev
94ca3579e84e log: fill in pseudo rev and node as wdir() manifest identifiers
Yuya Nishihara <yuya@tcha.org>
parents: 39795
diff changeset
   354
            else:
94ca3579e84e log: fill in pseudo rev and node as wdir() manifest identifiers
Yuya Nishihara <yuya@tcha.org>
parents: 39795
diff changeset
   355
                mrev = self.repo.manifestlog.rev(mnode)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   356
            self.ui.write(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   357
                columns[b'manifest']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   358
                % scmutil.formatrevnode(self.ui, mrev, mnode),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   359
                label=b'ui.debug log.manifest',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   360
            )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   361
        self.ui.write(columns[b'user'] % ctx.user(), label=b'log.user')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   362
        self.ui.write(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   363
            columns[b'date'] % dateutil.datestr(ctx.date()), label=b'log.date'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   364
        )
3643
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3531
diff changeset
   365
33730
52c5ff856b49 context: rename troubled into isunstable
Boris Feld <boris.feld@octobus.net>
parents: 33726
diff changeset
   366
        if ctx.isunstable():
33726
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33694
diff changeset
   367
            instabilities = ctx.instabilities()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   368
            self.ui.write(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   369
                columns[b'instability'] % b', '.join(instabilities),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   370
                label=b'log.instability',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   371
            )
30695
f05ede08dcf7 cmdutil: add support for evolution "troubles" display in changeset_printer
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30694
diff changeset
   372
34852
d45236f3d38e log: add obsfate by default in changeset printer
Boris Feld <boris.feld@octobus.net>
parents: 34794
diff changeset
   373
        elif ctx.obsolete():
d45236f3d38e log: add obsfate by default in changeset printer
Boris Feld <boris.feld@octobus.net>
parents: 34794
diff changeset
   374
            self._showobsfate(ctx)
d45236f3d38e log: add obsfate by default in changeset printer
Boris Feld <boris.feld@octobus.net>
parents: 34794
diff changeset
   375
33154
4ecc6047d45f log: add an extension hook-point in changeset_printer
Boris Feld <boris.feld@octobus.net>
parents: 33102
diff changeset
   376
        self._exthook(ctx)
4ecc6047d45f log: add an extension hook-point in changeset_printer
Boris Feld <boris.feld@octobus.net>
parents: 33102
diff changeset
   377
3643
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3531
diff changeset
   378
        if self.ui.debugflag:
43648
4093fc1777c2 logcmdutil: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43630
diff changeset
   379
            files = ctx.p1().status(ctx)
4093fc1777c2 logcmdutil: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43630
diff changeset
   380
            for key, value in zip(
4093fc1777c2 logcmdutil: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43630
diff changeset
   381
                [b'files', b'files+', b'files-'],
4093fc1777c2 logcmdutil: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43630
diff changeset
   382
                [files.modified, files.added, files.removed],
4093fc1777c2 logcmdutil: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43630
diff changeset
   383
            ):
3643
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3531
diff changeset
   384
                if value:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   385
                    self.ui.write(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   386
                        columns[key] % b" ".join(value),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   387
                        label=b'ui.debug log.files',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   388
                    )
9547
f57640bf10d4 cmdutil: changeset_printer: use methods of filectx/changectx.
Greg Ward <greg-hg@gerg.ca>
parents: 9536
diff changeset
   389
        elif ctx.files() and self.ui.verbose:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   390
            self.ui.write(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   391
                columns[b'files'] % b" ".join(ctx.files()),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   392
                label=b'ui.note log.files',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   393
            )
3643
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3531
diff changeset
   394
        if copies and self.ui.verbose:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   395
            copies = [b'%s (%s)' % c for c in copies]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   396
            self.ui.write(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   397
                columns[b'copies'] % b' '.join(copies),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   398
                label=b'ui.note log.copies',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   399
            )
3643
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3531
diff changeset
   400
9637
64425c5a9257 cmdutil: minor refactoring of changeset_printer._show
Adrian Buehlmann <adrian@cadifra.com>
parents: 9547
diff changeset
   401
        extra = ctx.extra()
3643
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3531
diff changeset
   402
        if extra and self.ui.debugflag:
8209
a1a5a57efe90 replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents: 8189
diff changeset
   403
            for key, value in sorted(extra.items()):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   404
                self.ui.write(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   405
                    columns[b'extra'] % (key, stringutil.escapestr(value)),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   406
                    label=b'ui.debug log.extra',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   407
                )
3643
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3531
diff changeset
   408
9547
f57640bf10d4 cmdutil: changeset_printer: use methods of filectx/changectx.
Greg Ward <greg-hg@gerg.ca>
parents: 9536
diff changeset
   409
        description = ctx.description().strip()
3643
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3531
diff changeset
   410
        if description:
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3531
diff changeset
   411
            if self.ui.verbose:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   412
                self.ui.write(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   413
                    _(b"description:\n"), label=b'ui.note log.description'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   414
                )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   415
                self.ui.write(description, label=b'ui.note log.description')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   416
                self.ui.write(b"\n\n")
3643
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3531
diff changeset
   417
            else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   418
                self.ui.write(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   419
                    columns[b'summary'] % description.splitlines()[0],
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   420
                    label=b'log.summary',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   421
                )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   422
        self.ui.write(b"\n")
3643
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3531
diff changeset
   423
41097
6a63ba61e71f log: fix line wrap on diffstat with -G/--graph (issue5800)
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 40285
diff changeset
   424
        self._showpatch(ctx, graphwidth)
27065
93bcc73df8d5 cmdutil.changeset_printer: pass context into showpatch()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26938
diff changeset
   425
34852
d45236f3d38e log: add obsfate by default in changeset printer
Boris Feld <boris.feld@octobus.net>
parents: 34794
diff changeset
   426
    def _showobsfate(self, ctx):
36517
69477bac8926 log: do not invoke templatekw.showobsfate() as a function
Yuya Nishihara <yuya@tcha.org>
parents: 36513
diff changeset
   427
        # TODO: do not depend on templater
69477bac8926 log: do not invoke templatekw.showobsfate() as a function
Yuya Nishihara <yuya@tcha.org>
parents: 36513
diff changeset
   428
        tres = formatter.templateresources(self.repo.ui, self.repo)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   429
        t = formatter.maketemplater(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   430
            self.repo.ui,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   431
            b'{join(obsfate, "\n")}',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   432
            defaults=templatekw.keywords,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   433
            resources=tres,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   434
        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   435
        obsfate = t.renderdefault({b'ctx': ctx}).splitlines()
34852
d45236f3d38e log: add obsfate by default in changeset printer
Boris Feld <boris.feld@octobus.net>
parents: 34794
diff changeset
   436
d45236f3d38e log: add obsfate by default in changeset printer
Boris Feld <boris.feld@octobus.net>
parents: 34794
diff changeset
   437
        if obsfate:
d45236f3d38e log: add obsfate by default in changeset printer
Boris Feld <boris.feld@octobus.net>
parents: 34794
diff changeset
   438
            for obsfateline in obsfate:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   439
                self.ui.write(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   440
                    self._columns[b'obsolete'] % obsfateline,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   441
                    label=b'log.obsfate',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   442
                )
34852
d45236f3d38e log: add obsfate by default in changeset printer
Boris Feld <boris.feld@octobus.net>
parents: 34794
diff changeset
   443
33154
4ecc6047d45f log: add an extension hook-point in changeset_printer
Boris Feld <boris.feld@octobus.net>
parents: 33102
diff changeset
   444
    def _exthook(self, ctx):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45900
diff changeset
   445
        """empty method used by extension as a hook point"""
33154
4ecc6047d45f log: add an extension hook-point in changeset_printer
Boris Feld <boris.feld@octobus.net>
parents: 33102
diff changeset
   446
41097
6a63ba61e71f log: fix line wrap on diffstat with -G/--graph (issue5800)
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 40285
diff changeset
   447
    def _showpatch(self, ctx, graphwidth=0):
37838
3fe1c9263024 log: consume --stat/patch options at constructor of changesetprinter
Yuya Nishihara <yuya@tcha.org>
parents: 37837
diff changeset
   448
        if self._includestat:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   449
            self._differ.showdiff(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   450
                self.ui, ctx, self._diffopts, graphwidth, stat=True
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   451
            )
37838
3fe1c9263024 log: consume --stat/patch options at constructor of changesetprinter
Yuya Nishihara <yuya@tcha.org>
parents: 37837
diff changeset
   452
        if self._includestat and self._includediff:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   453
            self.ui.write(b"\n")
37838
3fe1c9263024 log: consume --stat/patch options at constructor of changesetprinter
Yuya Nishihara <yuya@tcha.org>
parents: 37837
diff changeset
   454
        if self._includediff:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   455
            self._differ.showdiff(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   456
                self.ui, ctx, self._diffopts, graphwidth, stat=False
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   457
            )
37838
3fe1c9263024 log: consume --stat/patch options at constructor of changesetprinter
Yuya Nishihara <yuya@tcha.org>
parents: 37837
diff changeset
   458
        if self._includestat or self._includediff:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   459
            self.ui.write(b"\n")
3645
b984dcb1df71 Refactor log ui buffering and patch display
Matt Mackall <mpm@selenic.com>
parents: 3643
diff changeset
   460
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   461
37773
0f084741cd66 logcmdutil: pass formatter to jsonchangeset as argument
Yuya Nishihara <yuya@tcha.org>
parents: 37772
diff changeset
   462
class changesetformatter(changesetprinter):
0f084741cd66 logcmdutil: pass formatter to jsonchangeset as argument
Yuya Nishihara <yuya@tcha.org>
parents: 37772
diff changeset
   463
    """Format changeset information by generic formatter"""
22427
bd15932846a4 cmdutil: add json style to log-like commands
Matt Mackall <mpm@selenic.com>
parents: 22405
diff changeset
   464
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   465
    def __init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   466
        self, ui, repo, fm, differ=None, diffopts=None, buffered=False
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   467
    ):
36007
29b83c08afe0 log: pack filematcher and hunksfilter into changesetdiffer object
Yuya Nishihara <yuya@tcha.org>
parents: 36005
diff changeset
   468
        changesetprinter.__init__(self, ui, repo, differ, diffopts, buffered)
37837
e0f30c91dfd8 log: cache diffopts instance
Yuya Nishihara <yuya@tcha.org>
parents: 37773
diff changeset
   469
        self._diffopts = patch.difffeatureopts(ui, diffopts, git=True)
37773
0f084741cd66 logcmdutil: pass formatter to jsonchangeset as argument
Yuya Nishihara <yuya@tcha.org>
parents: 37772
diff changeset
   470
        self._fm = fm
22427
bd15932846a4 cmdutil: add json style to log-like commands
Matt Mackall <mpm@selenic.com>
parents: 22405
diff changeset
   471
bd15932846a4 cmdutil: add json style to log-like commands
Matt Mackall <mpm@selenic.com>
parents: 22405
diff changeset
   472
    def close(self):
37772
814151cd8c4a logcmdutil: rewrite jsonchangeset printer to be backed by jsonformatter
Yuya Nishihara <yuya@tcha.org>
parents: 37771
diff changeset
   473
        self._fm.end()
22427
bd15932846a4 cmdutil: add json style to log-like commands
Matt Mackall <mpm@selenic.com>
parents: 22405
diff changeset
   474
36003
fcde8946c553 logcmdutil: hold makefilematcher/makehunksfilter() by changesetpriner (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36002
diff changeset
   475
    def _show(self, ctx, copies, props):
22427
bd15932846a4 cmdutil: add json style to log-like commands
Matt Mackall <mpm@selenic.com>
parents: 22405
diff changeset
   476
        '''show a single changeset or file revision'''
37772
814151cd8c4a logcmdutil: rewrite jsonchangeset printer to be backed by jsonformatter
Yuya Nishihara <yuya@tcha.org>
parents: 37771
diff changeset
   477
        fm = self._fm
814151cd8c4a logcmdutil: rewrite jsonchangeset printer to be backed by jsonformatter
Yuya Nishihara <yuya@tcha.org>
parents: 37771
diff changeset
   478
        fm.startitem()
39705
fa681452b249 log: make changesetformatter pass in changectx to formatter
Yuya Nishihara <yuya@tcha.org>
parents: 38570
diff changeset
   479
        fm.context(ctx=ctx)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   480
        fm.data(rev=scmutil.intrev(ctx), node=fm.hexfunc(scmutil.binnode(ctx)))
22427
bd15932846a4 cmdutil: add json style to log-like commands
Matt Mackall <mpm@selenic.com>
parents: 22405
diff changeset
   481
43102
829088e87032 log: populate keywords if specified in custom -Tjson(...) or -Tcbor(...)
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
   482
        datahint = fm.datahint()
829088e87032 log: populate keywords if specified in custom -Tjson(...) or -Tcbor(...)
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
   483
        if self.ui.quiet and not datahint:
22427
bd15932846a4 cmdutil: add json style to log-like commands
Matt Mackall <mpm@selenic.com>
parents: 22405
diff changeset
   484
            return
bd15932846a4 cmdutil: add json style to log-like commands
Matt Mackall <mpm@selenic.com>
parents: 22405
diff changeset
   485
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   486
        fm.data(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   487
            branch=ctx.branch(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   488
            phase=ctx.phasestr(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   489
            user=ctx.user(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   490
            date=fm.formatdate(ctx.date()),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   491
            desc=ctx.description(),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   492
            bookmarks=fm.formatlist(ctx.bookmarks(), name=b'bookmark'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   493
            tags=fm.formatlist(ctx.tags(), name=b'tag'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   494
            parents=fm.formatlist(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   495
                [fm.hexfunc(c.node()) for c in ctx.parents()], name=b'node'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   496
            ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   497
        )
22427
bd15932846a4 cmdutil: add json style to log-like commands
Matt Mackall <mpm@selenic.com>
parents: 22405
diff changeset
   498
43102
829088e87032 log: populate keywords if specified in custom -Tjson(...) or -Tcbor(...)
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
   499
        if self.ui.debugflag or b'manifest' in datahint:
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
   500
            fm.data(
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
   501
                manifest=fm.hexfunc(
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
   502
                    ctx.manifestnode() or self.repo.nodeconstants.wdirid
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
   503
                )
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
   504
            )
43102
829088e87032 log: populate keywords if specified in custom -Tjson(...) or -Tcbor(...)
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
   505
        if self.ui.debugflag or b'extra' in datahint:
829088e87032 log: populate keywords if specified in custom -Tjson(...) or -Tcbor(...)
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
   506
            fm.data(extra=fm.formatdict(ctx.extra()))
22427
bd15932846a4 cmdutil: add json style to log-like commands
Matt Mackall <mpm@selenic.com>
parents: 22405
diff changeset
   507
43102
829088e87032 log: populate keywords if specified in custom -Tjson(...) or -Tcbor(...)
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
   508
        if (
829088e87032 log: populate keywords if specified in custom -Tjson(...) or -Tcbor(...)
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
   509
            self.ui.debugflag
829088e87032 log: populate keywords if specified in custom -Tjson(...) or -Tcbor(...)
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
   510
            or b'modified' in datahint
829088e87032 log: populate keywords if specified in custom -Tjson(...) or -Tcbor(...)
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
   511
            or b'added' in datahint
829088e87032 log: populate keywords if specified in custom -Tjson(...) or -Tcbor(...)
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
   512
            or b'removed' in datahint
829088e87032 log: populate keywords if specified in custom -Tjson(...) or -Tcbor(...)
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
   513
        ):
23734
f4e6475950f1 cmdutil.jsonchangeset: properly compute added and removed files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23501
diff changeset
   514
            files = ctx.p1().status(ctx)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   515
            fm.data(
43648
4093fc1777c2 logcmdutil: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43630
diff changeset
   516
                modified=fm.formatlist(files.modified, name=b'file'),
4093fc1777c2 logcmdutil: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43630
diff changeset
   517
                added=fm.formatlist(files.added, name=b'file'),
4093fc1777c2 logcmdutil: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43630
diff changeset
   518
                removed=fm.formatlist(files.removed, name=b'file'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   519
            )
22427
bd15932846a4 cmdutil: add json style to log-like commands
Matt Mackall <mpm@selenic.com>
parents: 22405
diff changeset
   520
43102
829088e87032 log: populate keywords if specified in custom -Tjson(...) or -Tcbor(...)
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
   521
        verbose = not self.ui.debugflag and self.ui.verbose
829088e87032 log: populate keywords if specified in custom -Tjson(...) or -Tcbor(...)
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
   522
        if verbose or b'files' in datahint:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   523
            fm.data(files=fm.formatlist(ctx.files(), name=b'file'))
43102
829088e87032 log: populate keywords if specified in custom -Tjson(...) or -Tcbor(...)
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
   524
        if verbose and copies or b'copies' in datahint:
829088e87032 log: populate keywords if specified in custom -Tjson(...) or -Tcbor(...)
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
   525
            fm.data(
829088e87032 log: populate keywords if specified in custom -Tjson(...) or -Tcbor(...)
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
   526
                copies=fm.formatdict(copies or {}, key=b'name', value=b'source')
829088e87032 log: populate keywords if specified in custom -Tjson(...) or -Tcbor(...)
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
   527
            )
22427
bd15932846a4 cmdutil: add json style to log-like commands
Matt Mackall <mpm@selenic.com>
parents: 22405
diff changeset
   528
43102
829088e87032 log: populate keywords if specified in custom -Tjson(...) or -Tcbor(...)
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
   529
        if self._includestat or b'diffstat' in datahint:
36004
d4c210ee894f logcmdutil: unindent diff generator of changesetprinter
Yuya Nishihara <yuya@tcha.org>
parents: 36003
diff changeset
   530
            self.ui.pushbuffer()
37837
e0f30c91dfd8 log: cache diffopts instance
Yuya Nishihara <yuya@tcha.org>
parents: 37773
diff changeset
   531
            self._differ.showdiff(self.ui, ctx, self._diffopts, stat=True)
37772
814151cd8c4a logcmdutil: rewrite jsonchangeset printer to be backed by jsonformatter
Yuya Nishihara <yuya@tcha.org>
parents: 37771
diff changeset
   532
            fm.data(diffstat=self.ui.popbuffer())
43102
829088e87032 log: populate keywords if specified in custom -Tjson(...) or -Tcbor(...)
Yuya Nishihara <yuya@tcha.org>
parents: 43100
diff changeset
   533
        if self._includediff or b'diff' in datahint:
36004
d4c210ee894f logcmdutil: unindent diff generator of changesetprinter
Yuya Nishihara <yuya@tcha.org>
parents: 36003
diff changeset
   534
            self.ui.pushbuffer()
37837
e0f30c91dfd8 log: cache diffopts instance
Yuya Nishihara <yuya@tcha.org>
parents: 37773
diff changeset
   535
            self._differ.showdiff(self.ui, ctx, self._diffopts, stat=False)
37772
814151cd8c4a logcmdutil: rewrite jsonchangeset printer to be backed by jsonformatter
Yuya Nishihara <yuya@tcha.org>
parents: 37771
diff changeset
   536
            fm.data(diff=self.ui.popbuffer())
4825
3cf94964c56b hg log: Move filtering implicit parents to own method and use it in templater.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4824
diff changeset
   537
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   538
35886
b0014780c7fc logcmdutil: rename classes and functions to conform to our coding style (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35885
diff changeset
   539
class changesettemplater(changesetprinter):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45900
diff changeset
   540
    """format changeset information.
35107
b22a0d9e0a83 docs: add args/returns docs for some cmdutil, context, and registrar functions
rlevasseur@google.com
parents: 35007
diff changeset
   541
b22a0d9e0a83 docs: add args/returns docs for some cmdutil, context, and registrar functions
rlevasseur@google.com
parents: 35007
diff changeset
   542
    Note: there are a variety of convenience functions to build a
35886
b0014780c7fc logcmdutil: rename classes and functions to conform to our coding style (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35885
diff changeset
   543
    changesettemplater for common cases. See functions such as:
35887
572f36e9a780 logcmdutil: drop redundant "log" from function names (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35886
diff changeset
   544
    maketemplater, changesetdisplayer, buildcommittemplate, or other
35107
b22a0d9e0a83 docs: add args/returns docs for some cmdutil, context, and registrar functions
rlevasseur@google.com
parents: 35007
diff changeset
   545
    functions that use changesest_templater.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45900
diff changeset
   546
    """
3643
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3531
diff changeset
   547
33045
99c6c9fa9e6d cmdutil: use named arguments for changeset_templater.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32953
diff changeset
   548
    # Arguments before "buffered" used to be positional. Consider not
99c6c9fa9e6d cmdutil: use named arguments for changeset_templater.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32953
diff changeset
   549
    # adding/removing arguments before "buffered" to not break callers.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   550
    def __init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   551
        self, ui, repo, tmplspec, differ=None, diffopts=None, buffered=False
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   552
    ):
36007
29b83c08afe0 log: pack filematcher and hunksfilter into changesetdiffer object
Yuya Nishihara <yuya@tcha.org>
parents: 36005
diff changeset
   553
        changesetprinter.__init__(self, ui, repo, differ, diffopts, buffered)
37072
d64ae4fef471 log: do no expect templateresources() returning a dict
Yuya Nishihara <yuya@tcha.org>
parents: 36989
diff changeset
   554
        # tres is shared with _graphnodeformatter()
d64ae4fef471 log: do no expect templateresources() returning a dict
Yuya Nishihara <yuya@tcha.org>
parents: 36989
diff changeset
   555
        self._tresources = tres = formatter.templateresources(ui, repo)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   556
        self.t = formatter.loadtemplater(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   557
            ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   558
            tmplspec,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   559
            defaults=templatekw.keywords,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   560
            resources=tres,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   561
            cache=templatekw.defaulttempl,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   562
        )
31807
e6eb86b154c5 templater: provide loop counter as "index" keyword
Yuya Nishihara <yuya@tcha.org>
parents: 31698
diff changeset
   563
        self._counter = itertools.count()
3643
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3531
diff changeset
   564
32842
97a4d09f5140 changeset_templater: render template specified by templatespec tuple
Yuya Nishihara <yuya@tcha.org>
parents: 32840
diff changeset
   565
        self._tref = tmplspec.ref
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   566
        self._parts = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   567
            b'header': b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   568
            b'footer': b'',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   569
            tmplspec.ref: tmplspec.ref,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   570
            b'docheader': b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   571
            b'docfooter': b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   572
            b'separator': b'',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   573
        }
32947
3f07f12c6e10 changeset_templater: do not enable verbosity postfix for [templates] section
Yuya Nishihara <yuya@tcha.org>
parents: 32946
diff changeset
   574
        if tmplspec.mapfile:
3f07f12c6e10 changeset_templater: do not enable verbosity postfix for [templates] section
Yuya Nishihara <yuya@tcha.org>
parents: 32946
diff changeset
   575
            # find correct templates for current mode, for backward
3f07f12c6e10 changeset_templater: do not enable verbosity postfix for [templates] section
Yuya Nishihara <yuya@tcha.org>
parents: 32946
diff changeset
   576
            # compatibility with 'log -v/-q/--debug' using a mapfile
3f07f12c6e10 changeset_templater: do not enable verbosity postfix for [templates] section
Yuya Nishihara <yuya@tcha.org>
parents: 32946
diff changeset
   577
            tmplmodes = [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   578
                (True, b''),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   579
                (self.ui.verbose, b'_verbose'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   580
                (self.ui.quiet, b'_quiet'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   581
                (self.ui.debugflag, b'_debug'),
32947
3f07f12c6e10 changeset_templater: do not enable verbosity postfix for [templates] section
Yuya Nishihara <yuya@tcha.org>
parents: 32946
diff changeset
   582
            ]
3f07f12c6e10 changeset_templater: do not enable verbosity postfix for [templates] section
Yuya Nishihara <yuya@tcha.org>
parents: 32946
diff changeset
   583
            for mode, postfix in tmplmodes:
3f07f12c6e10 changeset_templater: do not enable verbosity postfix for [templates] section
Yuya Nishihara <yuya@tcha.org>
parents: 32946
diff changeset
   584
                for t in self._parts:
3f07f12c6e10 changeset_templater: do not enable verbosity postfix for [templates] section
Yuya Nishihara <yuya@tcha.org>
parents: 32946
diff changeset
   585
                    cur = t + postfix
3f07f12c6e10 changeset_templater: do not enable verbosity postfix for [templates] section
Yuya Nishihara <yuya@tcha.org>
parents: 32946
diff changeset
   586
                    if mode and cur in self.t:
3f07f12c6e10 changeset_templater: do not enable verbosity postfix for [templates] section
Yuya Nishihara <yuya@tcha.org>
parents: 32946
diff changeset
   587
                        self._parts[t] = cur
32953
6d79e9109908 changeset_templater: backport parts map of [templates] section from formatter
Yuya Nishihara <yuya@tcha.org>
parents: 32951
diff changeset
   588
        else:
6d79e9109908 changeset_templater: backport parts map of [templates] section from formatter
Yuya Nishihara <yuya@tcha.org>
parents: 32951
diff changeset
   589
            partnames = [p for p in self._parts.keys() if p != tmplspec.ref]
6d79e9109908 changeset_templater: backport parts map of [templates] section from formatter
Yuya Nishihara <yuya@tcha.org>
parents: 32951
diff changeset
   590
            m = formatter.templatepartsmap(tmplspec, self.t, partnames)
6d79e9109908 changeset_templater: backport parts map of [templates] section from formatter
Yuya Nishihara <yuya@tcha.org>
parents: 32951
diff changeset
   591
            self._parts.update(m)
26086
3670efdc7088 templater: move verbosity-to-template matcher to constructor
Matt Mackall <mpm@selenic.com>
parents: 26085
diff changeset
   592
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   593
        if self._parts[b'docheader']:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   594
            self.ui.write(self.t.render(self._parts[b'docheader'], {}))
26222
3095b1027661 templater: add new docheader/footer components for XML (issue4135)
Matt Mackall <mpm@selenic.com>
parents: 26206
diff changeset
   595
3095b1027661 templater: add new docheader/footer components for XML (issue4135)
Matt Mackall <mpm@selenic.com>
parents: 26206
diff changeset
   596
    def close(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   597
        if self._parts[b'docfooter']:
26222
3095b1027661 templater: add new docheader/footer components for XML (issue4135)
Matt Mackall <mpm@selenic.com>
parents: 26206
diff changeset
   598
            if not self.footer:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   599
                self.footer = b""
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   600
            self.footer += self.t.render(self._parts[b'docfooter'], {})
35886
b0014780c7fc logcmdutil: rename classes and functions to conform to our coding style (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35885
diff changeset
   601
        return super(changesettemplater, self).close()
26222
3095b1027661 templater: add new docheader/footer components for XML (issue4135)
Matt Mackall <mpm@selenic.com>
parents: 26206
diff changeset
   602
36003
fcde8946c553 logcmdutil: hold makefilematcher/makehunksfilter() by changesetpriner (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36002
diff changeset
   603
    def _show(self, ctx, copies, props):
3643
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3531
diff changeset
   604
        '''show a single changeset or file revision'''
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3531
diff changeset
   605
        props = props.copy()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   606
        props[b'ctx'] = ctx
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   607
        props[b'index'] = index = next(self._counter)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   608
        props[b'revcache'] = {b'copies': copies}
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   609
        graphwidth = props.get(b'graphwidth', 0)
3643
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3531
diff changeset
   610
32951
050efe9a1644 changeset_templater: backport separator template from formatter
Yuya Nishihara <yuya@tcha.org>
parents: 32947
diff changeset
   611
        # write separator, which wouldn't work well with the header part below
050efe9a1644 changeset_templater: backport separator template from formatter
Yuya Nishihara <yuya@tcha.org>
parents: 32947
diff changeset
   612
        # since there's inherently a conflict between header (across items) and
050efe9a1644 changeset_templater: backport separator template from formatter
Yuya Nishihara <yuya@tcha.org>
parents: 32947
diff changeset
   613
        # separator (per item)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   614
        if self._parts[b'separator'] and index > 0:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   615
            self.ui.write(self.t.render(self._parts[b'separator'], {}))
32951
050efe9a1644 changeset_templater: backport separator template from formatter
Yuya Nishihara <yuya@tcha.org>
parents: 32947
diff changeset
   616
28837
d54a7410307f templater: drop deprecated handling of KeyError from changeset_templater
Yuya Nishihara <yuya@tcha.org>
parents: 28815
diff changeset
   617
        # write header
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   618
        if self._parts[b'header']:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   619
            h = self.t.render(self._parts[b'header'], props)
28837
d54a7410307f templater: drop deprecated handling of KeyError from changeset_templater
Yuya Nishihara <yuya@tcha.org>
parents: 28815
diff changeset
   620
            if self.buffered:
d54a7410307f templater: drop deprecated handling of KeyError from changeset_templater
Yuya Nishihara <yuya@tcha.org>
parents: 28815
diff changeset
   621
                self.header[ctx.rev()] = h
d54a7410307f templater: drop deprecated handling of KeyError from changeset_templater
Yuya Nishihara <yuya@tcha.org>
parents: 28815
diff changeset
   622
            else:
d54a7410307f templater: drop deprecated handling of KeyError from changeset_templater
Yuya Nishihara <yuya@tcha.org>
parents: 28815
diff changeset
   623
                if self.lastheader != h:
d54a7410307f templater: drop deprecated handling of KeyError from changeset_templater
Yuya Nishihara <yuya@tcha.org>
parents: 28815
diff changeset
   624
                    self.lastheader = h
d54a7410307f templater: drop deprecated handling of KeyError from changeset_templater
Yuya Nishihara <yuya@tcha.org>
parents: 28815
diff changeset
   625
                    self.ui.write(h)
d54a7410307f templater: drop deprecated handling of KeyError from changeset_templater
Yuya Nishihara <yuya@tcha.org>
parents: 28815
diff changeset
   626
d54a7410307f templater: drop deprecated handling of KeyError from changeset_templater
Yuya Nishihara <yuya@tcha.org>
parents: 28815
diff changeset
   627
        # write changeset metadata, then patch if requested
32842
97a4d09f5140 changeset_templater: render template specified by templatespec tuple
Yuya Nishihara <yuya@tcha.org>
parents: 32840
diff changeset
   628
        key = self._parts[self._tref]
36989
de117f579431 templater: factor out helper that renders named template as string
Yuya Nishihara <yuya@tcha.org>
parents: 36988
diff changeset
   629
        self.ui.write(self.t.render(key, props))
43830
6331a6fc3304 logcmdutil: call _exthook() in changesettemplater
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43793
diff changeset
   630
        self._exthook(ctx)
41097
6a63ba61e71f log: fix line wrap on diffstat with -G/--graph (issue5800)
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 40285
diff changeset
   631
        self._showpatch(ctx, graphwidth)
28837
d54a7410307f templater: drop deprecated handling of KeyError from changeset_templater
Yuya Nishihara <yuya@tcha.org>
parents: 28815
diff changeset
   632
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   633
        if self._parts[b'footer']:
28837
d54a7410307f templater: drop deprecated handling of KeyError from changeset_templater
Yuya Nishihara <yuya@tcha.org>
parents: 28815
diff changeset
   634
            if not self.footer:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   635
                self.footer = self.t.render(self._parts[b'footer'], props)
3643
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3531
diff changeset
   636
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   637
35887
572f36e9a780 logcmdutil: drop redundant "log" from function names (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35886
diff changeset
   638
def templatespec(tmpl, mapfile):
45265
dfb67cd1da7f templatespec: logcmdutil.templatespec() gets either template or mapfile
Martin von Zweigbergk <martinvonz@google.com>
parents: 44823
diff changeset
   639
    assert not (tmpl and mapfile)
32875
c8f2cf18b82e formatter: load templates section like a map file
Yuya Nishihara <yuya@tcha.org>
parents: 32873
diff changeset
   640
    if mapfile:
45265
dfb67cd1da7f templatespec: logcmdutil.templatespec() gets either template or mapfile
Martin von Zweigbergk <martinvonz@google.com>
parents: 44823
diff changeset
   641
        return formatter.mapfile_templatespec(b'changeset', mapfile)
32875
c8f2cf18b82e formatter: load templates section like a map file
Yuya Nishihara <yuya@tcha.org>
parents: 32873
diff changeset
   642
    else:
45265
dfb67cd1da7f templatespec: logcmdutil.templatespec() gets either template or mapfile
Martin von Zweigbergk <martinvonz@google.com>
parents: 44823
diff changeset
   643
        return formatter.literal_templatespec(tmpl)
32838
615ec3f14aa9 formatter: wrap (tmpl, mapfile) by named tuple
Yuya Nishihara <yuya@tcha.org>
parents: 32837
diff changeset
   644
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   645
35887
572f36e9a780 logcmdutil: drop redundant "log" from function names (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35886
diff changeset
   646
def _lookuptemplate(ui, tmpl, style):
32835
9d76812f9b0b formatter: document lookuptemplate()
Yuya Nishihara <yuya@tcha.org>
parents: 32834
diff changeset
   647
    """Find the template matching the given template spec or style
9d76812f9b0b formatter: document lookuptemplate()
Yuya Nishihara <yuya@tcha.org>
parents: 32834
diff changeset
   648
9d76812f9b0b formatter: document lookuptemplate()
Yuya Nishihara <yuya@tcha.org>
parents: 32834
diff changeset
   649
    See formatter.lookuptemplate() for details.
20666
e3eb480a9391 cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents: 20604
diff changeset
   650
    """
e3eb480a9391 cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents: 20604
diff changeset
   651
e3eb480a9391 cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents: 20604
diff changeset
   652
    # ui settings
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   653
    if not tmpl and not style:  # template are stronger than style
45765
ed84a4d48910 config: add a new [command-templates] section for templates defined by hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 45651
diff changeset
   654
        tmpl = ui.config(b'command-templates', b'log')
20666
e3eb480a9391 cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents: 20604
diff changeset
   655
        if tmpl:
45267
c1915cfa8080 templatespec: use new factory functions in logcmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45266
diff changeset
   656
            return formatter.literal_templatespec(templater.unquotestring(tmpl))
20666
e3eb480a9391 cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents: 20604
diff changeset
   657
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   658
            style = util.expandpath(ui.config(b'ui', b'style'))
20666
e3eb480a9391 cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents: 20604
diff changeset
   659
22582
4fe5fa49eac8 templater: fix precedence of --style and --template options
Yuya Nishihara <yuya@tcha.org>
parents: 22303
diff changeset
   660
    if not tmpl and style:
20666
e3eb480a9391 cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents: 20604
diff changeset
   661
        mapfile = style
45310
f3481e4fcc3a templater: pass opened file-like object to templatespec
Martin von Zweigbergk <martinvonz@google.com>
parents: 45309
diff changeset
   662
        fp = None
20666
e3eb480a9391 cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents: 20604
diff changeset
   663
        if not os.path.split(mapfile)[0]:
45320
4aa484efc926 templater: add exception-raising version of open_template()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45310
diff changeset
   664
            (mapname, fp) = templater.try_open_template(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   665
                b'map-cmdline.' + mapfile
45320
4aa484efc926 templater: add exception-raising version of open_template()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45310
diff changeset
   666
            ) or templater.try_open_template(mapfile)
20666
e3eb480a9391 cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents: 20604
diff changeset
   667
            if mapname:
e3eb480a9391 cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents: 20604
diff changeset
   668
                mapfile = mapname
45310
f3481e4fcc3a templater: pass opened file-like object to templatespec
Martin von Zweigbergk <martinvonz@google.com>
parents: 45309
diff changeset
   669
        return formatter.mapfile_templatespec(b'changeset', mapfile, fp)
20666
e3eb480a9391 cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents: 20604
diff changeset
   670
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   671
    return formatter.lookuptemplate(ui, b'changeset', tmpl)
20666
e3eb480a9391 cmdutil: make helper function to process template args
Matt Mackall <mpm@selenic.com>
parents: 20604
diff changeset
   672
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   673
35887
572f36e9a780 logcmdutil: drop redundant "log" from function names (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35886
diff changeset
   674
def maketemplater(ui, repo, tmpl, buffered=False):
35886
b0014780c7fc logcmdutil: rename classes and functions to conform to our coding style (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35885
diff changeset
   675
    """Create a changesettemplater from a literal template 'tmpl'
35107
b22a0d9e0a83 docs: add args/returns docs for some cmdutil, context, and registrar functions
rlevasseur@google.com
parents: 35007
diff changeset
   676
    byte-string."""
45267
c1915cfa8080 templatespec: use new factory functions in logcmdutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 45266
diff changeset
   677
    spec = formatter.literal_templatespec(tmpl)
35886
b0014780c7fc logcmdutil: rename classes and functions to conform to our coding style (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35885
diff changeset
   678
    return changesettemplater(ui, repo, spec, buffered=buffered)
32837
50586a0a946f cmdutil: factor out helper to create changeset_templater with literal template
Yuya Nishihara <yuya@tcha.org>
parents: 32835
diff changeset
   679
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   680
36007
29b83c08afe0 log: pack filematcher and hunksfilter into changesetdiffer object
Yuya Nishihara <yuya@tcha.org>
parents: 36005
diff changeset
   681
def changesetdisplayer(ui, repo, opts, differ=None, buffered=False):
3643
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3531
diff changeset
   682
    """show one changeset using template or regular display.
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3531
diff changeset
   683
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3531
diff changeset
   684
    Display format will be the first non-empty hit of:
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3531
diff changeset
   685
    1. option 'template'
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3531
diff changeset
   686
    2. option 'style'
45765
ed84a4d48910 config: add a new [command-templates] section for templates defined by hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 45651
diff changeset
   687
    3. [command-templates] setting 'log'
3643
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3531
diff changeset
   688
    4. [ui] setting 'style'
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3531
diff changeset
   689
    If all of these values are either the unset or the empty string,
35886
b0014780c7fc logcmdutil: rename classes and functions to conform to our coding style (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35885
diff changeset
   690
    regular display via changesetprinter() is done.
3643
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3531
diff changeset
   691
    """
36007
29b83c08afe0 log: pack filematcher and hunksfilter into changesetdiffer object
Yuya Nishihara <yuya@tcha.org>
parents: 36005
diff changeset
   692
    postargs = (differ, opts, buffered)
43100
90b9a7e06c2c formatter: parse name of built-in formatter templates in standard way
Yuya Nishihara <yuya@tcha.org>
parents: 43077
diff changeset
   693
    spec = _lookuptemplate(ui, opts.get(b'template'), opts.get(b'style'))
90b9a7e06c2c formatter: parse name of built-in formatter templates in standard way
Yuya Nishihara <yuya@tcha.org>
parents: 43077
diff changeset
   694
90b9a7e06c2c formatter: parse name of built-in formatter templates in standard way
Yuya Nishihara <yuya@tcha.org>
parents: 43077
diff changeset
   695
    # machine-readable formats have slightly different keyword set than
90b9a7e06c2c formatter: parse name of built-in formatter templates in standard way
Yuya Nishihara <yuya@tcha.org>
parents: 43077
diff changeset
   696
    # plain templates, which are handled by changesetformatter.
90b9a7e06c2c formatter: parse name of built-in formatter templates in standard way
Yuya Nishihara <yuya@tcha.org>
parents: 43077
diff changeset
   697
    # note that {b'pickle', b'debug'} can also be added to the list if needed.
90b9a7e06c2c formatter: parse name of built-in formatter templates in standard way
Yuya Nishihara <yuya@tcha.org>
parents: 43077
diff changeset
   698
    if spec.ref in {b'cbor', b'json'}:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   699
        fm = ui.formatter(b'log', opts)
37773
0f084741cd66 logcmdutil: pass formatter to jsonchangeset as argument
Yuya Nishihara <yuya@tcha.org>
parents: 37772
diff changeset
   700
        return changesetformatter(ui, repo, fm, *postargs)
3837
7df171ea50cd Fix log regression where log -p file showed diffs for other files
Matt Mackall <mpm@selenic.com>
parents: 3827
diff changeset
   701
32875
c8f2cf18b82e formatter: load templates section like a map file
Yuya Nishihara <yuya@tcha.org>
parents: 32873
diff changeset
   702
    if not spec.ref and not spec.tmpl and not spec.mapfile:
36003
fcde8946c553 logcmdutil: hold makefilematcher/makehunksfilter() by changesetpriner (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36002
diff changeset
   703
        return changesetprinter(ui, repo, *postargs)
34083
08346a8fa65f cleanup: rename "matchfn" to "match" where obviously a matcher
Martin von Zweigbergk <martinvonz@google.com>
parents: 34081
diff changeset
   704
36003
fcde8946c553 logcmdutil: hold makefilematcher/makehunksfilter() by changesetpriner (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36002
diff changeset
   705
    return changesettemplater(ui, repo, spec, *postargs)
3643
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 3531
diff changeset
   706
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   707
45565
c1d0f83d62c4 log: introduce struct that carries log traversal options
Yuya Nishihara <yuya@tcha.org>
parents: 45564
diff changeset
   708
@attr.s
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48913
diff changeset
   709
class walkopts:
45565
c1d0f83d62c4 log: introduce struct that carries log traversal options
Yuya Nishihara <yuya@tcha.org>
parents: 45564
diff changeset
   710
    """Options to configure a set of revisions and file matcher factory
c1d0f83d62c4 log: introduce struct that carries log traversal options
Yuya Nishihara <yuya@tcha.org>
parents: 45564
diff changeset
   711
    to scan revision/file history
c1d0f83d62c4 log: introduce struct that carries log traversal options
Yuya Nishihara <yuya@tcha.org>
parents: 45564
diff changeset
   712
    """
c1d0f83d62c4 log: introduce struct that carries log traversal options
Yuya Nishihara <yuya@tcha.org>
parents: 45564
diff changeset
   713
c1d0f83d62c4 log: introduce struct that carries log traversal options
Yuya Nishihara <yuya@tcha.org>
parents: 45564
diff changeset
   714
    # raw command-line parameters, which a matcher will be built from
48014
0dc4cc654d96 typing: drop annotations on `mercurial/logcmdutil.walkopts` attributes
Matt Harbison <matt_harbison@yahoo.com>
parents: 47437
diff changeset
   715
    pats = attr.ib()
0dc4cc654d96 typing: drop annotations on `mercurial/logcmdutil.walkopts` attributes
Matt Harbison <matt_harbison@yahoo.com>
parents: 47437
diff changeset
   716
    opts = attr.ib()
45565
c1d0f83d62c4 log: introduce struct that carries log traversal options
Yuya Nishihara <yuya@tcha.org>
parents: 45564
diff changeset
   717
45568
9a26fea2b518 log: pass around --rev option by walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45567
diff changeset
   718
    # a list of revset expressions to be traversed; if follow, it specifies
9a26fea2b518 log: pass around --rev option by walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45567
diff changeset
   719
    # the start revisions
48014
0dc4cc654d96 typing: drop annotations on `mercurial/logcmdutil.walkopts` attributes
Matt Harbison <matt_harbison@yahoo.com>
parents: 47437
diff changeset
   720
    revspec = attr.ib()
45568
9a26fea2b518 log: pass around --rev option by walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45567
diff changeset
   721
45626
8fe09005ed88 log: move miscellaneous filter/matcher options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45625
diff changeset
   722
    # miscellaneous queries to filter revisions (see "hg help log" for details)
48014
0dc4cc654d96 typing: drop annotations on `mercurial/logcmdutil.walkopts` attributes
Matt Harbison <matt_harbison@yahoo.com>
parents: 47437
diff changeset
   723
    bookmarks = attr.ib(default=attr.Factory(list))
0dc4cc654d96 typing: drop annotations on `mercurial/logcmdutil.walkopts` attributes
Matt Harbison <matt_harbison@yahoo.com>
parents: 47437
diff changeset
   724
    branches = attr.ib(default=attr.Factory(list))
0dc4cc654d96 typing: drop annotations on `mercurial/logcmdutil.walkopts` attributes
Matt Harbison <matt_harbison@yahoo.com>
parents: 47437
diff changeset
   725
    date = attr.ib(default=None)
0dc4cc654d96 typing: drop annotations on `mercurial/logcmdutil.walkopts` attributes
Matt Harbison <matt_harbison@yahoo.com>
parents: 47437
diff changeset
   726
    keywords = attr.ib(default=attr.Factory(list))
0dc4cc654d96 typing: drop annotations on `mercurial/logcmdutil.walkopts` attributes
Matt Harbison <matt_harbison@yahoo.com>
parents: 47437
diff changeset
   727
    no_merges = attr.ib(default=False)
0dc4cc654d96 typing: drop annotations on `mercurial/logcmdutil.walkopts` attributes
Matt Harbison <matt_harbison@yahoo.com>
parents: 47437
diff changeset
   728
    only_merges = attr.ib(default=False)
0dc4cc654d96 typing: drop annotations on `mercurial/logcmdutil.walkopts` attributes
Matt Harbison <matt_harbison@yahoo.com>
parents: 47437
diff changeset
   729
    prune_ancestors = attr.ib(default=attr.Factory(list))
0dc4cc654d96 typing: drop annotations on `mercurial/logcmdutil.walkopts` attributes
Matt Harbison <matt_harbison@yahoo.com>
parents: 47437
diff changeset
   730
    users = attr.ib(default=attr.Factory(list))
45626
8fe09005ed88 log: move miscellaneous filter/matcher options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45625
diff changeset
   731
8fe09005ed88 log: move miscellaneous filter/matcher options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45625
diff changeset
   732
    # miscellaneous matcher arguments
48014
0dc4cc654d96 typing: drop annotations on `mercurial/logcmdutil.walkopts` attributes
Matt Harbison <matt_harbison@yahoo.com>
parents: 47437
diff changeset
   733
    include_pats = attr.ib(default=attr.Factory(list))
0dc4cc654d96 typing: drop annotations on `mercurial/logcmdutil.walkopts` attributes
Matt Harbison <matt_harbison@yahoo.com>
parents: 47437
diff changeset
   734
    exclude_pats = attr.ib(default=attr.Factory(list))
45626
8fe09005ed88 log: move miscellaneous filter/matcher options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45625
diff changeset
   735
45566
24df19a9ab87 log: pass around --follow/--follow-first options by walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45565
diff changeset
   736
    # 0: no follow, 1: follow first, 2: follow both parents
48014
0dc4cc654d96 typing: drop annotations on `mercurial/logcmdutil.walkopts` attributes
Matt Harbison <matt_harbison@yahoo.com>
parents: 47437
diff changeset
   737
    follow = attr.ib(default=0)
45566
24df19a9ab87 log: pass around --follow/--follow-first options by walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45565
diff changeset
   738
45625
c11099cc1de4 log: map --removed to walkopts.force_changelog_traversal
Yuya Nishihara <yuya@tcha.org>
parents: 45568
diff changeset
   739
    # do not attempt filelog-based traversal, which may be fast but cannot
c11099cc1de4 log: map --removed to walkopts.force_changelog_traversal
Yuya Nishihara <yuya@tcha.org>
parents: 45568
diff changeset
   740
    # include revisions where files were removed
48014
0dc4cc654d96 typing: drop annotations on `mercurial/logcmdutil.walkopts` attributes
Matt Harbison <matt_harbison@yahoo.com>
parents: 47437
diff changeset
   741
    force_changelog_traversal = attr.ib(default=False)
45625
c11099cc1de4 log: map --removed to walkopts.force_changelog_traversal
Yuya Nishihara <yuya@tcha.org>
parents: 45568
diff changeset
   742
45647
9fead7d97069 grep: add option for logcmdutil.makewalker() to not filter revs by file pats
Yuya Nishihara <yuya@tcha.org>
parents: 45628
diff changeset
   743
    # filter revisions by file patterns, which should be disabled only if
9fead7d97069 grep: add option for logcmdutil.makewalker() to not filter revs by file pats
Yuya Nishihara <yuya@tcha.org>
parents: 45628
diff changeset
   744
    # you want to include revisions where files were unmodified
48014
0dc4cc654d96 typing: drop annotations on `mercurial/logcmdutil.walkopts` attributes
Matt Harbison <matt_harbison@yahoo.com>
parents: 47437
diff changeset
   745
    filter_revisions_by_pats = attr.ib(default=True)
45647
9fead7d97069 grep: add option for logcmdutil.makewalker() to not filter revs by file pats
Yuya Nishihara <yuya@tcha.org>
parents: 45628
diff changeset
   746
45627
224c786f4fce log: move --graph and topo sort options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45626
diff changeset
   747
    # sort revisions prior to traversal: 'desc', 'topo', or None
48014
0dc4cc654d96 typing: drop annotations on `mercurial/logcmdutil.walkopts` attributes
Matt Harbison <matt_harbison@yahoo.com>
parents: 47437
diff changeset
   748
    sort_revisions = attr.ib(default=None)
45627
224c786f4fce log: move --graph and topo sort options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45626
diff changeset
   749
45567
bddf70c93614 log: parse --limit option by logcmdutil.parseopts()
Yuya Nishihara <yuya@tcha.org>
parents: 45566
diff changeset
   750
    # limit number of changes displayed; None means unlimited
48014
0dc4cc654d96 typing: drop annotations on `mercurial/logcmdutil.walkopts` attributes
Matt Harbison <matt_harbison@yahoo.com>
parents: 47437
diff changeset
   751
    limit = attr.ib(default=None)
45567
bddf70c93614 log: parse --limit option by logcmdutil.parseopts()
Yuya Nishihara <yuya@tcha.org>
parents: 45566
diff changeset
   752
45565
c1d0f83d62c4 log: introduce struct that carries log traversal options
Yuya Nishihara <yuya@tcha.org>
parents: 45564
diff changeset
   753
c1d0f83d62c4 log: introduce struct that carries log traversal options
Yuya Nishihara <yuya@tcha.org>
parents: 45564
diff changeset
   754
def parseopts(ui, pats, opts):
46682
8f8fce2dd594 typing: switch an argument type to the generic form
Matt Harbison <matt_harbison@yahoo.com>
parents: 46549
diff changeset
   755
    # type: (Any, Sequence[bytes], Dict[bytes, Any]) -> walkopts
45565
c1d0f83d62c4 log: introduce struct that carries log traversal options
Yuya Nishihara <yuya@tcha.org>
parents: 45564
diff changeset
   756
    """Parse log command options into walkopts
c1d0f83d62c4 log: introduce struct that carries log traversal options
Yuya Nishihara <yuya@tcha.org>
parents: 45564
diff changeset
   757
45628
7f033a587414 log: extract function that builds (revs, makefilematcher) from walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45627
diff changeset
   758
    The returned walkopts will be passed in to getrevs() or makewalker().
45565
c1d0f83d62c4 log: introduce struct that carries log traversal options
Yuya Nishihara <yuya@tcha.org>
parents: 45564
diff changeset
   759
    """
45566
24df19a9ab87 log: pass around --follow/--follow-first options by walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45565
diff changeset
   760
    if opts.get(b'follow_first'):
24df19a9ab87 log: pass around --follow/--follow-first options by walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45565
diff changeset
   761
        follow = 1
24df19a9ab87 log: pass around --follow/--follow-first options by walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45565
diff changeset
   762
    elif opts.get(b'follow'):
24df19a9ab87 log: pass around --follow/--follow-first options by walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45565
diff changeset
   763
        follow = 2
24df19a9ab87 log: pass around --follow/--follow-first options by walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45565
diff changeset
   764
    else:
24df19a9ab87 log: pass around --follow/--follow-first options by walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45565
diff changeset
   765
        follow = 0
24df19a9ab87 log: pass around --follow/--follow-first options by walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45565
diff changeset
   766
45627
224c786f4fce log: move --graph and topo sort options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45626
diff changeset
   767
    if opts.get(b'graph'):
224c786f4fce log: move --graph and topo sort options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45626
diff changeset
   768
        if ui.configbool(b'experimental', b'log.topo'):
224c786f4fce log: move --graph and topo sort options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45626
diff changeset
   769
            sort_revisions = b'topo'
224c786f4fce log: move --graph and topo sort options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45626
diff changeset
   770
        else:
224c786f4fce log: move --graph and topo sort options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45626
diff changeset
   771
            sort_revisions = b'desc'
224c786f4fce log: move --graph and topo sort options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45626
diff changeset
   772
    else:
224c786f4fce log: move --graph and topo sort options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45626
diff changeset
   773
        sort_revisions = None
224c786f4fce log: move --graph and topo sort options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45626
diff changeset
   774
45568
9a26fea2b518 log: pass around --rev option by walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45567
diff changeset
   775
    return walkopts(
9a26fea2b518 log: pass around --rev option by walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45567
diff changeset
   776
        pats=pats,
9a26fea2b518 log: pass around --rev option by walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45567
diff changeset
   777
        opts=opts,
9a26fea2b518 log: pass around --rev option by walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45567
diff changeset
   778
        revspec=opts.get(b'rev', []),
46041
9c0db3671008 log: do not override other filtering and sorting options by --bookmark
Yuya Nishihara <yuya@tcha.org>
parents: 45942
diff changeset
   779
        bookmarks=opts.get(b'bookmark', []),
45626
8fe09005ed88 log: move miscellaneous filter/matcher options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45625
diff changeset
   780
        # branch and only_branch are really aliases and must be handled at
8fe09005ed88 log: move miscellaneous filter/matcher options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45625
diff changeset
   781
        # the same time
8fe09005ed88 log: move miscellaneous filter/matcher options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45625
diff changeset
   782
        branches=opts.get(b'branch', []) + opts.get(b'only_branch', []),
8fe09005ed88 log: move miscellaneous filter/matcher options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45625
diff changeset
   783
        date=opts.get(b'date'),
8fe09005ed88 log: move miscellaneous filter/matcher options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45625
diff changeset
   784
        keywords=opts.get(b'keyword', []),
8fe09005ed88 log: move miscellaneous filter/matcher options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45625
diff changeset
   785
        no_merges=bool(opts.get(b'no_merges')),
8fe09005ed88 log: move miscellaneous filter/matcher options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45625
diff changeset
   786
        only_merges=bool(opts.get(b'only_merges')),
8fe09005ed88 log: move miscellaneous filter/matcher options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45625
diff changeset
   787
        prune_ancestors=opts.get(b'prune', []),
8fe09005ed88 log: move miscellaneous filter/matcher options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45625
diff changeset
   788
        users=opts.get(b'user', []),
8fe09005ed88 log: move miscellaneous filter/matcher options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45625
diff changeset
   789
        include_pats=opts.get(b'include', []),
8fe09005ed88 log: move miscellaneous filter/matcher options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45625
diff changeset
   790
        exclude_pats=opts.get(b'exclude', []),
45568
9a26fea2b518 log: pass around --rev option by walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45567
diff changeset
   791
        follow=follow,
45625
c11099cc1de4 log: map --removed to walkopts.force_changelog_traversal
Yuya Nishihara <yuya@tcha.org>
parents: 45568
diff changeset
   792
        force_changelog_traversal=bool(opts.get(b'removed')),
45627
224c786f4fce log: move --graph and topo sort options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45626
diff changeset
   793
        sort_revisions=sort_revisions,
45568
9a26fea2b518 log: pass around --rev option by walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45567
diff changeset
   794
        limit=getlimit(opts),
9a26fea2b518 log: pass around --rev option by walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45567
diff changeset
   795
    )
45565
c1d0f83d62c4 log: introduce struct that carries log traversal options
Yuya Nishihara <yuya@tcha.org>
parents: 45564
diff changeset
   796
c1d0f83d62c4 log: introduce struct that carries log traversal options
Yuya Nishihara <yuya@tcha.org>
parents: 45564
diff changeset
   797
c1d0f83d62c4 log: introduce struct that carries log traversal options
Yuya Nishihara <yuya@tcha.org>
parents: 45564
diff changeset
   798
def _makematcher(repo, revs, wopts):
35685
659dfbd852e2 log: extract function that processes log file patterns
Yuya Nishihara <yuya@tcha.org>
parents: 35684
diff changeset
   799
    """Build matcher and expanded patterns from log options
659dfbd852e2 log: extract function that processes log file patterns
Yuya Nishihara <yuya@tcha.org>
parents: 35684
diff changeset
   800
35687
67893a516272 log: follow file history across copies even with -rREV (BC) (issue4959)
Yuya Nishihara <yuya@tcha.org>
parents: 35686
diff changeset
   801
    If --follow, revs are the revisions to follow from.
67893a516272 log: follow file history across copies even with -rREV (BC) (issue4959)
Yuya Nishihara <yuya@tcha.org>
parents: 35686
diff changeset
   802
35685
659dfbd852e2 log: extract function that processes log file patterns
Yuya Nishihara <yuya@tcha.org>
parents: 35684
diff changeset
   803
    Returns (match, pats, slowpath) where
659dfbd852e2 log: extract function that processes log file patterns
Yuya Nishihara <yuya@tcha.org>
parents: 35684
diff changeset
   804
    - match: a matcher built from the given pats and -I/-X opts
659dfbd852e2 log: extract function that processes log file patterns
Yuya Nishihara <yuya@tcha.org>
parents: 35684
diff changeset
   805
    - pats: patterns used (globs are expanded on Windows)
659dfbd852e2 log: extract function that processes log file patterns
Yuya Nishihara <yuya@tcha.org>
parents: 35684
diff changeset
   806
    - slowpath: True if patterns aren't as simple as scanning filelogs
659dfbd852e2 log: extract function that processes log file patterns
Yuya Nishihara <yuya@tcha.org>
parents: 35684
diff changeset
   807
    """
659dfbd852e2 log: extract function that processes log file patterns
Yuya Nishihara <yuya@tcha.org>
parents: 35684
diff changeset
   808
    # pats/include/exclude are passed to match.match() directly in
45651
c7413ffe0402 cmdutil: remove remainder of old walkchangerevs() implementation
Yuya Nishihara <yuya@tcha.org>
parents: 45647
diff changeset
   809
    # _matchfiles() revset, but a log-like command should build its matcher
c7413ffe0402 cmdutil: remove remainder of old walkchangerevs() implementation
Yuya Nishihara <yuya@tcha.org>
parents: 45647
diff changeset
   810
    # with scmutil.match(). The difference is input pats are globbed on
35685
659dfbd852e2 log: extract function that processes log file patterns
Yuya Nishihara <yuya@tcha.org>
parents: 35684
diff changeset
   811
    # platforms without shell expansion (windows).
659dfbd852e2 log: extract function that processes log file patterns
Yuya Nishihara <yuya@tcha.org>
parents: 35684
diff changeset
   812
    wctx = repo[None]
45565
c1d0f83d62c4 log: introduce struct that carries log traversal options
Yuya Nishihara <yuya@tcha.org>
parents: 45564
diff changeset
   813
    match, pats = scmutil.matchandpats(wctx, wopts.pats, wopts.opts)
c1d0f83d62c4 log: introduce struct that carries log traversal options
Yuya Nishihara <yuya@tcha.org>
parents: 45564
diff changeset
   814
    slowpath = match.anypats() or (
45625
c11099cc1de4 log: map --removed to walkopts.force_changelog_traversal
Yuya Nishihara <yuya@tcha.org>
parents: 45568
diff changeset
   815
        not match.always() and wopts.force_changelog_traversal
45565
c1d0f83d62c4 log: introduce struct that carries log traversal options
Yuya Nishihara <yuya@tcha.org>
parents: 45564
diff changeset
   816
    )
35685
659dfbd852e2 log: extract function that processes log file patterns
Yuya Nishihara <yuya@tcha.org>
parents: 35684
diff changeset
   817
    if not slowpath:
45568
9a26fea2b518 log: pass around --rev option by walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45567
diff changeset
   818
        if wopts.follow and wopts.revspec:
45473
5f0eeda2005d log: make -frREV PATH detect missing files before falling back to slow path
Yuya Nishihara <yuya@tcha.org>
parents: 45472
diff changeset
   819
            # There may be the case that a path doesn't exist in some (but
5f0eeda2005d log: make -frREV PATH detect missing files before falling back to slow path
Yuya Nishihara <yuya@tcha.org>
parents: 45472
diff changeset
   820
            # not all) of the specified start revisions, but let's consider
5f0eeda2005d log: make -frREV PATH detect missing files before falling back to slow path
Yuya Nishihara <yuya@tcha.org>
parents: 45472
diff changeset
   821
            # the path is valid. Missing files will be warned by the matcher.
35687
67893a516272 log: follow file history across copies even with -rREV (BC) (issue4959)
Yuya Nishihara <yuya@tcha.org>
parents: 35686
diff changeset
   822
            startctxs = [repo[r] for r in revs]
45471
a03fde1077ce log: reorganize if-else and for loop in logcmdutil._makematcher()
Yuya Nishihara <yuya@tcha.org>
parents: 45458
diff changeset
   823
            for f in match.files():
45473
5f0eeda2005d log: make -frREV PATH detect missing files before falling back to slow path
Yuya Nishihara <yuya@tcha.org>
parents: 45472
diff changeset
   824
                found = False
5f0eeda2005d log: make -frREV PATH detect missing files before falling back to slow path
Yuya Nishihara <yuya@tcha.org>
parents: 45472
diff changeset
   825
                for c in startctxs:
5f0eeda2005d log: make -frREV PATH detect missing files before falling back to slow path
Yuya Nishihara <yuya@tcha.org>
parents: 45472
diff changeset
   826
                    if f in c:
5f0eeda2005d log: make -frREV PATH detect missing files before falling back to slow path
Yuya Nishihara <yuya@tcha.org>
parents: 45472
diff changeset
   827
                        found = True
5f0eeda2005d log: make -frREV PATH detect missing files before falling back to slow path
Yuya Nishihara <yuya@tcha.org>
parents: 45472
diff changeset
   828
                    elif c.hasdir(f):
5f0eeda2005d log: make -frREV PATH detect missing files before falling back to slow path
Yuya Nishihara <yuya@tcha.org>
parents: 45472
diff changeset
   829
                        # If a directory exists in any of the start revisions,
5f0eeda2005d log: make -frREV PATH detect missing files before falling back to slow path
Yuya Nishihara <yuya@tcha.org>
parents: 45472
diff changeset
   830
                        # take the slow path.
5f0eeda2005d log: make -frREV PATH detect missing files before falling back to slow path
Yuya Nishihara <yuya@tcha.org>
parents: 45472
diff changeset
   831
                        found = slowpath = True
5f0eeda2005d log: make -frREV PATH detect missing files before falling back to slow path
Yuya Nishihara <yuya@tcha.org>
parents: 45472
diff changeset
   832
                if not found:
48553
3b6b43a7ace4 logcmdutil: raise `StateError` when file to follow doesn't exist
Martin von Zweigbergk <martinvonz@google.com>
parents: 48552
diff changeset
   833
                    raise error.StateError(
45473
5f0eeda2005d log: make -frREV PATH detect missing files before falling back to slow path
Yuya Nishihara <yuya@tcha.org>
parents: 45472
diff changeset
   834
                        _(
5f0eeda2005d log: make -frREV PATH detect missing files before falling back to slow path
Yuya Nishihara <yuya@tcha.org>
parents: 45472
diff changeset
   835
                            b'cannot follow file not in any of the specified '
5f0eeda2005d log: make -frREV PATH detect missing files before falling back to slow path
Yuya Nishihara <yuya@tcha.org>
parents: 45472
diff changeset
   836
                            b'revisions: "%s"'
5f0eeda2005d log: make -frREV PATH detect missing files before falling back to slow path
Yuya Nishihara <yuya@tcha.org>
parents: 45472
diff changeset
   837
                        )
5f0eeda2005d log: make -frREV PATH detect missing files before falling back to slow path
Yuya Nishihara <yuya@tcha.org>
parents: 45472
diff changeset
   838
                        % f
5f0eeda2005d log: make -frREV PATH detect missing files before falling back to slow path
Yuya Nishihara <yuya@tcha.org>
parents: 45472
diff changeset
   839
                    )
45566
24df19a9ab87 log: pass around --follow/--follow-first options by walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45565
diff changeset
   840
        elif wopts.follow:
45471
a03fde1077ce log: reorganize if-else and for loop in logcmdutil._makematcher()
Yuya Nishihara <yuya@tcha.org>
parents: 45458
diff changeset
   841
            for f in match.files():
a03fde1077ce log: reorganize if-else and for loop in logcmdutil._makematcher()
Yuya Nishihara <yuya@tcha.org>
parents: 45458
diff changeset
   842
                if f not in wctx:
a03fde1077ce log: reorganize if-else and for loop in logcmdutil._makematcher()
Yuya Nishihara <yuya@tcha.org>
parents: 45458
diff changeset
   843
                    # If the file exists, it may be a directory, so let it
a03fde1077ce log: reorganize if-else and for loop in logcmdutil._makematcher()
Yuya Nishihara <yuya@tcha.org>
parents: 45458
diff changeset
   844
                    # take the slow path.
a03fde1077ce log: reorganize if-else and for loop in logcmdutil._makematcher()
Yuya Nishihara <yuya@tcha.org>
parents: 45458
diff changeset
   845
                    if os.path.exists(repo.wjoin(f)):
a03fde1077ce log: reorganize if-else and for loop in logcmdutil._makematcher()
Yuya Nishihara <yuya@tcha.org>
parents: 45458
diff changeset
   846
                        slowpath = True
a03fde1077ce log: reorganize if-else and for loop in logcmdutil._makematcher()
Yuya Nishihara <yuya@tcha.org>
parents: 45458
diff changeset
   847
                        continue
a03fde1077ce log: reorganize if-else and for loop in logcmdutil._makematcher()
Yuya Nishihara <yuya@tcha.org>
parents: 45458
diff changeset
   848
                    else:
48553
3b6b43a7ace4 logcmdutil: raise `StateError` when file to follow doesn't exist
Martin von Zweigbergk <martinvonz@google.com>
parents: 48552
diff changeset
   849
                        raise error.StateError(
45471
a03fde1077ce log: reorganize if-else and for loop in logcmdutil._makematcher()
Yuya Nishihara <yuya@tcha.org>
parents: 45458
diff changeset
   850
                            _(
a03fde1077ce log: reorganize if-else and for loop in logcmdutil._makematcher()
Yuya Nishihara <yuya@tcha.org>
parents: 45458
diff changeset
   851
                                b'cannot follow file not in parent '
a03fde1077ce log: reorganize if-else and for loop in logcmdutil._makematcher()
Yuya Nishihara <yuya@tcha.org>
parents: 45458
diff changeset
   852
                                b'revision: "%s"'
a03fde1077ce log: reorganize if-else and for loop in logcmdutil._makematcher()
Yuya Nishihara <yuya@tcha.org>
parents: 45458
diff changeset
   853
                            )
a03fde1077ce log: reorganize if-else and for loop in logcmdutil._makematcher()
Yuya Nishihara <yuya@tcha.org>
parents: 45458
diff changeset
   854
                            % f
a03fde1077ce log: reorganize if-else and for loop in logcmdutil._makematcher()
Yuya Nishihara <yuya@tcha.org>
parents: 45458
diff changeset
   855
                        )
a03fde1077ce log: reorganize if-else and for loop in logcmdutil._makematcher()
Yuya Nishihara <yuya@tcha.org>
parents: 45458
diff changeset
   856
                filelog = repo.file(f)
a03fde1077ce log: reorganize if-else and for loop in logcmdutil._makematcher()
Yuya Nishihara <yuya@tcha.org>
parents: 45458
diff changeset
   857
                if not filelog:
45472
07324227f6b7 log: fix -fr'wdir()' PATH to follow newly added file
Yuya Nishihara <yuya@tcha.org>
parents: 45471
diff changeset
   858
                    # A file exists in wdir but not in history, which means
07324227f6b7 log: fix -fr'wdir()' PATH to follow newly added file
Yuya Nishihara <yuya@tcha.org>
parents: 45471
diff changeset
   859
                    # the file isn't committed yet.
48553
3b6b43a7ace4 logcmdutil: raise `StateError` when file to follow doesn't exist
Martin von Zweigbergk <martinvonz@google.com>
parents: 48552
diff changeset
   860
                    raise error.StateError(
45471
a03fde1077ce log: reorganize if-else and for loop in logcmdutil._makematcher()
Yuya Nishihara <yuya@tcha.org>
parents: 45458
diff changeset
   861
                        _(b'cannot follow nonexistent file: "%s"') % f
a03fde1077ce log: reorganize if-else and for loop in logcmdutil._makematcher()
Yuya Nishihara <yuya@tcha.org>
parents: 45458
diff changeset
   862
                    )
a03fde1077ce log: reorganize if-else and for loop in logcmdutil._makematcher()
Yuya Nishihara <yuya@tcha.org>
parents: 45458
diff changeset
   863
        else:
a03fde1077ce log: reorganize if-else and for loop in logcmdutil._makematcher()
Yuya Nishihara <yuya@tcha.org>
parents: 45458
diff changeset
   864
            for f in match.files():
a03fde1077ce log: reorganize if-else and for loop in logcmdutil._makematcher()
Yuya Nishihara <yuya@tcha.org>
parents: 45458
diff changeset
   865
                filelog = repo.file(f)
a03fde1077ce log: reorganize if-else and for loop in logcmdutil._makematcher()
Yuya Nishihara <yuya@tcha.org>
parents: 45458
diff changeset
   866
                if not filelog:
a03fde1077ce log: reorganize if-else and for loop in logcmdutil._makematcher()
Yuya Nishihara <yuya@tcha.org>
parents: 45458
diff changeset
   867
                    # A zero count may be a directory or deleted file, so
a03fde1077ce log: reorganize if-else and for loop in logcmdutil._makematcher()
Yuya Nishihara <yuya@tcha.org>
parents: 45458
diff changeset
   868
                    # try to find matching entries on the slow path.
a03fde1077ce log: reorganize if-else and for loop in logcmdutil._makematcher()
Yuya Nishihara <yuya@tcha.org>
parents: 45458
diff changeset
   869
                    slowpath = True
35685
659dfbd852e2 log: extract function that processes log file patterns
Yuya Nishihara <yuya@tcha.org>
parents: 35684
diff changeset
   870
659dfbd852e2 log: extract function that processes log file patterns
Yuya Nishihara <yuya@tcha.org>
parents: 35684
diff changeset
   871
        # We decided to fall back to the slowpath because at least one
659dfbd852e2 log: extract function that processes log file patterns
Yuya Nishihara <yuya@tcha.org>
parents: 35684
diff changeset
   872
        # of the paths was not a file. Check to see if at least one of them
659dfbd852e2 log: extract function that processes log file patterns
Yuya Nishihara <yuya@tcha.org>
parents: 35684
diff changeset
   873
        # existed in history - in that case, we'll continue down the
659dfbd852e2 log: extract function that processes log file patterns
Yuya Nishihara <yuya@tcha.org>
parents: 35684
diff changeset
   874
        # slowpath; otherwise, we can turn off the slowpath
659dfbd852e2 log: extract function that processes log file patterns
Yuya Nishihara <yuya@tcha.org>
parents: 35684
diff changeset
   875
        if slowpath:
659dfbd852e2 log: extract function that processes log file patterns
Yuya Nishihara <yuya@tcha.org>
parents: 35684
diff changeset
   876
            for path in match.files():
46549
9842c00f0252 log: fix handling of root (or empty) path provided by matcher (issue6478)
Yuya Nishihara <yuya@tcha.org>
parents: 46042
diff changeset
   877
                if not path or path in repo.store:
35685
659dfbd852e2 log: extract function that processes log file patterns
Yuya Nishihara <yuya@tcha.org>
parents: 35684
diff changeset
   878
                    break
659dfbd852e2 log: extract function that processes log file patterns
Yuya Nishihara <yuya@tcha.org>
parents: 35684
diff changeset
   879
            else:
659dfbd852e2 log: extract function that processes log file patterns
Yuya Nishihara <yuya@tcha.org>
parents: 35684
diff changeset
   880
                slowpath = False
659dfbd852e2 log: extract function that processes log file patterns
Yuya Nishihara <yuya@tcha.org>
parents: 35684
diff changeset
   881
659dfbd852e2 log: extract function that processes log file patterns
Yuya Nishihara <yuya@tcha.org>
parents: 35684
diff changeset
   882
    return match, pats, slowpath
659dfbd852e2 log: extract function that processes log file patterns
Yuya Nishihara <yuya@tcha.org>
parents: 35684
diff changeset
   883
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   884
35686
b25fa5da4ca2 log: resolve --follow thoroughly in getlogrevs()
Yuya Nishihara <yuya@tcha.org>
parents: 35685
diff changeset
   885
def _fileancestors(repo, revs, match, followfirst):
b25fa5da4ca2 log: resolve --follow thoroughly in getlogrevs()
Yuya Nishihara <yuya@tcha.org>
parents: 35685
diff changeset
   886
    fctxs = []
b25fa5da4ca2 log: resolve --follow thoroughly in getlogrevs()
Yuya Nishihara <yuya@tcha.org>
parents: 35685
diff changeset
   887
    for r in revs:
b25fa5da4ca2 log: resolve --follow thoroughly in getlogrevs()
Yuya Nishihara <yuya@tcha.org>
parents: 35685
diff changeset
   888
        ctx = repo[r]
b25fa5da4ca2 log: resolve --follow thoroughly in getlogrevs()
Yuya Nishihara <yuya@tcha.org>
parents: 35685
diff changeset
   889
        fctxs.extend(ctx[f].introfilectx() for f in ctx.walk(match))
35690
3e394e0558d7 log: build follow-log filematcher at once
Yuya Nishihara <yuya@tcha.org>
parents: 35689
diff changeset
   890
17180
ae0629161090 graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
   891
    # When displaying a revision with --patch --follow FILE, we have
ae0629161090 graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
   892
    # to know which file of the revision must be diffed. With
ae0629161090 graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
   893
    # --follow, we want the names of the ancestors of FILE in the
35690
3e394e0558d7 log: build follow-log filematcher at once
Yuya Nishihara <yuya@tcha.org>
parents: 35689
diff changeset
   894
    # revision, stored in "fcache". "fcache" is populated as a side effect
3e394e0558d7 log: build follow-log filematcher at once
Yuya Nishihara <yuya@tcha.org>
parents: 35689
diff changeset
   895
    # of the graph traversal.
17180
ae0629161090 graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
   896
    fcache = {}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   897
36002
f8ad57d24252 log: pass ctx to makefilematcher() and makehunksfilter() functions
Yuya Nishihara <yuya@tcha.org>
parents: 35961
diff changeset
   898
    def filematcher(ctx):
45416
4ebc5f325bed log: fix crash and bad filematcher lookup by -fr'wdir()' PATH
Yuya Nishihara <yuya@tcha.org>
parents: 44823
diff changeset
   899
        return scmutil.matchfiles(repo, fcache.get(scmutil.intrev(ctx), []))
17180
ae0629161090 graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
   900
35690
3e394e0558d7 log: build follow-log filematcher at once
Yuya Nishihara <yuya@tcha.org>
parents: 35689
diff changeset
   901
    def revgen():
3e394e0558d7 log: build follow-log filematcher at once
Yuya Nishihara <yuya@tcha.org>
parents: 35689
diff changeset
   902
        for rev, cs in dagop.filectxancestors(fctxs, followfirst=followfirst):
3e394e0558d7 log: build follow-log filematcher at once
Yuya Nishihara <yuya@tcha.org>
parents: 35689
diff changeset
   903
            fcache[rev] = [c.path() for c in cs]
3e394e0558d7 log: build follow-log filematcher at once
Yuya Nishihara <yuya@tcha.org>
parents: 35689
diff changeset
   904
            yield rev
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   905
35690
3e394e0558d7 log: build follow-log filematcher at once
Yuya Nishihara <yuya@tcha.org>
parents: 35689
diff changeset
   906
    return smartset.generatorset(revgen(), iterasc=False), filematcher
17180
ae0629161090 graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
   907
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   908
35887
572f36e9a780 logcmdutil: drop redundant "log" from function names (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35886
diff changeset
   909
def _makenofollowfilematcher(repo, pats, opts):
22167
d4bc38f6eab7 cmdutil: add a hook for making custom non-follow log file matchers
Siddharth Agarwal <sid0@fb.com>
parents: 22166
diff changeset
   910
    '''hook for extensions to override the filematcher for non-follow cases'''
d4bc38f6eab7 cmdutil: add a hook for making custom non-follow log file matchers
Siddharth Agarwal <sid0@fb.com>
parents: 22166
diff changeset
   911
    return None
d4bc38f6eab7 cmdutil: add a hook for making custom non-follow log file matchers
Siddharth Agarwal <sid0@fb.com>
parents: 22166
diff changeset
   912
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   913
48118
5105a9975407 errors: raise InputError from revsingle() iff revset provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48117
diff changeset
   914
def revsingle(repo, revspec, default=b'.', localalias=None):
5105a9975407 errors: raise InputError from revsingle() iff revset provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48117
diff changeset
   915
    """Resolves user-provided revset(s) into a single revision.
5105a9975407 errors: raise InputError from revsingle() iff revset provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48117
diff changeset
   916
5105a9975407 errors: raise InputError from revsingle() iff revset provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48117
diff changeset
   917
    This just wraps the lower-level scmutil.revsingle() in order to raise an
5105a9975407 errors: raise InputError from revsingle() iff revset provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48117
diff changeset
   918
    exception indicating user error.
5105a9975407 errors: raise InputError from revsingle() iff revset provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48117
diff changeset
   919
    """
5105a9975407 errors: raise InputError from revsingle() iff revset provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48117
diff changeset
   920
    try:
5105a9975407 errors: raise InputError from revsingle() iff revset provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48117
diff changeset
   921
        return scmutil.revsingle(repo, revspec, default, localalias)
5105a9975407 errors: raise InputError from revsingle() iff revset provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48117
diff changeset
   922
    except error.RepoLookupError as e:
5105a9975407 errors: raise InputError from revsingle() iff revset provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48117
diff changeset
   923
        raise error.InputError(e.args[0], hint=e.hint)
5105a9975407 errors: raise InputError from revsingle() iff revset provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48117
diff changeset
   924
5105a9975407 errors: raise InputError from revsingle() iff revset provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48117
diff changeset
   925
48117
b74e128676d4 errors: raise InputError from revpair() iff revset provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
   926
def revpair(repo, revs):
b74e128676d4 errors: raise InputError from revpair() iff revset provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
   927
    """Resolves user-provided revset(s) into two revisions.
b74e128676d4 errors: raise InputError from revpair() iff revset provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
   928
b74e128676d4 errors: raise InputError from revpair() iff revset provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
   929
    This just wraps the lower-level scmutil.revpair() in order to raise an
b74e128676d4 errors: raise InputError from revpair() iff revset provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
   930
    exception indicating user error.
b74e128676d4 errors: raise InputError from revpair() iff revset provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
   931
    """
b74e128676d4 errors: raise InputError from revpair() iff revset provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
   932
    try:
b74e128676d4 errors: raise InputError from revpair() iff revset provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
   933
        return scmutil.revpair(repo, revs)
b74e128676d4 errors: raise InputError from revpair() iff revset provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
   934
    except error.RepoLookupError as e:
b74e128676d4 errors: raise InputError from revpair() iff revset provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
   935
        raise error.InputError(e.args[0], hint=e.hint)
b74e128676d4 errors: raise InputError from revpair() iff revset provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
   936
b74e128676d4 errors: raise InputError from revpair() iff revset provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
   937
48116
5ced12cfa41b errors: raise InputError on bad revset to revrange() iff provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48014
diff changeset
   938
def revrange(repo, specs, localalias=None):
5ced12cfa41b errors: raise InputError on bad revset to revrange() iff provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48014
diff changeset
   939
    """Resolves user-provided revset(s).
5ced12cfa41b errors: raise InputError on bad revset to revrange() iff provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48014
diff changeset
   940
5ced12cfa41b errors: raise InputError on bad revset to revrange() iff provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48014
diff changeset
   941
    This just wraps the lower-level scmutil.revrange() in order to raise an
5ced12cfa41b errors: raise InputError on bad revset to revrange() iff provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48014
diff changeset
   942
    exception indicating user error.
5ced12cfa41b errors: raise InputError on bad revset to revrange() iff provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48014
diff changeset
   943
    """
5ced12cfa41b errors: raise InputError on bad revset to revrange() iff provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48014
diff changeset
   944
    try:
5ced12cfa41b errors: raise InputError on bad revset to revrange() iff provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48014
diff changeset
   945
        return scmutil.revrange(repo, specs, localalias)
5ced12cfa41b errors: raise InputError on bad revset to revrange() iff provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48014
diff changeset
   946
    except error.RepoLookupError as e:
5ced12cfa41b errors: raise InputError on bad revset to revrange() iff provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48014
diff changeset
   947
        raise error.InputError(e.args[0], hint=e.hint)
5ced12cfa41b errors: raise InputError on bad revset to revrange() iff provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48014
diff changeset
   948
5ced12cfa41b errors: raise InputError on bad revset to revrange() iff provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48014
diff changeset
   949
35642
e64baf32782a log: make opt2revset table a module constant
Yuya Nishihara <yuya@tcha.org>
parents: 35548
diff changeset
   950
_opt2logrevset = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   951
    b'no_merges': (b'not merge()', None),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   952
    b'only_merges': (b'merge()', None),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   953
    b'_matchfiles': (None, b'_matchfiles(%ps)'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   954
    b'date': (b'date(%s)', None),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   955
    b'branch': (b'branch(%s)', b'%lr'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   956
    b'_patslog': (b'filelog(%s)', b'%lr'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   957
    b'keyword': (b'keyword(%s)', b'%lr'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   958
    b'prune': (b'ancestors(%s)', b'not %lr'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   959
    b'user': (b'user(%s)', b'%lr'),
35642
e64baf32782a log: make opt2revset table a module constant
Yuya Nishihara <yuya@tcha.org>
parents: 35548
diff changeset
   960
}
e64baf32782a log: make opt2revset table a module constant
Yuya Nishihara <yuya@tcha.org>
parents: 35548
diff changeset
   961
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
   962
45565
c1d0f83d62c4 log: introduce struct that carries log traversal options
Yuya Nishihara <yuya@tcha.org>
parents: 45564
diff changeset
   963
def _makerevset(repo, wopts, slowpath):
35690
3e394e0558d7 log: build follow-log filematcher at once
Yuya Nishihara <yuya@tcha.org>
parents: 35689
diff changeset
   964
    """Return a revset string built from log options and file patterns"""
45626
8fe09005ed88 log: move miscellaneous filter/matcher options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45625
diff changeset
   965
    opts = {
46042
1bf2b44c4007 log: do not accept string-matcher pattern as -u/-b/-B parameter
Yuya Nishihara <yuya@tcha.org>
parents: 46041
diff changeset
   966
        b'branch': [b'literal:' + repo.lookupbranch(b) for b in wopts.branches],
45626
8fe09005ed88 log: move miscellaneous filter/matcher options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45625
diff changeset
   967
        b'date': wopts.date,
8fe09005ed88 log: move miscellaneous filter/matcher options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45625
diff changeset
   968
        b'keyword': wopts.keywords,
8fe09005ed88 log: move miscellaneous filter/matcher options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45625
diff changeset
   969
        b'no_merges': wopts.no_merges,
8fe09005ed88 log: move miscellaneous filter/matcher options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45625
diff changeset
   970
        b'only_merges': wopts.only_merges,
8fe09005ed88 log: move miscellaneous filter/matcher options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45625
diff changeset
   971
        b'prune': wopts.prune_ancestors,
46042
1bf2b44c4007 log: do not accept string-matcher pattern as -u/-b/-B parameter
Yuya Nishihara <yuya@tcha.org>
parents: 46041
diff changeset
   972
        b'user': [b'literal:' + v for v in wopts.users],
45626
8fe09005ed88 log: move miscellaneous filter/matcher options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45625
diff changeset
   973
    }
17746
6d218e47cf9b log: speed up hg log for untracked files (issue1340)
smuralid
parents: 17676
diff changeset
   974
45647
9fead7d97069 grep: add option for logcmdutil.makewalker() to not filter revs by file pats
Yuya Nishihara <yuya@tcha.org>
parents: 45628
diff changeset
   975
    if wopts.filter_revisions_by_pats and slowpath:
17180
ae0629161090 graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
   976
        # pats/include/exclude cannot be represented as separate
ae0629161090 graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
   977
        # revset expressions as their filtering logic applies at file
35743
3c2a6246fd63 log: fix typo in comment about _matchfiles()
Yuya Nishihara <yuya@tcha.org>
parents: 35690
diff changeset
   978
        # level. For instance "-I a -X b" matches a revision touching
17180
ae0629161090 graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
   979
        # "a" and "b" while "file(a) and not file(b)" does
ae0629161090 graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
   980
        # not. Besides, filesets are evaluated against the working
ae0629161090 graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
   981
        # directory.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   982
        matchargs = [b'r:', b'd:relpath']
45565
c1d0f83d62c4 log: introduce struct that carries log traversal options
Yuya Nishihara <yuya@tcha.org>
parents: 45564
diff changeset
   983
        for p in wopts.pats:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   984
            matchargs.append(b'p:' + p)
45626
8fe09005ed88 log: move miscellaneous filter/matcher options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45625
diff changeset
   985
        for p in wopts.include_pats:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   986
            matchargs.append(b'i:' + p)
45626
8fe09005ed88 log: move miscellaneous filter/matcher options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45625
diff changeset
   987
        for p in wopts.exclude_pats:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   988
            matchargs.append(b'x:' + p)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   989
        opts[b'_matchfiles'] = matchargs
45647
9fead7d97069 grep: add option for logcmdutil.makewalker() to not filter revs by file pats
Yuya Nishihara <yuya@tcha.org>
parents: 45628
diff changeset
   990
    elif wopts.filter_revisions_by_pats and not wopts.follow:
45565
c1d0f83d62c4 log: introduce struct that carries log traversal options
Yuya Nishihara <yuya@tcha.org>
parents: 45564
diff changeset
   991
        opts[b'_patslog'] = list(wopts.pats)
17180
ae0629161090 graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
   992
ae0629161090 graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
   993
    expr = []
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   994
    for op, val in sorted(opts.items()):
17180
ae0629161090 graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
   995
        if not val:
ae0629161090 graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
   996
            continue
35644
7a0a90d63a8c log: use revsetlang.formatspec() to concatenate list expression
Yuya Nishihara <yuya@tcha.org>
parents: 35643
diff changeset
   997
        revop, listop = _opt2logrevset[op]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   998
        if revop and b'%' not in revop:
17180
ae0629161090 graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
   999
            expr.append(revop)
35645
b6b7855c79aa log: use revsetlang.formatspec() thoroughly
Yuya Nishihara <yuya@tcha.org>
parents: 35644
diff changeset
  1000
        elif not listop:
b6b7855c79aa log: use revsetlang.formatspec() thoroughly
Yuya Nishihara <yuya@tcha.org>
parents: 35644
diff changeset
  1001
            expr.append(revsetlang.formatspec(revop, val))
17180
ae0629161090 graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
  1002
        else:
35645
b6b7855c79aa log: use revsetlang.formatspec() thoroughly
Yuya Nishihara <yuya@tcha.org>
parents: 35644
diff changeset
  1003
            if revop:
b6b7855c79aa log: use revsetlang.formatspec() thoroughly
Yuya Nishihara <yuya@tcha.org>
parents: 35644
diff changeset
  1004
                val = [revsetlang.formatspec(revop, v) for v in val]
b6b7855c79aa log: use revsetlang.formatspec() thoroughly
Yuya Nishihara <yuya@tcha.org>
parents: 35644
diff changeset
  1005
            expr.append(revsetlang.formatspec(listop, val))
17180
ae0629161090 graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
  1006
46041
9c0db3671008 log: do not override other filtering and sorting options by --bookmark
Yuya Nishihara <yuya@tcha.org>
parents: 45942
diff changeset
  1007
    if wopts.bookmarks:
9c0db3671008 log: do not override other filtering and sorting options by --bookmark
Yuya Nishihara <yuya@tcha.org>
parents: 45942
diff changeset
  1008
        expr.append(
9c0db3671008 log: do not override other filtering and sorting options by --bookmark
Yuya Nishihara <yuya@tcha.org>
parents: 45942
diff changeset
  1009
            revsetlang.formatspec(
9c0db3671008 log: do not override other filtering and sorting options by --bookmark
Yuya Nishihara <yuya@tcha.org>
parents: 45942
diff changeset
  1010
                b'%lr',
9c0db3671008 log: do not override other filtering and sorting options by --bookmark
Yuya Nishihara <yuya@tcha.org>
parents: 45942
diff changeset
  1011
                [scmutil.format_bookmark_revspec(v) for v in wopts.bookmarks],
9c0db3671008 log: do not override other filtering and sorting options by --bookmark
Yuya Nishihara <yuya@tcha.org>
parents: 45942
diff changeset
  1012
            )
9c0db3671008 log: do not override other filtering and sorting options by --bookmark
Yuya Nishihara <yuya@tcha.org>
parents: 45942
diff changeset
  1013
        )
9c0db3671008 log: do not override other filtering and sorting options by --bookmark
Yuya Nishihara <yuya@tcha.org>
parents: 45942
diff changeset
  1014
17180
ae0629161090 graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
  1015
    if expr:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1016
        expr = b'(' + b' and '.join(expr) + b')'
17180
ae0629161090 graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
  1017
    else:
ae0629161090 graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
  1018
        expr = None
35690
3e394e0558d7 log: build follow-log filematcher at once
Yuya Nishihara <yuya@tcha.org>
parents: 35689
diff changeset
  1019
    return expr
17180
ae0629161090 graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
  1020
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
  1021
45565
c1d0f83d62c4 log: introduce struct that carries log traversal options
Yuya Nishihara <yuya@tcha.org>
parents: 45564
diff changeset
  1022
def _initialrevs(repo, wopts):
35686
b25fa5da4ca2 log: resolve --follow thoroughly in getlogrevs()
Yuya Nishihara <yuya@tcha.org>
parents: 35685
diff changeset
  1023
    """Return the initial set of revisions to be filtered or followed"""
45568
9a26fea2b518 log: pass around --rev option by walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45567
diff changeset
  1024
    if wopts.revspec:
48116
5ced12cfa41b errors: raise InputError on bad revset to revrange() iff provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48014
diff changeset
  1025
        revs = revrange(repo, wopts.revspec)
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
  1026
    elif wopts.follow and repo.dirstate.p1() == repo.nullid:
31023
aea06029919e revset: import set classes directly from smartset module
Yuya Nishihara <yuya@tcha.org>
parents: 30877
diff changeset
  1027
        revs = smartset.baseset()
45566
24df19a9ab87 log: pass around --follow/--follow-first options by walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45565
diff changeset
  1028
    elif wopts.follow:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1029
        revs = repo.revs(b'.')
24062
f576addb5b77 log: extract common part from getgraphlogrevs() and getlogrevs()
Yuya Nishihara <yuya@tcha.org>
parents: 24061
diff changeset
  1030
    else:
31023
aea06029919e revset: import set classes directly from smartset module
Yuya Nishihara <yuya@tcha.org>
parents: 30877
diff changeset
  1031
        revs = smartset.spanset(repo)
24062
f576addb5b77 log: extract common part from getgraphlogrevs() and getlogrevs()
Yuya Nishihara <yuya@tcha.org>
parents: 24061
diff changeset
  1032
        revs.reverse()
f576addb5b77 log: extract common part from getgraphlogrevs() and getlogrevs()
Yuya Nishihara <yuya@tcha.org>
parents: 24061
diff changeset
  1033
    return revs
f576addb5b77 log: extract common part from getgraphlogrevs() and getlogrevs()
Yuya Nishihara <yuya@tcha.org>
parents: 24061
diff changeset
  1034
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
  1035
45628
7f033a587414 log: extract function that builds (revs, makefilematcher) from walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45627
diff changeset
  1036
def makewalker(repo, wopts):
7f033a587414 log: extract function that builds (revs, makefilematcher) from walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45627
diff changeset
  1037
    # type: (Any, walkopts) -> Tuple[smartset.abstractsmartset, Optional[Callable[[Any], matchmod.basematcher]]]
7f033a587414 log: extract function that builds (revs, makefilematcher) from walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45627
diff changeset
  1038
    """Build (revs, makefilematcher) to scan revision/file history
35548
b14c8bcfbad9 log: drop unused expr from return value of getlogrevs()
Yuya Nishihara <yuya@tcha.org>
parents: 35547
diff changeset
  1039
45628
7f033a587414 log: extract function that builds (revs, makefilematcher) from walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45627
diff changeset
  1040
    - revs is the smartset to be traversed.
7f033a587414 log: extract function that builds (revs, makefilematcher) from walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45627
diff changeset
  1041
    - makefilematcher is a function to map ctx to a matcher for that revision
17180
ae0629161090 graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
  1042
    """
45565
c1d0f83d62c4 log: introduce struct that carries log traversal options
Yuya Nishihara <yuya@tcha.org>
parents: 45564
diff changeset
  1043
    revs = _initialrevs(repo, wopts)
17180
ae0629161090 graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
  1044
    if not revs:
35548
b14c8bcfbad9 log: drop unused expr from return value of getlogrevs()
Yuya Nishihara <yuya@tcha.org>
parents: 35547
diff changeset
  1045
        return smartset.baseset(), None
45625
c11099cc1de4 log: map --removed to walkopts.force_changelog_traversal
Yuya Nishihara <yuya@tcha.org>
parents: 45568
diff changeset
  1046
    # TODO: might want to merge slowpath with wopts.force_changelog_traversal
45565
c1d0f83d62c4 log: introduce struct that carries log traversal options
Yuya Nishihara <yuya@tcha.org>
parents: 45564
diff changeset
  1047
    match, pats, slowpath = _makematcher(repo, revs, wopts)
c1d0f83d62c4 log: introduce struct that carries log traversal options
Yuya Nishihara <yuya@tcha.org>
parents: 45564
diff changeset
  1048
    wopts = attr.evolve(wopts, pats=pats)
c1d0f83d62c4 log: introduce struct that carries log traversal options
Yuya Nishihara <yuya@tcha.org>
parents: 45564
diff changeset
  1049
35690
3e394e0558d7 log: build follow-log filematcher at once
Yuya Nishihara <yuya@tcha.org>
parents: 35689
diff changeset
  1050
    filematcher = None
45566
24df19a9ab87 log: pass around --follow/--follow-first options by walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45565
diff changeset
  1051
    if wopts.follow:
35688
84d0e99c063a log: replace "not pats" with matcher attribute for consistency
Yuya Nishihara <yuya@tcha.org>
parents: 35687
diff changeset
  1052
        if slowpath or match.always():
45566
24df19a9ab87 log: pass around --follow/--follow-first options by walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45565
diff changeset
  1053
            revs = dagop.revancestors(repo, revs, followfirst=wopts.follow == 1)
35686
b25fa5da4ca2 log: resolve --follow thoroughly in getlogrevs()
Yuya Nishihara <yuya@tcha.org>
parents: 35685
diff changeset
  1054
        else:
45625
c11099cc1de4 log: map --removed to walkopts.force_changelog_traversal
Yuya Nishihara <yuya@tcha.org>
parents: 45568
diff changeset
  1055
            assert not wopts.force_changelog_traversal
45566
24df19a9ab87 log: pass around --follow/--follow-first options by walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45565
diff changeset
  1056
            revs, filematcher = _fileancestors(
24df19a9ab87 log: pass around --follow/--follow-first options by walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45565
diff changeset
  1057
                repo, revs, match, followfirst=wopts.follow == 1
24df19a9ab87 log: pass around --follow/--follow-first options by walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45565
diff changeset
  1058
            )
35684
1c929b4942a3 log: resolve --follow with -rREV in cmdutil.getlogrevs()
Yuya Nishihara <yuya@tcha.org>
parents: 35683
diff changeset
  1059
        revs.reverse()
35690
3e394e0558d7 log: build follow-log filematcher at once
Yuya Nishihara <yuya@tcha.org>
parents: 35689
diff changeset
  1060
    if filematcher is None:
45565
c1d0f83d62c4 log: introduce struct that carries log traversal options
Yuya Nishihara <yuya@tcha.org>
parents: 45564
diff changeset
  1061
        filematcher = _makenofollowfilematcher(repo, wopts.pats, wopts.opts)
35690
3e394e0558d7 log: build follow-log filematcher at once
Yuya Nishihara <yuya@tcha.org>
parents: 35689
diff changeset
  1062
    if filematcher is None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
  1063
36002
f8ad57d24252 log: pass ctx to makefilematcher() and makehunksfilter() functions
Yuya Nishihara <yuya@tcha.org>
parents: 35961
diff changeset
  1064
        def filematcher(ctx):
35690
3e394e0558d7 log: build follow-log filematcher at once
Yuya Nishihara <yuya@tcha.org>
parents: 35689
diff changeset
  1065
            return match
3e394e0558d7 log: build follow-log filematcher at once
Yuya Nishihara <yuya@tcha.org>
parents: 35689
diff changeset
  1066
45565
c1d0f83d62c4 log: introduce struct that carries log traversal options
Yuya Nishihara <yuya@tcha.org>
parents: 45564
diff changeset
  1067
    expr = _makerevset(repo, wopts, slowpath)
45627
224c786f4fce log: move --graph and topo sort options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45626
diff changeset
  1068
    if wopts.sort_revisions:
224c786f4fce log: move --graph and topo sort options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45626
diff changeset
  1069
        assert wopts.sort_revisions in {b'topo', b'desc'}
224c786f4fce log: move --graph and topo sort options to walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45626
diff changeset
  1070
        if wopts.sort_revisions == b'topo':
42309
604c086ddde6 log: add config for making `hg log -G` always topo-sorted
Martin von Zweigbergk <martinvonz@google.com>
parents: 42308
diff changeset
  1071
            if not revs.istopo():
604c086ddde6 log: add config for making `hg log -G` always topo-sorted
Martin von Zweigbergk <martinvonz@google.com>
parents: 42308
diff changeset
  1072
                revs = dagop.toposort(revs, repo.changelog.parentrevs)
604c086ddde6 log: add config for making `hg log -G` always topo-sorted
Martin von Zweigbergk <martinvonz@google.com>
parents: 42308
diff changeset
  1073
                # TODO: try to iterate the set lazily
42319
b162229ebe0d log: flag topo-sorted set as such
Yuya Nishihara <yuya@tcha.org>
parents: 42309
diff changeset
  1074
                revs = revset.baseset(list(revs), istopo=True)
42309
604c086ddde6 log: add config for making `hg log -G` always topo-sorted
Martin von Zweigbergk <martinvonz@google.com>
parents: 42308
diff changeset
  1075
        elif not (revs.isdescending() or revs.istopo()):
45563
142f0dcf90d0 log: remove stale comment about order of user revset
Yuya Nishihara <yuya@tcha.org>
parents: 45473
diff changeset
  1076
            # User-specified revs might be unsorted
29335
631617262e55 graphmod: avoid sorting when already sorted
Martijn Pieters <mjpieters@fb.com>
parents: 29327
diff changeset
  1077
            revs.sort(reverse=True)
17180
ae0629161090 graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
  1078
    if expr:
35547
b6dbc860570d log: don't expand aliases in revset built from command options
Yuya Nishihara <yuya@tcha.org>
parents: 35545
diff changeset
  1079
        matcher = revset.match(None, expr)
34019
205c47e30a93 revset: make match function follow given subset if specified (API)
Yuya Nishihara <yuya@tcha.org>
parents: 34018
diff changeset
  1080
        revs = matcher(repo, revs)
45567
bddf70c93614 log: parse --limit option by logcmdutil.parseopts()
Yuya Nishihara <yuya@tcha.org>
parents: 45566
diff changeset
  1081
    if wopts.limit is not None:
bddf70c93614 log: parse --limit option by logcmdutil.parseopts()
Yuya Nishihara <yuya@tcha.org>
parents: 45566
diff changeset
  1082
        revs = revs.slice(0, wopts.limit)
36007
29b83c08afe0 log: pack filematcher and hunksfilter into changesetdiffer object
Yuya Nishihara <yuya@tcha.org>
parents: 36005
diff changeset
  1083
45628
7f033a587414 log: extract function that builds (revs, makefilematcher) from walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45627
diff changeset
  1084
    return revs, filematcher
7f033a587414 log: extract function that builds (revs, makefilematcher) from walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45627
diff changeset
  1085
7f033a587414 log: extract function that builds (revs, makefilematcher) from walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45627
diff changeset
  1086
7f033a587414 log: extract function that builds (revs, makefilematcher) from walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45627
diff changeset
  1087
def getrevs(repo, wopts):
7f033a587414 log: extract function that builds (revs, makefilematcher) from walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45627
diff changeset
  1088
    # type: (Any, walkopts) -> Tuple[smartset.abstractsmartset, Optional[changesetdiffer]]
7f033a587414 log: extract function that builds (revs, makefilematcher) from walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45627
diff changeset
  1089
    """Return (revs, differ) where revs is a smartset
7f033a587414 log: extract function that builds (revs, makefilematcher) from walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45627
diff changeset
  1090
7f033a587414 log: extract function that builds (revs, makefilematcher) from walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45627
diff changeset
  1091
    differ is a changesetdiffer with pre-configured file matcher.
7f033a587414 log: extract function that builds (revs, makefilematcher) from walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45627
diff changeset
  1092
    """
7f033a587414 log: extract function that builds (revs, makefilematcher) from walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45627
diff changeset
  1093
    revs, filematcher = makewalker(repo, wopts)
7f033a587414 log: extract function that builds (revs, makefilematcher) from walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45627
diff changeset
  1094
    if not revs:
7f033a587414 log: extract function that builds (revs, makefilematcher) from walkopts
Yuya Nishihara <yuya@tcha.org>
parents: 45627
diff changeset
  1095
        return revs, None
36007
29b83c08afe0 log: pack filematcher and hunksfilter into changesetdiffer object
Yuya Nishihara <yuya@tcha.org>
parents: 36005
diff changeset
  1096
    differ = changesetdiffer()
29b83c08afe0 log: pack filematcher and hunksfilter into changesetdiffer object
Yuya Nishihara <yuya@tcha.org>
parents: 36005
diff changeset
  1097
    differ._makefilematcher = filematcher
29b83c08afe0 log: pack filematcher and hunksfilter into changesetdiffer object
Yuya Nishihara <yuya@tcha.org>
parents: 36005
diff changeset
  1098
    return revs, differ
17180
ae0629161090 graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
  1099
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
  1100
35887
572f36e9a780 logcmdutil: drop redundant "log" from function names (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35886
diff changeset
  1101
def _parselinerangeopt(repo, opts):
34857
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1102
    """Parse --line-range log option and return a list of tuples (filename,
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1103
    (fromline, toline)).
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1104
    """
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1105
    linerangebyfname = []
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1106
    for pat in opts.get(b'line_range', []):
34857
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1107
        try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1108
            pat, linerange = pat.rsplit(b',', 1)
34857
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1109
        except ValueError:
48552
91017508a785 logcmdutil: raise `InputError` on bad CLI arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 48118
diff changeset
  1110
            raise error.InputError(
91017508a785 logcmdutil: raise `InputError` on bad CLI arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 48118
diff changeset
  1111
                _(b'malformatted line-range pattern %s') % pat
91017508a785 logcmdutil: raise `InputError` on bad CLI arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 48118
diff changeset
  1112
            )
34857
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1113
        try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1114
            fromline, toline = map(int, linerange.split(b':'))
34857
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1115
        except ValueError:
48552
91017508a785 logcmdutil: raise `InputError` on bad CLI arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 48118
diff changeset
  1116
            raise error.InputError(_(b"invalid line range for %s") % pat)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1117
        msg = _(b"line range pattern '%s' must match exactly one file") % pat
34857
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1118
        fname = scmutil.parsefollowlinespattern(repo, None, pat, msg)
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1119
        linerangebyfname.append(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
  1120
            (fname, util.processlinerange(fromline, toline))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
  1121
        )
34857
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1122
    return linerangebyfname
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1123
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
  1124
35887
572f36e9a780 logcmdutil: drop redundant "log" from function names (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35886
diff changeset
  1125
def getlinerangerevs(repo, userrevs, opts):
36007
29b83c08afe0 log: pack filematcher and hunksfilter into changesetdiffer object
Yuya Nishihara <yuya@tcha.org>
parents: 36005
diff changeset
  1126
    """Return (revs, differ).
34857
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1127
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1128
    "revs" are revisions obtained by processing "line-range" log options and
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1129
    walking block ancestors of each specified file/line-range.
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1130
36007
29b83c08afe0 log: pack filematcher and hunksfilter into changesetdiffer object
Yuya Nishihara <yuya@tcha.org>
parents: 36005
diff changeset
  1131
    "differ" is a changesetdiffer with pre-configured file matcher and hunks
29b83c08afe0 log: pack filematcher and hunksfilter into changesetdiffer object
Yuya Nishihara <yuya@tcha.org>
parents: 36005
diff changeset
  1132
    filter.
34857
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1133
    """
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1134
    wctx = repo[None]
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1135
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1136
    # Two-levels map of "rev -> file ctx -> [line range]".
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1137
    linerangesbyrev = {}
35887
572f36e9a780 logcmdutil: drop redundant "log" from function names (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35886
diff changeset
  1138
    for fname, (fromline, toline) in _parselinerangeopt(repo, opts):
34907
0ccfc468423a log: handle removed files with --line-range patterns
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34905
diff changeset
  1139
        if fname not in wctx:
48553
3b6b43a7ace4 logcmdutil: raise `StateError` when file to follow doesn't exist
Martin von Zweigbergk <martinvonz@google.com>
parents: 48552
diff changeset
  1140
            raise error.StateError(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
  1141
                _(b'cannot follow file not in parent revision: "%s"') % fname
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
  1142
            )
34857
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1143
        fctx = wctx.filectx(fname)
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1144
        for fctx, linerange in dagop.blockancestors(fctx, fromline, toline):
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1145
            rev = fctx.introrev()
43740
d1b9d2c6ec96 log: map None rev to wdirrev when filtering revisions with --line-range
Denis Laxalde <denis@laxalde.org>
parents: 43117
diff changeset
  1146
            if rev is None:
d1b9d2c6ec96 log: map None rev to wdirrev when filtering revisions with --line-range
Denis Laxalde <denis@laxalde.org>
parents: 43117
diff changeset
  1147
                rev = wdirrev
34857
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1148
            if rev not in userrevs:
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1149
                continue
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
  1150
            linerangesbyrev.setdefault(rev, {}).setdefault(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
  1151
                fctx.path(), []
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
  1152
            ).append(linerange)
34857
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1153
36005
dd77e36eabb6 logcmdutil: create hunksfilter and filematcher even if no diff option given
Yuya Nishihara <yuya@tcha.org>
parents: 36004
diff changeset
  1154
    def nofilterhunksfn(fctx, hunks):
dd77e36eabb6 logcmdutil: create hunksfilter and filematcher even if no diff option given
Yuya Nishihara <yuya@tcha.org>
parents: 36004
diff changeset
  1155
        return hunks
34857
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1156
36005
dd77e36eabb6 logcmdutil: create hunksfilter and filematcher even if no diff option given
Yuya Nishihara <yuya@tcha.org>
parents: 36004
diff changeset
  1157
    def hunksfilter(ctx):
43740
d1b9d2c6ec96 log: map None rev to wdirrev when filtering revisions with --line-range
Denis Laxalde <denis@laxalde.org>
parents: 43117
diff changeset
  1158
        fctxlineranges = linerangesbyrev.get(scmutil.intrev(ctx))
36005
dd77e36eabb6 logcmdutil: create hunksfilter and filematcher even if no diff option given
Yuya Nishihara <yuya@tcha.org>
parents: 36004
diff changeset
  1159
        if fctxlineranges is None:
dd77e36eabb6 logcmdutil: create hunksfilter and filematcher even if no diff option given
Yuya Nishihara <yuya@tcha.org>
parents: 36004
diff changeset
  1160
            return nofilterhunksfn
34857
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1161
36005
dd77e36eabb6 logcmdutil: create hunksfilter and filematcher even if no diff option given
Yuya Nishihara <yuya@tcha.org>
parents: 36004
diff changeset
  1162
        def filterfn(fctx, hunks):
dd77e36eabb6 logcmdutil: create hunksfilter and filematcher even if no diff option given
Yuya Nishihara <yuya@tcha.org>
parents: 36004
diff changeset
  1163
            lineranges = fctxlineranges.get(fctx.path())
dd77e36eabb6 logcmdutil: create hunksfilter and filematcher even if no diff option given
Yuya Nishihara <yuya@tcha.org>
parents: 36004
diff changeset
  1164
            if lineranges is not None:
dd77e36eabb6 logcmdutil: create hunksfilter and filematcher even if no diff option given
Yuya Nishihara <yuya@tcha.org>
parents: 36004
diff changeset
  1165
                for hr, lines in hunks:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
  1166
                    if hr is None:  # binary
36005
dd77e36eabb6 logcmdutil: create hunksfilter and filematcher even if no diff option given
Yuya Nishihara <yuya@tcha.org>
parents: 36004
diff changeset
  1167
                        yield hr, lines
dd77e36eabb6 logcmdutil: create hunksfilter and filematcher even if no diff option given
Yuya Nishihara <yuya@tcha.org>
parents: 36004
diff changeset
  1168
                        continue
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
  1169
                    if any(mdiff.hunkinrange(hr[2:], lr) for lr in lineranges):
36005
dd77e36eabb6 logcmdutil: create hunksfilter and filematcher even if no diff option given
Yuya Nishihara <yuya@tcha.org>
parents: 36004
diff changeset
  1170
                        yield hr, lines
dd77e36eabb6 logcmdutil: create hunksfilter and filematcher even if no diff option given
Yuya Nishihara <yuya@tcha.org>
parents: 36004
diff changeset
  1171
            else:
dd77e36eabb6 logcmdutil: create hunksfilter and filematcher even if no diff option given
Yuya Nishihara <yuya@tcha.org>
parents: 36004
diff changeset
  1172
                for hunk in hunks:
dd77e36eabb6 logcmdutil: create hunksfilter and filematcher even if no diff option given
Yuya Nishihara <yuya@tcha.org>
parents: 36004
diff changeset
  1173
                    yield hunk
34857
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1174
36005
dd77e36eabb6 logcmdutil: create hunksfilter and filematcher even if no diff option given
Yuya Nishihara <yuya@tcha.org>
parents: 36004
diff changeset
  1175
        return filterfn
34857
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1176
36005
dd77e36eabb6 logcmdutil: create hunksfilter and filematcher even if no diff option given
Yuya Nishihara <yuya@tcha.org>
parents: 36004
diff changeset
  1177
    def filematcher(ctx):
43740
d1b9d2c6ec96 log: map None rev to wdirrev when filtering revisions with --line-range
Denis Laxalde <denis@laxalde.org>
parents: 43117
diff changeset
  1178
        files = list(linerangesbyrev.get(scmutil.intrev(ctx), []))
36005
dd77e36eabb6 logcmdutil: create hunksfilter and filematcher even if no diff option given
Yuya Nishihara <yuya@tcha.org>
parents: 36004
diff changeset
  1179
        return scmutil.matchfiles(repo, files)
34857
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1180
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1181
    revs = sorted(linerangesbyrev, reverse=True)
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1182
36007
29b83c08afe0 log: pack filematcher and hunksfilter into changesetdiffer object
Yuya Nishihara <yuya@tcha.org>
parents: 36005
diff changeset
  1183
    differ = changesetdiffer()
29b83c08afe0 log: pack filematcher and hunksfilter into changesetdiffer object
Yuya Nishihara <yuya@tcha.org>
parents: 36005
diff changeset
  1184
    differ._makefilematcher = filematcher
29b83c08afe0 log: pack filematcher and hunksfilter into changesetdiffer object
Yuya Nishihara <yuya@tcha.org>
parents: 36005
diff changeset
  1185
    differ._makehunksfilter = hunksfilter
43630
af9c73f26371 logcmdutil: let getlinerangerevs() return "revs" as a smartset
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 43117
diff changeset
  1186
    return smartset.baseset(revs), differ
34857
84c6b9384d6a log: add -L/--line-range option to follow file history by line range
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34856
diff changeset
  1187
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
  1188
27216
8117e2cd959e graphlog: make node symbol templatable by ui.graphnodetemplate option
Yuya Nishihara <yuya@tcha.org>
parents: 27214
diff changeset
  1189
def _graphnodeformatter(ui, displayer):
45766
1f7c077e0640 config: rename ui.graphnodetemplate to command-templates.graphnode
Martin von Zweigbergk <martinvonz@google.com>
parents: 45765
diff changeset
  1190
    spec = ui.config(b'command-templates', b'graphnode')
27216
8117e2cd959e graphlog: make node symbol templatable by ui.graphnodetemplate option
Yuya Nishihara <yuya@tcha.org>
parents: 27214
diff changeset
  1191
    if not spec:
36513
6ad140dc4269 templatekw: extract non-templatekw function as getgraphnode()
Yuya Nishihara <yuya@tcha.org>
parents: 36441
diff changeset
  1192
        return templatekw.getgraphnode  # fast path for "{graphnode}"
27216
8117e2cd959e graphlog: make node symbol templatable by ui.graphnodetemplate option
Yuya Nishihara <yuya@tcha.org>
parents: 27214
diff changeset
  1193
32045
3eceeede26e9 graphlog: optionally strip quotes from graphnode template (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 32005
diff changeset
  1194
    spec = templater.unquotestring(spec)
35886
b0014780c7fc logcmdutil: rename classes and functions to conform to our coding style (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35885
diff changeset
  1195
    if isinstance(displayer, changesettemplater):
36982
255f635c3204 templater: convert resources to a table of callables for future extension
Yuya Nishihara <yuya@tcha.org>
parents: 36920
diff changeset
  1196
        # reuse cache of slow templates
37072
d64ae4fef471 log: do no expect templateresources() returning a dict
Yuya Nishihara <yuya@tcha.org>
parents: 36989
diff changeset
  1197
        tres = displayer._tresources
d64ae4fef471 log: do no expect templateresources() returning a dict
Yuya Nishihara <yuya@tcha.org>
parents: 36989
diff changeset
  1198
    else:
d64ae4fef471 log: do no expect templateresources() returning a dict
Yuya Nishihara <yuya@tcha.org>
parents: 36989
diff changeset
  1199
        tres = formatter.templateresources(ui)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
  1200
    templ = formatter.maketemplater(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
  1201
        ui, spec, defaults=templatekw.keywords, resources=tres
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
  1202
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
  1203
44345
14d0e89520a2 graphlog: use '%' for other context in merge conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 43830
diff changeset
  1204
    def formatnode(repo, ctx, cache):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1205
        props = {b'ctx': ctx, b'repo': repo}
36988
317382151ac3 templater: rename .render(mapping) to .renderdefault(mapping) (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36982
diff changeset
  1206
        return templ.renderdefault(props)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
  1207
27216
8117e2cd959e graphlog: make node symbol templatable by ui.graphnodetemplate option
Yuya Nishihara <yuya@tcha.org>
parents: 27214
diff changeset
  1208
    return formatnode
8117e2cd959e graphlog: make node symbol templatable by ui.graphnodetemplate option
Yuya Nishihara <yuya@tcha.org>
parents: 27214
diff changeset
  1209
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
  1210
42504
a68350a7fc55 log: pass getcopies() function instead of getrenamed() to displayer (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 42502
diff changeset
  1211
def displaygraph(ui, repo, dag, displayer, edgefn, getcopies=None, props=None):
34189
e9898ad31115 cmdutil: allow extra properties to be added to each context
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34121
diff changeset
  1212
    props = props or {}
27216
8117e2cd959e graphlog: make node symbol templatable by ui.graphnodetemplate option
Yuya Nishihara <yuya@tcha.org>
parents: 27214
diff changeset
  1213
    formatnode = _graphnodeformatter(ui, displayer)
28375
97cb1aeaca78 graphmod: refactor state handling
Martijn Pieters <mjpieters@fb.com>
parents: 28322
diff changeset
  1214
    state = graphmod.asciistate()
43776
faa8a59f4a06 graphlog: change state dict to attr struct
Yuya Nishihara <yuya@tcha.org>
parents: 43774
diff changeset
  1215
    styles = state.styles
28999
790c076cd4a2 graphmod: disable graph styling when HGPLAIN is set (issue5212)
Martijn Pieters <mjpieters@fb.com>
parents: 28955
diff changeset
  1216
790c076cd4a2 graphmod: disable graph styling when HGPLAIN is set (issue5212)
Martijn Pieters <mjpieters@fb.com>
parents: 28955
diff changeset
  1217
    # only set graph styling if HGPLAIN is not set.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1218
    if ui.plain(b'graph'):
28999
790c076cd4a2 graphmod: disable graph styling when HGPLAIN is set (issue5212)
Martijn Pieters <mjpieters@fb.com>
parents: 28955
diff changeset
  1219
        # set all edge styles to |, the default pre-3.8 behaviour
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1220
        styles.update(dict.fromkeys(styles, b'|'))
28999
790c076cd4a2 graphmod: disable graph styling when HGPLAIN is set (issue5212)
Martijn Pieters <mjpieters@fb.com>
parents: 28955
diff changeset
  1221
    else:
790c076cd4a2 graphmod: disable graph styling when HGPLAIN is set (issue5212)
Martijn Pieters <mjpieters@fb.com>
parents: 28955
diff changeset
  1222
        edgetypes = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1223
            b'parent': graphmod.PARENT,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1224
            b'grandparent': graphmod.GRANDPARENT,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1225
            b'missing': graphmod.MISSINGPARENT,
28999
790c076cd4a2 graphmod: disable graph styling when HGPLAIN is set (issue5212)
Martijn Pieters <mjpieters@fb.com>
parents: 28955
diff changeset
  1226
        }
790c076cd4a2 graphmod: disable graph styling when HGPLAIN is set (issue5212)
Martijn Pieters <mjpieters@fb.com>
parents: 28955
diff changeset
  1227
        for name, key in edgetypes.items():
790c076cd4a2 graphmod: disable graph styling when HGPLAIN is set (issue5212)
Martijn Pieters <mjpieters@fb.com>
parents: 28955
diff changeset
  1228
            # experimental config: experimental.graphstyle.*
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
  1229
            styles[key] = ui.config(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1230
                b'experimental', b'graphstyle.%s' % name, styles[key]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
  1231
            )
28999
790c076cd4a2 graphmod: disable graph styling when HGPLAIN is set (issue5212)
Martijn Pieters <mjpieters@fb.com>
parents: 28955
diff changeset
  1232
            if not styles[key]:
790c076cd4a2 graphmod: disable graph styling when HGPLAIN is set (issue5212)
Martijn Pieters <mjpieters@fb.com>
parents: 28955
diff changeset
  1233
                styles[key] = None
790c076cd4a2 graphmod: disable graph styling when HGPLAIN is set (issue5212)
Martijn Pieters <mjpieters@fb.com>
parents: 28955
diff changeset
  1234
790c076cd4a2 graphmod: disable graph styling when HGPLAIN is set (issue5212)
Martijn Pieters <mjpieters@fb.com>
parents: 28955
diff changeset
  1235
        # experimental config: experimental.graphshorten
43776
faa8a59f4a06 graphlog: change state dict to attr struct
Yuya Nishihara <yuya@tcha.org>
parents: 43774
diff changeset
  1236
        state.graphshorten = ui.configbool(b'experimental', b'graphshorten')
28891
ac30adb260ea graphmod: shorten graph
santiagopim <santiagopim@gmail.com>
parents: 28861
diff changeset
  1237
44345
14d0e89520a2 graphlog: use '%' for other context in merge conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 43830
diff changeset
  1238
    formatnode_cache = {}
17180
ae0629161090 graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
  1239
    for rev, type, ctx, parents in dag:
44345
14d0e89520a2 graphlog: use '%' for other context in merge conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 43830
diff changeset
  1240
        char = formatnode(repo, ctx, formatnode_cache)
42504
a68350a7fc55 log: pass getcopies() function instead of getrenamed() to displayer (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 42502
diff changeset
  1241
        copies = getcopies(ctx) if getcopies else None
33858
6f6c87888b22 log: add a "graphwidth" template variable
Danny Hooper <hooper@google.com>
parents: 33856
diff changeset
  1242
        edges = edgefn(type, char, state, rev, parents)
6f6c87888b22 log: add a "graphwidth" template variable
Danny Hooper <hooper@google.com>
parents: 33856
diff changeset
  1243
        firstedge = next(edges)
6f6c87888b22 log: add a "graphwidth" template variable
Danny Hooper <hooper@google.com>
parents: 33856
diff changeset
  1244
        width = firstedge[2]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
  1245
        displayer.show(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
  1246
            ctx, copies=copies, graphwidth=width, **pycompat.strkwargs(props)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
  1247
        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1248
        lines = displayer.hunk.pop(rev).split(b'\n')
17180
ae0629161090 graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
  1249
        if not lines[-1]:
ae0629161090 graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
  1250
            del lines[-1]
25763
60c791592aa7 changeset_printer: change flush() to accept ctx instead of rev
Yuya Nishihara <yuya@tcha.org>
parents: 25762
diff changeset
  1251
        displayer.flush(ctx)
33858
6f6c87888b22 log: add a "graphwidth" template variable
Danny Hooper <hooper@google.com>
parents: 33856
diff changeset
  1252
        for type, char, width, coldata in itertools.chain([firstedge], edges):
17180
ae0629161090 graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
  1253
            graphmod.ascii(ui, state, type, char, lines, coldata)
33858
6f6c87888b22 log: add a "graphwidth" template variable
Danny Hooper <hooper@google.com>
parents: 33856
diff changeset
  1254
            lines = []
17180
ae0629161090 graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
  1255
    displayer.close()
ae0629161090 graphlog: extract revset/support functions into cmdutil
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
  1256
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
  1257
36198
7bc10d3f68b4 log: factor out function to feed revisions to displayer
Yuya Nishihara <yuya@tcha.org>
parents: 36196
diff changeset
  1258
def displaygraphrevs(ui, repo, revs, displayer, getrenamed):
17181
6f71167292f2 log: support --graph without graphlog extension
Patrick Mezard <patrick@mezard.eu>
parents: 17180
diff changeset
  1259
    revdag = graphmod.dagwalker(repo, revs)
36003
fcde8946c553 logcmdutil: hold makefilematcher/makehunksfilter() by changesetpriner (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36002
diff changeset
  1260
    displaygraph(ui, repo, revdag, displayer, graphmod.asciiedges, getrenamed)
17181
6f71167292f2 log: support --graph without graphlog extension
Patrick Mezard <patrick@mezard.eu>
parents: 17180
diff changeset
  1261
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
  1262
42504
a68350a7fc55 log: pass getcopies() function instead of getrenamed() to displayer (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 42502
diff changeset
  1263
def displayrevs(ui, repo, revs, displayer, getcopies):
36198
7bc10d3f68b4 log: factor out function to feed revisions to displayer
Yuya Nishihara <yuya@tcha.org>
parents: 36196
diff changeset
  1264
    for rev in revs:
7bc10d3f68b4 log: factor out function to feed revisions to displayer
Yuya Nishihara <yuya@tcha.org>
parents: 36196
diff changeset
  1265
        ctx = repo[rev]
42504
a68350a7fc55 log: pass getcopies() function instead of getrenamed() to displayer (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 42502
diff changeset
  1266
        copies = getcopies(ctx) if getcopies else None
36198
7bc10d3f68b4 log: factor out function to feed revisions to displayer
Yuya Nishihara <yuya@tcha.org>
parents: 36196
diff changeset
  1267
        displayer.show(ctx, copies=copies)
7bc10d3f68b4 log: factor out function to feed revisions to displayer
Yuya Nishihara <yuya@tcha.org>
parents: 36196
diff changeset
  1268
        displayer.flush(ctx)
7bc10d3f68b4 log: factor out function to feed revisions to displayer
Yuya Nishihara <yuya@tcha.org>
parents: 36196
diff changeset
  1269
    displayer.close()
7bc10d3f68b4 log: factor out function to feed revisions to displayer
Yuya Nishihara <yuya@tcha.org>
parents: 36196
diff changeset
  1270
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
  1271
17182
cdf1532d89c6 incoming/outgoing: handle --graph in core
Patrick Mezard <patrick@mezard.eu>
parents: 17181
diff changeset
  1272
def checkunsupportedgraphflags(pats, opts):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1273
    for op in [b"newest_first"]:
17182
cdf1532d89c6 incoming/outgoing: handle --graph in core
Patrick Mezard <patrick@mezard.eu>
parents: 17181
diff changeset
  1274
        if op in opts and opts[op]:
48552
91017508a785 logcmdutil: raise `InputError` on bad CLI arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 48118
diff changeset
  1275
            raise error.InputError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1276
                _(b"-G/--graph option is incompatible with --%s")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1277
                % op.replace(b"_", b"-")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
  1278
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42504
diff changeset
  1279
17182
cdf1532d89c6 incoming/outgoing: handle --graph in core
Patrick Mezard <patrick@mezard.eu>
parents: 17181
diff changeset
  1280
cdf1532d89c6 incoming/outgoing: handle --graph in core
Patrick Mezard <patrick@mezard.eu>
parents: 17181
diff changeset
  1281
def graphrevs(repo, nodes, opts):
35887
572f36e9a780 logcmdutil: drop redundant "log" from function names (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35886
diff changeset
  1282
    limit = getlimit(opts)
17182
cdf1532d89c6 incoming/outgoing: handle --graph in core
Patrick Mezard <patrick@mezard.eu>
parents: 17181
diff changeset
  1283
    nodes.reverse()
cdf1532d89c6 incoming/outgoing: handle --graph in core
Patrick Mezard <patrick@mezard.eu>
parents: 17181
diff changeset
  1284
    if limit is not None:
cdf1532d89c6 incoming/outgoing: handle --graph in core
Patrick Mezard <patrick@mezard.eu>
parents: 17181
diff changeset
  1285
        nodes = nodes[:limit]
cdf1532d89c6 incoming/outgoing: handle --graph in core
Patrick Mezard <patrick@mezard.eu>
parents: 17181
diff changeset
  1286
    return graphmod.nodes(repo, nodes)