annotate mercurial/scmutil.py @ 52669:e627cc25b6f3

pyupgrade: rewrite `yield` statements in a loop to `yield from` This is the `legacy` fixer in `pyupgrade`, with the `yield` statement yielding loop commented back in. This seems to help pytype in some cases, and hurt it in others. But that can be manually fixed later. Note that it's possibly buggy in that it aggressively changed `import-checker.py` to `yield from 'fcntl', 'grp', 'pwd', 'select', 'termios': # Unix only`, which is invalid syntax. Possibly it needed help from the token fixer that I've disabled locally (because that wants to make a bunch of unrelated changes). Just change those few places to yield from a list, to avoid having to constantly revert that.
author Matt Harbison <matt_harbison@yahoo.com>
date Sun, 05 Jan 2025 22:26:16 -0500
parents 24ee91ba9aa8
children 4cb75772818d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
13962
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
1 # scmutil.py - Mercurial core utility functions
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
2 #
46819
d4ba4d51f85f contributor: change mentions of mpm to olivia
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46711
diff changeset
3 # Copyright Olivia Mackall <olivia@selenic.com>
13962
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
4 #
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
5 # This software may be used and distributed according to the terms of the
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
6 # GNU General Public License version 2 or any later version.
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
7
51901
f4733654f144 typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents: 51849
diff changeset
8 from __future__ import annotations
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
9
49263
63fd0282ad40 node: stop converting binascii.Error to TypeError in bin()
Manuel Jacob <me@manueljacob.de>
parents: 49037
diff changeset
10 import binascii
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
11 import errno
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
12 import glob
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
13 import os
41661
f8b18583049f add: pass around uipathfn and use instead of m.rel() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41660
diff changeset
14 import posixpath
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
15 import re
34462
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34461
diff changeset
16 import subprocess
51788
278af66e6595 typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents: 51762
diff changeset
17 import typing
33252
53b3a1968aa6 obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33246
diff changeset
18 import weakref
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
19
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
20 from typing import (
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
21 Callable,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
22 Dict,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
23 Iterable,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
24 Iterator,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
25 List,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
26 Optional,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
27 Set,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
28 Tuple,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
29 )
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
30
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
31 from .i18n import _
32678
55ff67ffcead scmutil: introduce binnode(ctx) as paired function with intrev(ctx)
Yuya Nishihara <yuya@tcha.org>
parents: 32676
diff changeset
32 from .node import (
37528
d2b484eed1ec scmutil: handle full hex nodeids in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37527
diff changeset
33 bin,
33100
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
34 hex,
39899
d739f423bf06 repo: look up nullrev context by revnum, not symbolic name
Martin von Zweigbergk <martinvonz@google.com>
parents: 39896
diff changeset
35 nullrev,
34334
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34158
diff changeset
36 short,
32678
55ff67ffcead scmutil: introduce binnode(ctx) as paired function with intrev(ctx)
Yuya Nishihara <yuya@tcha.org>
parents: 32676
diff changeset
37 wdirrev,
55ff67ffcead scmutil: introduce binnode(ctx) as paired function with intrev(ctx)
Yuya Nishihara <yuya@tcha.org>
parents: 32676
diff changeset
38 )
43698
c5548b0b6847 scmutil: convert status data object from a tuple to an attrs (API)
Augie Fackler <augie@google.com>
parents: 43677
diff changeset
39 from .thirdparty import attr
51788
278af66e6595 typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents: 51762
diff changeset
40
278af66e6595 typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents: 51762
diff changeset
41 # Force pytype to use the non-vendored package
278af66e6595 typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents: 51762
diff changeset
42 if typing.TYPE_CHECKING:
278af66e6595 typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents: 51762
diff changeset
43 # noinspection PyPackageRequirements
278af66e6595 typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents: 51762
diff changeset
44 import attr
278af66e6595 typing: induce pytype to use the standard `attr` instead of the vendored copy
Matt Harbison <matt_harbison@yahoo.com>
parents: 51762
diff changeset
45
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
46 from . import (
41942
232d4b9d391a uncommit: move _movedirstate() to scmutil for reuse
Martin von Zweigbergk <martinvonz@google.com>
parents: 41804
diff changeset
47 copies as copiesmod,
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
48 encoding,
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
49 error,
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
50 match as matchmod,
33100
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
51 obsolete,
33252
53b3a1968aa6 obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33246
diff changeset
52 obsutil,
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
53 pathutil,
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
54 phases,
39254
7a759ad2d06d shortest: use nodetree for finding shortest node within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 39125
diff changeset
55 policy,
30318
af7c60988f6e py3: make scmutil.rcpath() return bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30109
diff changeset
56 pycompat,
45493
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
57 requirements as requirementsmod,
31044
0b8356705de6 revset: split language services to revsetlang module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 30644
diff changeset
58 revsetlang,
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
59 similar,
39902
a477679f6323 pullreport: skip filtered revs instead of obsolete ones
Boris Feld <boris.feld@octobus.net>
parents: 39899
diff changeset
60 smartset,
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
61 typelib,
34457
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
62 url,
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
63 util,
34543
6fad8059a970 scmutil: handle conflicting files and dirs in origbackuppath
Mark Thomas <mbthomas@fb.com>
parents: 34542
diff changeset
64 vfs,
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
65 )
18690
4c6f7f0dadab scmutil: split platform-specific bits into their own modules
Kevin Bullock <kbullock@ringworld.org>
parents: 18678
diff changeset
66
52480
f5d134e57f51 scmutil: explicitly subclass the `Status` protocol
Matt Harbison <matt_harbison@yahoo.com>
parents: 52116
diff changeset
67 from .interfaces import status as istatus
f5d134e57f51 scmutil: explicitly subclass the `Status` protocol
Matt Harbison <matt_harbison@yahoo.com>
parents: 52116
diff changeset
68
37087
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36844
diff changeset
69 from .utils import (
44060
a61287a95dc3 core: migrate uses of hashlib.sha1 to hashutil.sha1
Augie Fackler <augie@google.com>
parents: 44039
diff changeset
70 hashutil,
37123
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37097
diff changeset
71 procutil,
37087
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36844
diff changeset
72 stringutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36844
diff changeset
73 )
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36844
diff changeset
74
34645
75979c8d4572 codemod: use pycompat.iswindows
Jun Wu <quark@fb.com>
parents: 34620
diff changeset
75 if pycompat.iswindows:
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
76 from . import scmwindows as scmplatform
18690
4c6f7f0dadab scmutil: split platform-specific bits into their own modules
Kevin Bullock <kbullock@ringworld.org>
parents: 18678
diff changeset
77 else:
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
78 from . import scmposix as scmplatform
18690
4c6f7f0dadab scmutil: split platform-specific bits into their own modules
Kevin Bullock <kbullock@ringworld.org>
parents: 18678
diff changeset
79
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
80 if typing.TYPE_CHECKING:
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
81 from . import (
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
82 ui as uimod,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
83 )
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
84
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43365
diff changeset
85 parsers = policy.importmod('parsers')
44016
992f0d6e7f33 rust-index: use the new method in shortesthexnodeidprefix
Georges Racinet <georges.racinet@octobus.net>
parents: 44003
diff changeset
86 rustrevlog = policy.importrust('revlog')
39254
7a759ad2d06d shortest: use nodetree for finding shortest node within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 39125
diff changeset
87
30327
365812902904 scmutil: extend termwidth() to return terminal height, renamed to termsize()
Yuya Nishihara <yuya@tcha.org>
parents: 30322
diff changeset
88 termsize = scmplatform.termsize
13962
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
89
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
90
43698
c5548b0b6847 scmutil: convert status data object from a tuple to an attrs (API)
Augie Fackler <augie@google.com>
parents: 43677
diff changeset
91 @attr.s(slots=True, repr=False)
52480
f5d134e57f51 scmutil: explicitly subclass the `Status` protocol
Matt Harbison <matt_harbison@yahoo.com>
parents: 52116
diff changeset
92 class status(istatus.Status):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45934
diff changeset
93 """Struct with a list of files per status.
43698
c5548b0b6847 scmutil: convert status data object from a tuple to an attrs (API)
Augie Fackler <augie@google.com>
parents: 43677
diff changeset
94
c5548b0b6847 scmutil: convert status data object from a tuple to an attrs (API)
Augie Fackler <augie@google.com>
parents: 43677
diff changeset
95 The 'deleted', 'unknown' and 'ignored' properties are only
c5548b0b6847 scmutil: convert status data object from a tuple to an attrs (API)
Augie Fackler <augie@google.com>
parents: 43677
diff changeset
96 relevant to the working copy.
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45934
diff changeset
97 """
22913
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
98
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
99 modified = attr.ib(default=attr.Factory(list), type=List[bytes])
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
100 added = attr.ib(default=attr.Factory(list), type=List[bytes])
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
101 removed = attr.ib(default=attr.Factory(list), type=List[bytes])
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
102 deleted = attr.ib(default=attr.Factory(list), type=List[bytes])
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
103 unknown = attr.ib(default=attr.Factory(list), type=List[bytes])
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
104 ignored = attr.ib(default=attr.Factory(list), type=List[bytes])
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
105 clean = attr.ib(default=attr.Factory(list), type=List[bytes])
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
106
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
107 def __iter__(self) -> Iterator[List[bytes]]:
43698
c5548b0b6847 scmutil: convert status data object from a tuple to an attrs (API)
Augie Fackler <augie@google.com>
parents: 43677
diff changeset
108 yield self.modified
c5548b0b6847 scmutil: convert status data object from a tuple to an attrs (API)
Augie Fackler <augie@google.com>
parents: 43677
diff changeset
109 yield self.added
c5548b0b6847 scmutil: convert status data object from a tuple to an attrs (API)
Augie Fackler <augie@google.com>
parents: 43677
diff changeset
110 yield self.removed
c5548b0b6847 scmutil: convert status data object from a tuple to an attrs (API)
Augie Fackler <augie@google.com>
parents: 43677
diff changeset
111 yield self.deleted
c5548b0b6847 scmutil: convert status data object from a tuple to an attrs (API)
Augie Fackler <augie@google.com>
parents: 43677
diff changeset
112 yield self.unknown
c5548b0b6847 scmutil: convert status data object from a tuple to an attrs (API)
Augie Fackler <augie@google.com>
parents: 43677
diff changeset
113 yield self.ignored
c5548b0b6847 scmutil: convert status data object from a tuple to an attrs (API)
Augie Fackler <augie@google.com>
parents: 43677
diff changeset
114 yield self.clean
22913
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
115
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
116 def __repr__(self) -> str:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
117 return (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
118 r'<status modified=%s, added=%s, removed=%s, deleted=%s, '
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
119 r'unknown=%s, ignored=%s, clean=%s>'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
120 ) % tuple(pycompat.sysstr(stringutil.pprint(v)) for v in self)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
121
22913
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
122
20392
d4f804caa0ed itersubrepos: move to scmutil to break a direct import cycle
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
123 def itersubrepos(ctx1, ctx2):
d4f804caa0ed itersubrepos: move to scmutil to break a direct import cycle
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
124 """find subrepos in ctx1 or ctx2"""
d4f804caa0ed itersubrepos: move to scmutil to break a direct import cycle
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
125 # Create a (subpath, ctx) mapping where we prefer subpaths from
d4f804caa0ed itersubrepos: move to scmutil to break a direct import cycle
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
126 # ctx1. The subpaths from ctx2 are important when the .hgsub file
d4f804caa0ed itersubrepos: move to scmutil to break a direct import cycle
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
127 # has been modified (in ctx2) but not yet committed (in ctx1).
d4f804caa0ed itersubrepos: move to scmutil to break a direct import cycle
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
128 subpaths = dict.fromkeys(ctx2.substate, ctx2)
d4f804caa0ed itersubrepos: move to scmutil to break a direct import cycle
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
129 subpaths.update(dict.fromkeys(ctx1.substate, ctx1))
25418
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
130
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
131 missing = set()
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
132
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
133 for subpath in ctx2.substate:
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
134 if subpath not in ctx1.substate:
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
135 del subpaths[subpath]
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
136 missing.add(subpath)
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
137
49004
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48966
diff changeset
138 for subpath, ctx in sorted(subpaths.items()):
20392
d4f804caa0ed itersubrepos: move to scmutil to break a direct import cycle
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
139 yield subpath, ctx.sub(subpath)
d4f804caa0ed itersubrepos: move to scmutil to break a direct import cycle
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
140
25418
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
141 # Yield an empty subrepo based on ctx1 for anything only in ctx2. That way,
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
142 # status and diff will have an accurate result when it does
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
143 # 'sub.{status|diff}(rev2)'. Otherwise, the ctx2 subrepo is compared
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
144 # against itself.
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
145 for subpath in missing:
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
146 yield subpath, ctx2.nullsub(subpath, ctx1)
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
147
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
148
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
149 def nochangesfound(ui: "uimod.ui", repo, excluded=None) -> None:
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45934
diff changeset
150 """Report no changes for push/pull, excluded is None or a list of
17248
6ffb35b2284c discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents: 17201
diff changeset
151 nodes excluded from the push/pull.
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45934
diff changeset
152 """
17248
6ffb35b2284c discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents: 17201
diff changeset
153 secretlist = []
6ffb35b2284c discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents: 17201
diff changeset
154 if excluded:
6ffb35b2284c discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents: 17201
diff changeset
155 for n in excluded:
6ffb35b2284c discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents: 17201
diff changeset
156 ctx = repo[n]
6ffb35b2284c discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents: 17201
diff changeset
157 if ctx.phase() >= phases.secret and not ctx.extinct():
6ffb35b2284c discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents: 17201
diff changeset
158 secretlist.append(n)
6ffb35b2284c discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents: 17201
diff changeset
159
15993
0b05e0bfdc1c scmutil: unify some 'no changes found' messages
Matt Mackall <mpm@selenic.com>
parents: 15797
diff changeset
160 if secretlist:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
161 ui.status(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
162 _(b"no changes found (ignored %d secret changesets)\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
163 % len(secretlist)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
164 )
15993
0b05e0bfdc1c scmutil: unify some 'no changes found' messages
Matt Mackall <mpm@selenic.com>
parents: 15797
diff changeset
165 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
166 ui.status(_(b"no changes found\n"))
15993
0b05e0bfdc1c scmutil: unify some 'no changes found' messages
Matt Mackall <mpm@selenic.com>
parents: 15797
diff changeset
167
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
168
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
169 def callcatch(ui: "uimod.ui", func: Callable[[], int]) -> int:
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
170 """call func() with global exception handling
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
171
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
172 return func() if no exception happens. otherwise do some error handling
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
173 and return an exit code accordingly. does not handle all exceptions.
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
174 """
45845
21733e8c924f errors: add config that lets user get more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 45844
diff changeset
175 coarse_exit_code = -1
21733e8c924f errors: add config that lets user get more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 45844
diff changeset
176 detailed_exit_code = -1
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
177 try:
32041
38963a53ab0d dispatch: print traceback in scmutil.callcatch() if --traceback specified
Yuya Nishihara <yuya@tcha.org>
parents: 31951
diff changeset
178 try:
38963a53ab0d dispatch: print traceback in scmutil.callcatch() if --traceback specified
Yuya Nishihara <yuya@tcha.org>
parents: 31951
diff changeset
179 return func()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
180 except: # re-raises
32041
38963a53ab0d dispatch: print traceback in scmutil.callcatch() if --traceback specified
Yuya Nishihara <yuya@tcha.org>
parents: 31951
diff changeset
181 ui.traceback()
38963a53ab0d dispatch: print traceback in scmutil.callcatch() if --traceback specified
Yuya Nishihara <yuya@tcha.org>
parents: 31951
diff changeset
182 raise
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
183 # Global exception handling, alphabetically
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
184 # Mercurial-specific first, followed by built-in and library exceptions
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
185 except error.LockHeld as inst:
45847
e0dbfbd4062c errors: set detailed exit code to 20 for locking errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 45846
diff changeset
186 detailed_exit_code = 20
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
187 if inst.errno == errno.ETIMEDOUT:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
188 reason = _(b'timed out waiting for lock held by %r') % (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
189 pycompat.bytestr(inst.locker)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
190 )
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
191 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
192 reason = _(b'lock held by %r') % inst.locker
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
193 ui.error(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
194 _(b"abort: %s: %s\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
195 % (inst.desc or stringutil.forcebytestr(inst.filename), reason)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
196 )
32088
0d892d820a51 lock: avoid unintentional lock acquisition at failure of readlock
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32041
diff changeset
197 if not inst.locker:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
198 ui.error(_(b"(lock might be very busy)\n"))
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
199 except error.LockUnavailable as inst:
45847
e0dbfbd4062c errors: set detailed exit code to 20 for locking errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 45846
diff changeset
200 detailed_exit_code = 20
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
201 ui.error(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
202 _(b"abort: could not lock %s: %s\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
203 % (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
204 inst.desc or stringutil.forcebytestr(inst.filename),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
205 encoding.strtolocal(inst.strerror),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
206 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
207 )
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
208 except error.RepoError as inst:
48416
8c4881c07f57 errors: use detailed exit code for RepoLookupError
Martin von Zweigbergk <martinvonz@google.com>
parents: 48415
diff changeset
209 if isinstance(inst, error.RepoLookupError):
8c4881c07f57 errors: use detailed exit code for RepoLookupError
Martin von Zweigbergk <martinvonz@google.com>
parents: 48415
diff changeset
210 detailed_exit_code = 10
45921
95c4cca641f6 errors: remove trailing "!" from some error messages for consistency
Martin von Zweigbergk <martinvonz@google.com>
parents: 45910
diff changeset
211 ui.error(_(b"abort: %s\n") % inst)
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
212 if inst.hint:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
213 ui.error(_(b"(%s)\n") % inst.hint)
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
214 except error.ResponseError as inst:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
215 ui.error(_(b"abort: %s") % inst.args[0])
36690
b76248e51605 scmutil: avoid using basestring and add explicit handling of unicodes
Augie Fackler <augie@google.com>
parents: 36687
diff changeset
216 msg = inst.args[1]
b76248e51605 scmutil: avoid using basestring and add explicit handling of unicodes
Augie Fackler <augie@google.com>
parents: 36687
diff changeset
217 if isinstance(msg, type(u'')):
b76248e51605 scmutil: avoid using basestring and add explicit handling of unicodes
Augie Fackler <augie@google.com>
parents: 36687
diff changeset
218 msg = pycompat.sysbytes(msg)
46711
aa2e38147e8b wireprotov1peer: don't raise internal errors in some cases
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 46485
diff changeset
219 if msg is None:
aa2e38147e8b wireprotov1peer: don't raise internal errors in some cases
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 46485
diff changeset
220 ui.error(b"\n")
aa2e38147e8b wireprotov1peer: don't raise internal errors in some cases
Valentin Gatien-Baron <vgatien-baron@janestreet.com>
parents: 46485
diff changeset
221 elif not isinstance(msg, bytes):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
222 ui.error(b" %r\n" % (msg,))
36720
c442c4a92ae8 scmutil: fix oversight in b76248e51605c6 where I forgot to use msg
Augie Fackler <augie@google.com>
parents: 36690
diff changeset
223 elif not msg:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
224 ui.error(_(b" empty string\n"))
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
225 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
226 ui.error(b"\n%r\n" % pycompat.bytestr(stringutil.ellipsis(msg)))
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
227 except error.CensoredNodeError as inst:
45921
95c4cca641f6 errors: remove trailing "!" from some error messages for consistency
Martin von Zweigbergk <martinvonz@google.com>
parents: 45910
diff changeset
228 ui.error(_(b"abort: file censored %s\n") % inst)
32679
7b17f9de6d3e revlog: map rev(wdirid) to WdirUnsupported exception
Yuya Nishihara <yuya@tcha.org>
parents: 32678
diff changeset
229 except error.WdirUnsupported:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
230 ui.error(_(b"abort: working directory revision cannot be specified\n"))
47304
7a769ac49637 errors: catch the new Error class in scmutil and chgserver
Martin von Zweigbergk <martinvonz@google.com>
parents: 47302
diff changeset
231 except error.Error as inst:
47300
33c0c25d0b0f errors: let each Abort subclass define its error code
Martin von Zweigbergk <martinvonz@google.com>
parents: 47142
diff changeset
232 if inst.detailed_exit_code is not None:
33c0c25d0b0f errors: let each Abort subclass define its error code
Martin von Zweigbergk <martinvonz@google.com>
parents: 47142
diff changeset
233 detailed_exit_code = inst.detailed_exit_code
47302
d9c71bbe20f7 errors: make InterventionRequired subclass Abort
Martin von Zweigbergk <martinvonz@google.com>
parents: 47300
diff changeset
234 if inst.coarse_exit_code is not None:
d9c71bbe20f7 errors: make InterventionRequired subclass Abort
Martin von Zweigbergk <martinvonz@google.com>
parents: 47300
diff changeset
235 coarse_exit_code = inst.coarse_exit_code
45900
600aec73f309 errors: format "abort: " text in a new Abort.format() method
Martin von Zweigbergk <martinvonz@google.com>
parents: 45899
diff changeset
236 ui.error(inst.format())
45844
8f07f5a9c3de worker: raise exception instead of calling sys.exit() with child's code
Martin von Zweigbergk <martinvonz@google.com>
parents: 45720
diff changeset
237 except error.WorkerError as inst:
8f07f5a9c3de worker: raise exception instead of calling sys.exit() with child's code
Martin von Zweigbergk <martinvonz@google.com>
parents: 45720
diff changeset
238 # Don't print a message -- the worker already should have
8f07f5a9c3de worker: raise exception instead of calling sys.exit() with child's code
Martin von Zweigbergk <martinvonz@google.com>
parents: 45720
diff changeset
239 return inst.status_code
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
240 except ImportError as inst:
45921
95c4cca641f6 errors: remove trailing "!" from some error messages for consistency
Martin von Zweigbergk <martinvonz@google.com>
parents: 45910
diff changeset
241 ui.error(_(b"abort: %s\n") % stringutil.forcebytestr(inst))
37087
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36844
diff changeset
242 m = stringutil.forcebytestr(inst).split()[-1]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
243 if m in b"mpatch bdiff".split():
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
244 ui.error(_(b"(did you forget to compile extensions?)\n"))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
245 elif m in b"zlib".split():
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
246 ui.error(_(b"(is your Python install correct?)\n"))
45857
ae00e170f2d1 errors: catch urllib errors specifically instead of using safehasattr()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45847
diff changeset
247 except util.urlerr.httperror as inst:
45858
ebee234d952a errors: set detailed exit code to 100 for some remote errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 45857
diff changeset
248 detailed_exit_code = 100
45857
ae00e170f2d1 errors: catch urllib errors specifically instead of using safehasattr()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45847
diff changeset
249 ui.error(_(b"abort: %s\n") % stringutil.forcebytestr(inst))
ae00e170f2d1 errors: catch urllib errors specifically instead of using safehasattr()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45847
diff changeset
250 except util.urlerr.urlerror as inst:
45858
ebee234d952a errors: set detailed exit code to 100 for some remote errors
Martin von Zweigbergk <martinvonz@google.com>
parents: 45857
diff changeset
251 detailed_exit_code = 100
45857
ae00e170f2d1 errors: catch urllib errors specifically instead of using safehasattr()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45847
diff changeset
252 try: # usually it is in the form (errno, strerror)
ae00e170f2d1 errors: catch urllib errors specifically instead of using safehasattr()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45847
diff changeset
253 reason = inst.reason.args[1]
ae00e170f2d1 errors: catch urllib errors specifically instead of using safehasattr()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45847
diff changeset
254 except (AttributeError, IndexError):
ae00e170f2d1 errors: catch urllib errors specifically instead of using safehasattr()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45847
diff changeset
255 # it might be anything, for example a string
ae00e170f2d1 errors: catch urllib errors specifically instead of using safehasattr()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45847
diff changeset
256 reason = inst.reason
49025
06de08b36c82 py3: use str instead of pycompat.unicode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 49004
diff changeset
257 if isinstance(reason, str):
45857
ae00e170f2d1 errors: catch urllib errors specifically instead of using safehasattr()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45847
diff changeset
258 # SSLError of Python 2.7.9 contains a unicode
ae00e170f2d1 errors: catch urllib errors specifically instead of using safehasattr()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45847
diff changeset
259 reason = encoding.unitolocal(reason)
ae00e170f2d1 errors: catch urllib errors specifically instead of using safehasattr()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45847
diff changeset
260 ui.error(_(b"abort: error: %s\n") % stringutil.forcebytestr(reason))
52665
24ee91ba9aa8 pyupgrade: drop usage of py3 aliases for `OSError`
Matt Harbison <matt_harbison@yahoo.com>
parents: 52480
diff changeset
261 except OSError as inst:
50951
d718eddf01d9 safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50942
diff changeset
262 if hasattr(inst, "args") and inst.args and inst.args[0] == errno.EPIPE:
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
263 pass
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
264 elif getattr(inst, "strerror", None): # common IOError or OSError
41442
b6673e9bdcf6 dispatch: quote filename in IOError as well
Yuya Nishihara <yuya@tcha.org>
parents: 41441
diff changeset
265 if getattr(inst, "filename", None) is not None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
266 ui.error(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
267 _(b"abort: %s: '%s'\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
268 % (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
269 encoding.strtolocal(inst.strerror),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
270 stringutil.forcebytestr(inst.filename),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
271 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
272 )
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
273 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
274 ui.error(_(b"abort: %s\n") % encoding.strtolocal(inst.strerror))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
275 else: # suspicious IOError
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
276 raise
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
277 except MemoryError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
278 ui.error(_(b"abort: out of memory\n"))
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
279 except SystemExit as inst:
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
280 # Commands shouldn't sys.exit directly, but give a return code.
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
281 # Just in case catch this and and pass exit code to caller.
45845
21733e8c924f errors: add config that lets user get more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 45844
diff changeset
282 detailed_exit_code = 254
21733e8c924f errors: add config that lets user get more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 45844
diff changeset
283 coarse_exit_code = inst.code
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
284
45845
21733e8c924f errors: add config that lets user get more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 45844
diff changeset
285 if ui.configbool(b'ui', b'detailed-exit-code'):
21733e8c924f errors: add config that lets user get more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 45844
diff changeset
286 return detailed_exit_code
21733e8c924f errors: add config that lets user get more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 45844
diff changeset
287 else:
21733e8c924f errors: add config that lets user get more detailed exit codes
Martin von Zweigbergk <martinvonz@google.com>
parents: 45844
diff changeset
288 return coarse_exit_code
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
289
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
290
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
291 def checknewlabel(repo, lbl: bytes, kind) -> None:
19070
290a61833b99 translations: change label integer error to not specify the kind of label
Durham Goode <durham@fb.com>
parents: 18951
diff changeset
292 # Do not use the "kind" parameter in ui output.
290a61833b99 translations: change label integer error to not specify the kind of label
Durham Goode <durham@fb.com>
parents: 18951
diff changeset
293 # It makes strings difficult to translate.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
294 if lbl in [b'tip', b'.', b'null']:
45864
f96fa4de5055 errors: use InputError for errors about bad label names (tags etc)
Martin von Zweigbergk <martinvonz@google.com>
parents: 45863
diff changeset
295 raise error.InputError(_(b"the name '%s' is reserved") % lbl)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
296 for c in (b':', b'\0', b'\n', b'\r'):
17821
361ab1e2086f scmutil: add bad character checking to checknewlabel
Kevin Bullock <kbullock@ringworld.org>
parents: 17817
diff changeset
297 if c in lbl:
45864
f96fa4de5055 errors: use InputError for errors about bad label names (tags etc)
Martin von Zweigbergk <martinvonz@google.com>
parents: 45863
diff changeset
298 raise error.InputError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
299 _(b"%r cannot be used in a name") % pycompat.bytestr(c)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
300 )
18566
341868ef0cf6 bookmark: don't allow integers as bookmark/branch/tag names
Durham Goode <durham@fb.com>
parents: 18560
diff changeset
301 try:
341868ef0cf6 bookmark: don't allow integers as bookmark/branch/tag names
Durham Goode <durham@fb.com>
parents: 18560
diff changeset
302 int(lbl)
49647
566f7dd563c1 scmutil: make checknewlabel() allow "_" in otherwise numeric names (issue6737)
Anton Shestakov <av6@dwimlabs.net>
parents: 49474
diff changeset
303 if b'_' in lbl:
566f7dd563c1 scmutil: make checknewlabel() allow "_" in otherwise numeric names (issue6737)
Anton Shestakov <av6@dwimlabs.net>
parents: 49474
diff changeset
304 # If label contains underscores, Python might consider it an
566f7dd563c1 scmutil: make checknewlabel() allow "_" in otherwise numeric names (issue6737)
Anton Shestakov <av6@dwimlabs.net>
parents: 49474
diff changeset
305 # integer (with "_" as visual separators), but we do not.
566f7dd563c1 scmutil: make checknewlabel() allow "_" in otherwise numeric names (issue6737)
Anton Shestakov <av6@dwimlabs.net>
parents: 49474
diff changeset
306 # See PEP 515 - Underscores in Numeric Literals.
566f7dd563c1 scmutil: make checknewlabel() allow "_" in otherwise numeric names (issue6737)
Anton Shestakov <av6@dwimlabs.net>
parents: 49474
diff changeset
307 raise ValueError
45864
f96fa4de5055 errors: use InputError for errors about bad label names (tags etc)
Martin von Zweigbergk <martinvonz@google.com>
parents: 45863
diff changeset
308 raise error.InputError(_(b"cannot use an integer as a name"))
18566
341868ef0cf6 bookmark: don't allow integers as bookmark/branch/tag names
Durham Goode <durham@fb.com>
parents: 18560
diff changeset
309 except ValueError:
341868ef0cf6 bookmark: don't allow integers as bookmark/branch/tag names
Durham Goode <durham@fb.com>
parents: 18560
diff changeset
310 pass
36183
4f3e989536c3 label: enforce the lack of leading or trailing white space
Boris Feld <boris.feld@octobus.net>
parents: 36175
diff changeset
311 if lbl.strip() != lbl:
45864
f96fa4de5055 errors: use InputError for errors about bad label names (tags etc)
Martin von Zweigbergk <martinvonz@google.com>
parents: 45863
diff changeset
312 raise error.InputError(
f96fa4de5055 errors: use InputError for errors about bad label names (tags etc)
Martin von Zweigbergk <martinvonz@google.com>
parents: 45863
diff changeset
313 _(b"leading or trailing whitespace in name %r") % lbl
f96fa4de5055 errors: use InputError for errors about bad label names (tags etc)
Martin von Zweigbergk <martinvonz@google.com>
parents: 45863
diff changeset
314 )
17817
b17be267b59c scmutil: add function to validate new branch, tag, and bookmark names
Kevin Bullock <kbullock@ringworld.org>
parents: 17768
diff changeset
315
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
316
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
317 def checkfilename(f: bytes) -> None:
13974
23f2736abce3 move checkfilename from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13973
diff changeset
318 '''Check that the filename f is an acceptable filename for a tracked file'''
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
319 if b'\r' in f or b'\n' in f:
45863
3175b0e0058b errors: use InputError for errors about bad paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 45860
diff changeset
320 raise error.InputError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
321 _(b"'\\n' and '\\r' disallowed in filenames: %r")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
322 % pycompat.bytestr(f)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
323 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
324
13974
23f2736abce3 move checkfilename from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13973
diff changeset
325
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
326 def checkportable(ui: "uimod.ui", f: bytes) -> None:
13962
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
327 '''Check if filename f is portable and warn or abort depending on config'''
13974
23f2736abce3 move checkfilename from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13973
diff changeset
328 checkfilename(f)
14138
c18204fd35b0 scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents: 14097
diff changeset
329 abort, warn = checkportabilityalert(ui)
c18204fd35b0 scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents: 14097
diff changeset
330 if abort or warn:
13962
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
331 msg = util.checkwinfilename(f)
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
332 if msg:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
333 msg = b"%s: %s" % (msg, procutil.shellquote(f))
14138
c18204fd35b0 scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents: 14097
diff changeset
334 if abort:
45863
3175b0e0058b errors: use InputError for errors about bad paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 45860
diff changeset
335 raise error.InputError(msg)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
336 ui.warn(_(b"warning: %s\n") % msg)
14068
04ce8fa1015d add: notify when adding a file that would cause a case-folding collision
Kevin Gessner <kevin@kevingessner.com>
parents: 14067
diff changeset
337
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
338
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
339 def checkportabilityalert(ui: "uimod.ui") -> Tuple[bool, bool]:
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45934
diff changeset
340 """check if the user's config requests nothing, a warning, or abort for
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45934
diff changeset
341 non-portable filenames"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
342 val = ui.config(b'ui', b'portablefilenames')
14067
e88a4958a6b7 scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents: 13986
diff changeset
343 lval = val.lower()
37087
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36844
diff changeset
344 bval = stringutil.parsebool(val)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
345 abort = pycompat.iswindows or lval == b'abort'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
346 warn = bval or lval == b'warn'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
347 if bval is None and not (warn or abort or lval == b'ignore'):
13962
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
348 raise error.ConfigError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
349 _(b"ui.portablefilenames value is invalid ('%s')") % val
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
350 )
14067
e88a4958a6b7 scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents: 13986
diff changeset
351 return abort, warn
e88a4958a6b7 scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents: 13986
diff changeset
352
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
353
49037
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 49025
diff changeset
354 class casecollisionauditor:
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
355 def __init__(self, ui: "uimod.ui", abort: bool, dirstate) -> None:
14138
c18204fd35b0 scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents: 14097
diff changeset
356 self._ui = ui
c18204fd35b0 scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents: 14097
diff changeset
357 self._abort = abort
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
358 allfiles = b'\0'.join(dirstate)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
359 self._loweredfiles = set(encoding.lower(allfiles).split(b'\0'))
17201
afd75476939e scmutil: 25% speedup in casecollisionauditor
Joshua Redstone <joshua.redstone@fb.com>
parents: 17161
diff changeset
360 self._dirstate = dirstate
afd75476939e scmutil: 25% speedup in casecollisionauditor
Joshua Redstone <joshua.redstone@fb.com>
parents: 17161
diff changeset
361 # The purpose of _newfiles is so that we don't complain about
afd75476939e scmutil: 25% speedup in casecollisionauditor
Joshua Redstone <joshua.redstone@fb.com>
parents: 17161
diff changeset
362 # case collisions if someone were to call this object with the
afd75476939e scmutil: 25% speedup in casecollisionauditor
Joshua Redstone <joshua.redstone@fb.com>
parents: 17161
diff changeset
363 # same filename twice.
afd75476939e scmutil: 25% speedup in casecollisionauditor
Joshua Redstone <joshua.redstone@fb.com>
parents: 17161
diff changeset
364 self._newfiles = set()
14067
e88a4958a6b7 scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents: 13986
diff changeset
365
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
366 def __call__(self, f: bytes) -> None:
20006
9276014db865 scmutil: skip checks in "casecollisionauditor" if filename is already checked
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19900
diff changeset
367 if f in self._newfiles:
9276014db865 scmutil: skip checks in "casecollisionauditor" if filename is already checked
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19900
diff changeset
368 return
14980
28e98a8b173d i18n: use UTF-8 string to lower filename for case collision check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 14861
diff changeset
369 fl = encoding.lower(f)
20006
9276014db865 scmutil: skip checks in "casecollisionauditor" if filename is already checked
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19900
diff changeset
370 if fl in self._loweredfiles and f not in self._dirstate:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
371 msg = _(b'possible case-folding collision for %s') % f
14138
c18204fd35b0 scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents: 14097
diff changeset
372 if self._abort:
48415
0b8e076e878c errors: use detailed exit code for detected case-collision
Martin von Zweigbergk <martinvonz@google.com>
parents: 48315
diff changeset
373 raise error.StateError(msg)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
374 self._ui.warn(_(b"warning: %s\n") % msg)
17201
afd75476939e scmutil: 25% speedup in casecollisionauditor
Joshua Redstone <joshua.redstone@fb.com>
parents: 17161
diff changeset
375 self._loweredfiles.add(fl)
afd75476939e scmutil: 25% speedup in casecollisionauditor
Joshua Redstone <joshua.redstone@fb.com>
parents: 17161
diff changeset
376 self._newfiles.add(f)
13970
d13913355390 move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13962
diff changeset
377
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
378
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
379 def combined_filtered_and_obsolete_hash(
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
380 repo, maxrev, needobsolete: bool = False
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
381 ):
24723
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
382 """build hash of filtered revisions in the current repoview.
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
383
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
384 Multiple caches perform up-to-date validation by checking that the
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
385 tiprev and tipnode stored in the cache file match the current repository.
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
386 However, this is not sufficient for validating repoviews because the set
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
387 of revisions in the view may change without the repository tiprev and
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
388 tipnode changing.
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
389
48701
f8f2ecdde4b5 branchmap: skip obsolete revisions while computing heads
Anton Shestakov <av6@dwimlabs.net>
parents: 48499
diff changeset
390 This function hashes all the revs filtered from the view (and, optionally,
f8f2ecdde4b5 branchmap: skip obsolete revisions while computing heads
Anton Shestakov <av6@dwimlabs.net>
parents: 48499
diff changeset
391 all obsolete revs) up to maxrev and returns that SHA-1 digest.
24723
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
392 """
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
393 cl = repo.changelog
48701
f8f2ecdde4b5 branchmap: skip obsolete revisions while computing heads
Anton Shestakov <av6@dwimlabs.net>
parents: 48499
diff changeset
394 if needobsolete:
f8f2ecdde4b5 branchmap: skip obsolete revisions while computing heads
Anton Shestakov <av6@dwimlabs.net>
parents: 48499
diff changeset
395 obsrevs = obsolete.getrevs(repo, b'obsolete')
f8f2ecdde4b5 branchmap: skip obsolete revisions while computing heads
Anton Shestakov <av6@dwimlabs.net>
parents: 48499
diff changeset
396 if not cl.filteredrevs and not obsrevs:
f8f2ecdde4b5 branchmap: skip obsolete revisions while computing heads
Anton Shestakov <av6@dwimlabs.net>
parents: 48499
diff changeset
397 return None
48737
c7e675848027 scmutil: obsrevs is already a frozenset
Anton Shestakov <av6@dwimlabs.net>
parents: 48701
diff changeset
398 key = (maxrev, hash(cl.filteredrevs), hash(obsrevs))
48701
f8f2ecdde4b5 branchmap: skip obsolete revisions while computing heads
Anton Shestakov <av6@dwimlabs.net>
parents: 48499
diff changeset
399 else:
f8f2ecdde4b5 branchmap: skip obsolete revisions while computing heads
Anton Shestakov <av6@dwimlabs.net>
parents: 48499
diff changeset
400 if not cl.filteredrevs:
f8f2ecdde4b5 branchmap: skip obsolete revisions while computing heads
Anton Shestakov <av6@dwimlabs.net>
parents: 48499
diff changeset
401 return None
f8f2ecdde4b5 branchmap: skip obsolete revisions while computing heads
Anton Shestakov <av6@dwimlabs.net>
parents: 48499
diff changeset
402 key = maxrev
f8f2ecdde4b5 branchmap: skip obsolete revisions while computing heads
Anton Shestakov <av6@dwimlabs.net>
parents: 48499
diff changeset
403 obsrevs = frozenset()
f8f2ecdde4b5 branchmap: skip obsolete revisions while computing heads
Anton Shestakov <av6@dwimlabs.net>
parents: 48499
diff changeset
404
f8f2ecdde4b5 branchmap: skip obsolete revisions while computing heads
Anton Shestakov <av6@dwimlabs.net>
parents: 48499
diff changeset
405 result = cl._filteredrevs_hashcache.get(key)
f8f2ecdde4b5 branchmap: skip obsolete revisions while computing heads
Anton Shestakov <av6@dwimlabs.net>
parents: 48499
diff changeset
406 if not result:
51567
530b4cffd6a6 filteredhash: split the computation of revision sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51566
diff changeset
407 revs, obs_revs = _filtered_and_obs_revs(repo, maxrev)
530b4cffd6a6 filteredhash: split the computation of revision sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51566
diff changeset
408 if needobsolete:
530b4cffd6a6 filteredhash: split the computation of revision sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51566
diff changeset
409 revs = revs | obs_revs
530b4cffd6a6 filteredhash: split the computation of revision sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51566
diff changeset
410 revs = sorted(revs)
45523
89f0d9f87701 branchmap: add a cache validation cache, avoid expensive re-hash on every use
Kyle Lippincott <spectral@google.com>
parents: 45494
diff changeset
411 if revs:
51566
4bfae99c4021 filteredhash: move the hashing in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51300
diff changeset
412 result = _hash_revs(revs)
48701
f8f2ecdde4b5 branchmap: skip obsolete revisions while computing heads
Anton Shestakov <av6@dwimlabs.net>
parents: 48499
diff changeset
413 cl._filteredrevs_hashcache[key] = result
f8f2ecdde4b5 branchmap: skip obsolete revisions while computing heads
Anton Shestakov <av6@dwimlabs.net>
parents: 48499
diff changeset
414 return result
24723
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
415
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
416
51571
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51568
diff changeset
417 def filtered_and_obsolete_hash(repo, maxrev):
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51568
diff changeset
418 """build hashs of filtered and obsolete revisions in the current repoview.
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51568
diff changeset
419
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51568
diff changeset
420 Multiple caches perform up-to-date validation by checking that the
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51568
diff changeset
421 tiprev and tipnode stored in the cache file match the current repository.
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51568
diff changeset
422 However, this is not sufficient for validating repoviews because the set
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51568
diff changeset
423 of revisions in the view may change without the repository tiprev and
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51568
diff changeset
424 tipnode changing.
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51568
diff changeset
425
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51568
diff changeset
426 This function hashes all the revs filtered from the view up to maxrev and
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51568
diff changeset
427 returns that SHA-1 digest. The obsolete revisions hashed are only the
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51568
diff changeset
428 non-filtered one.
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51568
diff changeset
429 """
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51568
diff changeset
430 cl = repo.changelog
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51568
diff changeset
431 obs_set = obsolete.getrevs(repo, b'obsolete')
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51568
diff changeset
432 key = (maxrev, hash(cl.filteredrevs), hash(obs_set))
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51568
diff changeset
433
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51568
diff changeset
434 result = cl._filteredrevs_hashcache.get(key)
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51568
diff changeset
435 if result is None:
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51568
diff changeset
436 filtered_hash = None
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51568
diff changeset
437 obs_hash = None
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51568
diff changeset
438 filtered_revs, obs_revs = _filtered_and_obs_revs(repo, maxrev)
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51568
diff changeset
439 if filtered_revs:
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51568
diff changeset
440 filtered_hash = _hash_revs(filtered_revs)
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51568
diff changeset
441 if obs_revs:
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51568
diff changeset
442 obs_hash = _hash_revs(obs_revs)
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51568
diff changeset
443 result = (filtered_hash, obs_hash)
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51568
diff changeset
444 cl._filteredrevs_hashcache[key] = result
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51568
diff changeset
445 return result
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51568
diff changeset
446
4141d12de073 branchcache: store filtered hash and obsolete hash independently for V3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51568
diff changeset
447
51567
530b4cffd6a6 filteredhash: split the computation of revision sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51566
diff changeset
448 def _filtered_and_obs_revs(repo, max_rev):
530b4cffd6a6 filteredhash: split the computation of revision sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51566
diff changeset
449 """return the set of filtered and non-filtered obsolete revision"""
530b4cffd6a6 filteredhash: split the computation of revision sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51566
diff changeset
450 cl = repo.changelog
530b4cffd6a6 filteredhash: split the computation of revision sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51566
diff changeset
451 obs_set = obsolete.getrevs(repo, b'obsolete')
530b4cffd6a6 filteredhash: split the computation of revision sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51566
diff changeset
452 filtered_set = cl.filteredrevs
530b4cffd6a6 filteredhash: split the computation of revision sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51566
diff changeset
453 if cl.filteredrevs:
530b4cffd6a6 filteredhash: split the computation of revision sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51566
diff changeset
454 obs_set = obs_set - cl.filteredrevs
530b4cffd6a6 filteredhash: split the computation of revision sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51566
diff changeset
455 if max_rev < (len(cl) - 1):
530b4cffd6a6 filteredhash: split the computation of revision sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51566
diff changeset
456 # there might be revision to filter out
530b4cffd6a6 filteredhash: split the computation of revision sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51566
diff changeset
457 filtered_set = set(r for r in filtered_set if r <= max_rev)
530b4cffd6a6 filteredhash: split the computation of revision sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51566
diff changeset
458 obs_set = set(r for r in obs_set if r <= max_rev)
530b4cffd6a6 filteredhash: split the computation of revision sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51566
diff changeset
459 return (filtered_set, obs_set)
530b4cffd6a6 filteredhash: split the computation of revision sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51566
diff changeset
460
530b4cffd6a6 filteredhash: split the computation of revision sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51566
diff changeset
461
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
462 def _hash_revs(revs: Iterable[int]) -> bytes:
51566
4bfae99c4021 filteredhash: move the hashing in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51300
diff changeset
463 """return a hash from a list of revision numbers"""
4bfae99c4021 filteredhash: move the hashing in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51300
diff changeset
464 s = hashutil.sha1()
4bfae99c4021 filteredhash: move the hashing in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51300
diff changeset
465 for rev in revs:
4bfae99c4021 filteredhash: move the hashing in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51300
diff changeset
466 s.update(b'%d;' % rev)
4bfae99c4021 filteredhash: move the hashing in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51300
diff changeset
467 return s.digest()
4bfae99c4021 filteredhash: move the hashing in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51300
diff changeset
468
4bfae99c4021 filteredhash: move the hashing in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51300
diff changeset
469
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
470 def walkrepos(
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
471 path,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
472 followsym: bool = False,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
473 seen_dirs: Optional[List[bytes]] = None,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
474 recurse: bool = False,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
475 ) -> Iterable[bytes]:
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45934
diff changeset
476 """yield every hg repository under path, always recursively.
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45934
diff changeset
477 The recurse flag will only control recursion into repo working dirs"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
478
13975
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
479 def errhandler(err):
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
480 if err.filename == path:
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
481 raise err
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
482
14961
5523529bd1af walkrepos: use getattr instead of hasattr for samestat
Augie Fackler <durin42@gmail.com>
parents: 14928
diff changeset
483 samestat = getattr(os.path, 'samestat', None)
5523529bd1af walkrepos: use getattr instead of hasattr for samestat
Augie Fackler <durin42@gmail.com>
parents: 14928
diff changeset
484 if followsym and samestat is not None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
485
14227
94985b5a8278 scmutil: rename local function _add_dir_if_not_there
Adrian Buehlmann <adrian@cadifra.com>
parents: 14226
diff changeset
486 def adddir(dirlst, dirname):
13975
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
487 dirstat = os.stat(dirname)
36371
ddd9474d2e08 walkrepos: don't reimplement any()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36346
diff changeset
488 match = any(samestat(dirstat, lstdirstat) for lstdirstat in dirlst)
13975
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
489 if not match:
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
490 dirlst.append(dirstat)
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
491 return not match
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
492
13975
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
493 else:
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
494 followsym = False
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
495
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
496 if (seen_dirs is None) and followsym:
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
497 seen_dirs = []
14227
94985b5a8278 scmutil: rename local function _add_dir_if_not_there
Adrian Buehlmann <adrian@cadifra.com>
parents: 14226
diff changeset
498 adddir(seen_dirs, path)
13975
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
499 for root, dirs, files in os.walk(path, topdown=True, onerror=errhandler):
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
500 dirs.sort()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
501 if b'.hg' in dirs:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
502 yield root # found a repository
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
503 qroot = os.path.join(root, b'.hg', b'patches')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
504 if os.path.isdir(os.path.join(qroot, b'.hg')):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
505 yield qroot # we have a patch queue repo here
13975
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
506 if recurse:
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
507 # avoid recursing inside the .hg directory
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
508 dirs.remove(b'.hg')
13975
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
509 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
510 dirs[:] = [] # don't descend further
13975
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
511 elif followsym:
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
512 newdirs = []
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
513 for d in dirs:
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
514 fname = os.path.join(root, d)
14227
94985b5a8278 scmutil: rename local function _add_dir_if_not_there
Adrian Buehlmann <adrian@cadifra.com>
parents: 14226
diff changeset
515 if adddir(seen_dirs, fname):
13975
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
516 if os.path.islink(fname):
52669
e627cc25b6f3 pyupgrade: rewrite `yield` statements in a loop to `yield from`
Matt Harbison <matt_harbison@yahoo.com>
parents: 52665
diff changeset
517 yield from walkrepos(fname, True, seen_dirs)
13975
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
518 else:
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
519 newdirs.append(d)
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
520 dirs[:] = newdirs
13984
af60153b5e3b move rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13975
diff changeset
521
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
522
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
523 def binnode(ctx) -> bytes:
32678
55ff67ffcead scmutil: introduce binnode(ctx) as paired function with intrev(ctx)
Yuya Nishihara <yuya@tcha.org>
parents: 32676
diff changeset
524 """Return binary node id for a given basectx"""
55ff67ffcead scmutil: introduce binnode(ctx) as paired function with intrev(ctx)
Yuya Nishihara <yuya@tcha.org>
parents: 32676
diff changeset
525 node = ctx.node()
55ff67ffcead scmutil: introduce binnode(ctx) as paired function with intrev(ctx)
Yuya Nishihara <yuya@tcha.org>
parents: 32676
diff changeset
526 if node is None:
47055
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46976
diff changeset
527 return ctx.repo().nodeconstants.wdirid
32678
55ff67ffcead scmutil: introduce binnode(ctx) as paired function with intrev(ctx)
Yuya Nishihara <yuya@tcha.org>
parents: 32676
diff changeset
528 return node
55ff67ffcead scmutil: introduce binnode(ctx) as paired function with intrev(ctx)
Yuya Nishihara <yuya@tcha.org>
parents: 32676
diff changeset
529
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
530
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
531 def intrev(ctx) -> int:
32676
4bec8cce6a09 scmutil: pass ctx object to intrev()
Yuya Nishihara <yuya@tcha.org>
parents: 32310
diff changeset
532 """Return integer for a given basectx that can be used in comparison or
24582
56fff44cce98 scmutil: add function to help handling workingctx in arithmetic operation
Yuya Nishihara <yuya@tcha.org>
parents: 24447
diff changeset
533 arithmetic operation"""
32676
4bec8cce6a09 scmutil: pass ctx object to intrev()
Yuya Nishihara <yuya@tcha.org>
parents: 32310
diff changeset
534 rev = ctx.rev()
24582
56fff44cce98 scmutil: add function to help handling workingctx in arithmetic operation
Yuya Nishihara <yuya@tcha.org>
parents: 24447
diff changeset
535 if rev is None:
25739
3dabc9b7494a changeset_printer: use node.wdirrev to calculate meaningful parentrevs
Yuya Nishihara <yuya@tcha.org>
parents: 25660
diff changeset
536 return wdirrev
24582
56fff44cce98 scmutil: add function to help handling workingctx in arithmetic operation
Yuya Nishihara <yuya@tcha.org>
parents: 24447
diff changeset
537 return rev
56fff44cce98 scmutil: add function to help handling workingctx in arithmetic operation
Yuya Nishihara <yuya@tcha.org>
parents: 24447
diff changeset
538
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
539
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
540 def formatchangeid(ctx) -> bytes:
34334
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34158
diff changeset
541 """Format changectx as '{rev}:{node|formatnode}', which is the default
35928
c8e2d6ed1f9e cmdutil: drop aliases for logcmdutil functions (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35748
diff changeset
542 template provided by logcmdutil.changesettemplater"""
34334
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34158
diff changeset
543 repo = ctx.repo()
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34158
diff changeset
544 return formatrevnode(repo.ui, intrev(ctx), binnode(ctx))
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34158
diff changeset
545
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
546
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
547 def formatrevnode(ui: "uimod.ui", rev: int, node: bytes) -> bytes:
34334
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34158
diff changeset
548 """Format given revision and node depending on the current verbosity"""
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34158
diff changeset
549 if ui.debugflag:
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34158
diff changeset
550 hexfunc = hex
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34158
diff changeset
551 else:
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34158
diff changeset
552 hexfunc = short
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
553 return b'%d:%s' % (rev, hexfunc(node))
34334
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34158
diff changeset
554
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
555
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
556 def resolvehexnodeidprefix(repo, prefix: bytes):
44887
62435a5b46fe revisions: parse "x123" as "nodeid starting with 123" without prefixhexnode
Martin von Zweigbergk <martinvonz@google.com>
parents: 44558
diff changeset
557 if prefix.startswith(b'x'):
38894
7848f284b211 revisions: allow "x123" to refer to nodeid prefix "123"
Martin von Zweigbergk <martinvonz@google.com>
parents: 38893
diff changeset
558 prefix = prefix[1:]
38881
503f936489dd lookup: add option to disambiguate prefix within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38880
diff changeset
559 try:
503f936489dd lookup: add option to disambiguate prefix within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38880
diff changeset
560 # Uses unfiltered repo because it's faster when prefix is ambiguous/
503f936489dd lookup: add option to disambiguate prefix within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38880
diff changeset
561 # This matches the shortesthexnodeidprefix() function below.
503f936489dd lookup: add option to disambiguate prefix within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38880
diff changeset
562 node = repo.unfiltered().changelog._partialmatch(prefix)
503f936489dd lookup: add option to disambiguate prefix within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38880
diff changeset
563 except error.AmbiguousPrefixLookupError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
564 revset = repo.ui.config(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
565 b'experimental', b'revisions.disambiguatewithin'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
566 )
38881
503f936489dd lookup: add option to disambiguate prefix within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38880
diff changeset
567 if revset:
503f936489dd lookup: add option to disambiguate prefix within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38880
diff changeset
568 # Clear config to avoid infinite recursion
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
569 configoverrides = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
570 (b'experimental', b'revisions.disambiguatewithin'): None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
571 }
38881
503f936489dd lookup: add option to disambiguate prefix within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38880
diff changeset
572 with repo.ui.configoverride(configoverrides):
503f936489dd lookup: add option to disambiguate prefix within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38880
diff changeset
573 revs = repo.anyrevs([revset], user=True)
503f936489dd lookup: add option to disambiguate prefix within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38880
diff changeset
574 matches = []
503f936489dd lookup: add option to disambiguate prefix within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38880
diff changeset
575 for rev in revs:
503f936489dd lookup: add option to disambiguate prefix within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38880
diff changeset
576 node = repo.changelog.node(rev)
503f936489dd lookup: add option to disambiguate prefix within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38880
diff changeset
577 if hex(node).startswith(prefix):
503f936489dd lookup: add option to disambiguate prefix within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38880
diff changeset
578 matches.append(node)
503f936489dd lookup: add option to disambiguate prefix within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38880
diff changeset
579 if len(matches) == 1:
503f936489dd lookup: add option to disambiguate prefix within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38880
diff changeset
580 return matches[0]
503f936489dd lookup: add option to disambiguate prefix within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38880
diff changeset
581 raise
37504
901e749ca0e1 context: extract partial nodeid lookup method to scmutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 37463
diff changeset
582 if node is None:
901e749ca0e1 context: extract partial nodeid lookup method to scmutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 37463
diff changeset
583 return
901e749ca0e1 context: extract partial nodeid lookup method to scmutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 37463
diff changeset
584 repo.changelog.rev(node) # make sure node isn't filtered
901e749ca0e1 context: extract partial nodeid lookup method to scmutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 37463
diff changeset
585 return node
901e749ca0e1 context: extract partial nodeid lookup method to scmutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 37463
diff changeset
586
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
587
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
588 def mayberevnum(repo, prefix: bytes) -> bool:
38893
531b86cc8fb3 shortest: make isrev() a top-level function
Martin von Zweigbergk <martinvonz@google.com>
parents: 38892
diff changeset
589 """Checks if the given prefix may be mistaken for a revision number"""
531b86cc8fb3 shortest: make isrev() a top-level function
Martin von Zweigbergk <martinvonz@google.com>
parents: 38892
diff changeset
590 try:
531b86cc8fb3 shortest: make isrev() a top-level function
Martin von Zweigbergk <martinvonz@google.com>
parents: 38892
diff changeset
591 i = int(prefix)
531b86cc8fb3 shortest: make isrev() a top-level function
Martin von Zweigbergk <martinvonz@google.com>
parents: 38892
diff changeset
592 # if we are a pure int, then starting with zero will not be
531b86cc8fb3 shortest: make isrev() a top-level function
Martin von Zweigbergk <martinvonz@google.com>
parents: 38892
diff changeset
593 # confused as a rev; or, obviously, if the int is larger
40341
d916ed3ca951 revisions: when using prefixhexnode, ensure we prefix "0"
Kyle Lippincott <spectral@google.com>
parents: 40167
diff changeset
594 # than the value of the tip rev. We still need to disambiguate if
d916ed3ca951 revisions: when using prefixhexnode, ensure we prefix "0"
Kyle Lippincott <spectral@google.com>
parents: 40167
diff changeset
595 # prefix == '0', since that *is* a valid revnum.
d916ed3ca951 revisions: when using prefixhexnode, ensure we prefix "0"
Kyle Lippincott <spectral@google.com>
parents: 40167
diff changeset
596 if (prefix != b'0' and prefix[0:1] == b'0') or i >= len(repo):
38893
531b86cc8fb3 shortest: make isrev() a top-level function
Martin von Zweigbergk <martinvonz@google.com>
parents: 38892
diff changeset
597 return False
531b86cc8fb3 shortest: make isrev() a top-level function
Martin von Zweigbergk <martinvonz@google.com>
parents: 38892
diff changeset
598 return True
531b86cc8fb3 shortest: make isrev() a top-level function
Martin von Zweigbergk <martinvonz@google.com>
parents: 38892
diff changeset
599 except ValueError:
531b86cc8fb3 shortest: make isrev() a top-level function
Martin von Zweigbergk <martinvonz@google.com>
parents: 38892
diff changeset
600 return False
531b86cc8fb3 shortest: make isrev() a top-level function
Martin von Zweigbergk <martinvonz@google.com>
parents: 38892
diff changeset
601
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
602
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
603 def shortesthexnodeidprefix(repo, node: bytes, minlength: int = 1, cache=None):
38892
3588e41f796d shortest: cache disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38882
diff changeset
604 """Find the shortest unambiguous prefix that matches hexnode.
3588e41f796d shortest: cache disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38882
diff changeset
605
3588e41f796d shortest: cache disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38882
diff changeset
606 If "cache" is not None, it must be a dictionary that can be used for
3588e41f796d shortest: cache disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38882
diff changeset
607 caching between calls to this method.
3588e41f796d shortest: cache disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38882
diff changeset
608 """
37708
8e8541610d85 scmutil: make shortesthexnodeidprefix() use unfiltered repo
Martin von Zweigbergk <martinvonz@google.com>
parents: 37680
diff changeset
609 # _partialmatch() of filtered changelog could take O(len(repo)) time,
8e8541610d85 scmutil: make shortesthexnodeidprefix() use unfiltered repo
Martin von Zweigbergk <martinvonz@google.com>
parents: 37680
diff changeset
610 # which would be unacceptably slow. so we look for hash collision in
8e8541610d85 scmutil: make shortesthexnodeidprefix() use unfiltered repo
Martin von Zweigbergk <martinvonz@google.com>
parents: 37680
diff changeset
611 # unfiltered space, which means some hashes may be slightly longer.
38015
3ac950cd5978 shortest: move revnum-disambiguation out of revlog
Martin von Zweigbergk <martinvonz@google.com>
parents: 38004
diff changeset
612
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
613 minlength = max(minlength, 1)
40403
bf249bb60087 shortest: never emit 0-length prefix even if unique
Martin von Zweigbergk <martinvonz@google.com>
parents: 40367
diff changeset
614
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
615 def disambiguate(prefix: bytes):
38015
3ac950cd5978 shortest: move revnum-disambiguation out of revlog
Martin von Zweigbergk <martinvonz@google.com>
parents: 38004
diff changeset
616 """Disambiguate against revnums."""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
617 if repo.ui.configbool(b'experimental', b'revisions.prefixhexnode'):
38895
a01200b25da6 shortest: use 'x' prefix to disambiguate from revnum if configured
Martin von Zweigbergk <martinvonz@google.com>
parents: 38894
diff changeset
618 if mayberevnum(repo, prefix):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
619 return b'x' + prefix
38895
a01200b25da6 shortest: use 'x' prefix to disambiguate from revnum if configured
Martin von Zweigbergk <martinvonz@google.com>
parents: 38894
diff changeset
620 else:
a01200b25da6 shortest: use 'x' prefix to disambiguate from revnum if configured
Martin von Zweigbergk <martinvonz@google.com>
parents: 38894
diff changeset
621 return prefix
a01200b25da6 shortest: use 'x' prefix to disambiguate from revnum if configured
Martin von Zweigbergk <martinvonz@google.com>
parents: 38894
diff changeset
622
38015
3ac950cd5978 shortest: move revnum-disambiguation out of revlog
Martin von Zweigbergk <martinvonz@google.com>
parents: 38004
diff changeset
623 hexnode = hex(node)
38023
5ac72e07692a shortest: avoid magic number "41"
Martin von Zweigbergk <martinvonz@google.com>
parents: 38015
diff changeset
624 for length in range(len(prefix), len(hexnode) + 1):
38015
3ac950cd5978 shortest: move revnum-disambiguation out of revlog
Martin von Zweigbergk <martinvonz@google.com>
parents: 38004
diff changeset
625 prefix = hexnode[:length]
38893
531b86cc8fb3 shortest: make isrev() a top-level function
Martin von Zweigbergk <martinvonz@google.com>
parents: 38892
diff changeset
626 if not mayberevnum(repo, prefix):
38015
3ac950cd5978 shortest: move revnum-disambiguation out of revlog
Martin von Zweigbergk <martinvonz@google.com>
parents: 38004
diff changeset
627 return prefix
3ac950cd5978 shortest: move revnum-disambiguation out of revlog
Martin von Zweigbergk <martinvonz@google.com>
parents: 38004
diff changeset
628
38893
531b86cc8fb3 shortest: make isrev() a top-level function
Martin von Zweigbergk <martinvonz@google.com>
parents: 38892
diff changeset
629 cl = repo.unfiltered().changelog
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
630 revset = repo.ui.config(b'experimental', b'revisions.disambiguatewithin')
38882
6f7c9527030b scmutil: make shortest() respect disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38881
diff changeset
631 if revset:
38892
3588e41f796d shortest: cache disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38882
diff changeset
632 revs = None
3588e41f796d shortest: cache disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38882
diff changeset
633 if cache is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
634 revs = cache.get(b'disambiguationrevset')
38892
3588e41f796d shortest: cache disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38882
diff changeset
635 if revs is None:
3588e41f796d shortest: cache disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38882
diff changeset
636 revs = repo.anyrevs([revset], user=True)
3588e41f796d shortest: cache disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38882
diff changeset
637 if cache is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
638 cache[b'disambiguationrevset'] = revs
38882
6f7c9527030b scmutil: make shortest() respect disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38881
diff changeset
639 if cl.rev(node) in revs:
6f7c9527030b scmutil: make shortest() respect disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38881
diff changeset
640 hexnode = hex(node)
39254
7a759ad2d06d shortest: use nodetree for finding shortest node within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 39125
diff changeset
641 nodetree = None
7a759ad2d06d shortest: use nodetree for finding shortest node within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 39125
diff changeset
642 if cache is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
643 nodetree = cache.get(b'disambiguationnodetree')
51273
fd1aa5e18f75 rust-revlog: using the ad-hoc `NodeTree` in scmutil
Georges Racinet <georges.racinet@octobus.net>
parents: 50952
diff changeset
644 is_invalidated = getattr(nodetree, 'is_invalidated', lambda: False)
fd1aa5e18f75 rust-revlog: using the ad-hoc `NodeTree` in scmutil
Georges Racinet <georges.racinet@octobus.net>
parents: 50952
diff changeset
645 if is_invalidated():
fd1aa5e18f75 rust-revlog: using the ad-hoc `NodeTree` in scmutil
Georges Racinet <georges.racinet@octobus.net>
parents: 50952
diff changeset
646 nodetree = None
39254
7a759ad2d06d shortest: use nodetree for finding shortest node within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 39125
diff changeset
647 if not nodetree:
51273
fd1aa5e18f75 rust-revlog: using the ad-hoc `NodeTree` in scmutil
Georges Racinet <georges.racinet@octobus.net>
parents: 50952
diff changeset
648 if hasattr(parsers, 'nodetree') and isinstance(
fd1aa5e18f75 rust-revlog: using the ad-hoc `NodeTree` in scmutil
Georges Racinet <georges.racinet@octobus.net>
parents: 50952
diff changeset
649 cl.index, parsers.index
fd1aa5e18f75 rust-revlog: using the ad-hoc `NodeTree` in scmutil
Georges Racinet <georges.racinet@octobus.net>
parents: 50952
diff changeset
650 ):
44016
992f0d6e7f33 rust-index: use the new method in shortesthexnodeidprefix
Georges Racinet <georges.racinet@octobus.net>
parents: 44003
diff changeset
651 index = cl.index
992f0d6e7f33 rust-index: use the new method in shortesthexnodeidprefix
Georges Racinet <georges.racinet@octobus.net>
parents: 44003
diff changeset
652 nodetree = parsers.nodetree(index, len(revs))
51273
fd1aa5e18f75 rust-revlog: using the ad-hoc `NodeTree` in scmutil
Georges Racinet <georges.racinet@octobus.net>
parents: 50952
diff changeset
653 elif getattr(cl.index, 'is_rust', False):
fd1aa5e18f75 rust-revlog: using the ad-hoc `NodeTree` in scmutil
Georges Racinet <georges.racinet@octobus.net>
parents: 50952
diff changeset
654 nodetree = rustrevlog.NodeTree(cl.index)
fd1aa5e18f75 rust-revlog: using the ad-hoc `NodeTree` in scmutil
Georges Racinet <georges.racinet@octobus.net>
parents: 50952
diff changeset
655
39254
7a759ad2d06d shortest: use nodetree for finding shortest node within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 39125
diff changeset
656 if nodetree is not None:
51273
fd1aa5e18f75 rust-revlog: using the ad-hoc `NodeTree` in scmutil
Georges Racinet <georges.racinet@octobus.net>
parents: 50952
diff changeset
657 for r in revs:
fd1aa5e18f75 rust-revlog: using the ad-hoc `NodeTree` in scmutil
Georges Racinet <georges.racinet@octobus.net>
parents: 50952
diff changeset
658 nodetree.insert(r)
fd1aa5e18f75 rust-revlog: using the ad-hoc `NodeTree` in scmutil
Georges Racinet <georges.racinet@octobus.net>
parents: 50952
diff changeset
659 if cache is not None:
fd1aa5e18f75 rust-revlog: using the ad-hoc `NodeTree` in scmutil
Georges Racinet <georges.racinet@octobus.net>
parents: 50952
diff changeset
660 cache[b'disambiguationnodetree'] = nodetree
39254
7a759ad2d06d shortest: use nodetree for finding shortest node within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 39125
diff changeset
661 length = max(nodetree.shortest(node), minlength)
7a759ad2d06d shortest: use nodetree for finding shortest node within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 39125
diff changeset
662 prefix = hexnode[:length]
7a759ad2d06d shortest: use nodetree for finding shortest node within revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 39125
diff changeset
663 return disambiguate(prefix)
38882
6f7c9527030b scmutil: make shortest() respect disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38881
diff changeset
664 for length in range(minlength, len(hexnode) + 1):
6f7c9527030b scmutil: make shortest() respect disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38881
diff changeset
665 matches = []
6f7c9527030b scmutil: make shortest() respect disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38881
diff changeset
666 prefix = hexnode[:length]
6f7c9527030b scmutil: make shortest() respect disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38881
diff changeset
667 for rev in revs:
6f7c9527030b scmutil: make shortest() respect disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38881
diff changeset
668 otherhexnode = repo[rev].hex()
6f7c9527030b scmutil: make shortest() respect disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38881
diff changeset
669 if prefix == otherhexnode[:length]:
6f7c9527030b scmutil: make shortest() respect disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38881
diff changeset
670 matches.append(otherhexnode)
6f7c9527030b scmutil: make shortest() respect disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38881
diff changeset
671 if len(matches) == 1:
6f7c9527030b scmutil: make shortest() respect disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38881
diff changeset
672 return disambiguate(prefix)
6f7c9527030b scmutil: make shortest() respect disambiguation revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 38881
diff changeset
673
37909
da083d9fafab shortest: don't keep checking for longer prefix if node doesn't exist (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37767
diff changeset
674 try:
38015
3ac950cd5978 shortest: move revnum-disambiguation out of revlog
Martin von Zweigbergk <martinvonz@google.com>
parents: 38004
diff changeset
675 return disambiguate(cl.shortest(node, minlength))
37909
da083d9fafab shortest: don't keep checking for longer prefix if node doesn't exist (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37767
diff changeset
676 except error.LookupError:
da083d9fafab shortest: don't keep checking for longer prefix if node doesn't exist (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37767
diff changeset
677 raise error.RepoLookupError()
37680
e743b8524d60 scmutil: introduce shortesthexnodeidprefix()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37679
diff changeset
678
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
679
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
680 def isrevsymbol(repo, symbol: bytes) -> bool:
37677
41ac707322ba scmutil: document that isrevsymbol() raises on ambiguous node prefix
Martin von Zweigbergk <martinvonz@google.com>
parents: 37531
diff changeset
681 """Checks if a symbol exists in the repo.
41ac707322ba scmutil: document that isrevsymbol() raises on ambiguous node prefix
Martin von Zweigbergk <martinvonz@google.com>
parents: 37531
diff changeset
682
38880
df0873ab5c14 revlog: use specialized exception for ambiguous prefix lookup
Martin von Zweigbergk <martinvonz@google.com>
parents: 38839
diff changeset
683 See revsymbol() for details. Raises error.AmbiguousPrefixLookupError if the
df0873ab5c14 revlog: use specialized exception for ambiguous prefix lookup
Martin von Zweigbergk <martinvonz@google.com>
parents: 38839
diff changeset
684 symbol is an ambiguous nodeid prefix.
37677
41ac707322ba scmutil: document that isrevsymbol() raises on ambiguous node prefix
Martin von Zweigbergk <martinvonz@google.com>
parents: 37531
diff changeset
685 """
37350
e32dfff71529 revset: use revsymbol() for checking if a symbol is valid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37306
diff changeset
686 try:
e32dfff71529 revset: use revsymbol() for checking if a symbol is valid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37306
diff changeset
687 revsymbol(repo, symbol)
e32dfff71529 revset: use revsymbol() for checking if a symbol is valid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37306
diff changeset
688 return True
e32dfff71529 revset: use revsymbol() for checking if a symbol is valid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37306
diff changeset
689 except error.RepoLookupError:
e32dfff71529 revset: use revsymbol() for checking if a symbol is valid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37306
diff changeset
690 return False
e32dfff71529 revset: use revsymbol() for checking if a symbol is valid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37306
diff changeset
691
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
692
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
693 def revsymbol(repo, symbol: bytes):
37273
0194dac77c93 scmutil: add method for looking up a context given a revision symbol
Martin von Zweigbergk <martinvonz@google.com>
parents: 37271
diff changeset
694 """Returns a context given a single revision symbol (as string).
0194dac77c93 scmutil: add method for looking up a context given a revision symbol
Martin von Zweigbergk <martinvonz@google.com>
parents: 37271
diff changeset
695
0194dac77c93 scmutil: add method for looking up a context given a revision symbol
Martin von Zweigbergk <martinvonz@google.com>
parents: 37271
diff changeset
696 This is similar to revsingle(), but accepts only a single revision symbol,
0194dac77c93 scmutil: add method for looking up a context given a revision symbol
Martin von Zweigbergk <martinvonz@google.com>
parents: 37271
diff changeset
697 i.e. things like ".", "tip", "1234", "deadbeef", "my-bookmark" work, but
0194dac77c93 scmutil: add method for looking up a context given a revision symbol
Martin von Zweigbergk <martinvonz@google.com>
parents: 37271
diff changeset
698 not "max(public())".
0194dac77c93 scmutil: add method for looking up a context given a revision symbol
Martin von Zweigbergk <martinvonz@google.com>
parents: 37271
diff changeset
699 """
0194dac77c93 scmutil: add method for looking up a context given a revision symbol
Martin von Zweigbergk <martinvonz@google.com>
parents: 37271
diff changeset
700 if not isinstance(symbol, bytes):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
701 msg = (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
702 b"symbol (%s of type %s) was not a string, did you mean "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
703 b"repo[symbol]?" % (symbol, type(symbol))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
704 )
37273
0194dac77c93 scmutil: add method for looking up a context given a revision symbol
Martin von Zweigbergk <martinvonz@google.com>
parents: 37271
diff changeset
705 raise error.ProgrammingError(msg)
37385
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
706 try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
707 if symbol in (b'.', b'tip', b'null'):
37527
1c09481acdcc context: handle stringified ints in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37504
diff changeset
708 return repo[symbol]
1c09481acdcc context: handle stringified ints in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37504
diff changeset
709
1c09481acdcc context: handle stringified ints in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37504
diff changeset
710 try:
1c09481acdcc context: handle stringified ints in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37504
diff changeset
711 r = int(symbol)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
712 if b'%d' % r != symbol:
37527
1c09481acdcc context: handle stringified ints in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37504
diff changeset
713 raise ValueError
1c09481acdcc context: handle stringified ints in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37504
diff changeset
714 l = len(repo.changelog)
1c09481acdcc context: handle stringified ints in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37504
diff changeset
715 if r < 0:
1c09481acdcc context: handle stringified ints in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37504
diff changeset
716 r += l
1c09481acdcc context: handle stringified ints in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37504
diff changeset
717 if r < 0 or r >= l and r != wdirrev:
1c09481acdcc context: handle stringified ints in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37504
diff changeset
718 raise ValueError
1c09481acdcc context: handle stringified ints in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37504
diff changeset
719 return repo[r]
1c09481acdcc context: handle stringified ints in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37504
diff changeset
720 except error.FilteredIndexError:
1c09481acdcc context: handle stringified ints in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37504
diff changeset
721 raise
1c09481acdcc context: handle stringified ints in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37504
diff changeset
722 except (ValueError, OverflowError, IndexError):
1c09481acdcc context: handle stringified ints in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37504
diff changeset
723 pass
1c09481acdcc context: handle stringified ints in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37504
diff changeset
724
47081
a407fe56d6e8 core: don't hard-code hex node lengths
Joerg Sonnenberger <joerg@bec.de>
parents: 47055
diff changeset
725 if len(symbol) == 2 * repo.nodeconstants.nodelen:
37528
d2b484eed1ec scmutil: handle full hex nodeids in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37527
diff changeset
726 try:
d2b484eed1ec scmutil: handle full hex nodeids in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37527
diff changeset
727 node = bin(symbol)
d2b484eed1ec scmutil: handle full hex nodeids in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37527
diff changeset
728 rev = repo.changelog.rev(node)
d2b484eed1ec scmutil: handle full hex nodeids in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37527
diff changeset
729 return repo[rev]
d2b484eed1ec scmutil: handle full hex nodeids in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37527
diff changeset
730 except error.FilteredLookupError:
d2b484eed1ec scmutil: handle full hex nodeids in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37527
diff changeset
731 raise
49263
63fd0282ad40 node: stop converting binascii.Error to TypeError in bin()
Manuel Jacob <me@manueljacob.de>
parents: 49037
diff changeset
732 except (binascii.Error, LookupError):
37528
d2b484eed1ec scmutil: handle full hex nodeids in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37527
diff changeset
733 pass
d2b484eed1ec scmutil: handle full hex nodeids in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37527
diff changeset
734
37529
45667439439e context: handle namespaces in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37528
diff changeset
735 # look up bookmarks through the name interface
45667439439e context: handle namespaces in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37528
diff changeset
736 try:
45667439439e context: handle namespaces in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37528
diff changeset
737 node = repo.names.singlenode(repo, symbol)
45667439439e context: handle namespaces in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37528
diff changeset
738 rev = repo.changelog.rev(node)
45667439439e context: handle namespaces in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37528
diff changeset
739 return repo[rev]
45667439439e context: handle namespaces in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37528
diff changeset
740 except KeyError:
45667439439e context: handle namespaces in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37528
diff changeset
741 pass
45667439439e context: handle namespaces in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37528
diff changeset
742
37679
ab828755e1ea scmutil: use resolvehexnodeidprefix() from revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37678
diff changeset
743 node = resolvehexnodeidprefix(repo, symbol)
37530
35b34202dd3b context: handle partial nodeids in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37529
diff changeset
744 if node is not None:
35b34202dd3b context: handle partial nodeids in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37529
diff changeset
745 rev = repo.changelog.rev(node)
35b34202dd3b context: handle partial nodeids in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37529
diff changeset
746 return repo[rev]
35b34202dd3b context: handle partial nodeids in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37529
diff changeset
747
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
748 raise error.RepoLookupError(_(b"unknown revision '%s'") % symbol)
37527
1c09481acdcc context: handle stringified ints in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37504
diff changeset
749
37528
d2b484eed1ec scmutil: handle full hex nodeids in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37527
diff changeset
750 except error.WdirUnsupported:
d2b484eed1ec scmutil: handle full hex nodeids in revsymbol()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37527
diff changeset
751 return repo[None]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
752 except (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
753 error.FilteredIndexError,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
754 error.FilteredLookupError,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
755 error.FilteredRepoLookupError,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
756 ):
37385
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
757 raise _filterederror(repo, symbol)
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
758
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
759
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
760 def _filterederror(repo, changeid: bytes) -> error.FilteredRepoLookupError:
37385
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
761 """build an exception to be raised about a filtered changeid
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
762
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
763 This is extracted in a function to help extensions (eg: evolve) to
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
764 experiment with various message variants."""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
765 if repo.filtername.startswith(b'visible'):
37385
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
766 # Check if the changeset is obsolete
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
767 unfilteredrepo = repo.unfiltered()
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
768 ctx = revsymbol(unfilteredrepo, changeid)
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
769
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
770 # If the changeset is obsolete, enrich the message with the reason
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
771 # that made this changeset not visible
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
772 if ctx.obsolete():
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
773 msg = obsutil._getfilteredreason(repo, changeid, ctx)
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
774 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
775 msg = _(b"hidden revision '%s'") % changeid
37385
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
776
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
777 hint = _(b'use --hidden to access hidden revisions')
37385
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
778
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
779 return error.FilteredRepoLookupError(msg, hint=hint)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
780 msg = _(b"filtered revision '%s' (not in '%s' subset)")
37385
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
781 msg %= (changeid, repo.filtername)
ecd3f6909184 context: move handling of filtering error to revsymbol() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37360
diff changeset
782 return error.FilteredRepoLookupError(msg)
37273
0194dac77c93 scmutil: add method for looking up a context given a revision symbol
Martin von Zweigbergk <martinvonz@google.com>
parents: 37271
diff changeset
783
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
784
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
785 def revsingle(repo, revspec, default=b'.', localalias=None):
19509
8963a706e075 revsingle: fix silly API issue (issue2992)
Matt Mackall <mpm@selenic.com>
parents: 19154
diff changeset
786 if not revspec and revspec != 0:
14319
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14261
diff changeset
787 return repo[default]
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14261
diff changeset
788
34023
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 33819
diff changeset
789 l = revrange(repo, [revspec], localalias=localalias)
22814
8110405cf8ae revset-limit: use boolean testing instead of `len(revs) < 1`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21799
diff changeset
790 if not l:
48052
7d908ee19b5b errors: use InputError for some invalid revsets and such
Martin von Zweigbergk <martinvonz@google.com>
parents: 47729
diff changeset
791 raise error.InputError(_(b'empty revision set'))
22815
4f81470e83bf revsingle: use `last` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22814
diff changeset
792 return repo[l.last()]
14319
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14261
diff changeset
793
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
794
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
795 def _pairspec(revspec) -> bool:
31044
0b8356705de6 revset: split language services to revsetlang module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 30644
diff changeset
796 tree = revsetlang.parse(revspec)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
797 return tree and tree[0] in (
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
798 b'range',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
799 b'rangepre',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
800 b'rangepost',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
801 b'rangeall',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
802 )
26020
cc3a30ff9490 revpair: restrict odd-range handling to top-level x:y expression (issue4774)
Yuya Nishihara <yuya@tcha.org>
parents: 25928
diff changeset
803
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
804
14319
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14261
diff changeset
805 def revpair(repo, revs):
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14261
diff changeset
806 if not revs:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
807 return repo[b'.'], repo[None]
14319
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14261
diff changeset
808
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14261
diff changeset
809 l = revrange(repo, revs)
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14261
diff changeset
810
41392
a728ef2f9b15 revpair: clarify check for empty revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 41391
diff changeset
811 if not l:
48052
7d908ee19b5b errors: use InputError for some invalid revsets and such
Martin von Zweigbergk <martinvonz@google.com>
parents: 47729
diff changeset
812 raise error.InputError(_(b'empty revision range'))
41392
a728ef2f9b15 revpair: clarify check for empty revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 41391
diff changeset
813
41391
5079242abef9 revpair: simplify revpair by always relying on smartset.first/last
Martin von Zweigbergk <martinvonz@google.com>
parents: 41288
diff changeset
814 first = l.first()
5079242abef9 revpair: simplify revpair by always relying on smartset.first/last
Martin von Zweigbergk <martinvonz@google.com>
parents: 41288
diff changeset
815 second = l.last()
20862
97b2f26dfc43 revpair: smartset compatibility
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20820
diff changeset
816
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
817 if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
818 first == second
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
819 and len(revs) >= 2
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
820 and not all(revrange(repo, [r]) for r in revs)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
821 ):
48052
7d908ee19b5b errors: use InputError for some invalid revsets and such
Martin von Zweigbergk <martinvonz@google.com>
parents: 47729
diff changeset
822 raise error.InputError(_(b'empty revision on one side of range'))
14319
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14261
diff changeset
823
26020
cc3a30ff9490 revpair: restrict odd-range handling to top-level x:y expression (issue4774)
Yuya Nishihara <yuya@tcha.org>
parents: 25928
diff changeset
824 # if top-level is range expression, the result must always be a pair
cc3a30ff9490 revpair: restrict odd-range handling to top-level x:y expression (issue4774)
Yuya Nishihara <yuya@tcha.org>
parents: 25928
diff changeset
825 if first == second and len(revs) == 1 and not _pairspec(revs[0]):
37254
e9ee540af434 scmutil: make revpair() return context objects (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37253
diff changeset
826 return repo[first], repo[None]
14319
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14261
diff changeset
827
37254
e9ee540af434 scmutil: make revpair() return context objects (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37253
diff changeset
828 return repo[first], repo[second]
14319
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14261
diff changeset
829
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
830
34023
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 33819
diff changeset
831 def revrange(repo, specs, localalias=None):
29417
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
832 """Execute 1 to many revsets and return the union.
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
833
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
834 This is the preferred mechanism for executing revsets using user-specified
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
835 config options, such as revset aliases.
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
836
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
837 The revsets specified by ``specs`` will be executed via a chained ``OR``
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
838 expression. If ``specs`` is empty, an empty result is returned.
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
839
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
840 ``specs`` can contain integers, in which case they are assumed to be
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
841 revision numbers.
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
842
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
843 It is assumed the revsets are already formatted. If you have arguments
31044
0b8356705de6 revset: split language services to revsetlang module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 30644
diff changeset
844 that need to be expanded in the revset, call ``revsetlang.formatspec()``
29417
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
845 and pass the result as an element of ``specs``.
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
846
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
847 Specifying a single revset is allowed.
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
848
44075
2122ffa903ea doc: fix references to `revset.abstractsmartset`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44063
diff changeset
849 Returns a ``smartset.abstractsmartset`` which is a list-like interface over
29417
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
850 integer revisions.
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
851 """
25928
4ee4f7415095 revrange: evaluate all revset specs at once
Yuya Nishihara <yuya@tcha.org>
parents: 25904
diff changeset
852 allspecs = []
29417
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
853 for spec in specs:
25904
fbaa2de13cf6 revrange: drop old-style parser in favor of revset (API)
Yuya Nishihara <yuya@tcha.org>
parents: 25772
diff changeset
854 if isinstance(spec, int):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
855 spec = revsetlang.formatspec(b'%d', spec)
25928
4ee4f7415095 revrange: evaluate all revset specs at once
Yuya Nishihara <yuya@tcha.org>
parents: 25904
diff changeset
856 allspecs.append(spec)
34023
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 33819
diff changeset
857 return repo.anyrevs(allspecs, user=True, localalias=localalias)
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
858
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
859
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
860 def increasingwindows(
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
861 windowsize: int = 8, sizelimit: int = 512
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
862 ) -> Iterable[int]:
45720
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
863 while True:
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
864 yield windowsize
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
865 if windowsize < sizelimit:
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
866 windowsize *= 2
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
867
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
868
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
869 def walkchangerevs(repo, revs, makefilematcher, prepare):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45934
diff changeset
870 """Iterate over files and the revs in a "windowed" way.
45720
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
871
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
872 Callers most commonly need to iterate backwards over the history
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
873 in which they are interested. Doing so has awful (quadratic-looking)
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
874 performance, so we use iterators in a "windowed" way.
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
875
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
876 We walk a window of revisions in the desired order. Within the
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
877 window, we first walk forwards to gather data, then in the desired
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
878 order (usually backwards) to display it.
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
879
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
880 This function returns an iterator yielding contexts. Before
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
881 yielding each context, the iterator will first call the prepare
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45934
diff changeset
882 function on each context in the window in forward order."""
45720
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
883
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
884 if not revs:
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
885 return []
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
886 change = repo.__getitem__
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
887
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
888 def iterate():
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
889 it = iter(revs)
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
890 stopiteration = False
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
891 for windowsize in increasingwindows():
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
892 nrevs = []
49292
d44e3c45f0e4 py3: replace `pycompat.xrange` by `range`
Manuel Jacob <me@manueljacob.de>
parents: 49263
diff changeset
893 for i in range(windowsize):
45720
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
894 rev = next(it, None)
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
895 if rev is None:
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
896 stopiteration = True
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
897 break
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
898 nrevs.append(rev)
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
899 for rev in sorted(nrevs):
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
900 ctx = change(rev)
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
901 prepare(ctx, makefilematcher(ctx))
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
902 for rev in nrevs:
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
903 yield change(rev)
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
904
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
905 if stopiteration:
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
906 break
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
907
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
908 return iterate()
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
909
508dfd1c18df scmutil: move walkchangerevs() from cmdutil
Yuya Nishihara <yuya@tcha.org>
parents: 45682
diff changeset
910
26433
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
911 def meaningfulparents(repo, ctx):
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
912 """Return list of meaningful (or all if debug) parentrevs for rev.
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
913
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
914 For merges (two non-nullrev revisions) both parents are meaningful.
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
915 Otherwise the first parent revision is considered meaningful if it
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
916 is not the preceding revision.
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
917 """
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
918 parents = ctx.parents()
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
919 if len(parents) > 1:
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
920 return parents
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
921 if repo.ui.debugflag:
39899
d739f423bf06 repo: look up nullrev context by revnum, not symbolic name
Martin von Zweigbergk <martinvonz@google.com>
parents: 39896
diff changeset
922 return [parents[0], repo[nullrev]]
32676
4bec8cce6a09 scmutil: pass ctx object to intrev()
Yuya Nishihara <yuya@tcha.org>
parents: 32310
diff changeset
923 if parents[0].rev() >= intrev(ctx) - 1:
26433
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
924 return []
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
925 return parents
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
926
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
927
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
928 def getuipathfn(
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
929 repo,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
930 legacyrelativevalue: bool = False,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
931 forcerelativevalue: Optional[bool] = None,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
932 ) -> typelib.UiPathFn:
41589
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41506
diff changeset
933 """Return a function that produced paths for presenting to the user.
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41506
diff changeset
934
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41506
diff changeset
935 The returned function takes a repo-relative path and produces a path
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41506
diff changeset
936 that can be presented in the UI.
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41506
diff changeset
937
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41506
diff changeset
938 Depending on the value of ui.relative-paths, either a repo-relative or
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41506
diff changeset
939 cwd-relative path will be produced.
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41506
diff changeset
940
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41506
diff changeset
941 legacyrelativevalue is the value to use if ui.relative-paths=legacy
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41506
diff changeset
942
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41506
diff changeset
943 If forcerelativevalue is not None, then that value will be used regardless
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41506
diff changeset
944 of what ui.relative-paths is set to.
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41506
diff changeset
945 """
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41506
diff changeset
946 if forcerelativevalue is not None:
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41506
diff changeset
947 relative = forcerelativevalue
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41506
diff changeset
948 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
949 config = repo.ui.config(b'ui', b'relative-paths')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
950 if config == b'legacy':
41589
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41506
diff changeset
951 relative = legacyrelativevalue
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41506
diff changeset
952 else:
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41506
diff changeset
953 relative = stringutil.parsebool(config)
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41506
diff changeset
954 if relative is None:
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41506
diff changeset
955 raise error.ConfigError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
956 _(b"ui.relative-paths is not a boolean ('%s')") % config
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
957 )
41589
aec185af621e config: introduce a new value for ui.relative-paths getting old behavior
Martin von Zweigbergk <martinvonz@google.com>
parents: 41506
diff changeset
958
41505
e6ec0737b706 status: extract helper for producing relative or absolute path for UI
Martin von Zweigbergk <martinvonz@google.com>
parents: 41443
diff changeset
959 if relative:
e6ec0737b706 status: extract helper for producing relative or absolute path for UI
Martin von Zweigbergk <martinvonz@google.com>
parents: 41443
diff changeset
960 cwd = repo.getcwd()
44917
5d8ae9248a70 scmutil: speed up relativization of paths when it's a no-op
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44887
diff changeset
961 if cwd != b'':
44943
d044b66d8429 scmutil: clarify getuipathfn comment
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44917
diff changeset
962 # this branch would work even if cwd == b'' (ie cwd = repo
d044b66d8429 scmutil: clarify getuipathfn comment
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44917
diff changeset
963 # root), but its generality makes the returned function slower
44917
5d8ae9248a70 scmutil: speed up relativization of paths when it's a no-op
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44887
diff changeset
964 pathto = repo.pathto
5d8ae9248a70 scmutil: speed up relativization of paths when it's a no-op
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44887
diff changeset
965 return lambda f: pathto(f, cwd)
5d8ae9248a70 scmutil: speed up relativization of paths when it's a no-op
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 44887
diff changeset
966 if repo.ui.configbool(b'ui', b'slash'):
41695
a8d3a4be066e windows: use util.localpath for repo-relative paths in getuipathfn()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41687
diff changeset
967 return lambda f: f
41505
e6ec0737b706 status: extract helper for producing relative or absolute path for UI
Martin von Zweigbergk <martinvonz@google.com>
parents: 41443
diff changeset
968 else:
41695
a8d3a4be066e windows: use util.localpath for repo-relative paths in getuipathfn()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41687
diff changeset
969 return util.localpath
41505
e6ec0737b706 status: extract helper for producing relative or absolute path for UI
Martin von Zweigbergk <martinvonz@google.com>
parents: 41443
diff changeset
970
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
971
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
972 def subdiruipathfn(
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
973 subpath: bytes, uipathfn: typelib.UiPathFn
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
974 ) -> typelib.UiPathFn:
41661
f8b18583049f add: pass around uipathfn and use instead of m.rel() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41660
diff changeset
975 '''Create a new uipathfn that treats the file as relative to subpath.'''
f8b18583049f add: pass around uipathfn and use instead of m.rel() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41660
diff changeset
976 return lambda f: uipathfn(posixpath.join(subpath, f))
f8b18583049f add: pass around uipathfn and use instead of m.rel() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41660
diff changeset
977
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
978
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
979 def anypats(pats, opts) -> bool:
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45934
diff changeset
980 """Checks if any patterns, including --include and --exclude were given.
41663
6a447a3d1bd0 addremove: pass around uipathfn and use instead of m.uipath() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41661
diff changeset
981
6a447a3d1bd0 addremove: pass around uipathfn and use instead of m.uipath() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41661
diff changeset
982 Some commands (e.g. addremove) use this condition for deciding whether to
6a447a3d1bd0 addremove: pass around uipathfn and use instead of m.uipath() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41661
diff changeset
983 print absolute or relative paths.
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45934
diff changeset
984 """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
985 return bool(pats or opts.get(b'include') or opts.get(b'exclude'))
41663
6a447a3d1bd0 addremove: pass around uipathfn and use instead of m.uipath() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41661
diff changeset
986
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
987
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
988 def expandpats(pats: Iterable[bytes]) -> List[bytes]:
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45934
diff changeset
989 """Expand bare globs when running on windows.
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45934
diff changeset
990 On posix we assume it already has already been done by sh."""
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
991 if not util.expandglobs:
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
992 return list(pats)
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
993 ret = []
21111
9d28fd795215 match: improve documentation - docstrings and more descriptive variable naming
Mads Kiilerich <madski@unity3d.com>
parents: 20980
diff changeset
994 for kindpat in pats:
9d28fd795215 match: improve documentation - docstrings and more descriptive variable naming
Mads Kiilerich <madski@unity3d.com>
parents: 20980
diff changeset
995 kind, pat = matchmod._patsplit(kindpat, None)
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
996 if kind is None:
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
997 try:
21111
9d28fd795215 match: improve documentation - docstrings and more descriptive variable naming
Mads Kiilerich <madski@unity3d.com>
parents: 20980
diff changeset
998 globbed = glob.glob(pat)
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
999 except re.error:
21111
9d28fd795215 match: improve documentation - docstrings and more descriptive variable naming
Mads Kiilerich <madski@unity3d.com>
parents: 20980
diff changeset
1000 globbed = [pat]
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
1001 if globbed:
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
1002 ret.extend(globbed)
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
1003 continue
21111
9d28fd795215 match: improve documentation - docstrings and more descriptive variable naming
Mads Kiilerich <madski@unity3d.com>
parents: 20980
diff changeset
1004 ret.append(kindpat)
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
1005 return ret
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
1006
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1007
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1008 def matchandpats(
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1009 ctx,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1010 pats=(),
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1011 opts=None,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1012 globbed: bool = False,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1013 default: bytes = b'relpath',
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1014 badfn=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1015 ):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45934
diff changeset
1016 """Return a matcher and the patterns that were used.
25467
f64dbe06f3d0 scmutil: add an optional parameter to matcher factories for a bad() override
Matt Harbison <matt_harbison@yahoo.com>
parents: 25466
diff changeset
1017 The matcher will warn about bad matches, unless an alternate badfn callback
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45934
diff changeset
1018 is provided."""
26326
58218b0e6005 match: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26325
diff changeset
1019 if opts is None:
58218b0e6005 match: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26325
diff changeset
1020 opts = {}
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1021 if not globbed and default == b'relpath':
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
1022 pats = expandpats(pats or [])
14670
19197fa4c41c scmutil: match now accepts a context or a repo
Matt Mackall <mpm@selenic.com>
parents: 14669
diff changeset
1023
41676
0ed7a8ac5711 scmutil: respect ui.relative-paths in default match.badfn
Martin von Zweigbergk <martinvonz@google.com>
parents: 41673
diff changeset
1024 uipathfn = getuipathfn(ctx.repo(), legacyrelativevalue=True)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1025
25467
f64dbe06f3d0 scmutil: add an optional parameter to matcher factories for a bad() override
Matt Harbison <matt_harbison@yahoo.com>
parents: 25466
diff changeset
1026 def bad(f, msg):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1027 ctx.repo().ui.warn(b"%s: %s\n" % (uipathfn(f), msg))
25466
007a1d53f7c3 scmutil: use the optional badfn argument when building a matcher
Matt Harbison <matt_harbison@yahoo.com>
parents: 25434
diff changeset
1028
25467
f64dbe06f3d0 scmutil: add an optional parameter to matcher factories for a bad() override
Matt Harbison <matt_harbison@yahoo.com>
parents: 25466
diff changeset
1029 if badfn is None:
f64dbe06f3d0 scmutil: add an optional parameter to matcher factories for a bad() override
Matt Harbison <matt_harbison@yahoo.com>
parents: 25466
diff changeset
1030 badfn = bad
f64dbe06f3d0 scmutil: add an optional parameter to matcher factories for a bad() override
Matt Harbison <matt_harbison@yahoo.com>
parents: 25466
diff changeset
1031
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1032 m = ctx.match(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1033 pats,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1034 opts.get(b'include'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1035 opts.get(b'exclude'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1036 default,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1037 listsubrepos=opts.get(b'subrepos'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1038 badfn=badfn,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1039 )
25466
007a1d53f7c3 scmutil: use the optional badfn argument when building a matcher
Matt Harbison <matt_harbison@yahoo.com>
parents: 25434
diff changeset
1040
24447
d44d53bc9a1e matcher: make e.g. 'relpath:.' lead to fast paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 24338
diff changeset
1041 if m.always():
d44d53bc9a1e matcher: make e.g. 'relpath:.' lead to fast paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 24338
diff changeset
1042 pats = []
16171
336e61875335 graphlog: restore FILE glob expansion on Windows
Patrick Mezard <patrick@mezard.eu>
parents: 16167
diff changeset
1043 return m, pats
336e61875335 graphlog: restore FILE glob expansion on Windows
Patrick Mezard <patrick@mezard.eu>
parents: 16167
diff changeset
1044
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1045
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1046 def match(
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1047 ctx,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1048 pats=(),
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1049 opts=None,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1050 globbed: bool = False,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1051 default: bytes = b'relpath',
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1052 badfn=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1053 ):
21111
9d28fd795215 match: improve documentation - docstrings and more descriptive variable naming
Mads Kiilerich <madski@unity3d.com>
parents: 20980
diff changeset
1054 '''Return a matcher that will warn about bad matches.'''
25467
f64dbe06f3d0 scmutil: add an optional parameter to matcher factories for a bad() override
Matt Harbison <matt_harbison@yahoo.com>
parents: 25466
diff changeset
1055 return matchandpats(ctx, pats, opts, globbed, default, badfn=badfn)[0]
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
1056
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1057
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
1058 def matchall(repo):
21111
9d28fd795215 match: improve documentation - docstrings and more descriptive variable naming
Mads Kiilerich <madski@unity3d.com>
parents: 20980
diff changeset
1059 '''Return a matcher that will efficiently match everything.'''
41687
0531dff73d0b match: delete unused root and cwd arguments from {always,never,exact}() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41677
diff changeset
1060 return matchmod.always()
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
1061
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1062
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1063 def matchfiles(repo, files, badfn=None) -> matchmod.exactmatcher:
21111
9d28fd795215 match: improve documentation - docstrings and more descriptive variable naming
Mads Kiilerich <madski@unity3d.com>
parents: 20980
diff changeset
1064 '''Return a matcher that will efficiently match exactly these files.'''
41687
0531dff73d0b match: delete unused root and cwd arguments from {always,never,exact}() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41677
diff changeset
1065 return matchmod.exact(files, badfn=badfn)
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
1066
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1067
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1068 def parsefollowlinespattern(repo, rev, pat: bytes, msg: bytes) -> bytes:
34854
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
1069 """Return a file name from `pat` pattern suitable for usage in followlines
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
1070 logic.
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
1071 """
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
1072 if not matchmod.patkind(pat):
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
1073 return pathutil.canonpath(repo.root, repo.getcwd(), pat)
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
1074 else:
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
1075 ctx = repo[rev]
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
1076 m = matchmod.match(repo.root, repo.getcwd(), [pat], ctx=ctx)
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
1077 files = [f for f in ctx if m(f)]
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
1078 if len(files) != 1:
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
1079 raise error.ParseError(msg)
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
1080 return files[0]
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
1081
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1082
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1083 def getorigvfs(ui: "uimod.ui", repo):
40786
65591a513b9c revert: extract origvfs logic in a sub-function
Boris Feld <boris.feld@octobus.net>
parents: 40699
diff changeset
1084 """return a vfs suitable to save 'orig' file
65591a513b9c revert: extract origvfs logic in a sub-function
Boris Feld <boris.feld@octobus.net>
parents: 40699
diff changeset
1085
65591a513b9c revert: extract origvfs logic in a sub-function
Boris Feld <boris.feld@octobus.net>
parents: 40699
diff changeset
1086 return None if no special directory is configured"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1087 origbackuppath = ui.config(b'ui', b'origbackuppath')
40786
65591a513b9c revert: extract origvfs logic in a sub-function
Boris Feld <boris.feld@octobus.net>
parents: 40699
diff changeset
1088 if not origbackuppath:
65591a513b9c revert: extract origvfs logic in a sub-function
Boris Feld <boris.feld@octobus.net>
parents: 40699
diff changeset
1089 return None
65591a513b9c revert: extract origvfs logic in a sub-function
Boris Feld <boris.feld@octobus.net>
parents: 40699
diff changeset
1090 return vfs.vfs(repo.wvfs.join(origbackuppath))
65591a513b9c revert: extract origvfs logic in a sub-function
Boris Feld <boris.feld@octobus.net>
parents: 40699
diff changeset
1091
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1092
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1093 def backuppath(ui: "uimod.ui", repo, filepath: bytes) -> bytes:
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45934
diff changeset
1094 """customize where working copy backup files (.orig files) are created
41608
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41589
diff changeset
1095
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41589
diff changeset
1096 Fetch user defined path from config file: [ui] origbackuppath = <path>
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41589
diff changeset
1097 Fall back to default (filepath with .orig suffix) if not specified
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41589
diff changeset
1098
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41589
diff changeset
1099 filepath is repo-relative
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41589
diff changeset
1100
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41589
diff changeset
1101 Returns an absolute path
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45934
diff changeset
1102 """
41608
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41589
diff changeset
1103 origvfs = getorigvfs(ui, repo)
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41589
diff changeset
1104 if origvfs is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1105 return repo.wjoin(filepath + b".orig")
41608
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41589
diff changeset
1106
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41589
diff changeset
1107 origbackupdir = origvfs.dirname(filepath)
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41589
diff changeset
1108 if not origvfs.isdir(origbackupdir) or origvfs.islink(origbackupdir):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1109 ui.note(_(b'creating directory: %s\n') % origvfs.join(origbackupdir))
41608
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41589
diff changeset
1110
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41589
diff changeset
1111 # Remove any files that conflict with the backup file's path
43677
0b7733719d21 utils: move finddirs() to pathutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 43554
diff changeset
1112 for f in reversed(list(pathutil.finddirs(filepath))):
41608
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41589
diff changeset
1113 if origvfs.isfileorlink(f):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1114 ui.note(_(b'removing conflicting file: %s\n') % origvfs.join(f))
41608
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41589
diff changeset
1115 origvfs.unlink(f)
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41589
diff changeset
1116 break
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41589
diff changeset
1117
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41589
diff changeset
1118 origvfs.makedirs(origbackupdir)
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41589
diff changeset
1119
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41589
diff changeset
1120 if origvfs.isdir(filepath) and not origvfs.islink(filepath):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1121 ui.note(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1122 _(b'removing conflicting directory: %s\n') % origvfs.join(filepath)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1123 )
41608
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41589
diff changeset
1124 origvfs.rmtree(filepath, forcibly=True)
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41589
diff changeset
1125
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41589
diff changeset
1126 return origvfs.join(filepath)
8785188d1915 scmutil: introduce a new backuppath() to replace origpath()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41589
diff changeset
1127
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1128
49037
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 49025
diff changeset
1129 class _containsnode:
33331
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
1130 """proxy __contains__(node) to container.__contains__ which accepts revs"""
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
1131
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
1132 def __init__(self, repo, revcontainer):
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
1133 self._torev = repo.changelog.rev
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
1134 self._revcontains = revcontainer.__contains__
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
1135
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1136 def __contains__(self, node) -> bool:
33331
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
1137 return self._revcontains(self._torev(node))
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
1138
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1139
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1140 def cleanupnodes(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1141 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1142 replacements,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1143 operation,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1144 moves=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1145 metadata=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1146 fixphase=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1147 targetphase=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1148 backup=True,
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1149 ) -> None:
33100
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
1150 """do common cleanups when old nodes are replaced by new nodes
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
1151
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
1152 That includes writing obsmarkers or stripping nodes, and moving bookmarks.
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
1153 (we might also want to move working directory parent in the future)
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
1154
33686
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33685
diff changeset
1155 By default, bookmark moves are calculated automatically from 'replacements',
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33685
diff changeset
1156 but 'moves' can be used to override that. Also, 'moves' may include
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33685
diff changeset
1157 additional bookmark moves that should not have associated obsmarkers.
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33685
diff changeset
1158
33685
2dbd6d259cd2 cleanupnodes: rename "mapping" to "replacements"
Martin von Zweigbergk <martinvonz@google.com>
parents: 33684
diff changeset
1159 replacements is {oldnode: [newnode]} or a iterable of nodes if they do not
2dbd6d259cd2 cleanupnodes: rename "mapping" to "replacements"
Martin von Zweigbergk <martinvonz@google.com>
parents: 33684
diff changeset
1160 have replacements. operation is a string, like "rebase".
34793
3df59451cdec scmutil: add capability to cleanupnodes to take obsmarker metadata
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34737
diff changeset
1161
3df59451cdec scmutil: add capability to cleanupnodes to take obsmarker metadata
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34737
diff changeset
1162 metadata is dictionary containing metadata to be stored in obsmarker if
3df59451cdec scmutil: add capability to cleanupnodes to take obsmarker metadata
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34737
diff changeset
1163 obsolescence is enabled.
33100
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
1164 """
38429
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38425
diff changeset
1165 assert fixphase or targetphase is None
33686
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33685
diff changeset
1166 if not replacements and not moves:
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33685
diff changeset
1167 return
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33685
diff changeset
1168
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33685
diff changeset
1169 # translate mapping's other forms
50951
d718eddf01d9 safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50942
diff changeset
1170 if not hasattr(replacements, 'items'):
39896
b99903534e06 scmutil: accept multiple predecessors in 'replacements' (API)
Boris Feld <boris.feld@octobus.net>
parents: 39895
diff changeset
1171 replacements = {(n,): () for n in replacements}
b99903534e06 scmutil: accept multiple predecessors in 'replacements' (API)
Boris Feld <boris.feld@octobus.net>
parents: 39895
diff changeset
1172 else:
b99903534e06 scmutil: accept multiple predecessors in 'replacements' (API)
Boris Feld <boris.feld@octobus.net>
parents: 39895
diff changeset
1173 # upgrading non tuple "source" to tuple ones for BC
b99903534e06 scmutil: accept multiple predecessors in 'replacements' (API)
Boris Feld <boris.feld@octobus.net>
parents: 39895
diff changeset
1174 repls = {}
b99903534e06 scmutil: accept multiple predecessors in 'replacements' (API)
Boris Feld <boris.feld@octobus.net>
parents: 39895
diff changeset
1175 for key, value in replacements.items():
b99903534e06 scmutil: accept multiple predecessors in 'replacements' (API)
Boris Feld <boris.feld@octobus.net>
parents: 39895
diff changeset
1176 if not isinstance(key, tuple):
b99903534e06 scmutil: accept multiple predecessors in 'replacements' (API)
Boris Feld <boris.feld@octobus.net>
parents: 39895
diff changeset
1177 key = (key,)
b99903534e06 scmutil: accept multiple predecessors in 'replacements' (API)
Boris Feld <boris.feld@octobus.net>
parents: 39895
diff changeset
1178 repls[key] = value
b99903534e06 scmutil: accept multiple predecessors in 'replacements' (API)
Boris Feld <boris.feld@octobus.net>
parents: 39895
diff changeset
1179 replacements = repls
33100
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
1180
40873
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40786
diff changeset
1181 # Unfiltered repo is needed since nodes in replacements might be hidden.
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40786
diff changeset
1182 unfi = repo.unfiltered()
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40786
diff changeset
1183
33684
033a5befbaf7 cleanupnodes: separate out bookmark destination calculation from actual update
Martin von Zweigbergk <martinvonz@google.com>
parents: 33647
diff changeset
1184 # Calculate bookmark movements
33686
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33685
diff changeset
1185 if moves is None:
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33685
diff changeset
1186 moves = {}
40873
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40786
diff changeset
1187 for oldnodes, newnodes in replacements.items():
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40786
diff changeset
1188 for oldnode in oldnodes:
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40786
diff changeset
1189 if oldnode in moves:
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40786
diff changeset
1190 continue
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40786
diff changeset
1191 if len(newnodes) > 1:
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40786
diff changeset
1192 # usually a split, take the one with biggest rev number
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1193 newnode = next(unfi.set(b'max(%ln)', newnodes)).node()
40873
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40786
diff changeset
1194 elif len(newnodes) == 0:
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40786
diff changeset
1195 # move bookmark backwards
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40786
diff changeset
1196 allreplaced = []
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40786
diff changeset
1197 for rep in replacements:
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40786
diff changeset
1198 allreplaced.extend(rep)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1199 roots = list(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1200 unfi.set(b'max((::%n) - %ln)', oldnode, allreplaced)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1201 )
40873
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40786
diff changeset
1202 if roots:
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40786
diff changeset
1203 newnode = roots[0].node()
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40786
diff changeset
1204 else:
47055
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46976
diff changeset
1205 newnode = repo.nullid
39896
b99903534e06 scmutil: accept multiple predecessors in 'replacements' (API)
Boris Feld <boris.feld@octobus.net>
parents: 39895
diff changeset
1206 else:
40873
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40786
diff changeset
1207 newnode = newnodes[0]
b7823bd59b07 cleanupnodes: trust caller when "moves" is not None
Martin von Zweigbergk <martinvonz@google.com>
parents: 40786
diff changeset
1208 moves[oldnode] = newnode
33684
033a5befbaf7 cleanupnodes: separate out bookmark destination calculation from actual update
Martin von Zweigbergk <martinvonz@google.com>
parents: 33647
diff changeset
1209
38429
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38425
diff changeset
1210 allnewnodes = [n for ns in replacements.values() for n in ns]
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38425
diff changeset
1211 toretract = {}
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38425
diff changeset
1212 toadvance = {}
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38425
diff changeset
1213 if fixphase:
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38425
diff changeset
1214 precursors = {}
39896
b99903534e06 scmutil: accept multiple predecessors in 'replacements' (API)
Boris Feld <boris.feld@octobus.net>
parents: 39895
diff changeset
1215 for oldnodes, newnodes in replacements.items():
b99903534e06 scmutil: accept multiple predecessors in 'replacements' (API)
Boris Feld <boris.feld@octobus.net>
parents: 39895
diff changeset
1216 for oldnode in oldnodes:
b99903534e06 scmutil: accept multiple predecessors in 'replacements' (API)
Boris Feld <boris.feld@octobus.net>
parents: 39895
diff changeset
1217 for newnode in newnodes:
b99903534e06 scmutil: accept multiple predecessors in 'replacements' (API)
Boris Feld <boris.feld@octobus.net>
parents: 39895
diff changeset
1218 precursors.setdefault(newnode, []).append(oldnode)
38429
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38425
diff changeset
1219
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38425
diff changeset
1220 allnewnodes.sort(key=lambda n: unfi[n].rev())
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38425
diff changeset
1221 newphases = {}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1222
38429
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38425
diff changeset
1223 def phase(ctx):
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38425
diff changeset
1224 return newphases.get(ctx.node(), ctx.phase())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1225
38429
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38425
diff changeset
1226 for newnode in allnewnodes:
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38425
diff changeset
1227 ctx = unfi[newnode]
38437
05b7dd11918e cleanupnodes: preserve phase of parents of new nodes
Martin von Zweigbergk <martinvonz@google.com>
parents: 38429
diff changeset
1228 parentphase = max(phase(p) for p in ctx.parents())
38429
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38425
diff changeset
1229 if targetphase is None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1230 oldphase = max(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1231 unfi[oldnode].phase() for oldnode in precursors[newnode]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1232 )
38429
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38425
diff changeset
1233 newphase = max(oldphase, parentphase)
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38425
diff changeset
1234 else:
38437
05b7dd11918e cleanupnodes: preserve phase of parents of new nodes
Martin von Zweigbergk <martinvonz@google.com>
parents: 38429
diff changeset
1235 newphase = max(targetphase, parentphase)
38429
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38425
diff changeset
1236 newphases[newnode] = newphase
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38425
diff changeset
1237 if newphase > ctx.phase():
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38425
diff changeset
1238 toretract.setdefault(newphase, []).append(newnode)
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38425
diff changeset
1239 elif newphase < ctx.phase():
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38425
diff changeset
1240 toadvance.setdefault(newphase, []).append(newnode)
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38425
diff changeset
1241
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1242 with repo.transaction(b'cleanup') as tr:
33100
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
1243 # Move bookmarks
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
1244 bmarks = repo._bookmarks
33511
9689239d7c2b bookmark: use 'divergent2delete' in 'scmutil.cleanupnode'
Boris Feld <boris.feld@octobus.net>
parents: 33505
diff changeset
1245 bmarkchanges = []
33684
033a5befbaf7 cleanupnodes: separate out bookmark destination calculation from actual update
Martin von Zweigbergk <martinvonz@google.com>
parents: 33647
diff changeset
1246 for oldnode, newnode in moves.items():
33100
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
1247 oldbmarks = repo.nodebookmarks(oldnode)
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
1248 if not oldbmarks:
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
1249 continue
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1250 from . import bookmarks # avoid import cycle
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1251
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1252 repo.ui.debug(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1253 b'moving bookmarks %r from %s to %s\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1254 % (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1255 pycompat.rapply(pycompat.maybebytestr, oldbmarks),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1256 hex(oldnode),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1257 hex(newnode),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1258 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1259 )
33331
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
1260 # Delete divergent bookmarks being parents of related newnodes
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1261 deleterevs = repo.revs(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1262 b'parents(roots(%ln & (::%n))) - parents(%n)',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1263 allnewnodes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1264 newnode,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1265 oldnode,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1266 )
33331
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
1267 deletenodes = _containsnode(repo, deleterevs)
33100
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
1268 for name in oldbmarks:
33511
9689239d7c2b bookmark: use 'divergent2delete' in 'scmutil.cleanupnode'
Boris Feld <boris.feld@octobus.net>
parents: 33505
diff changeset
1269 bmarkchanges.append((name, newnode))
9689239d7c2b bookmark: use 'divergent2delete' in 'scmutil.cleanupnode'
Boris Feld <boris.feld@octobus.net>
parents: 33505
diff changeset
1270 for b in bookmarks.divergent2delete(repo, deletenodes, name):
9689239d7c2b bookmark: use 'divergent2delete' in 'scmutil.cleanupnode'
Boris Feld <boris.feld@octobus.net>
parents: 33505
diff changeset
1271 bmarkchanges.append((b, None))
9689239d7c2b bookmark: use 'divergent2delete' in 'scmutil.cleanupnode'
Boris Feld <boris.feld@octobus.net>
parents: 33505
diff changeset
1272
9689239d7c2b bookmark: use 'divergent2delete' in 'scmutil.cleanupnode'
Boris Feld <boris.feld@octobus.net>
parents: 33505
diff changeset
1273 if bmarkchanges:
9689239d7c2b bookmark: use 'divergent2delete' in 'scmutil.cleanupnode'
Boris Feld <boris.feld@octobus.net>
parents: 33505
diff changeset
1274 bmarks.applychanges(repo, tr, bmarkchanges)
33100
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
1275
38429
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38425
diff changeset
1276 for phase, nodes in toretract.items():
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38425
diff changeset
1277 phases.retractboundary(repo, tr, phase, nodes)
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38425
diff changeset
1278 for phase, nodes in toadvance.items():
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38425
diff changeset
1279 phases.advanceboundary(repo, tr, phase, nodes)
32fba6fe893d scmutil: make cleanupnodes optionally also fix the phase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38425
diff changeset
1280
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1281 mayusearchived = repo.ui.config(b'experimental', b'cleanup-as-archived')
33100
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
1282 # Obsolete or strip nodes
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
1283 if obsolete.isenabled(repo, obsolete.createmarkersopt):
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
1284 # If a node is already obsoleted, and we want to obsolete it
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
1285 # without a successor, skip that obssolete request since it's
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
1286 # unnecessary. That's the "if s or not isobs(n)" check below.
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
1287 # Also sort the node in topology order, that might be useful for
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
1288 # some obsstore logic.
40042
ca9d0c93acea cleanupnodes: update comment to drop mention of filtering
Boris Feld <boris.feld@octobus.net>
parents: 39928
diff changeset
1289 # NOTE: the sorting might belong to createmarkers.
33330
ba43e5ee9c6d scmutil: make cleanupnodes handle filtered node
Jun Wu <quark@fb.com>
parents: 33252
diff changeset
1290 torev = unfi.changelog.rev
39896
b99903534e06 scmutil: accept multiple predecessors in 'replacements' (API)
Boris Feld <boris.feld@octobus.net>
parents: 39895
diff changeset
1291 sortfunc = lambda ns: torev(ns[0][0])
39895
1c3f1491965f scmutil: expand long "one-liner"
Boris Feld <boris.feld@octobus.net>
parents: 39841
diff changeset
1292 rels = []
39896
b99903534e06 scmutil: accept multiple predecessors in 'replacements' (API)
Boris Feld <boris.feld@octobus.net>
parents: 39895
diff changeset
1293 for ns, s in sorted(replacements.items(), key=sortfunc):
39928
61f39a892168 cleanupnodes: pass multiple predecessors to `createmarkers` directly
Boris Feld <boris.feld@octobus.net>
parents: 39921
diff changeset
1294 rel = (tuple(unfi[n] for n in ns), tuple(unfi[m] for m in s))
61f39a892168 cleanupnodes: pass multiple predecessors to `createmarkers` directly
Boris Feld <boris.feld@octobus.net>
parents: 39921
diff changeset
1295 rels.append(rel)
33686
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33685
diff changeset
1296 if rels:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1297 obsolete.createmarkers(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1298 repo, rels, operation=operation, metadata=metadata
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1299 )
49474
b57c95a0f5f9 phase: introduce a dedicated function to check for the archived phase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49314
diff changeset
1300 elif phases.supportarchived(repo) and mayusearchived:
41804
64de5f44eec3 rewriting: add an option for rewrite commands to use the archived phase
Boris Feld <boris.feld@octobus.net>
parents: 41790
diff changeset
1301 # this assume we do not have "unstable" nodes above the cleaned ones
64de5f44eec3 rewriting: add an option for rewrite commands to use the archived phase
Boris Feld <boris.feld@octobus.net>
parents: 41790
diff changeset
1302 allreplaced = set()
64de5f44eec3 rewriting: add an option for rewrite commands to use the archived phase
Boris Feld <boris.feld@octobus.net>
parents: 41790
diff changeset
1303 for ns in replacements.keys():
64de5f44eec3 rewriting: add an option for rewrite commands to use the archived phase
Boris Feld <boris.feld@octobus.net>
parents: 41790
diff changeset
1304 allreplaced.update(ns)
64de5f44eec3 rewriting: add an option for rewrite commands to use the archived phase
Boris Feld <boris.feld@octobus.net>
parents: 41790
diff changeset
1305 if backup:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1306 from . import repair # avoid import cycle
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1307
41804
64de5f44eec3 rewriting: add an option for rewrite commands to use the archived phase
Boris Feld <boris.feld@octobus.net>
parents: 41790
diff changeset
1308 node = min(allreplaced, key=repo.changelog.rev)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1309 repair.backupbundle(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1310 repo, allreplaced, allreplaced, node, operation
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1311 )
41804
64de5f44eec3 rewriting: add an option for rewrite commands to use the archived phase
Boris Feld <boris.feld@octobus.net>
parents: 41790
diff changeset
1312 phases.retractboundary(repo, tr, phases.archived, allreplaced)
33100
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
1313 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1314 from . import repair # avoid import cycle
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1315
39896
b99903534e06 scmutil: accept multiple predecessors in 'replacements' (API)
Boris Feld <boris.feld@octobus.net>
parents: 39895
diff changeset
1316 tostrip = list(n for ns in replacements for n in ns)
33686
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33685
diff changeset
1317 if tostrip:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1318 repair.delayedstrip(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1319 repo.ui, repo, tostrip, operation, backup=backup
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1320 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1321
33100
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
1322
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1323 def addremove(
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1324 repo,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1325 matcher,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1326 prefix: bytes,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1327 uipathfn: typelib.UiPathFn,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1328 opts=None,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1329 open_tr=None,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1330 ) -> int:
26329
d9537ce64f3a addremove: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26328
diff changeset
1331 if opts is None:
d9537ce64f3a addremove: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26328
diff changeset
1332 opts = {}
23533
891aaa7c0c70 scmutil: pass a matcher to scmutil.addremove() instead of a list of patterns
Matt Harbison <matt_harbison@yahoo.com>
parents: 23481
diff changeset
1333 m = matcher
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1334 dry_run = opts.get(b'dry_run')
37306
6942c73f0733 addremove: pass command-level similarity value down to scmutil.addremove()
Yuya Nishihara <yuya@tcha.org>
parents: 37273
diff changeset
1335 try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1336 similarity = float(opts.get(b'similarity') or 0)
37306
6942c73f0733 addremove: pass command-level similarity value down to scmutil.addremove()
Yuya Nishihara <yuya@tcha.org>
parents: 37273
diff changeset
1337 except ValueError:
48053
5b89626c11e9 errors: use InputError for bad --similarity value
Martin von Zweigbergk <martinvonz@google.com>
parents: 48052
diff changeset
1338 raise error.InputError(_(b'similarity must be a number'))
37306
6942c73f0733 addremove: pass command-level similarity value down to scmutil.addremove()
Yuya Nishihara <yuya@tcha.org>
parents: 37273
diff changeset
1339 if similarity < 0 or similarity > 100:
48053
5b89626c11e9 errors: use InputError for bad --similarity value
Martin von Zweigbergk <martinvonz@google.com>
parents: 48052
diff changeset
1340 raise error.InputError(_(b'similarity must be between 0 and 100'))
37306
6942c73f0733 addremove: pass command-level similarity value down to scmutil.addremove()
Yuya Nishihara <yuya@tcha.org>
parents: 37273
diff changeset
1341 similarity /= 100.0
23533
891aaa7c0c70 scmutil: pass a matcher to scmutil.addremove() instead of a list of patterns
Matt Harbison <matt_harbison@yahoo.com>
parents: 23481
diff changeset
1342
23537
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23534
diff changeset
1343 ret = 0
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23534
diff changeset
1344
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23534
diff changeset
1345 wctx = repo[None]
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23534
diff changeset
1346 for subpath in sorted(wctx.substate):
29813
35560189677c subrepo: cleanup of subrepo filematcher logic
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29782
diff changeset
1347 submatch = matchmod.subdirmatcher(subpath, m)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1348 if opts.get(b'subrepos') or m.exact(subpath) or any(submatch.files()):
23537
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23534
diff changeset
1349 sub = wctx.sub(subpath)
41640
5ee3c49fc9cd subrepo: adjust subrepo prefix before calling subrepo.addremove() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41617
diff changeset
1350 subprefix = repo.wvfs.reljoin(prefix, subpath)
41663
6a447a3d1bd0 addremove: pass around uipathfn and use instead of m.uipath() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41661
diff changeset
1351 subuipathfn = subdiruipathfn(subpath, uipathfn)
23537
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23534
diff changeset
1352 try:
41663
6a447a3d1bd0 addremove: pass around uipathfn and use instead of m.uipath() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41661
diff changeset
1353 if sub.addremove(submatch, subprefix, subuipathfn, opts):
23537
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23534
diff changeset
1354 ret = 1
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23534
diff changeset
1355 except error.LookupError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1356 repo.ui.status(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1357 _(b"skipping missing subrepository: %s\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1358 % uipathfn(subpath)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1359 )
23537
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23534
diff changeset
1360
16167
94a8396c9305 addremove: return 1 if we failed to handle any explicit files
Matt Mackall <mpm@selenic.com>
parents: 16115
diff changeset
1361 rejected = []
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1362
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1363 def badfn(f: bytes, msg: bytes) -> None:
23534
83bbedc16b3f addremove: warn when addremove fails to operate on a named path
Matt Harbison <matt_harbison@yahoo.com>
parents: 23533
diff changeset
1364 if f in m.files():
25434
5984dd42e140 addremove: replace match.bad() monkey patching with match.badmatch()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25418
diff changeset
1365 m.bad(f, msg)
23534
83bbedc16b3f addremove: warn when addremove fails to operate on a named path
Matt Harbison <matt_harbison@yahoo.com>
parents: 23533
diff changeset
1366 rejected.append(f)
16167
94a8396c9305 addremove: return 1 if we failed to handle any explicit files
Matt Mackall <mpm@selenic.com>
parents: 16115
diff changeset
1367
25434
5984dd42e140 addremove: replace match.bad() monkey patching with match.badmatch()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25418
diff changeset
1368 badmatch = matchmod.badmatch(m, badfn)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1369 added, unknown, deleted, removed, forgotten = _interestingfiles(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1370 repo, badmatch
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1371 )
18863
1b70e5941ad7 scmutil.addremove: pull ui.status printing out of the loop
Siddharth Agarwal <sid0@fb.com>
parents: 18862
diff changeset
1372
23259
9f4778027bc2 addremove: add back forgotten files (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 23142
diff changeset
1373 unknownset = set(unknown + forgotten)
18863
1b70e5941ad7 scmutil.addremove: pull ui.status printing out of the loop
Siddharth Agarwal <sid0@fb.com>
parents: 18862
diff changeset
1374 toprint = unknownset.copy()
1b70e5941ad7 scmutil.addremove: pull ui.status printing out of the loop
Siddharth Agarwal <sid0@fb.com>
parents: 18862
diff changeset
1375 toprint.update(deleted)
1b70e5941ad7 scmutil.addremove: pull ui.status printing out of the loop
Siddharth Agarwal <sid0@fb.com>
parents: 18862
diff changeset
1376 for abs in sorted(toprint):
1b70e5941ad7 scmutil.addremove: pull ui.status printing out of the loop
Siddharth Agarwal <sid0@fb.com>
parents: 18862
diff changeset
1377 if repo.ui.verbose or not m.exact(abs):
1b70e5941ad7 scmutil.addremove: pull ui.status printing out of the loop
Siddharth Agarwal <sid0@fb.com>
parents: 18862
diff changeset
1378 if abs in unknownset:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1379 status = _(b'adding %s\n') % uipathfn(abs)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1380 label = b'ui.addremove.added'
18863
1b70e5941ad7 scmutil.addremove: pull ui.status printing out of the loop
Siddharth Agarwal <sid0@fb.com>
parents: 18862
diff changeset
1381 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1382 status = _(b'removing %s\n') % uipathfn(abs)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1383 label = b'ui.addremove.removed'
39125
ad88726d6982 addremove: add labels for messages about added and removed files
Boris Feld <boris.feld@octobus.net>
parents: 38895
diff changeset
1384 repo.ui.status(status, label=label)
18863
1b70e5941ad7 scmutil.addremove: pull ui.status printing out of the loop
Siddharth Agarwal <sid0@fb.com>
parents: 18862
diff changeset
1385
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1386 renames = _findrenames(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1387 repo, m, added + unknown, removed + deleted, similarity, uipathfn
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1388 )
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
1389
50085
28dfb2df4ab9 commit: use `dirstate.change_files` to scope the associated `addremove`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50030
diff changeset
1390 if not dry_run and (unknown or forgotten or deleted or renames):
28dfb2df4ab9 commit: use `dirstate.change_files` to scope the associated `addremove`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50030
diff changeset
1391 if open_tr is not None:
28dfb2df4ab9 commit: use `dirstate.change_files` to scope the associated `addremove`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50030
diff changeset
1392 open_tr()
23259
9f4778027bc2 addremove: add back forgotten files (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 23142
diff changeset
1393 _markchanges(repo, unknown + forgotten, deleted, renames)
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
1394
16167
94a8396c9305 addremove: return 1 if we failed to handle any explicit files
Matt Mackall <mpm@selenic.com>
parents: 16115
diff changeset
1395 for f in rejected:
94a8396c9305 addremove: return 1 if we failed to handle any explicit files
Matt Mackall <mpm@selenic.com>
parents: 16115
diff changeset
1396 if f in m.files():
94a8396c9305 addremove: return 1 if we failed to handle any explicit files
Matt Mackall <mpm@selenic.com>
parents: 16115
diff changeset
1397 return 1
23537
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23534
diff changeset
1398 return ret
16167
94a8396c9305 addremove: return 1 if we failed to handle any explicit files
Matt Mackall <mpm@selenic.com>
parents: 16115
diff changeset
1399
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1400
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1401 def marktouched(repo, files, similarity: float = 0.0) -> int:
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45934
diff changeset
1402 """Assert that files have somehow been operated upon. files are relative to
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45934
diff changeset
1403 the repo root."""
25467
f64dbe06f3d0 scmutil: add an optional parameter to matcher factories for a bad() override
Matt Harbison <matt_harbison@yahoo.com>
parents: 25466
diff changeset
1404 m = matchfiles(repo, files, badfn=lambda x, y: rejected.append(x))
19154
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
1405 rejected = []
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
1406
23259
9f4778027bc2 addremove: add back forgotten files (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 23142
diff changeset
1407 added, unknown, deleted, removed, forgotten = _interestingfiles(repo, m)
19154
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
1408
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
1409 if repo.ui.verbose:
23259
9f4778027bc2 addremove: add back forgotten files (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 23142
diff changeset
1410 unknownset = set(unknown + forgotten)
19154
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
1411 toprint = unknownset.copy()
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
1412 toprint.update(deleted)
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
1413 for abs in sorted(toprint):
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
1414 if abs in unknownset:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1415 status = _(b'adding %s\n') % abs
19154
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
1416 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1417 status = _(b'removing %s\n') % abs
19154
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
1418 repo.ui.status(status)
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
1419
41673
0a5a6675c86c addremove: use uipathfn instead of m.rel() for recorded similatity message
Martin von Zweigbergk <martinvonz@google.com>
parents: 41663
diff changeset
1420 # TODO: We should probably have the caller pass in uipathfn and apply it to
41708
e21183db2259 scmutil: fix a comment that doesn't match the code
Martin von Zweigbergk <martinvonz@google.com>
parents: 41696
diff changeset
1421 # the messages above too. legacyrelativevalue=True is consistent with how
41673
0a5a6675c86c addremove: use uipathfn instead of m.rel() for recorded similatity message
Martin von Zweigbergk <martinvonz@google.com>
parents: 41663
diff changeset
1422 # it used to work.
41696
b81ecf3571d5 addremove: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41695
diff changeset
1423 uipathfn = getuipathfn(repo, legacyrelativevalue=True)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1424 renames = _findrenames(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1425 repo, m, added + unknown, removed + deleted, similarity, uipathfn
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1426 )
19154
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
1427
23259
9f4778027bc2 addremove: add back forgotten files (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 23142
diff changeset
1428 _markchanges(repo, unknown + forgotten, deleted, renames)
19154
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
1429
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
1430 for f in rejected:
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
1431 if f in m.files():
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
1432 return 1
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
1433 return 0
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
1434
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1435
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1436 def _interestingfiles(
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1437 repo, matcher
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1438 ) -> Tuple[List[bytes], List[bytes], List[bytes], List[bytes], List[bytes]]:
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45934
diff changeset
1439 """Walk dirstate with matcher, looking for files that addremove would care
19150
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
1440 about.
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
1441
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
1442 This is different from dirstate.status because it doesn't care about
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45934
diff changeset
1443 whether files are modified or clean."""
23259
9f4778027bc2 addremove: add back forgotten files (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 23142
diff changeset
1444 added, unknown, deleted, removed, forgotten = [], [], [], [], []
33647
377e8ddaebef pathauditor: disable cache of audited paths by default (issue5628)
Yuya Nishihara <yuya@tcha.org>
parents: 33542
diff changeset
1445 audit_path = pathutil.pathauditor(repo.root, cached=True)
19150
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
1446
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
1447 ctx = repo[None]
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
1448 dirstate = repo.dirstate
40088
1d09ba0d2ed3 narrow: move remaining narrow-limited dirstate walks to core
Martin von Zweigbergk <martinvonz@google.com>
parents: 40042
diff changeset
1449 matcher = repo.narrowmatch(matcher, includeexact=True)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1450 walkresults = dirstate.walk(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1451 matcher,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1452 subrepos=sorted(ctx.substate),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1453 unknown=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1454 ignored=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1455 full=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1456 )
49004
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48966
diff changeset
1457 for abs, st in walkresults.items():
48110
ba79d99ec1ae dirstate-item: use item's property instead of `state` in addremove
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
1458 entry = dirstate.get_entry(abs)
ba79d99ec1ae dirstate-item: use item's property instead of `state` in addremove
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
1459 if (not entry.any_tracked) and audit_path.check(abs):
19150
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
1460 unknown.append(abs)
48110
ba79d99ec1ae dirstate-item: use item's property instead of `state` in addremove
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
1461 elif (not entry.removed) and not st:
19150
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
1462 deleted.append(abs)
48110
ba79d99ec1ae dirstate-item: use item's property instead of `state` in addremove
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
1463 elif entry.removed and st:
23259
9f4778027bc2 addremove: add back forgotten files (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 23142
diff changeset
1464 forgotten.append(abs)
19150
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
1465 # for finding renames
48110
ba79d99ec1ae dirstate-item: use item's property instead of `state` in addremove
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
1466 elif entry.removed and not st:
19150
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
1467 removed.append(abs)
48110
ba79d99ec1ae dirstate-item: use item's property instead of `state` in addremove
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
1468 elif entry.added:
19150
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
1469 added.append(abs)
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
1470
23259
9f4778027bc2 addremove: add back forgotten files (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 23142
diff changeset
1471 return added, unknown, deleted, removed, forgotten
19150
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
1472
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1473
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1474 def _findrenames(
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1475 repo, matcher, added, removed, similarity, uipathfn: typelib.UiPathFn
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1476 ) -> Dict[bytes, bytes]:
19152
7a1292523db3 scmutil.addremove: factor out code to find renames
Siddharth Agarwal <sid0@fb.com>
parents: 19151
diff changeset
1477 '''Find renames from removed files to added ones.'''
7a1292523db3 scmutil.addremove: factor out code to find renames
Siddharth Agarwal <sid0@fb.com>
parents: 19151
diff changeset
1478 renames = {}
7a1292523db3 scmutil.addremove: factor out code to find renames
Siddharth Agarwal <sid0@fb.com>
parents: 19151
diff changeset
1479 if similarity > 0:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1480 for old, new, score in similar.findrenames(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1481 repo, added, removed, similarity
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1482 ):
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1483 if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1484 repo.ui.verbose
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1485 or not matcher.exact(old)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1486 or not matcher.exact(new)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1487 ):
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1488 repo.ui.status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1489 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1490 b'recording removal of %s as rename to %s '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1491 b'(%d%% similar)\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1492 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1493 % (uipathfn(old), uipathfn(new), score * 100)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1494 )
19152
7a1292523db3 scmutil.addremove: factor out code to find renames
Siddharth Agarwal <sid0@fb.com>
parents: 19151
diff changeset
1495 renames[new] = old
7a1292523db3 scmutil.addremove: factor out code to find renames
Siddharth Agarwal <sid0@fb.com>
parents: 19151
diff changeset
1496 return renames
7a1292523db3 scmutil.addremove: factor out code to find renames
Siddharth Agarwal <sid0@fb.com>
parents: 19151
diff changeset
1497
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1498
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1499 def _markchanges(repo, unknown, deleted, renames) -> None:
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45934
diff changeset
1500 """Marks the files in unknown as added, the files in deleted as removed,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45934
diff changeset
1501 and the files in renames as copied."""
19153
9a4e219bda89 scmutil.addremove: factor out code to mark added/removed/renames
Siddharth Agarwal <sid0@fb.com>
parents: 19152
diff changeset
1502 wctx = repo[None]
27851
4133a306606c with: use context manager in _markchanges
Bryan O'Sullivan <bryano@fb.com>
parents: 27706
diff changeset
1503 with repo.wlock():
19153
9a4e219bda89 scmutil.addremove: factor out code to mark added/removed/renames
Siddharth Agarwal <sid0@fb.com>
parents: 19152
diff changeset
1504 wctx.forget(deleted)
9a4e219bda89 scmutil.addremove: factor out code to mark added/removed/renames
Siddharth Agarwal <sid0@fb.com>
parents: 19152
diff changeset
1505 wctx.add(unknown)
49004
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48966
diff changeset
1506 for new, old in renames.items():
19153
9a4e219bda89 scmutil.addremove: factor out code to mark added/removed/renames
Siddharth Agarwal <sid0@fb.com>
parents: 19152
diff changeset
1507 wctx.copy(old, new)
9a4e219bda89 scmutil.addremove: factor out code to mark added/removed/renames
Siddharth Agarwal <sid0@fb.com>
parents: 19152
diff changeset
1508
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1509
41790
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41708
diff changeset
1510 def getrenamedfn(repo, endrev=None):
42115
27475ae67676 copies: extract function for deciding whether to use changeset-centric algos
Martin von Zweigbergk <martinvonz@google.com>
parents: 42114
diff changeset
1511 if copiesmod.usechangesetcentricalgo(repo):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1512
42114
aa84bc48c2f7 getrenamedfn: get copy data from context object if configured
Martin von Zweigbergk <martinvonz@google.com>
parents: 41943
diff changeset
1513 def getrenamed(fn, rev):
aa84bc48c2f7 getrenamedfn: get copy data from context object if configured
Martin von Zweigbergk <martinvonz@google.com>
parents: 41943
diff changeset
1514 ctx = repo[rev]
aa84bc48c2f7 getrenamedfn: get copy data from context object if configured
Martin von Zweigbergk <martinvonz@google.com>
parents: 41943
diff changeset
1515 p1copies = ctx.p1copies()
aa84bc48c2f7 getrenamedfn: get copy data from context object if configured
Martin von Zweigbergk <martinvonz@google.com>
parents: 41943
diff changeset
1516 if fn in p1copies:
aa84bc48c2f7 getrenamedfn: get copy data from context object if configured
Martin von Zweigbergk <martinvonz@google.com>
parents: 41943
diff changeset
1517 return p1copies[fn]
aa84bc48c2f7 getrenamedfn: get copy data from context object if configured
Martin von Zweigbergk <martinvonz@google.com>
parents: 41943
diff changeset
1518 p2copies = ctx.p2copies()
aa84bc48c2f7 getrenamedfn: get copy data from context object if configured
Martin von Zweigbergk <martinvonz@google.com>
parents: 41943
diff changeset
1519 if fn in p2copies:
aa84bc48c2f7 getrenamedfn: get copy data from context object if configured
Martin von Zweigbergk <martinvonz@google.com>
parents: 41943
diff changeset
1520 return p2copies[fn]
aa84bc48c2f7 getrenamedfn: get copy data from context object if configured
Martin von Zweigbergk <martinvonz@google.com>
parents: 41943
diff changeset
1521 return None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1522
42114
aa84bc48c2f7 getrenamedfn: get copy data from context object if configured
Martin von Zweigbergk <martinvonz@google.com>
parents: 41943
diff changeset
1523 return getrenamed
aa84bc48c2f7 getrenamedfn: get copy data from context object if configured
Martin von Zweigbergk <martinvonz@google.com>
parents: 41943
diff changeset
1524
41790
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41708
diff changeset
1525 rcache = {}
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41708
diff changeset
1526 if endrev is None:
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41708
diff changeset
1527 endrev = len(repo)
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41708
diff changeset
1528
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41708
diff changeset
1529 def getrenamed(fn, rev):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45934
diff changeset
1530 """looks up all renames for a file (up to endrev) the first
41790
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41708
diff changeset
1531 time the file is given. It indexes on the changerev and only
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41708
diff changeset
1532 parses the manifest if linkrev != changerev.
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45934
diff changeset
1533 Returns rename info for fn at changerev rev."""
41790
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41708
diff changeset
1534 if fn not in rcache:
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41708
diff changeset
1535 rcache[fn] = {}
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41708
diff changeset
1536 fl = repo.file(fn)
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41708
diff changeset
1537 for i in fl:
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41708
diff changeset
1538 lr = fl.linkrev(i)
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41708
diff changeset
1539 renamed = fl.renamed(fl.node(i))
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41708
diff changeset
1540 rcache[fn][lr] = renamed and renamed[0]
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41708
diff changeset
1541 if lr >= endrev:
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41708
diff changeset
1542 break
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41708
diff changeset
1543 if rev in rcache[fn]:
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41708
diff changeset
1544 return rcache[fn][rev]
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41708
diff changeset
1545
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41708
diff changeset
1546 # If linkrev != rev (i.e. rev not found in rcache) fallback to
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41708
diff changeset
1547 # filectx logic.
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41708
diff changeset
1548 try:
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41708
diff changeset
1549 return repo[rev][fn].copysource()
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41708
diff changeset
1550 except error.LookupError:
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41708
diff changeset
1551 return None
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41708
diff changeset
1552
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41708
diff changeset
1553 return getrenamed
e9b9ee9af4a9 templatekw: move getrenamedfn() to scmutil (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41708
diff changeset
1554
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1555
42518
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
1556 def getcopiesfn(repo, endrev=None):
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
1557 if copiesmod.usechangesetcentricalgo(repo):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1558
42518
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
1559 def copiesfn(ctx):
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
1560 if ctx.p2copies():
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
1561 allcopies = ctx.p1copies().copy()
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
1562 # There should be no overlap
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
1563 allcopies.update(ctx.p2copies())
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
1564 return sorted(allcopies.items())
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
1565 else:
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
1566 return sorted(ctx.p1copies().items())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1567
42518
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
1568 else:
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
1569 getrenamed = getrenamedfn(repo, endrev)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1570
42518
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
1571 def copiesfn(ctx):
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
1572 copies = []
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
1573 for fn in ctx.files():
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
1574 rename = getrenamed(fn, ctx.rev())
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
1575 if rename:
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
1576 copies.append((fn, rename))
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
1577 return copies
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
1578
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
1579 return copiesfn
88ba0ff94605 copies: create helper for getting all copies for changeset
Martin von Zweigbergk <martinvonz@google.com>
parents: 42115
diff changeset
1580
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1581
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1582 def dirstatecopy(
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1583 ui: "uimod.ui",
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1584 repo,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1585 wctx,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1586 src,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1587 dst,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1588 dryrun: bool = False,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1589 cwd: Optional[bytes] = None,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1590 ) -> None:
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
1591 """Update the dirstate to reflect the intent of copying src to dst. For
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
1592 different reasons it might not end with dst being marked as copied from src.
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
1593 """
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
1594 origsrc = repo.dirstate.copied(src) or src
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1595 if dst == origsrc: # copying back a copy?
48115
8f452fecd0a4 dirstate-item: use item's property when computing a copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48110
diff changeset
1596 entry = repo.dirstate.get_entry(dst)
8f452fecd0a4 dirstate-item: use item's property when computing a copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48110
diff changeset
1597 if (entry.added or not entry.tracked) and not dryrun:
47729
b66ae4468c9a copy: use `set_tracked` instead of `normallookup` in `dirstatecopy`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47693
diff changeset
1598 repo.dirstate.set_tracked(dst)
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
1599 else:
48115
8f452fecd0a4 dirstate-item: use item's property when computing a copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48110
diff changeset
1600 if repo.dirstate.get_entry(origsrc).added and origsrc == src:
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
1601 if not ui.quiet:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1602 ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1603 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1604 b"%s has not been committed yet, so no copy "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1605 b"data will be stored for %s.\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1606 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1607 % (repo.pathto(origsrc, cwd), repo.pathto(dst, cwd))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1608 )
48115
8f452fecd0a4 dirstate-item: use item's property when computing a copies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48110
diff changeset
1609 if not repo.dirstate.get_entry(dst).tracked and not dryrun:
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
1610 wctx.add([dst])
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
1611 elif not dryrun:
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
1612 wctx.copy(origsrc, dst)
14482
58b36e9ea783 introduce new function scmutil.readrequires
Adrian Buehlmann <adrian@cadifra.com>
parents: 14435
diff changeset
1613
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1614
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1615 def movedirstate(repo, newctx, match=None) -> None:
41943
ad4a3e2eedb3 scmutil: document matcher argument of movedirstate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41942
diff changeset
1616 """Move the dirstate to newctx and adjust it as necessary.
ad4a3e2eedb3 scmutil: document matcher argument of movedirstate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41942
diff changeset
1617
ad4a3e2eedb3 scmutil: document matcher argument of movedirstate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41942
diff changeset
1618 A matcher can be provided as an optimization. It is probably a bug to pass
ad4a3e2eedb3 scmutil: document matcher argument of movedirstate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41942
diff changeset
1619 a matcher that doesn't match all the differences between the parent of the
ad4a3e2eedb3 scmutil: document matcher argument of movedirstate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41942
diff changeset
1620 working copy and newctx.
ad4a3e2eedb3 scmutil: document matcher argument of movedirstate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41942
diff changeset
1621 """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1622 oldctx = repo[b'.']
41942
232d4b9d391a uncommit: move _movedirstate() to scmutil for reuse
Martin von Zweigbergk <martinvonz@google.com>
parents: 41804
diff changeset
1623 ds = repo.dirstate
44039
0750cbffdb3b movedirstate: get copies from dirstate before setting parents
Martin von Zweigbergk <martinvonz@google.com>
parents: 44016
diff changeset
1624 copies = dict(ds.copies())
47055
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46976
diff changeset
1625 ds.setparents(newctx.node(), repo.nullid)
41942
232d4b9d391a uncommit: move _movedirstate() to scmutil for reuse
Martin von Zweigbergk <martinvonz@google.com>
parents: 41804
diff changeset
1626 s = newctx.status(oldctx, match=match)
47592
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47306
diff changeset
1627
41942
232d4b9d391a uncommit: move _movedirstate() to scmutil for reuse
Martin von Zweigbergk <martinvonz@google.com>
parents: 41804
diff changeset
1628 for f in s.modified:
47693
46c318b9b9a4 dirstate: rename `update_file_reference` to `update_file_p1`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47592
diff changeset
1629 ds.update_file_p1(f, p1_tracked=True)
41942
232d4b9d391a uncommit: move _movedirstate() to scmutil for reuse
Martin von Zweigbergk <martinvonz@google.com>
parents: 41804
diff changeset
1630
232d4b9d391a uncommit: move _movedirstate() to scmutil for reuse
Martin von Zweigbergk <martinvonz@google.com>
parents: 41804
diff changeset
1631 for f in s.added:
47693
46c318b9b9a4 dirstate: rename `update_file_reference` to `update_file_p1`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47592
diff changeset
1632 ds.update_file_p1(f, p1_tracked=False)
41942
232d4b9d391a uncommit: move _movedirstate() to scmutil for reuse
Martin von Zweigbergk <martinvonz@google.com>
parents: 41804
diff changeset
1633
232d4b9d391a uncommit: move _movedirstate() to scmutil for reuse
Martin von Zweigbergk <martinvonz@google.com>
parents: 41804
diff changeset
1634 for f in s.removed:
47693
46c318b9b9a4 dirstate: rename `update_file_reference` to `update_file_p1`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47592
diff changeset
1635 ds.update_file_p1(f, p1_tracked=True)
41942
232d4b9d391a uncommit: move _movedirstate() to scmutil for reuse
Martin von Zweigbergk <martinvonz@google.com>
parents: 41804
diff changeset
1636
232d4b9d391a uncommit: move _movedirstate() to scmutil for reuse
Martin von Zweigbergk <martinvonz@google.com>
parents: 41804
diff changeset
1637 # Merge old parent and old working dir copies
232d4b9d391a uncommit: move _movedirstate() to scmutil for reuse
Martin von Zweigbergk <martinvonz@google.com>
parents: 41804
diff changeset
1638 oldcopies = copiesmod.pathcopies(newctx, oldctx, match)
232d4b9d391a uncommit: move _movedirstate() to scmutil for reuse
Martin von Zweigbergk <martinvonz@google.com>
parents: 41804
diff changeset
1639 oldcopies.update(copies)
49004
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48966
diff changeset
1640 copies = {dst: oldcopies.get(src, src) for dst, src in oldcopies.items()}
41942
232d4b9d391a uncommit: move _movedirstate() to scmutil for reuse
Martin von Zweigbergk <martinvonz@google.com>
parents: 41804
diff changeset
1641 # Adjust the dirstate copies
49004
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48966
diff changeset
1642 for dst, src in copies.items():
48117
207df24a31f6 dirstate-item: use `added` instead of `state` when moving dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48115
diff changeset
1643 if src not in newctx or dst in newctx or not ds.get_entry(dst).added:
41942
232d4b9d391a uncommit: move _movedirstate() to scmutil for reuse
Martin von Zweigbergk <martinvonz@google.com>
parents: 41804
diff changeset
1644 src = None
232d4b9d391a uncommit: move _movedirstate() to scmutil for reuse
Martin von Zweigbergk <martinvonz@google.com>
parents: 41804
diff changeset
1645 ds.copy(src, dst)
44104
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
1646 repo._quick_access_changeid_invalidate()
41942
232d4b9d391a uncommit: move _movedirstate() to scmutil for reuse
Martin von Zweigbergk <martinvonz@google.com>
parents: 41804
diff changeset
1647
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1648
45493
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
1649 def filterrequirements(requirements):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45934
diff changeset
1650 """filters the requirements into two sets:
45493
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
1651
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
1652 wcreq: requirements which should be written in .hg/requires
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
1653 storereq: which should be written in .hg/store/requires
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
1654
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
1655 Returns (wcreq, storereq)
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
1656 """
45494
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45493
diff changeset
1657 if requirementsmod.SHARESAFE_REQUIREMENT in requirements:
45493
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
1658 wc, store = set(), set()
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
1659 for r in requirements:
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
1660 if r in requirementsmod.WORKING_DIR_REQUIREMENTS:
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
1661 wc.add(r)
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
1662 else:
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
1663 store.add(r)
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
1664 return wc, store
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
1665 return requirements, None
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
1666
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
1667
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1668 def istreemanifest(repo) -> bool:
47031
f38bf44e077f black: make codebase compatible with black v21.4b2 and v20.8b1
Kyle Lippincott <spectral@google.com>
parents: 46976
diff changeset
1669 """returns whether the repository is using treemanifest or not"""
45558
10284ce3d5ed scmutil: introduce function to check whether repo uses treemanifest or not
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45527
diff changeset
1670 return requirementsmod.TREEMANIFEST_REQUIREMENT in repo.requirements
10284ce3d5ed scmutil: introduce function to check whether repo uses treemanifest or not
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45527
diff changeset
1671
10284ce3d5ed scmutil: introduce function to check whether repo uses treemanifest or not
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45527
diff changeset
1672
51849
95cdc01f313d sparse: reliably avoid writing to store without a lock
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51847
diff changeset
1673 def writereporequirements(repo, requirements=None, maywritestore=True) -> None:
46242
cb12658bf0e1 scmutil: improve documentation of writereporequirements()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46117
diff changeset
1674 """writes requirements for the repo
cb12658bf0e1 scmutil: improve documentation of writereporequirements()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46117
diff changeset
1675
cb12658bf0e1 scmutil: improve documentation of writereporequirements()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46117
diff changeset
1676 Requirements are written to .hg/requires and .hg/store/requires based
cb12658bf0e1 scmutil: improve documentation of writereporequirements()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46117
diff changeset
1677 on whether share-safe mode is enabled and which requirements are wdir
cb12658bf0e1 scmutil: improve documentation of writereporequirements()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46117
diff changeset
1678 requirements and which are store requirements
cb12658bf0e1 scmutil: improve documentation of writereporequirements()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46117
diff changeset
1679 """
45106
a03c177a4679 scmutil: add writereporequirements() and route requires writing through it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45073
diff changeset
1680 if requirements:
a03c177a4679 scmutil: add writereporequirements() and route requires writing through it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45073
diff changeset
1681 repo.requirements = requirements
45493
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
1682 wcreq, storereq = filterrequirements(repo.requirements)
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
1683 if wcreq is not None:
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
1684 writerequires(repo.vfs, wcreq)
9a99ab8217bd scmutil: introduce filterrequirements() to split reqs into wc and store ones
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45106
diff changeset
1685 if storereq is not None:
51849
95cdc01f313d sparse: reliably avoid writing to store without a lock
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51847
diff changeset
1686 writerequires(repo.svfs, storereq, maywrite=maywritestore)
45934
aba4f2c97e74 scmutil: try-delete `.hg/store/requires` if store requirements are empty
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45930
diff changeset
1687 elif repo.ui.configbool(b'format', b'usestore'):
aba4f2c97e74 scmutil: try-delete `.hg/store/requires` if store requirements are empty
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45930
diff changeset
1688 # only remove store requires if we are using store
51849
95cdc01f313d sparse: reliably avoid writing to store without a lock
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51847
diff changeset
1689 if maywritestore:
95cdc01f313d sparse: reliably avoid writing to store without a lock
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51847
diff changeset
1690 repo.svfs.tryunlink(b'requires')
45106
a03c177a4679 scmutil: add writereporequirements() and route requires writing through it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45073
diff changeset
1691
a03c177a4679 scmutil: add writereporequirements() and route requires writing through it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45073
diff changeset
1692
51845
eb952b2d224c scmutil: add `readrequires` next to `writerequires`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51790
diff changeset
1693 def readrequires(vfs, allowmissing):
eb952b2d224c scmutil: add `readrequires` next to `writerequires`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51790
diff changeset
1694 """reads the require file present at root of this vfs
eb952b2d224c scmutil: add `readrequires` next to `writerequires`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51790
diff changeset
1695 and return a set of requirements
eb952b2d224c scmutil: add `readrequires` next to `writerequires`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51790
diff changeset
1696
eb952b2d224c scmutil: add `readrequires` next to `writerequires`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51790
diff changeset
1697 If allowmissing is True, we suppress FileNotFoundError if raised"""
eb952b2d224c scmutil: add `readrequires` next to `writerequires`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51790
diff changeset
1698 # requires file contains a newline-delimited list of
eb952b2d224c scmutil: add `readrequires` next to `writerequires`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51790
diff changeset
1699 # features/capabilities the opener (us) must have in order to use
eb952b2d224c scmutil: add `readrequires` next to `writerequires`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51790
diff changeset
1700 # the repository. This file was introduced in Mercurial 0.9.2,
eb952b2d224c scmutil: add `readrequires` next to `writerequires`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51790
diff changeset
1701 # which means very old repositories may not have one. We assume
eb952b2d224c scmutil: add `readrequires` next to `writerequires`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51790
diff changeset
1702 # a missing file translates to no requirements.
eb952b2d224c scmutil: add `readrequires` next to `writerequires`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51790
diff changeset
1703 read = vfs.tryread if allowmissing else vfs.read
eb952b2d224c scmutil: add `readrequires` next to `writerequires`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51790
diff changeset
1704 return set(read(b'requires').splitlines())
eb952b2d224c scmutil: add `readrequires` next to `writerequires`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51790
diff changeset
1705
eb952b2d224c scmutil: add `readrequires` next to `writerequires`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51790
diff changeset
1706
51849
95cdc01f313d sparse: reliably avoid writing to store without a lock
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51847
diff changeset
1707 def writerequires(opener, requirements, maywrite=True) -> None:
51847
e69e3d585f07 scmutils: read the requires file before writing to avoid unnecessary rewrite
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51845
diff changeset
1708 on_disk = readrequires(opener, True)
e69e3d585f07 scmutils: read the requires file before writing to avoid unnecessary rewrite
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51845
diff changeset
1709 if not (on_disk == set(requirements)):
51849
95cdc01f313d sparse: reliably avoid writing to store without a lock
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51847
diff changeset
1710 if not maywrite:
95cdc01f313d sparse: reliably avoid writing to store without a lock
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51847
diff changeset
1711 raise error.Abort(_(b"store requirements are not as expected"))
51847
e69e3d585f07 scmutils: read the requires file before writing to avoid unnecessary rewrite
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51845
diff changeset
1712 with opener(b'requires', b'w', atomictemp=True) as fp:
e69e3d585f07 scmutils: read the requires file before writing to avoid unnecessary rewrite
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51845
diff changeset
1713 for r in sorted(requirements):
e69e3d585f07 scmutils: read the requires file before writing to avoid unnecessary rewrite
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51845
diff changeset
1714 fp.write(b"%s\n" % r)
24934
5abd0a76bc8f requires: move requires file writing func from localrepo to scmutil
Drew Gottlieb <drgott@google.com>
parents: 24755
diff changeset
1715
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1716
49037
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 49025
diff changeset
1717 class filecachesubentry:
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1718 _cacheable: Optional[bool] = None
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1719
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1720 def __init__(self, path, stat: bool):
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1721 self.path = path
18315
216230643ae2 filecache: allow filecacheentry to be created without stating in __init__
Idan Kamara <idankk86@gmail.com>
parents: 18213
diff changeset
1722 self.cachestat = None
216230643ae2 filecache: allow filecacheentry to be created without stating in __init__
Idan Kamara <idankk86@gmail.com>
parents: 18213
diff changeset
1723 self._cacheable = None
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1724
18315
216230643ae2 filecache: allow filecacheentry to be created without stating in __init__
Idan Kamara <idankk86@gmail.com>
parents: 18213
diff changeset
1725 if stat:
20043
88bd8df008f2 scmutil: rename filecacheentry to filecachesubentry
Siddharth Agarwal <sid0@fb.com>
parents: 20042
diff changeset
1726 self.cachestat = filecachesubentry.stat(self.path)
18315
216230643ae2 filecache: allow filecacheentry to be created without stating in __init__
Idan Kamara <idankk86@gmail.com>
parents: 18213
diff changeset
1727
216230643ae2 filecache: allow filecacheentry to be created without stating in __init__
Idan Kamara <idankk86@gmail.com>
parents: 18213
diff changeset
1728 if self.cachestat:
216230643ae2 filecache: allow filecacheentry to be created without stating in __init__
Idan Kamara <idankk86@gmail.com>
parents: 18213
diff changeset
1729 self._cacheable = self.cachestat.cacheable()
216230643ae2 filecache: allow filecacheentry to be created without stating in __init__
Idan Kamara <idankk86@gmail.com>
parents: 18213
diff changeset
1730 else:
216230643ae2 filecache: allow filecacheentry to be created without stating in __init__
Idan Kamara <idankk86@gmail.com>
parents: 18213
diff changeset
1731 # None means we don't know yet
216230643ae2 filecache: allow filecacheentry to be created without stating in __init__
Idan Kamara <idankk86@gmail.com>
parents: 18213
diff changeset
1732 self._cacheable = None
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1733
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1734 def refresh(self) -> None:
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1735 if self.cacheable():
20043
88bd8df008f2 scmutil: rename filecacheentry to filecachesubentry
Siddharth Agarwal <sid0@fb.com>
parents: 20042
diff changeset
1736 self.cachestat = filecachesubentry.stat(self.path)
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1737
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1738 def cacheable(self) -> bool:
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1739 if self._cacheable is not None:
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1740 return self._cacheable
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1741
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1742 # we don't know yet, assume it is for now
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1743 return True
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1744
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1745 def changed(self) -> bool:
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1746 # no point in going further if we can't cache it
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1747 if not self.cacheable():
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1748 return True
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1749
20043
88bd8df008f2 scmutil: rename filecacheentry to filecachesubentry
Siddharth Agarwal <sid0@fb.com>
parents: 20042
diff changeset
1750 newstat = filecachesubentry.stat(self.path)
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1751
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1752 # we may not know if it's cacheable yet, check again now
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1753 if newstat and self._cacheable is None:
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1754 self._cacheable = newstat.cacheable()
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1755
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1756 # check again
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1757 if not self._cacheable:
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1758 return True
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1759
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1760 if self.cachestat != newstat:
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1761 self.cachestat = newstat
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1762 return True
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1763 else:
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1764 return False
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1765
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1766 @staticmethod
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1767 def stat(path: bytes) -> Optional[typelib.CacheStat]:
52116
82e2c99c84f3 cachestat: avoid creating cachestat for http path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51901
diff changeset
1768 # TODO have a cleaner approach on httpstaticrepo side
82e2c99c84f3 cachestat: avoid creating cachestat for http path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51901
diff changeset
1769 if path.startswith(b'https://') or path.startswith(b'http://'):
82e2c99c84f3 cachestat: avoid creating cachestat for http path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51901
diff changeset
1770 return util.uncacheable_cachestat()
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1771 try:
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1772 return util.cachestat(path)
49314
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49292
diff changeset
1773 except FileNotFoundError:
52116
82e2c99c84f3 cachestat: avoid creating cachestat for http path
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51901
diff changeset
1774 return None
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1775
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1776
49037
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 49025
diff changeset
1777 class filecacheentry:
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1778 def __init__(self, paths, stat: bool = True) -> None:
20044
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
1779 self._entries = []
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
1780 for path in paths:
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
1781 self._entries.append(filecachesubentry(path, stat))
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
1782
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1783 def changed(self) -> bool:
20044
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
1784 '''true if any entry has changed'''
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
1785 for entry in self._entries:
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
1786 if entry.changed():
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
1787 return True
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
1788 return False
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
1789
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1790 def refresh(self) -> None:
20044
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
1791 for entry in self._entries:
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
1792 entry.refresh()
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
1793
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1794
49037
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 49025
diff changeset
1795 class filecache:
38676
3b072388ca78 scmutil: rewrite docstring for filecache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38659
diff changeset
1796 """A property like decorator that tracks files under .hg/ for updates.
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1797
38676
3b072388ca78 scmutil: rewrite docstring for filecache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38659
diff changeset
1798 On first access, the files defined as arguments are stat()ed and the
3b072388ca78 scmutil: rewrite docstring for filecache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38659
diff changeset
1799 results cached. The decorated function is called. The results are stashed
3b072388ca78 scmutil: rewrite docstring for filecache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38659
diff changeset
1800 away in a ``_filecache`` dict on the object whose method is decorated.
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1801
40493
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40492
diff changeset
1802 On subsequent access, the cached result is used as it is set to the
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40492
diff changeset
1803 instance dictionary.
38676
3b072388ca78 scmutil: rewrite docstring for filecache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38659
diff changeset
1804
40493
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40492
diff changeset
1805 On external property set/delete operations, the caller must update the
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40492
diff changeset
1806 corresponding _filecache entry appropriately. Use __class__.<attr>.set()
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40492
diff changeset
1807 instead of directly setting <attr>.
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1808
40493
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40492
diff changeset
1809 When using the property API, the cached data is always used if available.
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40492
diff changeset
1810 No stat() is performed to check if the file has changed.
20045
b3684fd2ff1a scmutil.filecache: support watching over multiple files
Siddharth Agarwal <sid0@fb.com>
parents: 20044
diff changeset
1811
38676
3b072388ca78 scmutil: rewrite docstring for filecache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38659
diff changeset
1812 Others can muck about with the state of the ``_filecache`` dict. e.g. they
3b072388ca78 scmutil: rewrite docstring for filecache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38659
diff changeset
1813 can populate an entry before the property's getter is called. In this case,
3b072388ca78 scmutil: rewrite docstring for filecache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38659
diff changeset
1814 entries in ``_filecache`` will be used during property operations,
3b072388ca78 scmutil: rewrite docstring for filecache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38659
diff changeset
1815 if available. If the underlying file changes, it is up to external callers
3b072388ca78 scmutil: rewrite docstring for filecache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38659
diff changeset
1816 to reflect this by e.g. calling ``delattr(obj, attr)`` to remove the cached
3b072388ca78 scmutil: rewrite docstring for filecache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38659
diff changeset
1817 method result as well as possibly calling ``del obj._filecache[attr]`` to
3b072388ca78 scmutil: rewrite docstring for filecache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38659
diff changeset
1818 remove the ``filecacheentry``.
3b072388ca78 scmutil: rewrite docstring for filecache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38659
diff changeset
1819 """
3b072388ca78 scmutil: rewrite docstring for filecache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38659
diff changeset
1820
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1821 paths: Tuple[bytes, ...]
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1822
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1823 def __init__(self, *paths: bytes) -> None:
20045
b3684fd2ff1a scmutil.filecache: support watching over multiple files
Siddharth Agarwal <sid0@fb.com>
parents: 20044
diff changeset
1824 self.paths = paths
16198
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16115
diff changeset
1825
48056
37a41267d000 branching: merge stable into default
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48053
diff changeset
1826 def tracked_paths(self, obj):
37a41267d000 branching: merge stable into default
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48053
diff changeset
1827 return [self.join(obj, path) for path in self.paths]
37a41267d000 branching: merge stable into default
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48053
diff changeset
1828
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1829 def join(self, obj, fname: bytes):
20045
b3684fd2ff1a scmutil.filecache: support watching over multiple files
Siddharth Agarwal <sid0@fb.com>
parents: 20044
diff changeset
1830 """Used to compute the runtime path of a cached file.
16198
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16115
diff changeset
1831
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16115
diff changeset
1832 Users should subclass filecache and provide their own version of this
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16115
diff changeset
1833 function to call the appropriate join function on 'obj' (an instance
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16115
diff changeset
1834 of the class that its member function was decorated).
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16115
diff changeset
1835 """
31294
1937671105bc filecache: make 'join' abstract
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31227
diff changeset
1836 raise NotImplementedError
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1837
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1838 def __call__(self, func):
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1839 self.func = func
37913
73a74f29eb87 scmutil: clean up bytes/string cache decorator mess on Python 3 again
Augie Fackler <augie@google.com>
parents: 37912
diff changeset
1840 self.sname = func.__name__
50942
b3174be5e7f7 localrepo: purge filecache attribute using there unicode name
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50649
diff changeset
1841 # XXX We should be using a unicode string instead of bytes for the main
b3174be5e7f7 localrepo: purge filecache attribute using there unicode name
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50649
diff changeset
1842 # name (and the _filecache key). The fact we use bytes is a remains
b3174be5e7f7 localrepo: purge filecache attribute using there unicode name
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50649
diff changeset
1843 # from Python2, since the name is derived from an attribute name a
b3174be5e7f7 localrepo: purge filecache attribute using there unicode name
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50649
diff changeset
1844 # `str` is a better fit now that we support Python3 only
37913
73a74f29eb87 scmutil: clean up bytes/string cache decorator mess on Python 3 again
Augie Fackler <augie@google.com>
parents: 37912
diff changeset
1845 self.name = pycompat.sysbytes(self.sname)
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1846 return self
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1847
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1848 def __get__(self, obj, type=None):
29373
36fbd72c2f39 scmutil: allow access to filecache descriptor on class
Martijn Pieters <mjpieters@fb.com>
parents: 29367
diff changeset
1849 # if accessed on the class, return the descriptor itself.
36fbd72c2f39 scmutil: allow access to filecache descriptor on class
Martijn Pieters <mjpieters@fb.com>
parents: 29367
diff changeset
1850 if obj is None:
36fbd72c2f39 scmutil: allow access to filecache descriptor on class
Martijn Pieters <mjpieters@fb.com>
parents: 29367
diff changeset
1851 return self
40493
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40492
diff changeset
1852
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40492
diff changeset
1853 assert self.sname not in obj.__dict__
16115
236bb604dc39 scmutil: update cached copy when filecached attribute is assigned (issue3263)
Idan Kamara <idankk86@gmail.com>
parents: 16068
diff changeset
1854
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1855 entry = obj._filecache.get(self.name)
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1856
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1857 if entry:
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1858 if entry.changed():
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1859 entry.obj = self.func(obj)
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1860 else:
48056
37a41267d000 branching: merge stable into default
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48053
diff changeset
1861 paths = self.tracked_paths(obj)
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1862
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1863 # We stat -before- creating the object so our cache doesn't lie if
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1864 # a writer modified between the time we read and stat
20045
b3684fd2ff1a scmutil.filecache: support watching over multiple files
Siddharth Agarwal <sid0@fb.com>
parents: 20044
diff changeset
1865 entry = filecacheentry(paths, True)
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1866 entry.obj = self.func(obj)
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1867
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1868 obj._filecache[self.name] = entry
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1869
37913
73a74f29eb87 scmutil: clean up bytes/string cache decorator mess on Python 3 again
Augie Fackler <augie@google.com>
parents: 37912
diff changeset
1870 obj.__dict__[self.sname] = entry.obj
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1871 return entry.obj
16115
236bb604dc39 scmutil: update cached copy when filecached attribute is assigned (issue3263)
Idan Kamara <idankk86@gmail.com>
parents: 16068
diff changeset
1872
40493
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40492
diff changeset
1873 # don't implement __set__(), which would make __dict__ lookup as slow as
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40492
diff changeset
1874 # function call.
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40492
diff changeset
1875
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40492
diff changeset
1876 def set(self, obj, value):
18316
f36375576ed5 filecache: create an entry in _filecache when __set__ is called for a missing one
Idan Kamara <idankk86@gmail.com>
parents: 18315
diff changeset
1877 if self.name not in obj._filecache:
f36375576ed5 filecache: create an entry in _filecache when __set__ is called for a missing one
Idan Kamara <idankk86@gmail.com>
parents: 18315
diff changeset
1878 # we add an entry for the missing value because X in __dict__
f36375576ed5 filecache: create an entry in _filecache when __set__ is called for a missing one
Idan Kamara <idankk86@gmail.com>
parents: 18315
diff changeset
1879 # implies X in _filecache
48056
37a41267d000 branching: merge stable into default
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48053
diff changeset
1880 paths = self.tracked_paths(obj)
20045
b3684fd2ff1a scmutil.filecache: support watching over multiple files
Siddharth Agarwal <sid0@fb.com>
parents: 20044
diff changeset
1881 ce = filecacheentry(paths, False)
18316
f36375576ed5 filecache: create an entry in _filecache when __set__ is called for a missing one
Idan Kamara <idankk86@gmail.com>
parents: 18315
diff changeset
1882 obj._filecache[self.name] = ce
f36375576ed5 filecache: create an entry in _filecache when __set__ is called for a missing one
Idan Kamara <idankk86@gmail.com>
parents: 18315
diff changeset
1883 else:
f36375576ed5 filecache: create an entry in _filecache when __set__ is called for a missing one
Idan Kamara <idankk86@gmail.com>
parents: 18315
diff changeset
1884 ce = obj._filecache[self.name]
f36375576ed5 filecache: create an entry in _filecache when __set__ is called for a missing one
Idan Kamara <idankk86@gmail.com>
parents: 18315
diff changeset
1885
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1886 ce.obj = value # update cached copy
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1887 obj.__dict__[self.sname] = value # update copy returned by obj.x
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1888
16115
236bb604dc39 scmutil: update cached copy when filecached attribute is assigned (issue3263)
Idan Kamara <idankk86@gmail.com>
parents: 16068
diff changeset
1889
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1890 def extdatasource(repo, source: bytes):
34457
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1891 """Gather a map of rev -> value dict from the specified source
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1892
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1893 A source spec is treated as a URL, with a special case shell: type
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1894 for parsing the output from a shell command.
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1895
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1896 The data is parsed as a series of newline-separated records where
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1897 each record is a revision specifier optionally followed by a space
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1898 and a freeform string value. If the revision is known locally, it
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1899 is converted to a rev, otherwise the record is skipped.
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1900
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1901 Note that both key and value are treated as UTF-8 and converted to
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1902 the local encoding. This allows uniformity between local and
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1903 remote data sources.
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1904 """
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1905
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1906 spec = repo.ui.config(b"extdata", source)
34457
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1907 if not spec:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1908 raise error.Abort(_(b"unknown extdata source '%s'") % source)
34457
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1909
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1910 data = {}
34462
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34461
diff changeset
1911 src = proc = None
34457
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1912 try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1913 if spec.startswith(b"shell:"):
34462
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34461
diff changeset
1914 # external commands should be run relative to the repo root
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34461
diff changeset
1915 cmd = spec[6:]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1916 proc = subprocess.Popen(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1917 procutil.tonativestr(cmd),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1918 shell=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1919 bufsize=-1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1920 close_fds=procutil.closefds,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1921 stdout=subprocess.PIPE,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1922 cwd=procutil.tonativestr(repo.root),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1923 )
34462
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34461
diff changeset
1924 src = proc.stdout
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34461
diff changeset
1925 else:
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34461
diff changeset
1926 # treat as a URL or file
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34461
diff changeset
1927 src = url.open(repo.ui, spec)
34461
910adadf08e8 extdata: just use iterator to read lines one by one
Yuya Nishihara <yuya@tcha.org>
parents: 34460
diff changeset
1928 for l in src:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1929 if b" " in l:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1930 k, v = l.strip().split(b" ", 1)
34457
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1931 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1932 k, v = l.strip(), b""
34457
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1933
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1934 k = encoding.tolocal(k)
34460
d5c5cc767b7e extdata: ignore ambiguous identifier as well
Yuya Nishihara <yuya@tcha.org>
parents: 34457
diff changeset
1935 try:
37360
d0d55980ffa7 extdatasource: use revsymbol() for converting to node
Martin von Zweigbergk <martinvonz@google.com>
parents: 37350
diff changeset
1936 data[revsingle(repo, k).rev()] = encoding.tolocal(v)
46116
be3d8178251e errors: raise InputError if an ambiguous revision id prefix is used
Martin von Zweigbergk <martinvonz@google.com>
parents: 46097
diff changeset
1937 except (error.LookupError, error.RepoLookupError, error.InputError):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1938 pass # we ignore data for nodes that don't exist locally
34457
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1939 finally:
34462
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34461
diff changeset
1940 if proc:
42576
ea6558db1011 extdata: avoid crashing inside subprocess when we get a revset parse error
Augie Fackler <augie@google.com>
parents: 42518
diff changeset
1941 try:
ea6558db1011 extdata: avoid crashing inside subprocess when we get a revset parse error
Augie Fackler <augie@google.com>
parents: 42518
diff changeset
1942 proc.communicate()
ea6558db1011 extdata: avoid crashing inside subprocess when we get a revset parse error
Augie Fackler <augie@google.com>
parents: 42518
diff changeset
1943 except ValueError:
ea6558db1011 extdata: avoid crashing inside subprocess when we get a revset parse error
Augie Fackler <augie@google.com>
parents: 42518
diff changeset
1944 # This happens if we started iterating src and then
ea6558db1011 extdata: avoid crashing inside subprocess when we get a revset parse error
Augie Fackler <augie@google.com>
parents: 42518
diff changeset
1945 # get a parse error on a line. It should be safe to ignore.
ea6558db1011 extdata: avoid crashing inside subprocess when we get a revset parse error
Augie Fackler <augie@google.com>
parents: 42518
diff changeset
1946 pass
34462
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34461
diff changeset
1947 if src:
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34461
diff changeset
1948 src.close()
35419
b1959391a088 extdata: abort if external command exits with non-zero status (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 35317
diff changeset
1949 if proc and proc.returncode != 0:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1950 raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1951 _(b"extdata command '%s' failed: %s")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1952 % (cmd, procutil.explainexit(proc.returncode))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1953 )
34457
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1954
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1955 return data
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1956
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
1957
49037
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 49025
diff changeset
1958 class progress:
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1959 ui: "uimod.ui"
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1960 pos: Optional[int] # None once complete
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1961 topic: bytes
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1962 unit: bytes
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1963 total: Optional[int]
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1964 debug: bool
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1965
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1966 def __init__(
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1967 self,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1968 ui: "uimod.ui",
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1969 updatebar,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1970 topic: bytes,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1971 unit: bytes = b"",
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1972 total: Optional[int] = None,
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1973 ) -> None:
38351
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38340
diff changeset
1974 self.ui = ui
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38340
diff changeset
1975 self.pos = 0
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38340
diff changeset
1976 self.topic = topic
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38340
diff changeset
1977 self.unit = unit
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38340
diff changeset
1978 self.total = total
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1979 self.debug = ui.configbool(b'progress', b'debug')
41146
963462786f6e progress: check what type of progress bar to use only once per topic
Martin von Zweigbergk <martinvonz@google.com>
parents: 41145
diff changeset
1980 self._updatebar = updatebar
38351
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38340
diff changeset
1981
38380
800f5a2c869e progress: make the progress helper a context manager
Martin von Zweigbergk <martinvonz@google.com>
parents: 38379
diff changeset
1982 def __enter__(self):
38507
077301ac69dc scmutil: fix __enter__ in progress context manager
Danny Hooper <hooper@google.com>
parents: 38460
diff changeset
1983 return self
38380
800f5a2c869e progress: make the progress helper a context manager
Martin von Zweigbergk <martinvonz@google.com>
parents: 38379
diff changeset
1984
800f5a2c869e progress: make the progress helper a context manager
Martin von Zweigbergk <martinvonz@google.com>
parents: 38379
diff changeset
1985 def __exit__(self, exc_type, exc_value, exc_tb):
800f5a2c869e progress: make the progress helper a context manager
Martin von Zweigbergk <martinvonz@google.com>
parents: 38379
diff changeset
1986 self.complete()
800f5a2c869e progress: make the progress helper a context manager
Martin von Zweigbergk <martinvonz@google.com>
parents: 38379
diff changeset
1987
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1988 def update(
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1989 self, pos: int, item: bytes = b"", total: Optional[int] = None
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1990 ) -> None:
38425
6dea017eb6ba progress: enforce use of complete() on the helper class
Martin von Zweigbergk <martinvonz@google.com>
parents: 38380
diff changeset
1991 assert pos is not None
38351
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38340
diff changeset
1992 if total:
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38340
diff changeset
1993 self.total = total
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38340
diff changeset
1994 self.pos = pos
41209
b223fc1c6b4c progress: change _updatebar() to take parameters as arguments
Yuya Nishihara <yuya@tcha.org>
parents: 41146
diff changeset
1995 self._updatebar(self.topic, self.pos, item, self.unit, self.total)
41145
3025fd3c2e71 progress: split up _print() method in bar-updating and debug-printing
Martin von Zweigbergk <martinvonz@google.com>
parents: 41144
diff changeset
1996 if self.debug:
3025fd3c2e71 progress: split up _print() method in bar-updating and debug-printing
Martin von Zweigbergk <martinvonz@google.com>
parents: 41144
diff changeset
1997 self._printdebug(item)
38351
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38340
diff changeset
1998
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
1999 def increment(
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2000 self, step: int = 1, item: bytes = b"", total: Optional[int] = None
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2001 ) -> None:
38351
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38340
diff changeset
2002 self.update(self.pos + step, item, total)
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38340
diff changeset
2003
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2004 def complete(self) -> None:
41143
8cf92ca92bfe progress: write ui.progress() in terms of ui.makeprogress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 40902
diff changeset
2005 self.pos = None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2006 self.unit = b""
41143
8cf92ca92bfe progress: write ui.progress() in terms of ui.makeprogress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 40902
diff changeset
2007 self.total = None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2008 self._updatebar(self.topic, self.pos, b"", self.unit, self.total)
38379
ef692614e601 progress: hide update(None) in a new complete() method
Martin von Zweigbergk <martinvonz@google.com>
parents: 38351
diff changeset
2009
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2010 def _printdebug(self, item: bytes) -> None:
44063
089255b1341e scmutil: fix an unbound variable with progressbar debug enabled
Matt Harbison <matt_harbison@yahoo.com>
parents: 44060
diff changeset
2011 unit = b''
41143
8cf92ca92bfe progress: write ui.progress() in terms of ui.makeprogress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 40902
diff changeset
2012 if self.unit:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2013 unit = b' ' + self.unit
41143
8cf92ca92bfe progress: write ui.progress() in terms of ui.makeprogress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 40902
diff changeset
2014 if item:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2015 item = b' ' + item
41143
8cf92ca92bfe progress: write ui.progress() in terms of ui.makeprogress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 40902
diff changeset
2016
8cf92ca92bfe progress: write ui.progress() in terms of ui.makeprogress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 40902
diff changeset
2017 if self.total:
8cf92ca92bfe progress: write ui.progress() in terms of ui.makeprogress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 40902
diff changeset
2018 pct = 100.0 * self.pos / self.total
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2019 self.ui.debug(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2020 b'%s:%s %d/%d%s (%4.2f%%)\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2021 % (self.topic, item, self.pos, self.total, unit, pct)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2022 )
41143
8cf92ca92bfe progress: write ui.progress() in terms of ui.makeprogress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 40902
diff changeset
2023 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2024 self.ui.debug(b'%s:%s %d%s\n' % (self.topic, item, self.pos, unit))
38351
bec1212eceaa progress: create helper class for incrementing progress
Martin von Zweigbergk <martinvonz@google.com>
parents: 38340
diff changeset
2025
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2026
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2027 def gdinitconfig(ui: "uimod.ui"):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45934
diff changeset
2028 """helper function to know if a repo should be created as general delta"""
26907
dfab6edb98e3 format: introduce 'format.usegeneraldelta`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26906
diff changeset
2029 # experimental config: format.generaldelta
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2030 return ui.configbool(b'format', b'generaldelta') or ui.configbool(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2031 b'format', b'usegeneraldelta'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2032 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2033
26906
e40af07e518e scmutil: extract general delta config handling in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26836
diff changeset
2034
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2035 def gddeltaconfig(ui: "uimod.ui"):
49780
4bd12c0f531e reuse-delta-base: improves some documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49474
diff changeset
2036 """helper function to know if incoming deltas should be optimized
4bd12c0f531e reuse-delta-base: improves some documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49474
diff changeset
2037
4bd12c0f531e reuse-delta-base: improves some documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49474
diff changeset
2038 The `format.generaldelta` config is an old form of the config that also
4bd12c0f531e reuse-delta-base: improves some documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49474
diff changeset
2039 implies that incoming delta-bases should be never be trusted. This function
4bd12c0f531e reuse-delta-base: improves some documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49474
diff changeset
2040 exists for this purpose.
4bd12c0f531e reuse-delta-base: improves some documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49474
diff changeset
2041 """
26906
e40af07e518e scmutil: extract general delta config handling in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26836
diff changeset
2042 # experimental config: format.generaldelta
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2043 return ui.configbool(b'format', b'generaldelta')
31559
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
2044
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2045
49037
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 49025
diff changeset
2046 class simplekeyvaluefile:
31559
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
2047 """A simple file with key=value lines
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
2048
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
2049 Keys must be alphanumerics and start with a letter, values must not
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
2050 contain '\n' characters"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2051
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2052 firstlinekey = b'__firstline'
31559
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
2053
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2054 def __init__(self, vfs, path: bytes, keys=None) -> None:
31559
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
2055 self.vfs = vfs
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
2056 self.path = path
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
2057
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2058 def read(self, firstlinenonkeyval: bool = False):
32310
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
2059 """Read the contents of a simple key-value file
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
2060
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
2061 'firstlinenonkeyval' indicates whether the first line of file should
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
2062 be treated as a key-value pair or reuturned fully under the
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
2063 __firstline key."""
31559
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
2064 lines = self.vfs.readlines(self.path)
32310
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
2065 d = {}
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
2066 if firstlinenonkeyval:
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
2067 if not lines:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2068 e = _(b"empty simplekeyvalue file")
32310
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
2069 raise error.CorruptedState(e)
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
2070 # we don't want to include '\n' in the __firstline
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
2071 d[self.firstlinekey] = lines[0][:-1]
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
2072 del lines[0]
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
2073
31559
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
2074 try:
32309
ed2c44741190 scmutil: add simplekeyvaluefile reading test
Kostia Balytskyi <ikostia@fb.com>
parents: 32221
diff changeset
2075 # the 'if line.strip()' part prevents us from failing on empty
ed2c44741190 scmutil: add simplekeyvaluefile reading test
Kostia Balytskyi <ikostia@fb.com>
parents: 32221
diff changeset
2076 # lines which only contain '\n' therefore are not skipped
ed2c44741190 scmutil: add simplekeyvaluefile reading test
Kostia Balytskyi <ikostia@fb.com>
parents: 32221
diff changeset
2077 # by 'if line'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2078 updatedict = dict(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2079 line[:-1].split(b'=', 1) for line in lines if line.strip()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2080 )
32310
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
2081 if self.firstlinekey in updatedict:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2082 e = _(b"%r can't be used as a key")
32310
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
2083 raise error.CorruptedState(e % self.firstlinekey)
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
2084 d.update(updatedict)
31559
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
2085 except ValueError as e:
43365
899e55e2d375 py3: fix exception message encoding in scmutil.py's simplekeyvaluefile.read
Emmanuel Leblond <emmanuel.leblond@gmail.com>
parents: 43147
diff changeset
2086 raise error.CorruptedState(stringutil.forcebytestr(e))
31559
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
2087 return d
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
2088
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2089 def write(self, data, firstline: Optional[bytes] = None) -> None:
31559
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
2090 """Write key=>value mapping to a file
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
2091 data is a dict. Keys must be alphanumerical and start with a letter.
32310
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
2092 Values must not contain newline characters.
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
2093
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
2094 If 'firstline' is not None, it is written to file before
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
2095 everything else, as it is, not in a key=value form"""
31559
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
2096 lines = []
32310
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
2097 if firstline is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2098 lines.append(b'%s\n' % firstline)
32310
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
2099
31559
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
2100 for k, v in data.items():
32310
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
2101 if k == self.firstlinekey:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2102 e = b"key name '%s' is reserved" % self.firstlinekey
32310
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
2103 raise error.ProgrammingError(e)
35953
558e01a23f40 py3: slice on bytes to prevent getting the ascii values
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35928
diff changeset
2104 if not k[0:1].isalpha():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2105 e = b"keys must start with a letter in a key-value file"
31559
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
2106 raise error.ProgrammingError(e)
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
2107 if not k.isalnum():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2108 e = b"invalid key name in a simple key-value file"
31559
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
2109 raise error.ProgrammingError(e)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2110 if b'\n' in v:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2111 e = b"invalid value in a simple key-value file"
31559
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
2112 raise error.ProgrammingError(e)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2113 lines.append(b"%s=%s\n" % (k, v))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2114 with self.vfs(self.path, mode=b'wb', atomictemp=True) as fp:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2115 fp.write(b''.join(lines))
33252
53b3a1968aa6 obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33246
diff changeset
2116
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2117
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2118 _reportobsoletedsource: List[bytes] = [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2119 b'debugobsolete',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2120 b'pull',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2121 b'push',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2122 b'serve',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2123 b'unbundle',
33541
b47fef6d2365 transaction-summary: display the summary for all transactions
Boris Feld <boris.feld@octobus.net>
parents: 33511
diff changeset
2124 ]
b47fef6d2365 transaction-summary: display the summary for all transactions
Boris Feld <boris.feld@octobus.net>
parents: 33511
diff changeset
2125
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2126 _reportnewcssource: List[bytes] = [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2127 b'pull',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2128 b'unbundle',
34661
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
2129 ]
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
2130
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2131
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2132 def prefetchfiles(repo, revmatches) -> None:
37762
7269b87f817c scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 37709
diff changeset
2133 """Invokes the registered file prefetch functions, allowing extensions to
7269b87f817c scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 37709
diff changeset
2134 ensure the corresponding files are available locally, before the command
45073
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44943
diff changeset
2135 uses them.
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44943
diff changeset
2136
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44943
diff changeset
2137 Args:
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44943
diff changeset
2138 revmatches: a list of (revision, match) tuples to indicate the files to
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44943
diff changeset
2139 fetch at each revision. If any of the match elements is None, it matches
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44943
diff changeset
2140 all files.
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44943
diff changeset
2141 """
37762
7269b87f817c scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 37709
diff changeset
2142
45073
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44943
diff changeset
2143 def _matcher(m):
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44943
diff changeset
2144 if m:
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44943
diff changeset
2145 assert isinstance(m, matchmod.basematcher)
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44943
diff changeset
2146 # The command itself will complain about files that don't exist, so
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44943
diff changeset
2147 # don't duplicate the message.
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44943
diff changeset
2148 return matchmod.badmatch(m, lambda fn, msg: None)
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44943
diff changeset
2149 else:
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44943
diff changeset
2150 return matchall(repo)
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44943
diff changeset
2151
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44943
diff changeset
2152 revbadmatches = [(rev, _matcher(match)) for (rev, match) in revmatches]
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44943
diff changeset
2153
a56ba57c837d scmutil: allowing different files to be prefetched per revision
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents: 44943
diff changeset
2154 fileprefetchhooks(repo, revbadmatches)
37762
7269b87f817c scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 37709
diff changeset
2155
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2156
37762
7269b87f817c scmutil: teach the file prefetch hook to handle multiple commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 37709
diff changeset
2157 # a list of (repo, revs, match) prefetch functions
36175
f52a9336ac5f cmdutil: convert the prefetchfiles() hook to a callback mechanism (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 35953
diff changeset
2158 fileprefetchhooks = util.hooks()
f52a9336ac5f cmdutil: convert the prefetchfiles() hook to a callback mechanism (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 35953
diff changeset
2159
35709
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
2160 # A marker that tells the evolve extension to suppress its own reporting
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2161 _reportstroubledchangesets: bool = True
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2162
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2163
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2164 def registersummarycallback(
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2165 repo, otr, txnname: bytes = b'', as_validator: bool = False
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2166 ) -> None:
33252
53b3a1968aa6 obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33246
diff changeset
2167 """register a callback to issue a summary after the transaction is closed
44554
13da36d77a3f scmutil: add option to register summary callbacks as transaction validators
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44470
diff changeset
2168
13da36d77a3f scmutil: add option to register summary callbacks as transaction validators
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44470
diff changeset
2169 If as_validator is true, then the callbacks are registered as transaction
13da36d77a3f scmutil: add option to register summary callbacks as transaction validators
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44470
diff changeset
2170 validators instead
33252
53b3a1968aa6 obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33246
diff changeset
2171 """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2172
34619
18309380fb88 scmutil: factor out transaction name lookup in registersummarycallback()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34543
diff changeset
2173 def txmatch(sources):
18309380fb88 scmutil: factor out transaction name lookup in registersummarycallback()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34543
diff changeset
2174 return any(txnname.startswith(source) for source in sources)
18309380fb88 scmutil: factor out transaction name lookup in registersummarycallback()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34543
diff changeset
2175
34620
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
2176 categories = []
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
2177
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
2178 def reportsummary(func):
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
2179 """decorator for report callbacks."""
34987
96dcc78468e3 tr-summary: keep a weakref to the unfiltered repository
Boris Feld <boris.feld@octobus.net>
parents: 34972
diff changeset
2180 # The repoview life cycle is shorter than the one of the actual
96dcc78468e3 tr-summary: keep a weakref to the unfiltered repository
Boris Feld <boris.feld@octobus.net>
parents: 34972
diff changeset
2181 # underlying repository. So the filtered object can die before the
96dcc78468e3 tr-summary: keep a weakref to the unfiltered repository
Boris Feld <boris.feld@octobus.net>
parents: 34972
diff changeset
2182 # weakref is used leading to troubles. We keep a reference to the
96dcc78468e3 tr-summary: keep a weakref to the unfiltered repository
Boris Feld <boris.feld@octobus.net>
parents: 34972
diff changeset
2183 # unfiltered object and restore the filtering when retrieving the
96dcc78468e3 tr-summary: keep a weakref to the unfiltered repository
Boris Feld <boris.feld@octobus.net>
parents: 34972
diff changeset
2184 # repository through the weakref.
96dcc78468e3 tr-summary: keep a weakref to the unfiltered repository
Boris Feld <boris.feld@octobus.net>
parents: 34972
diff changeset
2185 filtername = repo.filtername
96dcc78468e3 tr-summary: keep a weakref to the unfiltered repository
Boris Feld <boris.feld@octobus.net>
parents: 34972
diff changeset
2186 reporef = weakref.ref(repo.unfiltered())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2187
34620
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
2188 def wrapped(tr):
34619
18309380fb88 scmutil: factor out transaction name lookup in registersummarycallback()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34543
diff changeset
2189 repo = reporef()
34987
96dcc78468e3 tr-summary: keep a weakref to the unfiltered repository
Boris Feld <boris.feld@octobus.net>
parents: 34972
diff changeset
2190 if filtername:
43760
5b90a050082b scmutil: add assertions to help pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 43698
diff changeset
2191 assert repo is not None # help pytype
34987
96dcc78468e3 tr-summary: keep a weakref to the unfiltered repository
Boris Feld <boris.feld@octobus.net>
parents: 34972
diff changeset
2192 repo = repo.filtered(filtername)
34620
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
2193 func(repo, tr)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2194
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2195 newcat = b'%02i-txnreport' % len(categories)
44554
13da36d77a3f scmutil: add option to register summary callbacks as transaction validators
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44470
diff changeset
2196 if as_validator:
13da36d77a3f scmutil: add option to register summary callbacks as transaction validators
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44470
diff changeset
2197 otr.addvalidator(newcat, wrapped)
13da36d77a3f scmutil: add option to register summary callbacks as transaction validators
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44470
diff changeset
2198 else:
13da36d77a3f scmutil: add option to register summary callbacks as transaction validators
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44470
diff changeset
2199 otr.addpostclose(newcat, wrapped)
34620
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
2200 categories.append(newcat)
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
2201 return wrapped
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
2202
42903
d7304434390f changegroup: move message about added changes to transaction summary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42900
diff changeset
2203 @reportsummary
d7304434390f changegroup: move message about added changes to transaction summary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42900
diff changeset
2204 def reportchangegroup(repo, tr):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2205 cgchangesets = tr.changes.get(b'changegroup-count-changesets', 0)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2206 cgrevisions = tr.changes.get(b'changegroup-count-revisions', 0)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2207 cgfiles = tr.changes.get(b'changegroup-count-files', 0)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2208 cgheads = tr.changes.get(b'changegroup-count-heads', 0)
42903
d7304434390f changegroup: move message about added changes to transaction summary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42900
diff changeset
2209 if cgchangesets or cgrevisions or cgfiles:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2210 htext = b""
42903
d7304434390f changegroup: move message about added changes to transaction summary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42900
diff changeset
2211 if cgheads:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2212 htext = _(b" (%+d heads)") % cgheads
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2213 msg = _(b"added %d changesets with %d changes to %d files%s\n")
44554
13da36d77a3f scmutil: add option to register summary callbacks as transaction validators
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44470
diff changeset
2214 if as_validator:
13da36d77a3f scmutil: add option to register summary callbacks as transaction validators
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44470
diff changeset
2215 msg = _(b"adding %d changesets with %d changes to %d files%s\n")
43760
5b90a050082b scmutil: add assertions to help pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 43698
diff changeset
2216 assert repo is not None # help pytype
42903
d7304434390f changegroup: move message about added changes to transaction summary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42900
diff changeset
2217 repo.ui.status(msg % (cgchangesets, cgrevisions, cgfiles, htext))
d7304434390f changegroup: move message about added changes to transaction summary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42900
diff changeset
2218
34620
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
2219 if txmatch(_reportobsoletedsource):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2220
34620
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
2221 @reportsummary
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
2222 def reportobsoleted(repo, tr):
34619
18309380fb88 scmutil: factor out transaction name lookup in registersummarycallback()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34543
diff changeset
2223 obsoleted = obsutil.getobsoleted(repo, tr)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2224 newmarkers = len(tr.changes.get(b'obsmarkers', ()))
42900
38392d5bde8e transaction: issue "new obsmarkers" message at the end of the transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42731
diff changeset
2225 if newmarkers:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2226 repo.ui.status(_(b'%i new obsolescence markers\n') % newmarkers)
34619
18309380fb88 scmutil: factor out transaction name lookup in registersummarycallback()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34543
diff changeset
2227 if obsoleted:
44554
13da36d77a3f scmutil: add option to register summary callbacks as transaction validators
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44470
diff changeset
2228 msg = _(b'obsoleted %i changesets\n')
13da36d77a3f scmutil: add option to register summary callbacks as transaction validators
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44470
diff changeset
2229 if as_validator:
13da36d77a3f scmutil: add option to register summary callbacks as transaction validators
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44470
diff changeset
2230 msg = _(b'obsoleting %i changesets\n')
13da36d77a3f scmutil: add option to register summary callbacks as transaction validators
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44470
diff changeset
2231 repo.ui.status(msg % len(obsoleted))
34661
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
2232
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2233 if obsolete.isenabled(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2234 repo, obsolete.createmarkersopt
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2235 ) and repo.ui.configbool(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2236 b'experimental', b'evolution.report-instabilities'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2237 ):
35709
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
2238 instabilitytypes = [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2239 (b'orphan', b'orphan'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2240 (b'phase-divergent', b'phasedivergent'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2241 (b'content-divergent', b'contentdivergent'),
35709
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
2242 ]
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
2243
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
2244 def getinstabilitycounts(repo):
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
2245 filtered = repo.changelog.filteredrevs
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
2246 counts = {}
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
2247 for instability, revset in instabilitytypes:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2248 counts[instability] = len(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2249 set(obsolete.getrevs(repo, revset)) - filtered
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2250 )
35709
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
2251 return counts
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
2252
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
2253 oldinstabilitycounts = getinstabilitycounts(repo)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2254
35709
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
2255 @reportsummary
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
2256 def reportnewinstabilities(repo, tr):
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
2257 newinstabilitycounts = getinstabilitycounts(repo)
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
2258 for instability, revset in instabilitytypes:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2259 delta = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2260 newinstabilitycounts[instability]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2261 - oldinstabilitycounts[instability]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2262 )
38460
1cac2e8c7624 scmutil: move construction of instability count message to separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38437
diff changeset
2263 msg = getinstabilitymessage(delta, instability)
1cac2e8c7624 scmutil: move construction of instability count message to separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38437
diff changeset
2264 if msg:
1cac2e8c7624 scmutil: move construction of instability count message to separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38437
diff changeset
2265 repo.ui.warn(msg)
35709
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
2266
34661
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
2267 if txmatch(_reportnewcssource):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2268
34661
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
2269 @reportsummary
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
2270 def reportnewcs(repo, tr):
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
2271 """Report the range of new revisions pulled/unbundled."""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2272 origrepolen = tr.changes.get(b'origrepolen', len(repo))
39903
b5e12039e6e0 pullreport: skip or rework some early return
Boris Feld <boris.feld@octobus.net>
parents: 39902
diff changeset
2273 unfi = repo.unfiltered()
b5e12039e6e0 pullreport: skip or rework some early return
Boris Feld <boris.feld@octobus.net>
parents: 39902
diff changeset
2274 if origrepolen >= len(unfi):
34661
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
2275 return
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
2276
39902
a477679f6323 pullreport: skip filtered revs instead of obsolete ones
Boris Feld <boris.feld@octobus.net>
parents: 39899
diff changeset
2277 # Compute the bounds of new visible revisions' range.
a477679f6323 pullreport: skip filtered revs instead of obsolete ones
Boris Feld <boris.feld@octobus.net>
parents: 39899
diff changeset
2278 revs = smartset.spanset(repo, start=origrepolen)
39903
b5e12039e6e0 pullreport: skip or rework some early return
Boris Feld <boris.feld@octobus.net>
parents: 39902
diff changeset
2279 if revs:
b5e12039e6e0 pullreport: skip or rework some early return
Boris Feld <boris.feld@octobus.net>
parents: 39902
diff changeset
2280 minrev, maxrev = repo[revs.min()], repo[revs.max()]
34661
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
2281
39903
b5e12039e6e0 pullreport: skip or rework some early return
Boris Feld <boris.feld@octobus.net>
parents: 39902
diff changeset
2282 if minrev == maxrev:
b5e12039e6e0 pullreport: skip or rework some early return
Boris Feld <boris.feld@octobus.net>
parents: 39902
diff changeset
2283 revrange = minrev
b5e12039e6e0 pullreport: skip or rework some early return
Boris Feld <boris.feld@octobus.net>
parents: 39902
diff changeset
2284 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2285 revrange = b'%s:%s' % (minrev, maxrev)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2286 draft = len(repo.revs(b'%ld and draft()', revs))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2287 secret = len(repo.revs(b'%ld and secret()', revs))
39903
b5e12039e6e0 pullreport: skip or rework some early return
Boris Feld <boris.feld@octobus.net>
parents: 39902
diff changeset
2288 if not (draft or secret):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2289 msg = _(b'new changesets %s\n') % revrange
39903
b5e12039e6e0 pullreport: skip or rework some early return
Boris Feld <boris.feld@octobus.net>
parents: 39902
diff changeset
2290 elif draft and secret:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2291 msg = _(b'new changesets %s (%d drafts, %d secrets)\n')
39903
b5e12039e6e0 pullreport: skip or rework some early return
Boris Feld <boris.feld@octobus.net>
parents: 39902
diff changeset
2292 msg %= (revrange, draft, secret)
b5e12039e6e0 pullreport: skip or rework some early return
Boris Feld <boris.feld@octobus.net>
parents: 39902
diff changeset
2293 elif draft:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2294 msg = _(b'new changesets %s (%d drafts)\n')
39903
b5e12039e6e0 pullreport: skip or rework some early return
Boris Feld <boris.feld@octobus.net>
parents: 39902
diff changeset
2295 msg %= (revrange, draft)
b5e12039e6e0 pullreport: skip or rework some early return
Boris Feld <boris.feld@octobus.net>
parents: 39902
diff changeset
2296 elif secret:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2297 msg = _(b'new changesets %s (%d secrets)\n')
39903
b5e12039e6e0 pullreport: skip or rework some early return
Boris Feld <boris.feld@octobus.net>
parents: 39902
diff changeset
2298 msg %= (revrange, secret)
b5e12039e6e0 pullreport: skip or rework some early return
Boris Feld <boris.feld@octobus.net>
parents: 39902
diff changeset
2299 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2300 errormsg = b'entered unreachable condition'
39903
b5e12039e6e0 pullreport: skip or rework some early return
Boris Feld <boris.feld@octobus.net>
parents: 39902
diff changeset
2301 raise error.ProgrammingError(errormsg)
b5e12039e6e0 pullreport: skip or rework some early return
Boris Feld <boris.feld@octobus.net>
parents: 39902
diff changeset
2302 repo.ui.status(msg)
35188
9700cb9df140 convert: allow the sink object to be wrapped when the extension isn't loaded
Matt Harbison <matt_harbison@yahoo.com>
parents: 34987
diff changeset
2303
39904
f9232b0310ef pullreport: issue a message about "extinct" pulled changesets
Boris Feld <boris.feld@octobus.net>
parents: 39903
diff changeset
2304 # search new changesets directly pulled as obsolete
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2305 duplicates = tr.changes.get(b'revduplicates', ())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2306 obsadded = unfi.revs(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2307 b'(%d: + %ld) and obsolete()', origrepolen, duplicates
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2308 )
39904
f9232b0310ef pullreport: issue a message about "extinct" pulled changesets
Boris Feld <boris.feld@octobus.net>
parents: 39903
diff changeset
2309 cl = repo.changelog
f9232b0310ef pullreport: issue a message about "extinct" pulled changesets
Boris Feld <boris.feld@octobus.net>
parents: 39903
diff changeset
2310 extinctadded = [r for r in obsadded if r not in cl]
f9232b0310ef pullreport: issue a message about "extinct" pulled changesets
Boris Feld <boris.feld@octobus.net>
parents: 39903
diff changeset
2311 if extinctadded:
f9232b0310ef pullreport: issue a message about "extinct" pulled changesets
Boris Feld <boris.feld@octobus.net>
parents: 39903
diff changeset
2312 # They are not just obsolete, but obsolete and invisible
f9232b0310ef pullreport: issue a message about "extinct" pulled changesets
Boris Feld <boris.feld@octobus.net>
parents: 39903
diff changeset
2313 # we call them "extinct" internally but the terms have not been
f9232b0310ef pullreport: issue a message about "extinct" pulled changesets
Boris Feld <boris.feld@octobus.net>
parents: 39903
diff changeset
2314 # exposed to users.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2315 msg = b'(%d other changesets obsolete on arrival)\n'
39904
f9232b0310ef pullreport: issue a message about "extinct" pulled changesets
Boris Feld <boris.feld@octobus.net>
parents: 39903
diff changeset
2316 repo.ui.status(msg % len(extinctadded))
f9232b0310ef pullreport: issue a message about "extinct" pulled changesets
Boris Feld <boris.feld@octobus.net>
parents: 39903
diff changeset
2317
38204
eb9835014d20 transaction-summary: show phase changes statistics in pull/unbundle
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 38164
diff changeset
2318 @reportsummary
eb9835014d20 transaction-summary: show phase changes statistics in pull/unbundle
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 38164
diff changeset
2319 def reportphasechanges(repo, tr):
eb9835014d20 transaction-summary: show phase changes statistics in pull/unbundle
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 38164
diff changeset
2320 """Report statistics of phase changes for changesets pre-existing
eb9835014d20 transaction-summary: show phase changes statistics in pull/unbundle
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 38164
diff changeset
2321 pull/unbundle.
eb9835014d20 transaction-summary: show phase changes statistics in pull/unbundle
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 38164
diff changeset
2322 """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2323 origrepolen = tr.changes.get(b'origrepolen', len(repo))
44558
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44554
diff changeset
2324 published = []
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44554
diff changeset
2325 for revs, (old, new) in tr.changes.get(b'phases', []):
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44554
diff changeset
2326 if new != phases.public:
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44554
diff changeset
2327 continue
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44554
diff changeset
2328 published.extend(rev for rev in revs if rev < origrepolen)
38204
eb9835014d20 transaction-summary: show phase changes statistics in pull/unbundle
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 38164
diff changeset
2329 if not published:
eb9835014d20 transaction-summary: show phase changes statistics in pull/unbundle
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 38164
diff changeset
2330 return
44554
13da36d77a3f scmutil: add option to register summary callbacks as transaction validators
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44470
diff changeset
2331 msg = _(b'%d local changesets published\n')
13da36d77a3f scmutil: add option to register summary callbacks as transaction validators
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44470
diff changeset
2332 if as_validator:
13da36d77a3f scmutil: add option to register summary callbacks as transaction validators
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44470
diff changeset
2333 msg = _(b'%d local changesets will be published\n')
13da36d77a3f scmutil: add option to register summary callbacks as transaction validators
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44470
diff changeset
2334 repo.ui.status(msg % len(published))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2335
38204
eb9835014d20 transaction-summary: show phase changes statistics in pull/unbundle
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 38164
diff changeset
2336
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2337 def getinstabilitymessage(delta: int, instability: bytes) -> Optional[bytes]:
38460
1cac2e8c7624 scmutil: move construction of instability count message to separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38437
diff changeset
2338 """function to return the message to show warning about new instabilities
1cac2e8c7624 scmutil: move construction of instability count message to separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38437
diff changeset
2339
1cac2e8c7624 scmutil: move construction of instability count message to separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38437
diff changeset
2340 exists as a separate function so that extension can wrap to show more
1cac2e8c7624 scmutil: move construction of instability count message to separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38437
diff changeset
2341 information like how to fix instabilities"""
1cac2e8c7624 scmutil: move construction of instability count message to separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38437
diff changeset
2342 if delta > 0:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2343 return _(b'%i new %s changesets\n') % (delta, instability)
38460
1cac2e8c7624 scmutil: move construction of instability count message to separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38437
diff changeset
2344
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2345
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2346 def nodesummaries(repo, nodes, maxnumnodes: int = 4) -> bytes:
35195
bc775b8cc020 scmutil: extra utility to display a reasonable amount of nodes
Boris Feld <boris.feld@octobus.net>
parents: 35188
diff changeset
2347 if len(nodes) <= maxnumnodes or repo.ui.verbose:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2348 return b' '.join(short(h) for h in nodes)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2349 first = b' '.join(short(h) for h in nodes[:maxnumnodes])
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2350 return _(b"%s and %d others") % (first, len(nodes) - maxnumnodes)
35195
bc775b8cc020 scmutil: extra utility to display a reasonable amount of nodes
Boris Feld <boris.feld@octobus.net>
parents: 35188
diff changeset
2351
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2352
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2353 def enforcesinglehead(repo, tr, desc: bytes, accountclosed, filtername) -> None:
35196
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35195
diff changeset
2354 """check that no named branch has multiple heads"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2355 if desc in (b'strip', b'repair'):
35196
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35195
diff changeset
2356 # skip the logic during strip
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35195
diff changeset
2357 return
46097
4d5e2fd53707 singlehead: introduce option to restrict to public changes
Joerg Sonnenberger <joerg@bec.de>
parents: 46046
diff changeset
2358 visible = repo.filtered(filtername)
35196
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35195
diff changeset
2359 # possible improvement: we could restrict the check to affected branch
42971
76608f9f27f6 singlehead: introduce special handling of closed heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42930
diff changeset
2360 bm = visible.branchmap()
76608f9f27f6 singlehead: introduce special handling of closed heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42930
diff changeset
2361 for name in bm:
76608f9f27f6 singlehead: introduce special handling of closed heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42930
diff changeset
2362 heads = bm.branchheads(name, closed=accountclosed)
35196
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35195
diff changeset
2363 if len(heads) > 1:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2364 msg = _(b'rejecting multiple heads on branch "%s"')
35196
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35195
diff changeset
2365 msg %= name
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2366 hint = _(b'%d heads: %s')
35196
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35195
diff changeset
2367 hint %= (len(heads), nodesummaries(repo, heads))
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35195
diff changeset
2368 raise error.Abort(msg, hint=hint)
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35195
diff changeset
2369
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2370
35188
9700cb9df140 convert: allow the sink object to be wrapped when the extension isn't loaded
Matt Harbison <matt_harbison@yahoo.com>
parents: 34987
diff changeset
2371 def wrapconvertsink(sink):
9700cb9df140 convert: allow the sink object to be wrapped when the extension isn't loaded
Matt Harbison <matt_harbison@yahoo.com>
parents: 34987
diff changeset
2372 """Allow extensions to wrap the sink returned by convcmd.convertsink()
9700cb9df140 convert: allow the sink object to be wrapped when the extension isn't loaded
Matt Harbison <matt_harbison@yahoo.com>
parents: 34987
diff changeset
2373 before it is used, whether or not the convert extension was formally loaded.
9700cb9df140 convert: allow the sink object to be wrapped when the extension isn't loaded
Matt Harbison <matt_harbison@yahoo.com>
parents: 34987
diff changeset
2374 """
9700cb9df140 convert: allow the sink object to be wrapped when the extension isn't loaded
Matt Harbison <matt_harbison@yahoo.com>
parents: 34987
diff changeset
2375 return sink
35500
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2376
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2377
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2378 def unhidehashlikerevs(repo, specs, hiddentype: bytes):
35500
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2379 """parse the user specs and unhide changesets whose hash or revision number
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2380 is passed.
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2381
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2382 hiddentype can be: 1) 'warn': warn while unhiding changesets
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2383 2) 'nowarn': don't warn while unhiding changesets
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2384
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2385 returns a repo object with the required changesets unhidden
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2386 """
48499
c51408b92b88 directaccess: fix uses of commands.status() that don't go through flag parsing
Kyle Lippincott <spectral@google.com>
parents: 48416
diff changeset
2387 if not specs:
c51408b92b88 directaccess: fix uses of commands.status() that don't go through flag parsing
Kyle Lippincott <spectral@google.com>
parents: 48416
diff changeset
2388 return repo
c51408b92b88 directaccess: fix uses of commands.status() that don't go through flag parsing
Kyle Lippincott <spectral@google.com>
parents: 48416
diff changeset
2389
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2390 if not repo.filtername or not repo.ui.configbool(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2391 b'experimental', b'directaccess'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2392 ):
35500
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2393 return repo
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2394
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2395 if repo.filtername not in (b'visible', b'visible-hidden'):
35500
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2396 return repo
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2397
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2398 symbols = set()
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2399 for spec in specs:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2400 try:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2401 tree = revsetlang.parse(spec)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2402 except error.ParseError: # will be reported by scmutil.revrange()
35500
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2403 continue
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2404
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2405 symbols.update(revsetlang.gethashlikesymbols(tree))
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2406
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2407 if not symbols:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2408 return repo
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2409
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2410 revs = _getrevsfromsymbols(repo, symbols)
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2411
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2412 if not revs:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2413 return repo
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2414
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2415 if hiddentype == b'warn':
35500
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2416 unfi = repo.unfiltered()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2417 revstr = b", ".join([pycompat.bytestr(unfi[l]) for l in revs])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2418 repo.ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2419 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2420 b"warning: accessing hidden changesets for write "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2421 b"operation: %s\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2422 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2423 % revstr
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2424 )
35500
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2425
35503
b55a142f00c5 scmutil: use a tuple of possible values instead of using startswith()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35500
diff changeset
2426 # we have to use new filtername to separate branch/tags cache until we can
b55a142f00c5 scmutil: use a tuple of possible values instead of using startswith()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35500
diff changeset
2427 # disbale these cache when revisions are dynamically pinned.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2428 return repo.filtered(b'visible-hidden', revs)
35500
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2429
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2430
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2431 def _getrevsfromsymbols(repo, symbols) -> Set[int]:
35500
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2432 """parse the list of symbols and returns a set of revision numbers of hidden
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2433 changesets present in symbols"""
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2434 revs = set()
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2435 unfi = repo.unfiltered()
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2436 unficl = unfi.changelog
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2437 cl = repo.changelog
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2438 tiprev = len(unficl)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2439 allowrevnums = repo.ui.configbool(b'experimental', b'directaccess.revnums')
35500
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2440 for s in symbols:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2441 try:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2442 n = int(s)
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2443 if n <= tiprev:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2444 if not allowrevnums:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2445 continue
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2446 else:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2447 if n not in cl:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2448 revs.add(n)
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2449 continue
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2450 except ValueError:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2451 pass
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2452
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2453 try:
37912
69de3c3de036 directaccess: use resolvehexnodeidprefix() instead of _partialmatch()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37909
diff changeset
2454 s = resolvehexnodeidprefix(unfi, s)
37097
7f025c9b7865 directaccess: do not abort by 'ff...' hash
Yuya Nishihara <yuya@tcha.org>
parents: 37087
diff changeset
2455 except (error.LookupError, error.WdirUnsupported):
35500
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2456 s = None
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2457
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2458 if s is not None:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2459 rev = unficl.rev(s)
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2460 if rev not in cl:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2461 revs.add(rev)
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2462
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
2463 return revs
38164
46c2b19a1263 scmutil: move repair.stripbmrevset as scmutil.bookmarkrevs (API)
David Demelier <markand@malikania.fr>
parents: 38023
diff changeset
2464
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2465
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2466 def bookmarkrevs(repo, mark: bytes):
46043
b9ebe0bfed4e scmutil: document that bookmarkrevs() ignores non-head bookmark branch
Yuya Nishihara <yuya@tcha.org>
parents: 45957
diff changeset
2467 """Select revisions reachable by a given bookmark
b9ebe0bfed4e scmutil: document that bookmarkrevs() ignores non-head bookmark branch
Yuya Nishihara <yuya@tcha.org>
parents: 45957
diff changeset
2468
b9ebe0bfed4e scmutil: document that bookmarkrevs() ignores non-head bookmark branch
Yuya Nishihara <yuya@tcha.org>
parents: 45957
diff changeset
2469 If the bookmarked revision isn't a head, an empty set will be returned.
38164
46c2b19a1263 scmutil: move repair.stripbmrevset as scmutil.bookmarkrevs (API)
David Demelier <markand@malikania.fr>
parents: 38023
diff changeset
2470 """
46044
9ee791f3278f scmutil: extract function that builds revset expr to select bookmark branch
Yuya Nishihara <yuya@tcha.org>
parents: 46043
diff changeset
2471 return repo.revs(format_bookmark_revspec(mark))
9ee791f3278f scmutil: extract function that builds revset expr to select bookmark branch
Yuya Nishihara <yuya@tcha.org>
parents: 46043
diff changeset
2472
9ee791f3278f scmutil: extract function that builds revset expr to select bookmark branch
Yuya Nishihara <yuya@tcha.org>
parents: 46043
diff changeset
2473
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2474 def format_bookmark_revspec(mark: bytes) -> bytes:
46044
9ee791f3278f scmutil: extract function that builds revset expr to select bookmark branch
Yuya Nishihara <yuya@tcha.org>
parents: 46043
diff changeset
2475 """Build a revset expression to select revisions reachable by a given
9ee791f3278f scmutil: extract function that builds revset expr to select bookmark branch
Yuya Nishihara <yuya@tcha.org>
parents: 46043
diff changeset
2476 bookmark"""
46046
1bf2b44c4007 log: do not accept string-matcher pattern as -u/-b/-B parameter
Yuya Nishihara <yuya@tcha.org>
parents: 46044
diff changeset
2477 mark = b'literal:' + mark
46044
9ee791f3278f scmutil: extract function that builds revset expr to select bookmark branch
Yuya Nishihara <yuya@tcha.org>
parents: 46043
diff changeset
2478 return revsetlang.formatspec(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2479 b"ancestors(bookmark(%s)) - "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2480 b"ancestors(head() and not bookmark(%s)) - "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2481 b"ancestors(bookmark() and not bookmark(%s))",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2482 mark,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2483 mark,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2484 mark,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42971
diff changeset
2485 )
50479
4bddc2f72879 hgweb: move ismember from `hgweb.common` to `scmutil`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50085
diff changeset
2486
4bddc2f72879 hgweb: move ismember from `hgweb.common` to `scmutil`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50085
diff changeset
2487
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2488 def ismember(ui: "uimod.ui", username: bytes, userlist: List[bytes]) -> bool:
50479
4bddc2f72879 hgweb: move ismember from `hgweb.common` to `scmutil`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50085
diff changeset
2489 """Check if username is a member of userlist.
4bddc2f72879 hgweb: move ismember from `hgweb.common` to `scmutil`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50085
diff changeset
2490
4bddc2f72879 hgweb: move ismember from `hgweb.common` to `scmutil`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50085
diff changeset
2491 If userlist has a single '*' member, all users are considered members.
4bddc2f72879 hgweb: move ismember from `hgweb.common` to `scmutil`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50085
diff changeset
2492 Can be overridden by extensions to provide more complex authorization
4bddc2f72879 hgweb: move ismember from `hgweb.common` to `scmutil`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50085
diff changeset
2493 schemes.
4bddc2f72879 hgweb: move ismember from `hgweb.common` to `scmutil`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50085
diff changeset
2494 """
4bddc2f72879 hgweb: move ismember from `hgweb.common` to `scmutil`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50085
diff changeset
2495 return userlist == [b'*'] or username in userlist
51300
83c6dceeb10d usage: add configuration option to adjust resources usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51273
diff changeset
2496
83c6dceeb10d usage: add configuration option to adjust resources usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51273
diff changeset
2497
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2498 RESOURCE_HIGH: int = 3
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2499 RESOURCE_MEDIUM: int = 2
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2500 RESOURCE_LOW: int = 1
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2501 RESOURCE_DEFAULT: int = 0
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2502
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2503 RESOURCE_MAPPING: Dict[bytes, int] = {
51300
83c6dceeb10d usage: add configuration option to adjust resources usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51273
diff changeset
2504 b'default': RESOURCE_DEFAULT,
83c6dceeb10d usage: add configuration option to adjust resources usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51273
diff changeset
2505 b'low': RESOURCE_LOW,
83c6dceeb10d usage: add configuration option to adjust resources usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51273
diff changeset
2506 b'medium': RESOURCE_MEDIUM,
83c6dceeb10d usage: add configuration option to adjust resources usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51273
diff changeset
2507 b'high': RESOURCE_HIGH,
83c6dceeb10d usage: add configuration option to adjust resources usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51273
diff changeset
2508 }
83c6dceeb10d usage: add configuration option to adjust resources usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51273
diff changeset
2509
51790
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2510 DEFAULT_RESOURCE: int = RESOURCE_MEDIUM
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2511
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2512
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2513 def get_resource_profile(
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2514 ui: "uimod.ui", dimension: Optional[bytes] = None
43460c311c0c typing: add trivial type hints to `mercurial.scmutil`
Matt Harbison <matt_harbison@yahoo.com>
parents: 51788
diff changeset
2515 ) -> int:
51300
83c6dceeb10d usage: add configuration option to adjust resources usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51273
diff changeset
2516 """return the resource profile for a dimension
83c6dceeb10d usage: add configuration option to adjust resources usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51273
diff changeset
2517
83c6dceeb10d usage: add configuration option to adjust resources usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51273
diff changeset
2518 If no dimension is specified, the generic value is returned"""
83c6dceeb10d usage: add configuration option to adjust resources usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51273
diff changeset
2519 generic_name = ui.config(b'usage', b'resources')
83c6dceeb10d usage: add configuration option to adjust resources usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51273
diff changeset
2520 value = RESOURCE_MAPPING.get(generic_name, RESOURCE_DEFAULT)
83c6dceeb10d usage: add configuration option to adjust resources usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51273
diff changeset
2521 if value == RESOURCE_DEFAULT:
83c6dceeb10d usage: add configuration option to adjust resources usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51273
diff changeset
2522 value = DEFAULT_RESOURCE
83c6dceeb10d usage: add configuration option to adjust resources usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51273
diff changeset
2523 if dimension is not None:
83c6dceeb10d usage: add configuration option to adjust resources usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51273
diff changeset
2524 sub_name = ui.config(b'usage', b'resources.%s' % dimension)
83c6dceeb10d usage: add configuration option to adjust resources usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51273
diff changeset
2525 sub_value = RESOURCE_MAPPING.get(sub_name, RESOURCE_DEFAULT)
83c6dceeb10d usage: add configuration option to adjust resources usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51273
diff changeset
2526 if sub_value != RESOURCE_DEFAULT:
83c6dceeb10d usage: add configuration option to adjust resources usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51273
diff changeset
2527 value = sub_value
83c6dceeb10d usage: add configuration option to adjust resources usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51273
diff changeset
2528 return value