annotate mercurial/logcmdutil.py @ 49306:2e726c934fcd

py3: catch FileNotFoundError instead of checking errno == ENOENT
author Manuel Jacob <me@manueljacob.de>
date Tue, 31 May 2022 22:50:01 +0200
parents eb8aed493a56
children 79b2c98ab7b4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
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(
49029
eb8aed493a56 logcmdutil: use new function for getting first line of string
Martin von Zweigbergk <martinvonz@google.com>
parents: 48946
diff changeset
419 columns[b'summary'] % stringutil.firstline(description),
43077
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)