annotate mercurial/localrepo.py @ 47387:75e1104f23a2

revlog: use dedicated code for reading sidedata We are about to introduce a new, dedicated, file to store sidedata. Before doing so, we make sidedata reading go through different code as reading data chunk. This will simplify some of the complexity of the next changesets. The reading is very simple right now and will need some improvement later to reuse some of the caching strategy we use for the data file. Differential Revision: https://phab.mercurial-scm.org/D10785
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Thu, 27 May 2021 04:09:30 +0200
parents 8b2d09c7e5cd
children c887bab2dccf
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1089
142b5d5ec9cc Break apart hg.py
mpm@selenic.com
parents: 1072
diff changeset
1 # localrepo.py - read/write repository class for mercurial
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
2 #
46819
d4ba4d51f85f contributor: change mentions of mpm to olivia
Raphaël Gomès <rgomes@octobus.net>
parents: 46794
diff changeset
3 # Copyright 2005-2007 Olivia Mackall <olivia@selenic.com>
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
4 #
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8210
diff changeset
5 # This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9954
diff changeset
6 # GNU General Public License version 2 or any later version.
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
7
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
8 from __future__ import absolute_import
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
9
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
10 import errno
45418
4111954cf86d localrepo: use functools.wraps() in unfilteredmethod decorator
Augie Fackler <raf@durin42.com>
parents: 45386
diff changeset
11 import functools
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
12 import os
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
13 import random
37630
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
14 import sys
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
15 import time
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
16 import weakref
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
17
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
18 from .i18n import _
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
19 from .node import (
39958
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
20 bin,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
21 hex,
39958
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
22 nullrev,
46780
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46713
diff changeset
23 sha1nodeconstants,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
24 short,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
25 )
43090
1f339b503a40 py3: manually import pycompat.delattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43089
diff changeset
26 from .pycompat import (
1f339b503a40 py3: manually import pycompat.delattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43089
diff changeset
27 delattr,
1f339b503a40 py3: manually import pycompat.delattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43089
diff changeset
28 getattr,
1f339b503a40 py3: manually import pycompat.delattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43089
diff changeset
29 )
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
30 from . import (
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
31 bookmarks,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
32 branchmap,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
33 bundle2,
45785
80f32ec8653a clonebundle: move the manifest filename to a constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45783
diff changeset
34 bundlecaches,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
35 changegroup,
31111
95ec3ad62f62 color: initialize color for the localrepo ui
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31054
diff changeset
36 color,
45203
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45202
diff changeset
37 commit,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
38 context,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
39 dirstate,
30492
77cd647b04ac localrepo: refer to dirstateguard by its new name
Augie Fackler <augie@google.com>
parents: 30377
diff changeset
40 dirstateguard,
34097
f7d41b85bbf6 changegroup: replace changegroupsubset with makechangegroup
Durham Goode <durham@fb.com>
parents: 33803
diff changeset
41 discovery,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
42 encoding,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
43 error,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
44 exchange,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
45 extensions,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
46 filelog,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
47 hook,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
48 lock as lockmod,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
49 match as matchmod,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44852
diff changeset
50 mergestate as mergestatemod,
30496
a90867a22daf localrepo: refer to checkunresolved by its new name
Augie Fackler <augie@google.com>
parents: 30492
diff changeset
51 mergeutil,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
52 namespaces,
36471
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
53 narrowspec,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
54 obsolete,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
55 pathutil,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
56 phases,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
57 pushkey,
31508
590319c07259 localrepo: ensure transaction id is fully bytes on py3
Augie Fackler <augie@google.com>
parents: 31476
diff changeset
58 pycompat,
44243
238790674d69 config: add a function in `rcutil` to abstract HGRCSKIPREPO
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44124
diff changeset
59 rcutil,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
60 repoview,
45372
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
61 requirements as requirementsmod,
46310
fc2d5c0aed7f persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46309
diff changeset
62 revlog,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
63 revset,
31024
0b8356705de6 revset: split language services to revsetlang module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 30989
diff changeset
64 revsetlang,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
65 scmutil,
33373
fb320398a21c dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33336
diff changeset
66 sparse,
39697
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
67 store as storemod,
36009
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35896
diff changeset
68 subrepoutil,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
69 tags as tagsmod,
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
70 transaction,
31054
59e69ed81776 localrepo: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31025
diff changeset
71 txnutil,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
72 util,
31231
0a38a313033e vfs: use 'vfs' module directly in 'mercurial.localrepo'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31209
diff changeset
73 vfs as vfsmod,
46902
631001150e13 narrow: add capabilities for local repos, not just remote peers
Charles Chamberlain <cchamberlain@janestreet.com>
parents: 46888
diff changeset
74 wireprototypes,
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
75 )
42813
268662aac075 interfaces: create a new folder for interfaces and move repository.py in it
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42712
diff changeset
76
268662aac075 interfaces: create a new folder for interfaces and move repository.py in it
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42712
diff changeset
77 from .interfaces import (
268662aac075 interfaces: create a new folder for interfaces and move repository.py in it
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42712
diff changeset
78 repository,
42814
2c4f656c8e9f interfaceutil: move to interfaces/
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42813
diff changeset
79 util as interfaceutil,
42813
268662aac075 interfaces: create a new folder for interfaces and move repository.py in it
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42712
diff changeset
80 )
268662aac075 interfaces: create a new folder for interfaces and move repository.py in it
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42712
diff changeset
81
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36952
diff changeset
82 from .utils import (
44060
a61287a95dc3 core: migrate uses of hashlib.sha1 to hashutil.sha1
Augie Fackler <augie@google.com>
parents: 44052
diff changeset
83 hashutil,
37120
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
84 procutil,
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36952
diff changeset
85 stringutil,
46907
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46902
diff changeset
86 urlutil,
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36952
diff changeset
87 )
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
88
46607
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46414
diff changeset
89 from .revlogutils import (
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46414
diff changeset
90 concurrency_checker as revlogchecker,
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46414
diff changeset
91 constants as revlogconst,
47085
3aab2330b7d3 sidedata: move sidedata-related utils to the dedicated module
Raphaël Gomès <rgomes@octobus.net>
parents: 47083
diff changeset
92 sidedata as sidedatamod,
46607
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46414
diff changeset
93 )
39506
b66ea3fc3a86 sparse-revlog: set max delta chain length to on thousand
Boris Feld <boris.feld@octobus.net>
parents: 39312
diff changeset
94
27522
798535853345 localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27319
diff changeset
95 release = lockmod.release
28883
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 28876
diff changeset
96 urlerr = util.urlerr
032c4c2f802a pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents: 28876
diff changeset
97 urlreq = util.urlreq
8109
496ae1ea4698 switch lock releasing in the core from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8108
diff changeset
98
33277
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
99 # set of (path, vfs-location) tuples. vfs-location is:
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
100 # - 'plain for vfs relative paths
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
101 # - '' for svfs relative paths
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
102 _cachedfiles = set()
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
103
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
104
33176
edb7f628ef8b localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32895
diff changeset
105 class _basefilecache(scmutil.filecache):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
106 """All filecache usage on repo are done for logic that should be unfiltered"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
107
18014
a39fe76c4c65 clfilter: ensure that filecache on localrepo is unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18013
diff changeset
108 def __get__(self, repo, type=None):
29373
36fbd72c2f39 scmutil: allow access to filecache descriptor on class
Martijn Pieters <mjpieters@fb.com>
parents: 29352
diff changeset
109 if repo is None:
36fbd72c2f39 scmutil: allow access to filecache descriptor on class
Martijn Pieters <mjpieters@fb.com>
parents: 29352
diff changeset
110 return self
40424
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40423
diff changeset
111 # proxy to unfiltered __dict__ since filtered repo has no entry
40423
597bb5a6867f filecache: use try-except for faster __dict__ lookup
Yuya Nishihara <yuya@tcha.org>
parents: 40390
diff changeset
112 unfi = repo.unfiltered()
597bb5a6867f filecache: use try-except for faster __dict__ lookup
Yuya Nishihara <yuya@tcha.org>
parents: 40390
diff changeset
113 try:
597bb5a6867f filecache: use try-except for faster __dict__ lookup
Yuya Nishihara <yuya@tcha.org>
parents: 40390
diff changeset
114 return unfi.__dict__[self.sname]
597bb5a6867f filecache: use try-except for faster __dict__ lookup
Yuya Nishihara <yuya@tcha.org>
parents: 40390
diff changeset
115 except KeyError:
597bb5a6867f filecache: use try-except for faster __dict__ lookup
Yuya Nishihara <yuya@tcha.org>
parents: 40390
diff changeset
116 pass
597bb5a6867f filecache: use try-except for faster __dict__ lookup
Yuya Nishihara <yuya@tcha.org>
parents: 40390
diff changeset
117 return super(_basefilecache, self).__get__(unfi, type)
40424
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40423
diff changeset
118
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40423
diff changeset
119 def set(self, repo, value):
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 40423
diff changeset
120 return super(_basefilecache, self).set(repo.unfiltered(), value)
18014
a39fe76c4c65 clfilter: ensure that filecache on localrepo is unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18013
diff changeset
121
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
122
33176
edb7f628ef8b localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32895
diff changeset
123 class repofilecache(_basefilecache):
edb7f628ef8b localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32895
diff changeset
124 """filecache for files in .hg but outside of .hg/store"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
125
33277
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
126 def __init__(self, *paths):
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
127 super(repofilecache, self).__init__(*paths)
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
128 for path in paths:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
129 _cachedfiles.add((path, b'plain'))
33277
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
130
33176
edb7f628ef8b localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32895
diff changeset
131 def join(self, obj, fname):
edb7f628ef8b localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32895
diff changeset
132 return obj.vfs.join(fname)
edb7f628ef8b localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32895
diff changeset
133
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
134
33176
edb7f628ef8b localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32895
diff changeset
135 class storecache(_basefilecache):
16198
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16144
diff changeset
136 """filecache for files in the store"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
137
33277
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
138 def __init__(self, *paths):
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
139 super(storecache, self).__init__(*paths)
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
140 for path in paths:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
141 _cachedfiles.add((path, b''))
33277
4470508eb6f2 localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33260
diff changeset
142
16198
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16144
diff changeset
143 def join(self, obj, fname):
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16144
diff changeset
144 return obj.sjoin(fname)
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16144
diff changeset
145
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
146
42323
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
147 class mixedrepostorecache(_basefilecache):
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
148 """filecache for a mix files in .hg/store and outside"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
149
42323
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
150 def __init__(self, *pathsandlocations):
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
151 # scmutil.filecache only uses the path for passing back into our
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
152 # join(), so we can safely pass a list of paths and locations
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
153 super(mixedrepostorecache, self).__init__(*pathsandlocations)
42439
aae93201f758 mixedrepostorecache: fix a silly redundant updating of set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42422
diff changeset
154 _cachedfiles.update(pathsandlocations)
42323
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
155
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
156 def join(self, obj, fnameandlocation):
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
157 fname, location = fnameandlocation
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
158 if location == b'plain':
42323
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
159 return obj.vfs.join(fname)
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
160 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
161 if location != b'':
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
162 raise error.ProgrammingError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
163 b'unexpected location: %s' % location
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
164 )
42323
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
165 return obj.sjoin(fname)
c2b83c957621 localrepo: grab mixedrepostorecache class from 526750cdd02d
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
166
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
167
33382
b107a7660f4e localrepo: add isfilecached to check filecache-ed property is already cached
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33373
diff changeset
168 def isfilecached(repo, name):
b107a7660f4e localrepo: add isfilecached to check filecache-ed property is already cached
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33373
diff changeset
169 """check if a repo has already cached "name" filecache-ed property
b107a7660f4e localrepo: add isfilecached to check filecache-ed property is already cached
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33373
diff changeset
170
b107a7660f4e localrepo: add isfilecached to check filecache-ed property is already cached
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33373
diff changeset
171 This returns (cachedobj-or-None, iscached) tuple.
b107a7660f4e localrepo: add isfilecached to check filecache-ed property is already cached
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33373
diff changeset
172 """
b107a7660f4e localrepo: add isfilecached to check filecache-ed property is already cached
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33373
diff changeset
173 cacheentry = repo.unfiltered()._filecache.get(name, None)
b107a7660f4e localrepo: add isfilecached to check filecache-ed property is already cached
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33373
diff changeset
174 if not cacheentry:
b107a7660f4e localrepo: add isfilecached to check filecache-ed property is already cached
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33373
diff changeset
175 return None, False
b107a7660f4e localrepo: add isfilecached to check filecache-ed property is already cached
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33373
diff changeset
176 return cacheentry.obj, True
b107a7660f4e localrepo: add isfilecached to check filecache-ed property is already cached
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33373
diff changeset
177
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
178
29104
b207653ada10 localrepo: remove a couple of local type aliases
Augie Fackler <augie@google.com>
parents: 29075
diff changeset
179 class unfilteredpropertycache(util.propertycache):
18013
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
180 """propertycache that apply to unfiltered repo only"""
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
181
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
182 def __get__(self, repo, type=None):
19846
9789670992d6 repoview: have unfilteredpropertycache using the underlying cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19515
diff changeset
183 unfi = repo.unfiltered()
9789670992d6 repoview: have unfilteredpropertycache using the underlying cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19515
diff changeset
184 if unfi is repo:
9789670992d6 repoview: have unfilteredpropertycache using the underlying cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19515
diff changeset
185 return super(unfilteredpropertycache, self).__get__(unfi)
9789670992d6 repoview: have unfilteredpropertycache using the underlying cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19515
diff changeset
186 return getattr(unfi, self.name)
18013
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
187
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
188
29104
b207653ada10 localrepo: remove a couple of local type aliases
Augie Fackler <augie@google.com>
parents: 29075
diff changeset
189 class filteredpropertycache(util.propertycache):
18013
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
190 """propertycache that must take filtering in account"""
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
191
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
192 def cachevalue(self, obj, value):
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
193 object.__setattr__(obj, self.name, value)
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
194
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
195
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
196 def hasunfilteredcache(repo, name):
18644
3e92772d5383 spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents: 18520
diff changeset
197 """check if a repo has an unfilteredpropertycache value for <name>"""
18013
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
198 return name in vars(repo.unfiltered())
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
199
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
200
18016
2a393df0f5cc clfilter: rename `unfilteredmeth` to `unfilteredmethod`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18014
diff changeset
201 def unfilteredmethod(orig):
17994
8899bf48116a clfilter: introduce an `unfilteredmethod` decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17993
diff changeset
202 """decorate method that always need to be run on unfiltered version"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
203
45418
4111954cf86d localrepo: use functools.wraps() in unfilteredmethod decorator
Augie Fackler <raf@durin42.com>
parents: 45386
diff changeset
204 @functools.wraps(orig)
17994
8899bf48116a clfilter: introduce an `unfilteredmethod` decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17993
diff changeset
205 def wrapper(repo, *args, **kwargs):
8899bf48116a clfilter: introduce an `unfilteredmethod` decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17993
diff changeset
206 return orig(repo.unfiltered(), *args, **kwargs)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
207
17994
8899bf48116a clfilter: introduce an `unfilteredmethod` decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17993
diff changeset
208 return wrapper
8899bf48116a clfilter: introduce an `unfilteredmethod` decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17993
diff changeset
209
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
210
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
211 moderncaps = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
212 b'lookup',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
213 b'branchmap',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
214 b'pushkey',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
215 b'known',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
216 b'getbundle',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
217 b'unbundle',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
218 }
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
219 legacycaps = moderncaps.union({b'changegroupsubset'})
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
220
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
221
37810
856f381ad74b interfaceutil: module to stub out zope.interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37797
diff changeset
222 @interfaceutil.implementer(repository.ipeercommandexecutor)
37630
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
223 class localcommandexecutor(object):
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
224 def __init__(self, peer):
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
225 self._peer = peer
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
226 self._sent = False
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
227 self._closed = False
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
228
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
229 def __enter__(self):
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
230 return self
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
231
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
232 def __exit__(self, exctype, excvalue, exctb):
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
233 self.close()
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
234
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
235 def callcommand(self, command, args):
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
236 if self._sent:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
237 raise error.ProgrammingError(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
238 b'callcommand() cannot be used after sendcommands()'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
239 )
37630
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
240
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
241 if self._closed:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
242 raise error.ProgrammingError(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
243 b'callcommand() cannot be used after close()'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
244 )
37630
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
245
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
246 # We don't need to support anything fancy. Just call the named
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
247 # method on the peer and return a resolved future.
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
248 fn = getattr(self._peer, pycompat.sysstr(command))
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
249
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
250 f = pycompat.futures.Future()
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
251
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
252 try:
37670
719b8cb22936 localrepo: add some overlooked strkwargs love for py3
Augie Fackler <augie@google.com>
parents: 37669
diff changeset
253 result = fn(**pycompat.strkwargs(args))
37630
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
254 except Exception:
37669
1cb54e6193a6 py3: paper over differences in future exception handling
Augie Fackler <augie@google.com>
parents: 37650
diff changeset
255 pycompat.future_set_exception_info(f, sys.exc_info()[1:])
37630
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
256 else:
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
257 f.set_result(result)
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
258
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
259 return f
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
260
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
261 def sendcommands(self):
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
262 self._sent = True
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
263
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
264 def close(self):
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
265 self._closed = True
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
266
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
267
37810
856f381ad74b interfaceutil: module to stub out zope.interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37797
diff changeset
268 @interfaceutil.implementer(repository.ipeercommands)
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
269 class localpeer(repository.peer):
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
270 '''peer for a local repo; reflects only the most recent API'''
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
271
31412
ecc87acb4d10 localrepo: don't use mutable default argument value
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31373
diff changeset
272 def __init__(self, repo, caps=None):
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
273 super(localpeer, self).__init__()
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
274
31412
ecc87acb4d10 localrepo: don't use mutable default argument value
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31373
diff changeset
275 if caps is None:
ecc87acb4d10 localrepo: don't use mutable default argument value
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31373
diff changeset
276 caps = moderncaps.copy()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
277 self._repo = repo.filtered(b'served')
37321
e826fe7a08c7 peer: make ui an attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37316
diff changeset
278 self.ui = repo.ui
46713
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
279
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
280 if repo._wanted_sidedata:
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
281 formatted = bundle2.format_remote_wanted_sidedata(repo)
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
282 caps.add(b'exp-wanted-sidedata=' + formatted)
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
283
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
284 self._caps = repo._restrictcapabilities(caps)
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
285
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
286 # Begin of _basepeer interface.
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
287
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
288 def url(self):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
289 return self._repo.url()
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
290
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
291 def local(self):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
292 return self._repo
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
293
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
294 def peer(self):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
295 return self
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
296
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
297 def canpush(self):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
298 return True
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
299
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
300 def close(self):
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
301 self._repo.close()
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
302
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
303 # End of _basepeer interface.
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
304
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
305 # Begin of _basewirecommands interface.
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
306
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
307 def branchmap(self):
18279
679767c38cb5 clfilter: drop extra filtering in localpeer
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18278
diff changeset
308 return self._repo.branchmap()
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
309
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
310 def capabilities(self):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
311 return self._caps
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
312
37649
a168799687e5 wireproto: properly call clonebundles command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37646
diff changeset
313 def clonebundles(self):
45785
80f32ec8653a clonebundle: move the manifest filename to a constant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45783
diff changeset
314 return self._repo.tryread(bundlecaches.CB_MANIFEST_FILE)
37649
a168799687e5 wireproto: properly call clonebundles command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37646
diff changeset
315
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
316 def debugwireargs(self, one, two, three=None, four=None, five=None):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
317 """Used to test argument passing over the wire"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
318 return b"%s %s %s %s %s" % (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
319 one,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
320 two,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
321 pycompat.bytestr(three),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
322 pycompat.bytestr(four),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
323 pycompat.bytestr(five),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
324 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
325
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
326 def getbundle(
46711
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46705
diff changeset
327 self,
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46705
diff changeset
328 source,
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46705
diff changeset
329 heads=None,
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46705
diff changeset
330 common=None,
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46705
diff changeset
331 bundlecaps=None,
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46705
diff changeset
332 remote_sidedata=None,
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46705
diff changeset
333 **kwargs
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
334 ):
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
335 chunks = exchange.getbundlechunks(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
336 self._repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
337 source,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
338 heads=heads,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
339 common=common,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
340 bundlecaps=bundlecaps,
46711
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46705
diff changeset
341 remote_sidedata=remote_sidedata,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
342 **kwargs
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
343 )[1]
30187
3e86261bf110 exchange: refactor APIs to obtain bundle data (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29975
diff changeset
344 cb = util.chunkbuffer(chunks)
3e86261bf110 exchange: refactor APIs to obtain bundle data (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29975
diff changeset
345
32149
9a9d54ae9963 localrepo: reuse exchange.bundle2requested()
Martin von Zweigbergk <martinvonz@google.com>
parents: 32121
diff changeset
346 if exchange.bundle2requested(bundlecaps):
21068
c15b66a6bbb4 bundle2: return a stream from exchange.getbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21043
diff changeset
347 # When requesting a bundle2, getbundle returns a stream to make the
c15b66a6bbb4 bundle2: return a stream from exchange.getbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21043
diff changeset
348 # wire level function happier. We need to build a proper object
c15b66a6bbb4 bundle2: return a stream from exchange.getbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21043
diff changeset
349 # from it in local peer.
30187
3e86261bf110 exchange: refactor APIs to obtain bundle data (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29975
diff changeset
350 return bundle2.getunbundler(self.ui, cb)
3e86261bf110 exchange: refactor APIs to obtain bundle data (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29975
diff changeset
351 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
352 return changegroup.getunbundler(b'01', cb, None)
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
353
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
354 def heads(self):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
355 return self._repo.heads()
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
356
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
357 def known(self, nodes):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
358 return self._repo.known(nodes)
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
359
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
360 def listkeys(self, namespace):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
361 return self._repo.listkeys(namespace)
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
362
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
363 def lookup(self, key):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
364 return self._repo.lookup(key)
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
365
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
366 def pushkey(self, namespace, key, old, new):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
367 return self._repo.pushkey(namespace, key, old, new)
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
368
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
369 def stream_out(self):
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
370 raise error.Abort(_(b'cannot perform stream clone against local peer'))
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
371
37646
72e26319f3b8 wireproto: use command executor for unbundle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37635
diff changeset
372 def unbundle(self, bundle, heads, url):
20969
7a679918ee2b localrepo: add unbundle support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20963
diff changeset
373 """apply a bundle on a repo
7a679918ee2b localrepo: add unbundle support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20963
diff changeset
374
7a679918ee2b localrepo: add unbundle support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20963
diff changeset
375 This function handles the repo locking itself."""
7a679918ee2b localrepo: add unbundle support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20963
diff changeset
376 try:
24798
9fbf0a2a72a1 bundle2: add on more layer of exception catching in localrepo.unbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24792
diff changeset
377 try:
37646
72e26319f3b8 wireproto: use command executor for unbundle
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37635
diff changeset
378 bundle = exchange.readbundle(self.ui, bundle, None)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
379 ret = exchange.unbundle(self._repo, bundle, heads, b'push', url)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
380 if util.safehasattr(ret, b'getchunks'):
24798
9fbf0a2a72a1 bundle2: add on more layer of exception catching in localrepo.unbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24792
diff changeset
381 # This is a bundle20 object, turn it into an unbundler.
9fbf0a2a72a1 bundle2: add on more layer of exception catching in localrepo.unbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24792
diff changeset
382 # This little dance should be dropped eventually when the
9fbf0a2a72a1 bundle2: add on more layer of exception catching in localrepo.unbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24792
diff changeset
383 # API is finally improved.
9fbf0a2a72a1 bundle2: add on more layer of exception catching in localrepo.unbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24792
diff changeset
384 stream = util.chunkbuffer(ret.getchunks())
9fbf0a2a72a1 bundle2: add on more layer of exception catching in localrepo.unbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24792
diff changeset
385 ret = bundle2.getunbundler(self.ui, stream)
9fbf0a2a72a1 bundle2: add on more layer of exception catching in localrepo.unbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24792
diff changeset
386 return ret
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25629
diff changeset
387 except Exception as exc:
24799
d99d7e3f5cda bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24798
diff changeset
388 # If the exception contains output salvaged from a bundle2
d99d7e3f5cda bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24798
diff changeset
389 # reply, we need to make sure it is printed before continuing
d99d7e3f5cda bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24798
diff changeset
390 # to fail. So we build a bundle2 with such output and consume
d99d7e3f5cda bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24798
diff changeset
391 # it directly.
d99d7e3f5cda bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24798
diff changeset
392 #
d99d7e3f5cda bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24798
diff changeset
393 # This is not very elegant but allows a "simple" solution for
d99d7e3f5cda bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24798
diff changeset
394 # issue4594
d99d7e3f5cda bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24798
diff changeset
395 output = getattr(exc, '_bundle2salvagedoutput', ())
d99d7e3f5cda bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24798
diff changeset
396 if output:
d99d7e3f5cda bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24798
diff changeset
397 bundler = bundle2.bundle20(self._repo.ui)
d99d7e3f5cda bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24798
diff changeset
398 for out in output:
d99d7e3f5cda bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24798
diff changeset
399 bundler.addpart(out)
d99d7e3f5cda bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24798
diff changeset
400 stream = util.chunkbuffer(bundler.getchunks())
d99d7e3f5cda bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24798
diff changeset
401 b = bundle2.getunbundler(self.ui, stream)
d99d7e3f5cda bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24798
diff changeset
402 bundle2.processbundle(self._repo, b)
24798
9fbf0a2a72a1 bundle2: add on more layer of exception catching in localrepo.unbundle
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24792
diff changeset
403 raise
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25629
diff changeset
404 except error.PushRaced as exc:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
405 raise error.ResponseError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
406 _(b'push failed:'), stringutil.forcebytestr(exc)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
407 )
20969
7a679918ee2b localrepo: add unbundle support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20963
diff changeset
408
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
409 # End of _basewirecommands interface.
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
410
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
411 # Begin of peer interface.
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
412
37630
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
413 def commandexecutor(self):
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
414 return localcommandexecutor(self)
e1b32dc4646c wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37615
diff changeset
415
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
416 # End of peer interface.
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
417
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
418
37810
856f381ad74b interfaceutil: module to stub out zope.interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37797
diff changeset
419 @interfaceutil.implementer(repository.ipeerlegacycommands)
37635
cc8c06835097 wireproto: convert legacy commands to command executor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37633
diff changeset
420 class locallegacypeer(localpeer):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
421 """peer extension which implements legacy methods too; used for tests with
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
422 restricted capabilities"""
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
423
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
424 def __init__(self, repo):
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
425 super(locallegacypeer, self).__init__(repo, caps=legacycaps)
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
426
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
427 # Begin of baselegacywirecommands interface.
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
428
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
429 def between(self, pairs):
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
430 return self._repo.between(pairs)
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
431
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
432 def branches(self, nodes):
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
433 return self._repo.branches(nodes)
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
434
37635
cc8c06835097 wireproto: convert legacy commands to command executor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37633
diff changeset
435 def changegroup(self, nodes, source):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
436 outgoing = discovery.outgoing(
45144
c93dd9d9f1e6 discovery: change users of `outgoing.missingheads` to `outgoing.ancestorsof`
Manuel Jacob <me@manueljacob.de>
parents: 45106
diff changeset
437 self._repo, missingroots=nodes, ancestorsof=self._repo.heads()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
438 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
439 return changegroup.makechangegroup(self._repo, outgoing, b'01', source)
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
440
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
441 def changegroupsubset(self, bases, heads, source):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
442 outgoing = discovery.outgoing(
45144
c93dd9d9f1e6 discovery: change users of `outgoing.missingheads` to `outgoing.ancestorsof`
Manuel Jacob <me@manueljacob.de>
parents: 45106
diff changeset
443 self._repo, missingroots=bases, ancestorsof=heads
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
444 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
445 return changegroup.makechangegroup(self._repo, outgoing, b'01', source)
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
446
33803
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
447 # End of baselegacywirecommands interface.
707750e5310b localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33737
diff changeset
448
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
449
37135
ecac0006b90e localrepo: move featuresetupfuncs out of localrepository class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37120
diff changeset
450 # Functions receiving (ui, features) that extensions can register to impact
ecac0006b90e localrepo: move featuresetupfuncs out of localrepository class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37120
diff changeset
451 # the ability to load repositories with custom requirements. Only
ecac0006b90e localrepo: move featuresetupfuncs out of localrepository class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37120
diff changeset
452 # functions defined in loaded extensions are called.
ecac0006b90e localrepo: move featuresetupfuncs out of localrepository class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37120
diff changeset
453 #
ecac0006b90e localrepo: move featuresetupfuncs out of localrepository class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37120
diff changeset
454 # The function receives a set of requirement strings that the repository
ecac0006b90e localrepo: move featuresetupfuncs out of localrepository class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37120
diff changeset
455 # is capable of opening. Functions will typically add elements to the
ecac0006b90e localrepo: move featuresetupfuncs out of localrepository class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37120
diff changeset
456 # set to reflect that the extension knows how to handle that requirements.
ecac0006b90e localrepo: move featuresetupfuncs out of localrepository class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37120
diff changeset
457 featuresetupfuncs = set()
ecac0006b90e localrepo: move featuresetupfuncs out of localrepository class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37120
diff changeset
458
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
459
45353
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
460 def _getsharedvfs(hgvfs, requirements):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
461 """returns the vfs object pointing to root of shared source
45353
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
462 repo for a shared repository
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
463
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
464 hgvfs is vfs pointing at .hg/ of current repo (shared one)
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
465 requirements is a set of requirements of current repo (shared one)
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
466 """
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
467 # The ``shared`` or ``relshared`` requirements indicate the
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
468 # store lives in the path contained in the ``.hg/sharedpath`` file.
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
469 # This is an absolute path for ``shared`` and relative to
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
470 # ``.hg/`` for ``relshared``.
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
471 sharedpath = hgvfs.read(b'sharedpath').rstrip(b'\n')
45386
034d94f8761b requirements: introduce constants for `shared` and `relshared` requirements
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45373
diff changeset
472 if requirementsmod.RELATIVE_SHARED_REQUIREMENT in requirements:
46888
218a26df7813 share: store relative share paths with '/' separators
Matt Harbison <matt_harbison@yahoo.com>
parents: 46851
diff changeset
473 sharedpath = util.normpath(hgvfs.join(sharedpath))
45353
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
474
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
475 sharedvfs = vfsmod.vfs(sharedpath, realpath=True)
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
476
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
477 if not sharedvfs.exists():
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
478 raise error.RepoError(
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
479 _(b'.hg/sharedpath points to nonexistent directory %s')
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
480 % sharedvfs.base
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
481 )
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
482 return sharedvfs
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
483
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
484
45354
c4fe2262435e localrepo: refactor `.hg/requires` reading logic in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45353
diff changeset
485 def _readrequires(vfs, allowmissing):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
486 """reads the require file present at root of this vfs
45354
c4fe2262435e localrepo: refactor `.hg/requires` reading logic in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45353
diff changeset
487 and return a set of requirements
c4fe2262435e localrepo: refactor `.hg/requires` reading logic in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45353
diff changeset
488
c4fe2262435e localrepo: refactor `.hg/requires` reading logic in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45353
diff changeset
489 If allowmissing is True, we suppress ENOENT if raised"""
c4fe2262435e localrepo: refactor `.hg/requires` reading logic in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45353
diff changeset
490 # requires file contains a newline-delimited list of
c4fe2262435e localrepo: refactor `.hg/requires` reading logic in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45353
diff changeset
491 # features/capabilities the opener (us) must have in order to use
c4fe2262435e localrepo: refactor `.hg/requires` reading logic in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45353
diff changeset
492 # the repository. This file was introduced in Mercurial 0.9.2,
c4fe2262435e localrepo: refactor `.hg/requires` reading logic in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45353
diff changeset
493 # which means very old repositories may not have one. We assume
c4fe2262435e localrepo: refactor `.hg/requires` reading logic in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45353
diff changeset
494 # a missing file translates to no requirements.
c4fe2262435e localrepo: refactor `.hg/requires` reading logic in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45353
diff changeset
495 try:
c4fe2262435e localrepo: refactor `.hg/requires` reading logic in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45353
diff changeset
496 requirements = set(vfs.read(b'requires').splitlines())
c4fe2262435e localrepo: refactor `.hg/requires` reading logic in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45353
diff changeset
497 except IOError as e:
c4fe2262435e localrepo: refactor `.hg/requires` reading logic in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45353
diff changeset
498 if not (allowmissing and e.errno == errno.ENOENT):
c4fe2262435e localrepo: refactor `.hg/requires` reading logic in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45353
diff changeset
499 raise
c4fe2262435e localrepo: refactor `.hg/requires` reading logic in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45353
diff changeset
500 requirements = set()
c4fe2262435e localrepo: refactor `.hg/requires` reading logic in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45353
diff changeset
501 return requirements
c4fe2262435e localrepo: refactor `.hg/requires` reading logic in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45353
diff changeset
502
c4fe2262435e localrepo: refactor `.hg/requires` reading logic in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45353
diff changeset
503
39689
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
504 def makelocalrepository(baseui, path, intents=None):
39687
bfeab472e3c0 localrepo: create new function for instantiating a local repo object
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39668
diff changeset
505 """Create a local repository object.
bfeab472e3c0 localrepo: create new function for instantiating a local repo object
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39668
diff changeset
506
bfeab472e3c0 localrepo: create new function for instantiating a local repo object
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39668
diff changeset
507 Given arguments needed to construct a local repository, this function
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
508 performs various early repository loading functionality (such as
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
509 reading the ``.hg/requires`` and ``.hg/hgrc`` files), validates that
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
510 the repository can be opened, derives a type suitable for representing
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
511 that repository, and returns an instance of it.
39687
bfeab472e3c0 localrepo: create new function for instantiating a local repo object
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39668
diff changeset
512
bfeab472e3c0 localrepo: create new function for instantiating a local repo object
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39668
diff changeset
513 The returned object conforms to the ``repository.completelocalrepository``
bfeab472e3c0 localrepo: create new function for instantiating a local repo object
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39668
diff changeset
514 interface.
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
515
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
516 The repository type is derived by calling a series of factory functions
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
517 for each aspect/interface of the final repository. These are defined by
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
518 ``REPO_INTERFACES``.
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
519
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
520 Each factory function is called to produce a type implementing a specific
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
521 interface. The cumulative list of returned types will be combined into a
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
522 new type and that type will be instantiated to represent the local
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
523 repository.
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
524
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
525 The factory functions each receive various state that may be consulted
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
526 as part of deriving a type.
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
527
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
528 Extensions should wrap these factory functions to customize repository type
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
529 creation. Note that an extension's wrapped function may be called even if
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
530 that extension is not loaded for the repo being constructed. Extensions
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
531 should check if their ``__name__`` appears in the
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
532 ``extensionmodulenames`` set passed to the factory function and no-op if
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
533 not.
39687
bfeab472e3c0 localrepo: create new function for instantiating a local repo object
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39668
diff changeset
534 """
39689
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
535 ui = baseui.copy()
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
536 # Prevent copying repo configuration.
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
537 ui.copy = baseui.copy
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
538
39688
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
539 # Working directory VFS rooted at repository root.
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
540 wdirvfs = vfsmod.vfs(path, expandpath=True, realpath=True)
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
541
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
542 # Main VFS for .hg/ directory.
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
543 hgpath = wdirvfs.join(b'.hg')
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
544 hgvfs = vfsmod.vfs(hgpath, cacheaudited=True)
45353
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
545 # Whether this repository is shared one or not
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
546 shared = False
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
547 # If this repository is shared, vfs pointing to shared repo
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
548 sharedvfs = None
39688
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
549
39691
2f067e365532 localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39690
diff changeset
550 # The .hg/ path should exist and should be a directory. All other
2f067e365532 localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39690
diff changeset
551 # cases are errors.
2f067e365532 localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39690
diff changeset
552 if not hgvfs.isdir():
2f067e365532 localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39690
diff changeset
553 try:
2f067e365532 localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39690
diff changeset
554 hgvfs.stat()
2f067e365532 localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39690
diff changeset
555 except OSError as e:
2f067e365532 localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39690
diff changeset
556 if e.errno != errno.ENOENT:
2f067e365532 localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39690
diff changeset
557 raise
44943
9e5b4dbe8ff2 localrepo: handle ValueError during repository opening
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44941
diff changeset
558 except ValueError as e:
9e5b4dbe8ff2 localrepo: handle ValueError during repository opening
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44941
diff changeset
559 # Can be raised on Python 3.8 when path is invalid.
9e5b4dbe8ff2 localrepo: handle ValueError during repository opening
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44941
diff changeset
560 raise error.Abort(
46572
d5d9177c0045 localrepo: fix conversion of exceptions to strings flagged by pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 46571
diff changeset
561 _(b'invalid path %s: %s') % (path, stringutil.forcebytestr(e))
44943
9e5b4dbe8ff2 localrepo: handle ValueError during repository opening
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44941
diff changeset
562 )
39691
2f067e365532 localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39690
diff changeset
563
2f067e365532 localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39690
diff changeset
564 raise error.RepoError(_(b'repository %s not found') % path)
2f067e365532 localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39690
diff changeset
565
45354
c4fe2262435e localrepo: refactor `.hg/requires` reading logic in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45353
diff changeset
566 requirements = _readrequires(hgvfs, True)
45483
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
567 shared = (
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
568 requirementsmod.SHARED_REQUIREMENT in requirements
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
569 or requirementsmod.RELATIVE_SHARED_REQUIREMENT in requirements
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
570 )
46234
9804162a4053 localrepo: move storevfs calculation out of if statement
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46114
diff changeset
571 storevfs = None
45483
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
572 if shared:
46234
9804162a4053 localrepo: move storevfs calculation out of if statement
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46114
diff changeset
573 # This is a shared repo
45483
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
574 sharedvfs = _getsharedvfs(hgvfs, requirements)
46234
9804162a4053 localrepo: move storevfs calculation out of if statement
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46114
diff changeset
575 storevfs = vfsmod.vfs(sharedvfs.join(b'store'))
9804162a4053 localrepo: move storevfs calculation out of if statement
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46114
diff changeset
576 else:
9804162a4053 localrepo: move storevfs calculation out of if statement
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46114
diff changeset
577 storevfs = vfsmod.vfs(hgvfs.join(b'store'))
45483
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
578
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
579 # if .hg/requires contains the sharesafe requirement, it means
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
580 # there exists a `.hg/store/requires` too and we should read it
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
581 # NOTE: presence of SHARESAFE_REQUIREMENT imply that store requirement
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
582 # is present. We never write SHARESAFE_REQUIREMENT for a repo if store
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
583 # is not present, refer checkrequirementscompat() for that
46004
49b4ab1d9f5e share: show warning if share is outdated while source supports share-safe
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 46003
diff changeset
584 #
49b4ab1d9f5e share: show warning if share is outdated while source supports share-safe
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 46003
diff changeset
585 # However, if SHARESAFE_REQUIREMENT is not present, it means that the
49b4ab1d9f5e share: show warning if share is outdated while source supports share-safe
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 46003
diff changeset
586 # repository was shared the old way. We check the share source .hg/requires
49b4ab1d9f5e share: show warning if share is outdated while source supports share-safe
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 46003
diff changeset
587 # for SHARESAFE_REQUIREMENT to detect whether the current repository needs
49b4ab1d9f5e share: show warning if share is outdated while source supports share-safe
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 46003
diff changeset
588 # to be reshared
46571
25392c48da8a localrepo: fix a UI string to be bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 46549
diff changeset
589 hint = _(b"see `hg help config.format.use-share-safe` for more information")
45483
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
590 if requirementsmod.SHARESAFE_REQUIREMENT in requirements:
46003
c6a1fa42e325 upgrade: add support to downgrade share safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45942
diff changeset
591
c6a1fa42e325 upgrade: add support to downgrade share safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45942
diff changeset
592 if (
c6a1fa42e325 upgrade: add support to downgrade share safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45942
diff changeset
593 shared
c6a1fa42e325 upgrade: add support to downgrade share safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45942
diff changeset
594 and requirementsmod.SHARESAFE_REQUIREMENT
c6a1fa42e325 upgrade: add support to downgrade share safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45942
diff changeset
595 not in _readrequires(sharedvfs, True)
c6a1fa42e325 upgrade: add support to downgrade share safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45942
diff changeset
596 ):
46333
2eb5fe13461b share: rename share-safe warning config
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46332
diff changeset
597 mismatch_warn = ui.configbool(
2eb5fe13461b share: rename share-safe warning config
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46332
diff changeset
598 b'share', b'safe-mismatch.source-not-safe.warn'
2eb5fe13461b share: rename share-safe warning config
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46332
diff changeset
599 )
46332
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
600 mismatch_config = ui.config(
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
601 b'share', b'safe-mismatch.source-not-safe'
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
602 )
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
603 if mismatch_config in (
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
604 b'downgrade-allow',
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
605 b'allow',
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
606 b'downgrade-abort',
46236
eec47efe219d sharesafe: add functionality to automatically downgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46235
diff changeset
607 ):
eec47efe219d sharesafe: add functionality to automatically downgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46235
diff changeset
608 # prevent cyclic import localrepo -> upgrade -> localrepo
eec47efe219d sharesafe: add functionality to automatically downgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46235
diff changeset
609 from . import upgrade
eec47efe219d sharesafe: add functionality to automatically downgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46235
diff changeset
610
eec47efe219d sharesafe: add functionality to automatically downgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46235
diff changeset
611 upgrade.downgrade_share_to_non_safe(
eec47efe219d sharesafe: add functionality to automatically downgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46235
diff changeset
612 ui,
eec47efe219d sharesafe: add functionality to automatically downgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46235
diff changeset
613 hgvfs,
eec47efe219d sharesafe: add functionality to automatically downgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46235
diff changeset
614 sharedvfs,
eec47efe219d sharesafe: add functionality to automatically downgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46235
diff changeset
615 requirements,
46332
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
616 mismatch_config,
46333
2eb5fe13461b share: rename share-safe warning config
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46332
diff changeset
617 mismatch_warn,
46236
eec47efe219d sharesafe: add functionality to automatically downgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46235
diff changeset
618 )
46332
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
619 elif mismatch_config == b'abort':
46236
eec47efe219d sharesafe: add functionality to automatically downgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46235
diff changeset
620 raise error.Abort(
46351
085294a8c0e0 share-safe: fix an abort message that references the experimental requirement
Matt Harbison <matt_harbison@yahoo.com>
parents: 46348
diff changeset
621 _(b"share source does not support share-safe requirement"),
46348
4a58561ace0f share-share: have the hint issue more consistently and point to the right doc
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46334
diff changeset
622 hint=hint,
46236
eec47efe219d sharesafe: add functionality to automatically downgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46235
diff changeset
623 )
46332
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
624 else:
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
625 raise error.Abort(
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
626 _(
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
627 b"share-safe mismatch with source.\nUnrecognized"
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
628 b" value '%s' of `share.safe-mismatch.source-not-safe`"
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
629 b" set."
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
630 )
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
631 % mismatch_config,
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
632 hint=hint,
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
633 )
46236
eec47efe219d sharesafe: add functionality to automatically downgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46235
diff changeset
634 else:
eec47efe219d sharesafe: add functionality to automatically downgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46235
diff changeset
635 requirements |= _readrequires(storevfs, False)
46004
49b4ab1d9f5e share: show warning if share is outdated while source supports share-safe
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 46003
diff changeset
636 elif shared:
49b4ab1d9f5e share: show warning if share is outdated while source supports share-safe
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 46003
diff changeset
637 sourcerequires = _readrequires(sharedvfs, False)
49b4ab1d9f5e share: show warning if share is outdated while source supports share-safe
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 46003
diff changeset
638 if requirementsmod.SHARESAFE_REQUIREMENT in sourcerequires:
46332
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
639 mismatch_config = ui.config(b'share', b'safe-mismatch.source-safe')
46333
2eb5fe13461b share: rename share-safe warning config
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46332
diff changeset
640 mismatch_warn = ui.configbool(
2eb5fe13461b share: rename share-safe warning config
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46332
diff changeset
641 b'share', b'safe-mismatch.source-safe.warn'
2eb5fe13461b share: rename share-safe warning config
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46332
diff changeset
642 )
46332
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
643 if mismatch_config in (
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
644 b'upgrade-allow',
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
645 b'allow',
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
646 b'upgrade-abort',
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
647 ):
46235
0babe12ef35d sharesafe: introduce functionality to automatically upgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46234
diff changeset
648 # prevent cyclic import localrepo -> upgrade -> localrepo
0babe12ef35d sharesafe: introduce functionality to automatically upgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46234
diff changeset
649 from . import upgrade
0babe12ef35d sharesafe: introduce functionality to automatically upgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46234
diff changeset
650
0babe12ef35d sharesafe: introduce functionality to automatically upgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46234
diff changeset
651 upgrade.upgrade_share_to_safe(
0babe12ef35d sharesafe: introduce functionality to automatically upgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46234
diff changeset
652 ui,
0babe12ef35d sharesafe: introduce functionality to automatically upgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46234
diff changeset
653 hgvfs,
0babe12ef35d sharesafe: introduce functionality to automatically upgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46234
diff changeset
654 storevfs,
0babe12ef35d sharesafe: introduce functionality to automatically upgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46234
diff changeset
655 requirements,
46332
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
656 mismatch_config,
46333
2eb5fe13461b share: rename share-safe warning config
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46332
diff changeset
657 mismatch_warn,
46004
49b4ab1d9f5e share: show warning if share is outdated while source supports share-safe
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 46003
diff changeset
658 )
46332
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
659 elif mismatch_config == b'abort':
46331
8788981c95f8 localrepo: disallow share if there is a version mismatch by default
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46312
diff changeset
660 raise error.Abort(
46235
0babe12ef35d sharesafe: introduce functionality to automatically upgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46234
diff changeset
661 _(
46331
8788981c95f8 localrepo: disallow share if there is a version mismatch by default
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46312
diff changeset
662 b'version mismatch: source uses share-safe'
8788981c95f8 localrepo: disallow share if there is a version mismatch by default
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46312
diff changeset
663 b' functionality while the current share does not'
46348
4a58561ace0f share-share: have the hint issue more consistently and point to the right doc
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46334
diff changeset
664 ),
4a58561ace0f share-share: have the hint issue more consistently and point to the right doc
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46334
diff changeset
665 hint=hint,
46235
0babe12ef35d sharesafe: introduce functionality to automatically upgrade shares
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46234
diff changeset
666 )
46332
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
667 else:
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
668 raise error.Abort(
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
669 _(
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
670 b"share-safe mismatch with source.\nUnrecognized"
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
671 b" value '%s' of `share.safe-mismatch.source-safe` set."
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
672 )
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
673 % mismatch_config,
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
674 hint=hint,
cc3452d2dfa4 share: rework config options to be much clearer and easier
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46331
diff changeset
675 )
39692
6a3162ed881d localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39691
diff changeset
676
39690
e0c5017124b3 localrepo: load extensions in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39689
diff changeset
677 # The .hg/hgrc file may load extensions or contain config options
e0c5017124b3 localrepo: load extensions in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39689
diff changeset
678 # that influence repository construction. Attempt to load it and
e0c5017124b3 localrepo: load extensions in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39689
diff changeset
679 # process any new extensions that it may have pulled in.
45485
b71858b42963 localrepo: load the share source .hg/hgrc also in share-safe mode (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45483
diff changeset
680 if loadhgrc(ui, wdirvfs, hgvfs, requirements, sharedvfs):
39852
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
681 afterhgrcload(ui, wdirvfs, hgvfs, requirements)
39690
e0c5017124b3 localrepo: load extensions in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39689
diff changeset
682 extensions.loadall(ui)
40729
c93d046d4300 extensions: add "uipopulate" hook, called per instance, not per process
Yuya Nishihara <yuya@tcha.org>
parents: 40718
diff changeset
683 extensions.populateui(ui)
39690
e0c5017124b3 localrepo: load extensions in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39689
diff changeset
684
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
685 # Set of module names of extensions loaded for this repository.
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
686 extensionmodulenames = {m.__name__ for n, m in extensions.extensions(ui)}
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
687
39693
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
688 supportedrequirements = gathersupportedrequirements(ui)
39695
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
689
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
690 # We first validate the requirements are known.
39693
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
691 ensurerequirementsrecognized(requirements, supportedrequirements)
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
692
39695
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
693 # Then we validate that the known set is reasonable to use together.
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
694 ensurerequirementscompatible(ui, requirements)
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
695
39696
9de1a1c83cd7 localrepo: document and test bug around opening shared repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39695
diff changeset
696 # TODO there are unhandled edge cases related to opening repositories with
9de1a1c83cd7 localrepo: document and test bug around opening shared repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39695
diff changeset
697 # shared storage. If storage is shared, we should also test for requirements
9de1a1c83cd7 localrepo: document and test bug around opening shared repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39695
diff changeset
698 # compatibility in the pointed-to repo. This entails loading the .hg/hgrc in
9de1a1c83cd7 localrepo: document and test bug around opening shared repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39695
diff changeset
699 # that repo, as that repo may load extensions needed to open it. This is a
9de1a1c83cd7 localrepo: document and test bug around opening shared repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39695
diff changeset
700 # bit complicated because we don't want the other hgrc to overwrite settings
9de1a1c83cd7 localrepo: document and test bug around opening shared repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39695
diff changeset
701 # in this hgrc.
9de1a1c83cd7 localrepo: document and test bug around opening shared repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39695
diff changeset
702 #
9de1a1c83cd7 localrepo: document and test bug around opening shared repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39695
diff changeset
703 # This bug is somewhat mitigated by the fact that we copy the .hg/requires
9de1a1c83cd7 localrepo: document and test bug around opening shared repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39695
diff changeset
704 # file when sharing repos. But if a requirement is added after the share is
9de1a1c83cd7 localrepo: document and test bug around opening shared repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39695
diff changeset
705 # performed, thereby introducing a new requirement for the opener, we may
9de1a1c83cd7 localrepo: document and test bug around opening shared repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39695
diff changeset
706 # will not see that and could encounter a run-time error interacting with
9de1a1c83cd7 localrepo: document and test bug around opening shared repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39695
diff changeset
707 # that shared store since it has an unknown-to-us requirement.
9de1a1c83cd7 localrepo: document and test bug around opening shared repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39695
diff changeset
708
39693
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
709 # At this point, we know we should be capable of opening the repository.
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
710 # Now get on with doing that.
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
711
39850
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
712 features = set()
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
713
39697
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
714 # The "store" part of the repository holds versioned data. How it is
45353
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
715 # accessed is determined by various requirements. If `shared` or
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
716 # `relshared` requirements are present, this indicates current repository
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
717 # is a share and store exists in path mentioned in `.hg/sharedpath`
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
718 if shared:
39697
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
719 storebasepath = sharedvfs.base
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
720 cachepath = sharedvfs.join(b'cache')
45353
665e911563da localrepo: refactor logic to calculate sharedvfs in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45301
diff changeset
721 features.add(repository.REPO_FEATURE_SHARED_STORAGE)
39697
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
722 else:
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
723 storebasepath = hgvfs.base
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
724 cachepath = hgvfs.join(b'cache')
40795
e1c3a2e9df59 repo: add a `wcachevfs` to access the `.hg/wcache/` directory
Boris Feld <boris.feld@octobus.net>
parents: 40794
diff changeset
725 wcachepath = hgvfs.join(b'wcache')
e1c3a2e9df59 repo: add a `wcachevfs` to access the `.hg/wcache/` directory
Boris Feld <boris.feld@octobus.net>
parents: 40794
diff changeset
726
39697
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
727 # The store has changed over time and the exact layout is dictated by
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
728 # requirements. The store interface abstracts differences across all
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
729 # of them.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
730 store = makestore(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
731 requirements,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
732 storebasepath,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
733 lambda base: vfsmod.vfs(base, cacheaudited=True),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
734 )
39697
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
735 hgvfs.createmode = store.createmode
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
736
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
737 storevfs = store.vfs
39850
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
738 storevfs.options = resolvestorevfsoptions(ui, requirements, features)
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
739
47263
6c84fc9c9a90 changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47260
diff changeset
740 if (
6c84fc9c9a90 changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47260
diff changeset
741 requirementsmod.REVLOGV2_REQUIREMENT in requirements
6c84fc9c9a90 changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47260
diff changeset
742 or requirementsmod.CHANGELOGV2_REQUIREMENT in requirements
6c84fc9c9a90 changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47260
diff changeset
743 ):
47226
19d4802cb304 sidedata: add a 'side-data' repository feature and use it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47221
diff changeset
744 features.add(repository.REPO_FEATURE_SIDE_DATA)
47238
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47233
diff changeset
745 # the revlogv2 docket introduced race condition that we need to fix
6597255a4f94 revlogv2: track current index size in the docket
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47233
diff changeset
746 features.discard(repository.REPO_FEATURE_STREAM_CLONE)
47226
19d4802cb304 sidedata: add a 'side-data' repository feature and use it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47221
diff changeset
747
39697
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
748 # The cache vfs is used to manage cache files.
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
749 cachevfs = vfsmod.vfs(cachepath, cacheaudited=True)
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
750 cachevfs.createmode = store.createmode
40795
e1c3a2e9df59 repo: add a `wcachevfs` to access the `.hg/wcache/` directory
Boris Feld <boris.feld@octobus.net>
parents: 40794
diff changeset
751 # The cache vfs is used to manage cache files related to the working copy
e1c3a2e9df59 repo: add a `wcachevfs` to access the `.hg/wcache/` directory
Boris Feld <boris.feld@octobus.net>
parents: 40794
diff changeset
752 wcachevfs = vfsmod.vfs(wcachepath, cacheaudited=True)
e1c3a2e9df59 repo: add a `wcachevfs` to access the `.hg/wcache/` directory
Boris Feld <boris.feld@octobus.net>
parents: 40794
diff changeset
753 wcachevfs.createmode = store.createmode
39697
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
754
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
755 # Now resolve the type for the repository object. We do this by repeatedly
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
756 # calling a factory function to produces types for specific aspects of the
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
757 # repo's operation. The aggregate returned types are used as base classes
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
758 # for a dynamically-derived type, which will represent our new repository.
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
759
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
760 bases = []
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
761 extrastate = {}
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
762
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
763 for iface, fn in REPO_INTERFACES:
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
764 # We pass all potentially useful state to give extensions tons of
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
765 # flexibility.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
766 typ = fn()(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
767 ui=ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
768 intents=intents,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
769 requirements=requirements,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
770 features=features,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
771 wdirvfs=wdirvfs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
772 hgvfs=hgvfs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
773 store=store,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
774 storevfs=storevfs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
775 storeoptions=storevfs.options,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
776 cachevfs=cachevfs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
777 wcachevfs=wcachevfs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
778 extensionmodulenames=extensionmodulenames,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
779 extrastate=extrastate,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
780 baseclasses=bases,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
781 )
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
782
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
783 if not isinstance(typ, type):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
784 raise error.ProgrammingError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
785 b'unable to construct type for %s' % iface
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
786 )
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
787
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
788 bases.append(typ)
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
789
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
790 # type() allows you to use characters in type names that wouldn't be
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
791 # recognized as Python symbols in source code. We abuse that to add
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
792 # rich information about our constructed repo.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
793 name = pycompat.sysstr(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
794 b'derivedrepo:%s<%s>' % (wdirvfs.base, b','.join(sorted(requirements)))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
795 )
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
796
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
797 cls = type(name, tuple(bases), {})
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
798
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
799 return cls(
39689
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
800 baseui=baseui,
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
801 ui=ui,
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
802 origroot=path,
39688
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
803 wdirvfs=wdirvfs,
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
804 hgvfs=hgvfs,
39692
6a3162ed881d localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39691
diff changeset
805 requirements=requirements,
39693
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
806 supportedrequirements=supportedrequirements,
39697
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
807 sharedpath=storebasepath,
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
808 store=store,
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
809 cachevfs=cachevfs,
40795
e1c3a2e9df59 repo: add a `wcachevfs` to access the `.hg/wcache/` directory
Boris Feld <boris.feld@octobus.net>
parents: 40794
diff changeset
810 wcachevfs=wcachevfs,
39850
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
811 features=features,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
812 intents=intents,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
813 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
814
39687
bfeab472e3c0 localrepo: create new function for instantiating a local repo object
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39668
diff changeset
815
45485
b71858b42963 localrepo: load the share source .hg/hgrc also in share-safe mode (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45483
diff changeset
816 def loadhgrc(ui, wdirvfs, hgvfs, requirements, sharedvfs=None):
40535
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
817 """Load hgrc files/content into a ui instance.
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
818
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
819 This is called during repository opening to load any additional
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
820 config files or settings relevant to the current repository.
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
821
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
822 Returns a bool indicating whether any additional configs were loaded.
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
823
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
824 Extensions should monkeypatch this function to modify how per-repo
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
825 configs are loaded. For example, an extension may wish to pull in
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
826 configs from alternate files or sources.
45485
b71858b42963 localrepo: load the share source .hg/hgrc also in share-safe mode (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45483
diff changeset
827
b71858b42963 localrepo: load the share source .hg/hgrc also in share-safe mode (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45483
diff changeset
828 sharedvfs is vfs object pointing to source repo if the current one is a
b71858b42963 localrepo: load the share source .hg/hgrc also in share-safe mode (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45483
diff changeset
829 shared one
40535
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
830 """
44243
238790674d69 config: add a function in `rcutil` to abstract HGRCSKIPREPO
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44124
diff changeset
831 if not rcutil.use_repo_hgrc():
44124
d56a2d6f34f0 hgrc: introduce HGRCSKIPREPO to skip reading the repository's hgrc
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44107
diff changeset
832 return False
45485
b71858b42963 localrepo: load the share source .hg/hgrc also in share-safe mode (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45483
diff changeset
833
45783
88a47cbf063c config: add a .hg/hgrc-not-shared which won't be shared in share-safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45519
diff changeset
834 ret = False
45485
b71858b42963 localrepo: load the share source .hg/hgrc also in share-safe mode (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45483
diff changeset
835 # first load config from shared source if we has to
b71858b42963 localrepo: load the share source .hg/hgrc also in share-safe mode (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45483
diff changeset
836 if requirementsmod.SHARESAFE_REQUIREMENT in requirements and sharedvfs:
b71858b42963 localrepo: load the share source .hg/hgrc also in share-safe mode (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45483
diff changeset
837 try:
b71858b42963 localrepo: load the share source .hg/hgrc also in share-safe mode (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45483
diff changeset
838 ui.readconfig(sharedvfs.join(b'hgrc'), root=sharedvfs.base)
45783
88a47cbf063c config: add a .hg/hgrc-not-shared which won't be shared in share-safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45519
diff changeset
839 ret = True
45485
b71858b42963 localrepo: load the share source .hg/hgrc also in share-safe mode (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45483
diff changeset
840 except IOError:
b71858b42963 localrepo: load the share source .hg/hgrc also in share-safe mode (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45483
diff changeset
841 pass
b71858b42963 localrepo: load the share source .hg/hgrc also in share-safe mode (API)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45483
diff changeset
842
40535
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
843 try:
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
844 ui.readconfig(hgvfs.join(b'hgrc'), root=wdirvfs.base)
45783
88a47cbf063c config: add a .hg/hgrc-not-shared which won't be shared in share-safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45519
diff changeset
845 ret = True
40535
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
846 except IOError:
45783
88a47cbf063c config: add a .hg/hgrc-not-shared which won't be shared in share-safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45519
diff changeset
847 pass
88a47cbf063c config: add a .hg/hgrc-not-shared which won't be shared in share-safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45519
diff changeset
848
88a47cbf063c config: add a .hg/hgrc-not-shared which won't be shared in share-safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45519
diff changeset
849 try:
88a47cbf063c config: add a .hg/hgrc-not-shared which won't be shared in share-safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45519
diff changeset
850 ui.readconfig(hgvfs.join(b'hgrc-not-shared'), root=wdirvfs.base)
88a47cbf063c config: add a .hg/hgrc-not-shared which won't be shared in share-safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45519
diff changeset
851 ret = True
88a47cbf063c config: add a .hg/hgrc-not-shared which won't be shared in share-safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45519
diff changeset
852 except IOError:
88a47cbf063c config: add a .hg/hgrc-not-shared which won't be shared in share-safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45519
diff changeset
853 pass
88a47cbf063c config: add a .hg/hgrc-not-shared which won't be shared in share-safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45519
diff changeset
854
88a47cbf063c config: add a .hg/hgrc-not-shared which won't be shared in share-safe mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45519
diff changeset
855 return ret
40535
473510bf0575 localrepo: extract loading of hgrc files to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40424
diff changeset
856
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
857
39852
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
858 def afterhgrcload(ui, wdirvfs, hgvfs, requirements):
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
859 """Perform additional actions after .hg/hgrc is loaded.
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
860
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
861 This function is called during repository loading immediately after
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
862 the .hg/hgrc file is loaded and before per-repo extensions are loaded.
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
863
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
864 The function can be used to validate configs, automatically add
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
865 options (including extensions) based on requirements, etc.
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
866 """
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
867
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
868 # Map of requirements to list of extensions to load automatically when
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
869 # requirement is present.
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
870 autoextensions = {
44482
21893ff382cd localrepo: add git extension to autoextensions list
Augie Fackler <raf@durin42.com>
parents: 44452
diff changeset
871 b'git': [b'git'],
39854
823a580448d7 largefiles: automatically load largefiles extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39852
diff changeset
872 b'largefiles': [b'largefiles'],
39852
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
873 b'lfs': [b'lfs'],
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
874 }
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
875
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
876 for requirement, names in sorted(autoextensions.items()):
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
877 if requirement not in requirements:
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
878 continue
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
879
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
880 for name in names:
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
881 if not ui.hasconfig(b'extensions', name):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
882 ui.setconfig(b'extensions', name, b'', source=b'autoload')
39852
2c2fadbc9851 localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39850
diff changeset
883
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
884
39693
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
885 def gathersupportedrequirements(ui):
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
886 """Determine the complete set of recognized requirements."""
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
887 # Start with all requirements supported by this file.
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
888 supported = set(localrepository._basesupported)
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
889
47277
ed0d54b20c5b dirstate-v2: Add a new experimental `exp-dirstate-v2` repository requirement
Simon Sapin <simon.sapin@octobus.net>
parents: 47265
diff changeset
890 if dirstate.SUPPORTS_DIRSTATE_V2:
ed0d54b20c5b dirstate-v2: Add a new experimental `exp-dirstate-v2` repository requirement
Simon Sapin <simon.sapin@octobus.net>
parents: 47265
diff changeset
891 supported.add(requirementsmod.DIRSTATE_V2_REQUIREMENT)
ed0d54b20c5b dirstate-v2: Add a new experimental `exp-dirstate-v2` repository requirement
Simon Sapin <simon.sapin@octobus.net>
parents: 47265
diff changeset
892
39693
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
893 # Execute ``featuresetupfuncs`` entries if they belong to an extension
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
894 # relevant to this ui instance.
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
895 modules = {m.__name__ for n, m in extensions.extensions(ui)}
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
896
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
897 for fn in featuresetupfuncs:
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
898 if fn.__module__ in modules:
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
899 fn(ui, supported)
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
900
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
901 # Add derived requirements from registered compression engines.
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
902 for name in util.compengines:
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
903 engine = util.compengines[name]
42135
b970fece153d compression: only declare revlog support for available engine
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42127
diff changeset
904 if engine.available() and engine.revlogheader():
39693
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
905 supported.add(b'exp-compression-%s' % name)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
906 if engine.name() == b'zstd':
42136
10a6725dca6e compression: introduce an official `zstd-revlog` requirement
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42135
diff changeset
907 supported.add(b'revlog-compression-zstd')
39693
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
908
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
909 return supported
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
910
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
911
39693
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
912 def ensurerequirementsrecognized(requirements, supported):
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
913 """Validate that a set of local requirements is recognized.
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
914
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
915 Receives a set of requirements. Raises an ``error.RepoError`` if there
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
916 exists any requirement in that set that currently loaded code doesn't
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
917 recognize.
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
918
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
919 Returns a set of supported requirements.
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
920 """
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
921 missing = set()
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
922
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
923 for requirement in requirements:
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
924 if requirement in supported:
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
925 continue
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
926
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
927 if not requirement or not requirement[0:1].isalnum():
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
928 raise error.RequirementError(_(b'.hg/requires file is corrupt'))
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
929
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
930 missing.add(requirement)
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
931
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
932 if missing:
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
933 raise error.RequirementError(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
934 _(b'repository requires features unknown to this Mercurial: %s')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
935 % b' '.join(sorted(missing)),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
936 hint=_(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
937 b'see https://mercurial-scm.org/wiki/MissingRequirement '
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
938 b'for more information'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
939 ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
940 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
941
39693
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
942
39695
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
943 def ensurerequirementscompatible(ui, requirements):
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
944 """Validates that a set of recognized requirements is mutually compatible.
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
945
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
946 Some requirements may not be compatible with others or require
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
947 config options that aren't enabled. This function is called during
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
948 repository opening to ensure that the set of requirements needed
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
949 to open a repository is sane and compatible with config options.
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
950
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
951 Extensions can monkeypatch this function to perform additional
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
952 checking.
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
953
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
954 ``error.RepoError`` should be raised on failure.
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
955 """
45372
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
956 if (
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
957 requirementsmod.SPARSE_REQUIREMENT in requirements
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
958 and not sparse.enabled
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
959 ):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
960 raise error.RepoError(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
961 _(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
962 b'repository is using sparse feature but '
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
963 b'sparse is not enabled; enable the '
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
964 b'"sparse" extensions to access'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
965 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
966 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
967
39695
cb2dcfa5cade localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39693
diff changeset
968
39698
f44187605315 localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39697
diff changeset
969 def makestore(requirements, path, vfstype):
f44187605315 localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39697
diff changeset
970 """Construct a storage object for a repository."""
46637
ab58098bebed requirements: also add a store constant
Raphaël Gomès <rgomes@octobus.net>
parents: 46636
diff changeset
971 if requirementsmod.STORE_REQUIREMENT in requirements:
46638
b4c2a2af25e2 requirements: also add a fncache constant
Raphaël Gomès <rgomes@octobus.net>
parents: 46637
diff changeset
972 if requirementsmod.FNCACHE_REQUIREMENT in requirements:
46636
c3773636ddbb requirements: also add a dotencode constant
Raphaël Gomès <rgomes@octobus.net>
parents: 46627
diff changeset
973 dotencode = requirementsmod.DOTENCODE_REQUIREMENT in requirements
c3773636ddbb requirements: also add a dotencode constant
Raphaël Gomès <rgomes@octobus.net>
parents: 46627
diff changeset
974 return storemod.fncachestore(path, vfstype, dotencode)
39698
f44187605315 localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39697
diff changeset
975
f44187605315 localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39697
diff changeset
976 return storemod.encodedstore(path, vfstype)
f44187605315 localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39697
diff changeset
977
f44187605315 localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39697
diff changeset
978 return storemod.basicstore(path, vfstype)
f44187605315 localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39697
diff changeset
979
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
980
39850
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
981 def resolvestorevfsoptions(ui, requirements, features):
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
982 """Resolve the options to pass to the store vfs opener.
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
983
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
984 The returned dict is used to influence behavior of the storage layer.
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
985 """
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
986 options = {}
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
987
45372
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
988 if requirementsmod.TREEMANIFEST_REQUIREMENT in requirements:
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
989 options[b'treemanifest'] = True
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
990
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
991 # experimental config: format.manifestcachesize
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
992 manifestcachesize = ui.configint(b'format', b'manifestcachesize')
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
993 if manifestcachesize is not None:
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
994 options[b'manifestcachesize'] = manifestcachesize
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
995
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
996 # In the absence of another requirement superseding a revlog-related
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
997 # requirement, we have to assume the repo is using revlog version 0.
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
998 # This revlog format is super old and we don't bother trying to parse
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
999 # opener options for it because those options wouldn't do anything
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1000 # meaningful on such old repos.
45373
d7dcc75a3eae localrepo: move requirements constant to requirements module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45372
diff changeset
1001 if (
46626
ee91966aec0f requirements: add constant for revlog v1 requirement
Raphaël Gomès <rgomes@octobus.net>
parents: 46607
diff changeset
1002 requirementsmod.REVLOGV1_REQUIREMENT in requirements
45373
d7dcc75a3eae localrepo: move requirements constant to requirements module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45372
diff changeset
1003 or requirementsmod.REVLOGV2_REQUIREMENT in requirements
d7dcc75a3eae localrepo: move requirements constant to requirements module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45372
diff changeset
1004 ):
39850
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
1005 options.update(resolverevlogstorevfsoptions(ui, requirements, features))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1006 else: # explicitly mark repo as using revlogv0
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1007 options[b'revlogv0'] = True
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1008
45373
d7dcc75a3eae localrepo: move requirements constant to requirements module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45372
diff changeset
1009 if requirementsmod.COPIESSDC_REQUIREMENT in requirements:
43142
beed7ce61681 sidedatacopies: write copies information in sidedata when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43137
diff changeset
1010 options[b'copies-storage'] = b'changeset-sidedata'
beed7ce61681 sidedatacopies: write copies information in sidedata when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43137
diff changeset
1011 else:
beed7ce61681 sidedatacopies: write copies information in sidedata when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43137
diff changeset
1012 writecopiesto = ui.config(b'experimental', b'copies.write-to')
beed7ce61681 sidedatacopies: write copies information in sidedata when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43137
diff changeset
1013 copiesextramode = (b'changeset-only', b'compatibility')
beed7ce61681 sidedatacopies: write copies information in sidedata when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43137
diff changeset
1014 if writecopiesto in copiesextramode:
beed7ce61681 sidedatacopies: write copies information in sidedata when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43137
diff changeset
1015 options[b'copies-storage'] = b'extra'
43026
0b87eb2fba67 copies: prepare changelog for more copies storage mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43024
diff changeset
1016
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1017 return options
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1018
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1019
39850
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
1020 def resolverevlogstorevfsoptions(ui, requirements, features):
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1021 """Resolve opener options specific to revlogs."""
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1022
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1023 options = {}
40267
9d5ddf55415b revlog: allow flag processors to be applied via store options
Matt Harbison <matt_harbison@yahoo.com>
parents: 40086
diff changeset
1024 options[b'flagprocessors'] = {}
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1025
46626
ee91966aec0f requirements: add constant for revlog v1 requirement
Raphaël Gomès <rgomes@octobus.net>
parents: 46607
diff changeset
1026 if requirementsmod.REVLOGV1_REQUIREMENT in requirements:
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1027 options[b'revlogv1'] = True
45373
d7dcc75a3eae localrepo: move requirements constant to requirements module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45372
diff changeset
1028 if requirementsmod.REVLOGV2_REQUIREMENT in requirements:
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1029 options[b'revlogv2'] = True
47263
6c84fc9c9a90 changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47260
diff changeset
1030 if requirementsmod.CHANGELOGV2_REQUIREMENT in requirements:
6c84fc9c9a90 changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47260
diff changeset
1031 options[b'changelogv2'] = True
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1032
46627
f4c325bf80fc requirements: also add a generaldelta constant
Raphaël Gomès <rgomes@octobus.net>
parents: 46626
diff changeset
1033 if requirementsmod.GENERALDELTA_REQUIREMENT in requirements:
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1034 options[b'generaldelta'] = True
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1035
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1036 # experimental config: format.chunkcachesize
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1037 chunkcachesize = ui.configint(b'format', b'chunkcachesize')
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1038 if chunkcachesize is not None:
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1039 options[b'chunkcachesize'] = chunkcachesize
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1040
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1041 deltabothparents = ui.configbool(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1042 b'storage', b'revlog.optimize-delta-parent-choice'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1043 )
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1044 options[b'deltabothparents'] = deltabothparents
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1045
41819
688fc33e105d storage: introduce a `revlog.reuse-external-delta` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41818
diff changeset
1046 lazydelta = ui.configbool(b'storage', b'revlog.reuse-external-delta')
688fc33e105d storage: introduce a `revlog.reuse-external-delta` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41818
diff changeset
1047 lazydeltabase = False
688fc33e105d storage: introduce a `revlog.reuse-external-delta` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41818
diff changeset
1048 if lazydelta:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1049 lazydeltabase = ui.configbool(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1050 b'storage', b'revlog.reuse-external-delta-parent'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1051 )
41818
f6eff9e4de80 storage: introduce a `revlog.reuse-external-delta-parent` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41774
diff changeset
1052 if lazydeltabase is None:
f6eff9e4de80 storage: introduce a `revlog.reuse-external-delta-parent` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41774
diff changeset
1053 lazydeltabase = not scmutil.gddeltaconfig(ui)
41819
688fc33e105d storage: introduce a `revlog.reuse-external-delta` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41818
diff changeset
1054 options[b'lazydelta'] = lazydelta
41818
f6eff9e4de80 storage: introduce a `revlog.reuse-external-delta-parent` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41774
diff changeset
1055 options[b'lazydeltabase'] = lazydeltabase
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1056
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1057 chainspan = ui.configbytes(b'experimental', b'maxdeltachainspan')
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1058 if 0 <= chainspan:
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1059 options[b'maxdeltachainspan'] = chainspan
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1060
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1061 mmapindexthreshold = ui.configbytes(b'experimental', b'mmapindexthreshold')
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1062 if mmapindexthreshold is not None:
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1063 options[b'mmapindexthreshold'] = mmapindexthreshold
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1064
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1065 withsparseread = ui.configbool(b'experimental', b'sparse-read')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1066 srdensitythres = float(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1067 ui.config(b'experimental', b'sparse-read.density-threshold')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1068 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1069 srmingapsize = ui.configbytes(b'experimental', b'sparse-read.min-gap-size')
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1070 options[b'with-sparse-read'] = withsparseread
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1071 options[b'sparse-read-density-threshold'] = srdensitythres
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1072 options[b'sparse-read-min-gap-size'] = srmingapsize
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1073
45373
d7dcc75a3eae localrepo: move requirements constant to requirements module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45372
diff changeset
1074 sparserevlog = requirementsmod.SPARSEREVLOG_REQUIREMENT in requirements
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1075 options[b'sparse-revlog'] = sparserevlog
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1076 if sparserevlog:
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1077 options[b'generaldelta'] = True
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1078
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1079 maxchainlen = None
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1080 if sparserevlog:
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1081 maxchainlen = revlogconst.SPARSE_REVLOG_MAX_CHAIN_LENGTH
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1082 # experimental config: format.maxchainlen
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1083 maxchainlen = ui.configint(b'format', b'maxchainlen', maxchainlen)
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1084 if maxchainlen is not None:
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1085 options[b'maxchainlen'] = maxchainlen
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1086
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1087 for r in requirements:
42136
10a6725dca6e compression: introduce an official `zstd-revlog` requirement
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42135
diff changeset
1088 # we allow multiple compression engine requirement to co-exist because
10a6725dca6e compression: introduce an official `zstd-revlog` requirement
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42135
diff changeset
1089 # strickly speaking, revlog seems to support mixed compression style.
10a6725dca6e compression: introduce an official `zstd-revlog` requirement
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42135
diff changeset
1090 #
10a6725dca6e compression: introduce an official `zstd-revlog` requirement
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42135
diff changeset
1091 # The compression used for new entries will be "the last one"
10a6725dca6e compression: introduce an official `zstd-revlog` requirement
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42135
diff changeset
1092 prefix = r.startswith
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1093 if prefix(b'revlog-compression-') or prefix(b'exp-compression-'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1094 options[b'compengine'] = r.split(b'-', 2)[2]
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1095
42043
1fac9b931d46 compression: introduce a `storage.revlog.zlib.level` configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42004
diff changeset
1096 options[b'zlib.level'] = ui.configint(b'storage', b'revlog.zlib.level')
1fac9b931d46 compression: introduce a `storage.revlog.zlib.level` configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42004
diff changeset
1097 if options[b'zlib.level'] is not None:
1fac9b931d46 compression: introduce a `storage.revlog.zlib.level` configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42004
diff changeset
1098 if not (0 <= options[b'zlib.level'] <= 9):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1099 msg = _(b'invalid value for `storage.revlog.zlib.level` config: %d')
42043
1fac9b931d46 compression: introduce a `storage.revlog.zlib.level` configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42004
diff changeset
1100 raise error.Abort(msg % options[b'zlib.level'])
42044
bb271ec2fbfb compression: introduce a `storage.revlog.zstd.level` configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42043
diff changeset
1101 options[b'zstd.level'] = ui.configint(b'storage', b'revlog.zstd.level')
bb271ec2fbfb compression: introduce a `storage.revlog.zstd.level` configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42043
diff changeset
1102 if options[b'zstd.level'] is not None:
bb271ec2fbfb compression: introduce a `storage.revlog.zstd.level` configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42043
diff changeset
1103 if not (0 <= options[b'zstd.level'] <= 22):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1104 msg = _(b'invalid value for `storage.revlog.zstd.level` config: %d')
42044
bb271ec2fbfb compression: introduce a `storage.revlog.zstd.level` configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42043
diff changeset
1105 raise error.Abort(msg % options[b'zstd.level'])
42043
1fac9b931d46 compression: introduce a `storage.revlog.zlib.level` configuration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42004
diff changeset
1106
45372
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
1107 if requirementsmod.NARROW_REQUIREMENT in requirements:
39770
7aa440222323 localrepo: enable ellipsis flag on revlogs when repo is narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39765
diff changeset
1108 options[b'enableellipsis'] = True
7aa440222323 localrepo: enable ellipsis flag on revlogs when repo is narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39765
diff changeset
1109
44043
b958419b6c53 py3: byteify some `ui.configbool()` parameters
Matt Harbison <matt_harbison@yahoo.com>
parents: 44023
diff changeset
1110 if ui.configbool(b'experimental', b'rust.index'):
44014
8042856c90b6 rust-index: add a `experimental.rust.index` option to use the wrapper
Georges Racinet <georges.racinet@octobus.net>
parents: 43778
diff changeset
1111 options[b'rust.index'] = True
45373
d7dcc75a3eae localrepo: move requirements constant to requirements module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45372
diff changeset
1112 if requirementsmod.NODEMAP_REQUIREMENT in requirements:
46309
2c9c88879ab7 persistent-node: check the value of the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46306
diff changeset
1113 slow_path = ui.config(
2c9c88879ab7 persistent-node: check the value of the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46306
diff changeset
1114 b'storage', b'revlog.persistent-nodemap.slow-path'
2c9c88879ab7 persistent-node: check the value of the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46306
diff changeset
1115 )
46311
014ac7a32048 persistent-nodemap: add a "abort" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46310
diff changeset
1116 if slow_path not in (b'allow', b'warn', b'abort'):
46309
2c9c88879ab7 persistent-node: check the value of the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46306
diff changeset
1117 default = ui.config_default(
2c9c88879ab7 persistent-node: check the value of the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46306
diff changeset
1118 b'storage', b'revlog.persistent-nodemap.slow-path'
2c9c88879ab7 persistent-node: check the value of the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46306
diff changeset
1119 )
2c9c88879ab7 persistent-node: check the value of the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46306
diff changeset
1120 msg = _(
2c9c88879ab7 persistent-node: check the value of the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46306
diff changeset
1121 b'unknown value for config '
2c9c88879ab7 persistent-node: check the value of the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46306
diff changeset
1122 b'"storage.revlog.persistent-nodemap.slow-path": "%s"\n'
2c9c88879ab7 persistent-node: check the value of the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46306
diff changeset
1123 )
2c9c88879ab7 persistent-node: check the value of the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46306
diff changeset
1124 ui.warn(msg % slow_path)
2c9c88879ab7 persistent-node: check the value of the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46306
diff changeset
1125 if not ui.quiet:
2c9c88879ab7 persistent-node: check the value of the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46306
diff changeset
1126 ui.warn(_(b'falling back to default value: %s\n') % default)
2c9c88879ab7 persistent-node: check the value of the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46306
diff changeset
1127 slow_path = default
46310
fc2d5c0aed7f persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46309
diff changeset
1128
fc2d5c0aed7f persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46309
diff changeset
1129 msg = _(
fc2d5c0aed7f persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46309
diff changeset
1130 b"accessing `persistent-nodemap` repository without associated "
fc2d5c0aed7f persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46309
diff changeset
1131 b"fast implementation."
fc2d5c0aed7f persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46309
diff changeset
1132 )
fc2d5c0aed7f persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46309
diff changeset
1133 hint = _(
fc2d5c0aed7f persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46309
diff changeset
1134 b"check `hg help config.format.use-persistent-nodemap` "
fc2d5c0aed7f persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46309
diff changeset
1135 b"for details"
fc2d5c0aed7f persistent-nodemap: add a "warn" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46309
diff changeset
1136 )
46311
014ac7a32048 persistent-nodemap: add a "abort" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46310
diff changeset
1137 if not revlog.HAS_FAST_PERSISTENT_NODEMAP:
014ac7a32048 persistent-nodemap: add a "abort" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46310
diff changeset
1138 if slow_path == b'warn':
014ac7a32048 persistent-nodemap: add a "abort" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46310
diff changeset
1139 msg = b"warning: " + msg + b'\n'
014ac7a32048 persistent-nodemap: add a "abort" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46310
diff changeset
1140 ui.warn(msg)
014ac7a32048 persistent-nodemap: add a "abort" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46310
diff changeset
1141 if not ui.quiet:
014ac7a32048 persistent-nodemap: add a "abort" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46310
diff changeset
1142 hint = b'(' + hint + b')\n'
014ac7a32048 persistent-nodemap: add a "abort" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46310
diff changeset
1143 ui.warn(hint)
014ac7a32048 persistent-nodemap: add a "abort" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46310
diff changeset
1144 if slow_path == b'abort':
014ac7a32048 persistent-nodemap: add a "abort" option to the slow-path config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46310
diff changeset
1145 raise error.Abort(msg, hint=hint)
44792
5e3c718692bb nodemap: drop the 'exp-' prefix for internal opener option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44791
diff changeset
1146 options[b'persistent-nodemap'] = True
46306
7d096e5a5b90 persistent-nodemap: rename the storage.revlog.nodemap.mmap option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46263
diff changeset
1147 if ui.configbool(b'storage', b'revlog.persistent-nodemap.mmap'):
44792
5e3c718692bb nodemap: drop the 'exp-' prefix for internal opener option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44791
diff changeset
1148 options[b'persistent-nodemap.mmap'] = True
44313
6f9e8e142cea nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44308
diff changeset
1149 if ui.configbool(b'devel', b'persistent-nodemap'):
6f9e8e142cea nodemap: add a (python) index class for persistent nodemap testing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44308
diff changeset
1150 options[b'devel-force-nodemap'] = True
44014
8042856c90b6 rust-index: add a `experimental.rust.index` option to use the wrapper
Georges Racinet <georges.racinet@octobus.net>
parents: 43778
diff changeset
1151
39700
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1152 return options
b10d145837bc localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39699
diff changeset
1153
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1154
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
1155 def makemain(**kwargs):
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
1156 """Produce a type conforming to ``ilocalrepositorymain``."""
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
1157 return localrepository
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
1158
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1159
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
1160 @interfaceutil.implementer(repository.ilocalrepositoryfilestorage)
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
1161 class revlogfilestorage(object):
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
1162 """File storage when using revlogs."""
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
1163
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
1164 def file(self, path):
46549
9842c00f0252 log: fix handling of root (or empty) path provided by matcher (issue6478)
Yuya Nishihara <yuya@tcha.org>
parents: 46351
diff changeset
1165 if path.startswith(b'/'):
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
1166 path = path[1:]
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
1167
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
1168 return filelog.filelog(self.svfs, path)
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
1169
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1170
39765
3e801ffd7269 filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39764
diff changeset
1171 @interfaceutil.implementer(repository.ilocalrepositoryfilestorage)
3e801ffd7269 filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39764
diff changeset
1172 class revlognarrowfilestorage(object):
3e801ffd7269 filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39764
diff changeset
1173 """File storage when using revlogs and narrow files."""
3e801ffd7269 filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39764
diff changeset
1174
3e801ffd7269 filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39764
diff changeset
1175 def file(self, path):
46549
9842c00f0252 log: fix handling of root (or empty) path provided by matcher (issue6478)
Yuya Nishihara <yuya@tcha.org>
parents: 46351
diff changeset
1176 if path.startswith(b'/'):
39765
3e801ffd7269 filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39764
diff changeset
1177 path = path[1:]
3e801ffd7269 filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39764
diff changeset
1178
41230
d2d716cc0700 narrow: extract repo property for store narrowmatcher
Martin von Zweigbergk <martinvonz@google.com>
parents: 41229
diff changeset
1179 return filelog.narrowfilelog(self.svfs, path, self._storenarrowmatch)
39765
3e801ffd7269 filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39764
diff changeset
1180
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1181
39850
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
1182 def makefilestorage(requirements, features, **kwargs):
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
1183 """Produce a type conforming to ``ilocalrepositoryfilestorage``."""
39850
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
1184 features.add(repository.REPO_FEATURE_REVLOG_FILE_STORAGE)
40027
83146d176c03 localrepo: add repository feature when repo can be stream cloned
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39996
diff changeset
1185 features.add(repository.REPO_FEATURE_STREAM_CLONE)
39850
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
1186
45372
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
1187 if requirementsmod.NARROW_REQUIREMENT in requirements:
39765
3e801ffd7269 filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39764
diff changeset
1188 return revlognarrowfilestorage
3e801ffd7269 filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39764
diff changeset
1189 else:
3e801ffd7269 filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39764
diff changeset
1190 return revlogfilestorage
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
1191
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1192
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
1193 # List of repository interfaces and factory functions for them. Each
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
1194 # will be called in order during ``makelocalrepository()`` to iteratively
39994
6962ebc8f817 localrepo: capture repo interface factory functions as lambas
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39959
diff changeset
1195 # derive the final type for a local repository instance. We capture the
6962ebc8f817 localrepo: capture repo interface factory functions as lambas
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39959
diff changeset
1196 # function as a lambda so we don't hold a reference and the module-level
6962ebc8f817 localrepo: capture repo interface factory functions as lambas
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39959
diff changeset
1197 # functions can be wrapped.
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
1198 REPO_INTERFACES = [
39994
6962ebc8f817 localrepo: capture repo interface factory functions as lambas
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39959
diff changeset
1199 (repository.ilocalrepositorymain, lambda: makemain),
6962ebc8f817 localrepo: capture repo interface factory functions as lambas
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39959
diff changeset
1200 (repository.ilocalrepositoryfilestorage, lambda: makefilestorage),
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
1201 ]
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
1202
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1203
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
1204 @interfaceutil.implementer(repository.ilocalrepositorymain)
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
1205 class localrepository(object):
39764
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
1206 """Main class for representing local repositories.
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
1207
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
1208 All local repositories are instances of this class.
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
1209
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
1210 Constructed on its own, instances of this class are not usable as
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
1211 repository objects. To obtain a usable repository object, call
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
1212 ``hg.repository()``, ``localrepo.instance()``, or
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
1213 ``localrepo.makelocalrepository()``. The latter is the lowest-level.
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
1214 ``instance()`` adds support for creating new repositories.
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
1215 ``hg.repository()`` adds more extension integration, including calling
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
1216 ``reposetup()``. Generally speaking, ``hg.repository()`` should be
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
1217 used.
e4e881572382 localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39763
diff changeset
1218 """
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
1219
36373
0147a4730420 cleanup: say goodbye to manifestv2 format
Augie Fackler <augie@google.com>
parents: 36178
diff changeset
1220 # obsolete experimental requirements:
0147a4730420 cleanup: say goodbye to manifestv2 format
Augie Fackler <augie@google.com>
parents: 36178
diff changeset
1221 # - manifestv2: An experimental new manifest format that allowed
0147a4730420 cleanup: say goodbye to manifestv2 format
Augie Fackler <augie@google.com>
parents: 36178
diff changeset
1222 # for stem compression of long paths. Experiment ended up not
0147a4730420 cleanup: say goodbye to manifestv2 format
Augie Fackler <augie@google.com>
parents: 36178
diff changeset
1223 # being successful (repository sizes went up due to worse delta
0147a4730420 cleanup: say goodbye to manifestv2 format
Augie Fackler <augie@google.com>
parents: 36178
diff changeset
1224 # chains), and the code was deleted in 4.6.
32314
9f35c7836f60 localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32312
diff changeset
1225 supportedformats = {
46626
ee91966aec0f requirements: add constant for revlog v1 requirement
Raphaël Gomès <rgomes@octobus.net>
parents: 46607
diff changeset
1226 requirementsmod.REVLOGV1_REQUIREMENT,
46627
f4c325bf80fc requirements: also add a generaldelta constant
Raphaël Gomès <rgomes@octobus.net>
parents: 46626
diff changeset
1227 requirementsmod.GENERALDELTA_REQUIREMENT,
45372
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
1228 requirementsmod.TREEMANIFEST_REQUIREMENT,
45373
d7dcc75a3eae localrepo: move requirements constant to requirements module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45372
diff changeset
1229 requirementsmod.COPIESSDC_REQUIREMENT,
d7dcc75a3eae localrepo: move requirements constant to requirements module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45372
diff changeset
1230 requirementsmod.REVLOGV2_REQUIREMENT,
47263
6c84fc9c9a90 changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47260
diff changeset
1231 requirementsmod.CHANGELOGV2_REQUIREMENT,
45373
d7dcc75a3eae localrepo: move requirements constant to requirements module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45372
diff changeset
1232 requirementsmod.SPARSEREVLOG_REQUIREMENT,
d7dcc75a3eae localrepo: move requirements constant to requirements module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45372
diff changeset
1233 requirementsmod.NODEMAP_REQUIREMENT,
42325
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42300
diff changeset
1234 bookmarks.BOOKMARKS_IN_STORE_REQUIREMENT,
45483
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
1235 requirementsmod.SHARESAFE_REQUIREMENT,
32314
9f35c7836f60 localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32312
diff changeset
1236 }
9f35c7836f60 localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32312
diff changeset
1237 _basesupported = supportedformats | {
46637
ab58098bebed requirements: also add a store constant
Raphaël Gomès <rgomes@octobus.net>
parents: 46636
diff changeset
1238 requirementsmod.STORE_REQUIREMENT,
46638
b4c2a2af25e2 requirements: also add a fncache constant
Raphaël Gomès <rgomes@octobus.net>
parents: 46637
diff changeset
1239 requirementsmod.FNCACHE_REQUIREMENT,
45386
034d94f8761b requirements: introduce constants for `shared` and `relshared` requirements
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45373
diff changeset
1240 requirementsmod.SHARED_REQUIREMENT,
034d94f8761b requirements: introduce constants for `shared` and `relshared` requirements
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45373
diff changeset
1241 requirementsmod.RELATIVE_SHARED_REQUIREMENT,
46636
c3773636ddbb requirements: also add a dotencode constant
Raphaël Gomès <rgomes@octobus.net>
parents: 46627
diff changeset
1242 requirementsmod.DOTENCODE_REQUIREMENT,
45372
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
1243 requirementsmod.SPARSE_REQUIREMENT,
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
1244 requirementsmod.INTERNAL_PHASE_REQUIREMENT,
32314
9f35c7836f60 localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32312
diff changeset
1245 }
17137
b090601a80d1 localrepo: make requirements and openerreqs mutable by subclasses
Bryan O'Sullivan <bryano@fb.com>
parents: 17075
diff changeset
1246
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1247 # list of prefix for file which can be written without 'wlock'
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1248 # Extensions should extend this list when needed
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1249 _wlockfreeprefix = {
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1250 # We migh consider requiring 'wlock' for the next
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1251 # two, but pretty much all the existing code assume
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1252 # wlock is not needed so we keep them excluded for
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1253 # now.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1254 b'hgrc',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1255 b'requires',
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1256 # XXX cache is a complicatged business someone
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1257 # should investigate this in depth at some point
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1258 b'cache/',
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1259 # XXX shouldn't be dirstate covered by the wlock?
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1260 b'dirstate',
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1261 # XXX bisect was still a bit too messy at the time
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1262 # this changeset was introduced. Someone should fix
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1263 # the remainig bit and drop this line
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1264 b'bisect.state',
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1265 }
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1266
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1267 def __init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1268 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1269 baseui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1270 ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1271 origroot,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1272 wdirvfs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1273 hgvfs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1274 requirements,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1275 supportedrequirements,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1276 sharedpath,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1277 store,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1278 cachevfs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1279 wcachevfs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1280 features,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1281 intents=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1282 ):
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
1283 """Create a new local repository instance.
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
1284
39688
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
1285 Most callers should use ``hg.repository()``, ``localrepo.instance()``,
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
1286 or ``localrepo.makelocalrepository()`` for obtaining a new repository
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
1287 object.
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
1288
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
1289 Arguments:
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
1290
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
1291 baseui
39689
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
1292 ``ui.ui`` instance that ``ui`` argument was based off of.
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
1293
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
1294 ui
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
1295 ``ui.ui`` instance for use by the repository.
39688
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
1296
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
1297 origroot
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
1298 ``bytes`` path to working directory root of this repository.
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
1299
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
1300 wdirvfs
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
1301 ``vfs.vfs`` rooted at the working directory.
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
1302
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
1303 hgvfs
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
1304 ``vfs.vfs`` rooted at .hg/
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
1305
39692
6a3162ed881d localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39691
diff changeset
1306 requirements
6a3162ed881d localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39691
diff changeset
1307 ``set`` of bytestrings representing repository opening requirements.
6a3162ed881d localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39691
diff changeset
1308
39693
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
1309 supportedrequirements
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
1310 ``set`` of bytestrings representing repository requirements that we
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
1311 know how to open. May be a supetset of ``requirements``.
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
1312
39697
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
1313 sharedpath
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
1314 ``bytes`` Defining path to storage base directory. Points to a
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
1315 ``.hg/`` directory somewhere.
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
1316
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
1317 store
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
1318 ``store.basicstore`` (or derived) instance providing access to
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
1319 versioned storage.
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
1320
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
1321 cachevfs
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
1322 ``vfs.vfs`` used for cache files.
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
1323
40795
e1c3a2e9df59 repo: add a `wcachevfs` to access the `.hg/wcache/` directory
Boris Feld <boris.feld@octobus.net>
parents: 40794
diff changeset
1324 wcachevfs
e1c3a2e9df59 repo: add a `wcachevfs` to access the `.hg/wcache/` directory
Boris Feld <boris.feld@octobus.net>
parents: 40794
diff changeset
1325 ``vfs.vfs`` used for cache files related to the working copy.
e1c3a2e9df59 repo: add a `wcachevfs` to access the `.hg/wcache/` directory
Boris Feld <boris.feld@octobus.net>
parents: 40794
diff changeset
1326
39850
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
1327 features
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
1328 ``set`` of bytestrings defining features/capabilities of this
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
1329 instance.
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
1330
39688
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
1331 intents
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
1332 ``set`` of system strings indicating what this repo will be used
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
1333 for.
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
1334 """
39688
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
1335 self.baseui = baseui
39689
f19bba3f4d3f localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39688
diff changeset
1336 self.ui = ui
39688
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
1337 self.origroot = origroot
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
1338 # vfs rooted at working directory.
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
1339 self.wvfs = wdirvfs
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
1340 self.root = wdirvfs.base
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
1341 # vfs rooted at .hg/. Used to access most non-store paths.
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
1342 self.vfs = hgvfs
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
1343 self.path = hgvfs.base
39693
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
1344 self.requirements = requirements
46780
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46713
diff changeset
1345 self.nodeconstants = sha1nodeconstants
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46713
diff changeset
1346 self.nullid = self.nodeconstants.nullid
39693
5b8e9b2060ef localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39692
diff changeset
1347 self.supported = supportedrequirements
39697
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
1348 self.sharedpath = sharedpath
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
1349 self.store = store
98ca9078807a localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39696
diff changeset
1350 self.cachevfs = cachevfs
40795
e1c3a2e9df59 repo: add a `wcachevfs` to access the `.hg/wcache/` directory
Boris Feld <boris.feld@octobus.net>
parents: 40794
diff changeset
1351 self.wcachevfs = wcachevfs
39850
d89d5bc06eaa localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39849
diff changeset
1352 self.features = features
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
1353
32730
b8ff7d0ff361 localrepo: move filtername to __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32729
diff changeset
1354 self.filtername = None
39688
2f9cdb5b3644 localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39687
diff changeset
1355
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1356 if self.ui.configbool(b'devel', b'all-warnings') or self.ui.configbool(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1357 b'devel', b'check-locks'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1358 ):
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1359 self.vfs.audit = self._getvfsward(self.vfs.audit)
15922
23921c17299a phases: mechanism to allow extension to alter initial computation of phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15892
diff changeset
1360 # A list of callback to shape the phase if no data were found.
23921c17299a phases: mechanism to allow extension to alter initial computation of phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15892
diff changeset
1361 # Callback are in the form: func(repo, roots) --> processed root.
23921c17299a phases: mechanism to allow extension to alter initial computation of phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15892
diff changeset
1362 # This list it to be filled by extension during repo setup
23921c17299a phases: mechanism to allow extension to alter initial computation of phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15892
diff changeset
1363 self._phasedefaults = []
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
1364
31111
95ec3ad62f62 color: initialize color for the localrepo ui
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31054
diff changeset
1365 color.setup(self.ui)
19778
55ef79031009 localrepo: make supported features manageable in each repositories individually
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19650
diff changeset
1366
6840
80e51429cb9a introduce store classes
Adrian Buehlmann <adrian@cadifra.com>
parents: 6839
diff changeset
1367 self.spath = self.store.path
17654
1dc37491e9fb localrepo: use "vfs" constructor/field for initialization around "store"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17650
diff changeset
1368 self.svfs = self.store.vfs
6840
80e51429cb9a introduce store classes
Adrian Buehlmann <adrian@cadifra.com>
parents: 6839
diff changeset
1369 self.sjoin = self.store.join
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1370 if self.ui.configbool(b'devel', b'all-warnings') or self.ui.configbool(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1371 b'devel', b'check-locks'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1372 ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1373 if util.safehasattr(self.svfs, b'vfs'): # this is filtervfs
33437
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
1374 self.svfs.vfs.audit = self._getsvfsward(self.svfs.vfs.audit)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1375 else: # standard vfs
33437
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
1376 self.svfs.audit = self._getsvfsward(self.svfs.audit)
3850
a4457828ca1a move code around
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3803
diff changeset
1377
26155
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
1378 self._dirstatevalidatewarned = False
9146
5614a628d173 localrepo: rename in-memory tag cache instance attributes (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9145
diff changeset
1379
41615
328ca3b9e545 branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents: 41529
diff changeset
1380 self._branchcaches = branchmap.BranchMapCache()
24373
59cc09240afb revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents: 24320
diff changeset
1381 self._revbranchcache = None
37137
db90a5793103 localrepo: make filterpats private (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37135
diff changeset
1382 self._filterpats = {}
5966
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
1383 self._datafilters = {}
4916
5c5d23d93447 Use a weakref for recursive transactions
Matt Mackall <mpm@selenic.com>
parents: 4915
diff changeset
1384 self._transref = self._lockref = self._wlockref = None
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
1385
14929
4bf9493e7b07 localrepo: add a cache with stat info for files under .hg/
Idan Kamara <idankk86@gmail.com>
parents: 14905
diff changeset
1386 # A cache for various files under .hg/ that tracks file changes,
4bf9493e7b07 localrepo: add a cache with stat info for files under .hg/
Idan Kamara <idankk86@gmail.com>
parents: 14905
diff changeset
1387 # (used by the filecache decorator)
4bf9493e7b07 localrepo: add a cache with stat info for files under .hg/
Idan Kamara <idankk86@gmail.com>
parents: 14905
diff changeset
1388 #
4bf9493e7b07 localrepo: add a cache with stat info for files under .hg/
Idan Kamara <idankk86@gmail.com>
parents: 14905
diff changeset
1389 # Maps a property name to its util.filecacheentry
4bf9493e7b07 localrepo: add a cache with stat info for files under .hg/
Idan Kamara <idankk86@gmail.com>
parents: 14905
diff changeset
1390 self._filecache = {}
4bf9493e7b07 localrepo: add a cache with stat info for files under .hg/
Idan Kamara <idankk86@gmail.com>
parents: 14905
diff changeset
1391
18101
a464deecc9dd clfilter: add a cache on repo for set of revision to filter for a given set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18100
diff changeset
1392 # hold sets of revision to be filtered
a464deecc9dd clfilter: add a cache on repo for set of revision to filter for a given set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18100
diff changeset
1393 # should be cleared when something might have changed the filter value:
a464deecc9dd clfilter: add a cache on repo for set of revision to filter for a given set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18100
diff changeset
1394 # - new changesets,
a464deecc9dd clfilter: add a cache on repo for set of revision to filter for a given set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18100
diff changeset
1395 # - phase change,
a464deecc9dd clfilter: add a cache on repo for set of revision to filter for a given set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18100
diff changeset
1396 # - new obsolescence marker,
a464deecc9dd clfilter: add a cache on repo for set of revision to filter for a given set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18100
diff changeset
1397 # - working directory parent change,
a464deecc9dd clfilter: add a cache on repo for set of revision to filter for a given set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18100
diff changeset
1398 # - bookmark changes
a464deecc9dd clfilter: add a cache on repo for set of revision to filter for a given set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18100
diff changeset
1399 self.filteredrevcache = {}
a464deecc9dd clfilter: add a cache on repo for set of revision to filter for a given set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18100
diff changeset
1400
32814
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
1401 # post-dirstate-status hooks
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
1402 self._postdsstatus = []
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
1403
23558
3198aac7a95d namespaces: add bookmarks to the names data structure
Sean Farley <sean.michael.farley@gmail.com>
parents: 23546
diff changeset
1404 # generic mapping between names and nodes
23561
3c2419e07df5 namespaces: remove weakref; always pass in repo
Ryan McElroy <rmcelroy@fb.com>
parents: 23558
diff changeset
1405 self.names = namespaces.namespaces()
23558
3198aac7a95d namespaces: add bookmarks to the names data structure
Sean Farley <sean.michael.farley@gmail.com>
parents: 23546
diff changeset
1406
33302
36a415b5a4b2 localrepo: add sparse caches
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33278
diff changeset
1407 # Key to signature value.
36a415b5a4b2 localrepo: add sparse caches
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33278
diff changeset
1408 self._sparsesignaturecache = {}
36a415b5a4b2 localrepo: add sparse caches
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33278
diff changeset
1409 # Signature to cached matcher instance.
36a415b5a4b2 localrepo: add sparse caches
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33278
diff changeset
1410 self._sparsematchercache = {}
36a415b5a4b2 localrepo: add sparse caches
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33278
diff changeset
1411
42231
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
1412 self._extrafilterid = repoview.extrafilter(ui)
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
1413
43142
beed7ce61681 sidedatacopies: write copies information in sidedata when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43137
diff changeset
1414 self.filecopiesmode = None
45373
d7dcc75a3eae localrepo: move requirements constant to requirements module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45372
diff changeset
1415 if requirementsmod.COPIESSDC_REQUIREMENT in self.requirements:
43142
beed7ce61681 sidedatacopies: write copies information in sidedata when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43137
diff changeset
1416 self.filecopiesmode = b'changeset-sidedata'
beed7ce61681 sidedatacopies: write copies information in sidedata when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43137
diff changeset
1417
46713
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
1418 self._wanted_sidedata = set()
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
1419 self._sidedata_computers = {}
47085
3aab2330b7d3 sidedata: move sidedata-related utils to the dedicated module
Raphaël Gomès <rgomes@octobus.net>
parents: 47083
diff changeset
1420 sidedatamod.set_sidedata_spec_for_repo(self)
46713
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
1421
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1422 def _getvfsward(self, origfunc):
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1423 """build a ward for self.vfs"""
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1424 rref = weakref.ref(self)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1425
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1426 def checkvfs(path, mode=None):
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1427 ret = origfunc(path, mode=mode)
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1428 repo = rref()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1429 if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1430 repo is None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1431 or not util.safehasattr(repo, b'_wlockref')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1432 or not util.safehasattr(repo, b'_lockref')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1433 ):
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1434 return
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1435 if mode in (None, b'r', b'rb'):
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1436 return
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1437 if path.startswith(repo.path):
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1438 # truncate name relative to the repository (.hg)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1439 path = path[len(repo.path) + 1 :]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1440 if path.startswith(b'cache/'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1441 msg = b'accessing cache with vfs instead of cachevfs: "%s"'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1442 repo.ui.develwarn(msg % path, stacklevel=3, config=b"cache-vfs")
45015
5797dbb630df locks: expect repo lock, not wlock, when writing to .hg/strip-backup/
Martin von Zweigbergk <martinvonz@google.com>
parents: 44943
diff changeset
1443 # path prefixes covered by 'lock'
45433
324ad3e7ef41 localrepo: warn if we are writing to cache without a lock
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45418
diff changeset
1444 vfs_path_prefixes = (
324ad3e7ef41 localrepo: warn if we are writing to cache without a lock
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45418
diff changeset
1445 b'journal.',
324ad3e7ef41 localrepo: warn if we are writing to cache without a lock
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45418
diff changeset
1446 b'undo.',
324ad3e7ef41 localrepo: warn if we are writing to cache without a lock
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45418
diff changeset
1447 b'strip-backup/',
324ad3e7ef41 localrepo: warn if we are writing to cache without a lock
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45418
diff changeset
1448 b'cache/',
324ad3e7ef41 localrepo: warn if we are writing to cache without a lock
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45418
diff changeset
1449 )
45015
5797dbb630df locks: expect repo lock, not wlock, when writing to .hg/strip-backup/
Martin von Zweigbergk <martinvonz@google.com>
parents: 44943
diff changeset
1450 if any(path.startswith(prefix) for prefix in vfs_path_prefixes):
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1451 if repo._currentlock(repo._lockref) is None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1452 repo.ui.develwarn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1453 b'write with no lock: "%s"' % path,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1454 stacklevel=3,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1455 config=b'check-locks',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1456 )
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1457 elif repo._currentlock(repo._wlockref) is None:
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1458 # rest of vfs files are covered by 'wlock'
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1459 #
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1460 # exclude special files
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1461 for prefix in self._wlockfreeprefix:
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1462 if path.startswith(prefix):
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1463 return
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1464 repo.ui.develwarn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1465 b'write with no wlock: "%s"' % path,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1466 stacklevel=3,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1467 config=b'check-locks',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1468 )
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1469 return ret
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1470
33436
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1471 return checkvfs
9bb4decd43b0 repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33403
diff changeset
1472
33437
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
1473 def _getsvfsward(self, origfunc):
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
1474 """build a ward for self.svfs"""
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
1475 rref = weakref.ref(self)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1476
33437
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
1477 def checksvfs(path, mode=None):
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
1478 ret = origfunc(path, mode=mode)
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
1479 repo = rref()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1480 if repo is None or not util.safehasattr(repo, b'_lockref'):
33437
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
1481 return
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1482 if mode in (None, b'r', b'rb'):
33437
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
1483 return
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
1484 if path.startswith(repo.sharedpath):
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
1485 # truncate name relative to the repository (.hg)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1486 path = path[len(repo.sharedpath) + 1 :]
33437
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
1487 if repo._currentlock(repo._lockref) is None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1488 repo.ui.develwarn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1489 b'write with no lock: "%s"' % path, stacklevel=4
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1490 )
33437
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
1491 return ret
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1492
33437
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
1493 return checksvfs
0720e6265c8a reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents: 33436
diff changeset
1494
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
1495 def close(self):
24378
9347c15d8136 revbranchcache: write cache even during read operations
Durham Goode <durham@fb.com>
parents: 24373
diff changeset
1496 self._writecaches()
9347c15d8136 revbranchcache: write cache even during read operations
Durham Goode <durham@fb.com>
parents: 24373
diff changeset
1497
9347c15d8136 revbranchcache: write cache even during read operations
Durham Goode <durham@fb.com>
parents: 24373
diff changeset
1498 def _writecaches(self):
9347c15d8136 revbranchcache: write cache even during read operations
Durham Goode <durham@fb.com>
parents: 24373
diff changeset
1499 if self._revbranchcache:
9347c15d8136 revbranchcache: write cache even during read operations
Durham Goode <durham@fb.com>
parents: 24373
diff changeset
1500 self._revbranchcache.write()
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
1501
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
1502 def _restrictcapabilities(self, caps):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1503 if self.ui.configbool(b'experimental', b'bundle2-advertise'):
20955
12f161f08d74 bundle2: allow pulling changegroups using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20954
diff changeset
1504 caps = set(caps)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1505 capsblob = bundle2.encodecaps(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1506 bundle2.getrepocaps(self, role=b'client')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1507 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1508 caps.add(b'bundle2=' + urlreq.quote(capsblob))
46902
631001150e13 narrow: add capabilities for local repos, not just remote peers
Charles Chamberlain <cchamberlain@janestreet.com>
parents: 46888
diff changeset
1509 if self.ui.configbool(b'experimental', b'narrow'):
631001150e13 narrow: add capabilities for local repos, not just remote peers
Charles Chamberlain <cchamberlain@janestreet.com>
parents: 46888
diff changeset
1510 caps.add(wireprototypes.NARROWCAP)
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
1511 return caps
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
1512
39312
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
1513 # Don't cache auditor/nofsauditor, or you'll end up with reference cycle:
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
1514 # self -> auditor -> self._checknested -> self
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
1515
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
1516 @property
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
1517 def auditor(self):
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
1518 # This is only used by context.workingctx.match in order to
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
1519 # detect files in subrepos.
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
1520 return pathutil.pathauditor(self.root, callback=self._checknested)
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
1521
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
1522 @property
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
1523 def nofsauditor(self):
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
1524 # This is only used by context.basectx.match in order to detect
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
1525 # files in subrepos.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1526 return pathutil.pathauditor(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1527 self.root, callback=self._checknested, realfs=False, cached=True
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1528 )
39312
9198e41df6ef localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents: 39301
diff changeset
1529
12162
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
1530 def _checknested(self, path):
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
1531 """Determine if path is a legal nested repository."""
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
1532 if not path.startswith(self.root):
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
1533 return False
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1534 subpath = path[len(self.root) + 1 :]
15722
417127af3996 windows: use normalized path to check repository nesting
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15604
diff changeset
1535 normsubpath = util.pconvert(subpath)
12162
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
1536
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
1537 # XXX: Checking against the current working copy is wrong in
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
1538 # the sense that it can reject things like
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
1539 #
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
1540 # $ hg cat -r 10 sub/x.txt
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
1541 #
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
1542 # if sub/ is no longer a subrepository in the working copy
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
1543 # parent revision.
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
1544 #
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
1545 # However, it can of course also allow things that would have
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
1546 # been rejected before, such as the above cat command if sub/
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
1547 # is a subrepository now, but was a normal directory before.
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
1548 # The old path auditor would have rejected by mistake since it
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
1549 # panics when it sees sub/.hg/.
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
1550 #
12174
7bccd04292a2 localrepo: check nested repos against working directory
Martin Geisler <mg@lazybytes.net>
parents: 12166
diff changeset
1551 # All in all, checking against the working copy seems sensible
7bccd04292a2 localrepo: check nested repos against working directory
Martin Geisler <mg@lazybytes.net>
parents: 12166
diff changeset
1552 # since we want to prevent access to nested repositories on
7bccd04292a2 localrepo: check nested repos against working directory
Martin Geisler <mg@lazybytes.net>
parents: 12166
diff changeset
1553 # the filesystem *now*.
7bccd04292a2 localrepo: check nested repos against working directory
Martin Geisler <mg@lazybytes.net>
parents: 12166
diff changeset
1554 ctx = self[None]
12162
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
1555 parts = util.splitpath(subpath)
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
1556 while parts:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1557 prefix = b'/'.join(parts)
12162
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
1558 if prefix in ctx.substate:
15722
417127af3996 windows: use normalized path to check repository nesting
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15604
diff changeset
1559 if prefix == normsubpath:
12162
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
1560 return True
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
1561 else:
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
1562 sub = ctx.sub(prefix)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1563 return sub.checknested(subpath[len(prefix) + 1 :])
12162
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
1564 else:
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
1565 parts.pop()
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
1566 return False
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
1567
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
1568 def peer(self):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1569 return localpeer(self) # not cached to avoid reference cycle
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
1570
17993
1a6f8820eb71 clfilter: introduce an "unfiltered" method on localrepo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17922
diff changeset
1571 def unfiltered(self):
1a6f8820eb71 clfilter: introduce an "unfiltered" method on localrepo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17922
diff changeset
1572 """Return unfiltered version of the repository
1a6f8820eb71 clfilter: introduce an "unfiltered" method on localrepo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17922
diff changeset
1573
18644
3e92772d5383 spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents: 18520
diff changeset
1574 Intended to be overwritten by filtered repo."""
17993
1a6f8820eb71 clfilter: introduce an "unfiltered" method on localrepo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17922
diff changeset
1575 return self
1a6f8820eb71 clfilter: introduce an "unfiltered" method on localrepo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17922
diff changeset
1576
35492
3ad582b2895c repoview: add visibilityexceptions as an optional argument to repo.filtered()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35309
diff changeset
1577 def filtered(self, name, visibilityexceptions=None):
42105
e0357a46c39d repoview: improve documentation for `repo.filtered` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42079
diff changeset
1578 """Return a filtered version of a repository
e0357a46c39d repoview: improve documentation for `repo.filtered` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42079
diff changeset
1579
e0357a46c39d repoview: improve documentation for `repo.filtered` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42079
diff changeset
1580 The `name` parameter is the identifier of the requested view. This
e0357a46c39d repoview: improve documentation for `repo.filtered` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42079
diff changeset
1581 will return a repoview object set "exactly" to the specified view.
e0357a46c39d repoview: improve documentation for `repo.filtered` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42079
diff changeset
1582
e0357a46c39d repoview: improve documentation for `repo.filtered` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42079
diff changeset
1583 This function does not apply recursive filtering to a repository. For
e0357a46c39d repoview: improve documentation for `repo.filtered` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42079
diff changeset
1584 example calling `repo.filtered("served")` will return a repoview using
e0357a46c39d repoview: improve documentation for `repo.filtered` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42079
diff changeset
1585 the "served" view, regardless of the initial view used by `repo`.
e0357a46c39d repoview: improve documentation for `repo.filtered` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42079
diff changeset
1586
e0357a46c39d repoview: improve documentation for `repo.filtered` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42079
diff changeset
1587 In other word, there is always only one level of `repoview` "filtering".
e0357a46c39d repoview: improve documentation for `repo.filtered` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42079
diff changeset
1588 """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1589 if self._extrafilterid is not None and b'%' not in name:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1590 name = name + b'%' + self._extrafilterid
42231
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42141
diff changeset
1591
35248
c752fbe228fb repoview: extract a factory function of proxy class
Yuya Nishihara <yuya@tcha.org>
parents: 35247
diff changeset
1592 cls = repoview.newtype(self.unfiltered().__class__)
35492
3ad582b2895c repoview: add visibilityexceptions as an optional argument to repo.filtered()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35309
diff changeset
1593 return cls(self, name, visibilityexceptions)
18100
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18092
diff changeset
1594
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1595 @mixedrepostorecache(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1596 (b'bookmarks', b'plain'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1597 (b'bookmarks.current', b'plain'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1598 (b'bookmarks', b''),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1599 (b'00changelog.i', b''),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1600 )
13355
cce2e7b77e36 bookmarks: move property methods into localrepo
Matt Mackall <mpm@selenic.com>
parents: 13341
diff changeset
1601 def _bookmarks(self):
42682
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1602 # Since the multiple files involved in the transaction cannot be
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1603 # written atomically (with current repository format), there is a race
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1604 # condition here.
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1605 #
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1606 # 1) changelog content A is read
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1607 # 2) outside transaction update changelog to content B
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1608 # 3) outside transaction update bookmark file referring to content B
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1609 # 4) bookmarks file content is read and filtered against changelog-A
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1610 #
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1611 # When this happens, bookmarks against nodes missing from A are dropped.
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1612 #
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1613 # Having this happening during read is not great, but it become worse
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1614 # when this happen during write because the bookmarks to the "unknown"
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1615 # nodes will be dropped for good. However, writes happen within locks.
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1616 # This locking makes it possible to have a race free consistent read.
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1617 # For this purpose data read from disc before locking are
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1618 # "invalidated" right after the locks are taken. This invalidations are
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1619 # "light", the `filecache` mechanism keep the data in memory and will
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1620 # reuse them if the underlying files did not changed. Not parsing the
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1621 # same data multiple times helps performances.
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1622 #
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1623 # Unfortunately in the case describe above, the files tracked by the
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1624 # bookmarks file cache might not have changed, but the in-memory
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1625 # content is still "wrong" because we used an older changelog content
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1626 # to process the on-disk data. So after locking, the changelog would be
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1627 # refreshed but `_bookmarks` would be preserved.
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1628 # Adding `00changelog.i` to the list of tracked file is not
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1629 # enough, because at the time we build the content for `_bookmarks` in
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1630 # (4), the changelog file has already diverged from the content used
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1631 # for loading `changelog` in (1)
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1632 #
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1633 # To prevent the issue, we force the changelog to be explicitly
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1634 # reloaded while computing `_bookmarks`. The data race can still happen
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1635 # without the lock (with a narrower window), but it would no longer go
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1636 # undetected during the lock time refresh.
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1637 #
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1638 # The new schedule is as follow
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1639 #
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1640 # 1) filecache logic detect that `_bookmarks` needs to be computed
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1641 # 2) cachestat for `bookmarks` and `changelog` are captured (for book)
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1642 # 3) We force `changelog` filecache to be tested
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1643 # 4) cachestat for `changelog` are captured (for changelog)
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1644 # 5) `_bookmarks` is computed and cached
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1645 #
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1646 # The step in (3) ensure we have a changelog at least as recent as the
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1647 # cache stat computed in (1). As a result at locking time:
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1648 # * if the changelog did not changed since (1) -> we can reuse the data
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1649 # * otherwise -> the bookmarks get refreshed.
e0cf09bc35ef bookmarks: actual fix for race condition deleting bookmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42621
diff changeset
1650 self._refreshchangelog()
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17857
diff changeset
1651 return bookmarks.bmstore(self)
13355
cce2e7b77e36 bookmarks: move property methods into localrepo
Matt Mackall <mpm@selenic.com>
parents: 13341
diff changeset
1652
42510
3472a3f9d785 localrepo: introduce a `_refreshchangelog` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42421
diff changeset
1653 def _refreshchangelog(self):
3472a3f9d785 localrepo: introduce a `_refreshchangelog` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42421
diff changeset
1654 """make sure the in memory changelog match the on-disk one"""
43414
a0916e8819f6 localrepo: use str for lookup in vars()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43202
diff changeset
1655 if 'changelog' in vars(self) and self.currenttransaction() is None:
42510
3472a3f9d785 localrepo: introduce a `_refreshchangelog` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42421
diff changeset
1656 del self.changelog
3472a3f9d785 localrepo: introduce a `_refreshchangelog` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42421
diff changeset
1657
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27522
diff changeset
1658 @property
24947
a02d293a1079 bookmarks: rename bookmarkcurrent to activebookmark (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24946
diff changeset
1659 def _activebookmark(self):
27698
dad6404ccddb bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents: 27522
diff changeset
1660 return self._bookmarks.active
12162
af8c4929931c localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12127
diff changeset
1661
35309
d13526333835 phases: drop the list with phase of each rev, always comput phase sets
Joerg Sonnenberger <joerg@bec.de>
parents: 35308
diff changeset
1662 # _phasesets depend on changelog. what we need is to call
d13526333835 phases: drop the list with phase of each rev, always comput phase sets
Joerg Sonnenberger <joerg@bec.de>
parents: 35308
diff changeset
1663 # _phasecache.invalidate() if '00changelog.i' was changed, but it
26405
c15d8f84343e localrepo: recreate phasecache if changelog was modified (issue4855)
Yuya Nishihara <yuya@tcha.org>
parents: 25878
diff changeset
1664 # can't be easily expressed in filecache mechanism.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1665 @storecache(b'phaseroots', b'00changelog.i')
16657
b6081c2c4647 phases: introduce phasecache
Patrick Mezard <patrick@mezard.eu>
parents: 16646
diff changeset
1666 def _phasecache(self):
b6081c2c4647 phases: introduce phasecache
Patrick Mezard <patrick@mezard.eu>
parents: 16646
diff changeset
1667 return phases.phasecache(self, self._phasedefaults)
15420
e80d0d3198f0 phases: add a cache allowing to know in which phase a changeset is
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15418
diff changeset
1668
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1669 @storecache(b'obsstore')
17070
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents: 17013
diff changeset
1670 def obsstore(self):
32729
c8177792fef6 obsolete: move obsstore creation logic from localrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32697
diff changeset
1671 return obsolete.makestore(self.ui, self)
17070
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents: 17013
diff changeset
1672
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1673 @storecache(b'00changelog.i')
8260
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8244
diff changeset
1674 def changelog(self):
44826
35b255e474d9 dirstate: make sure the dirstate is loaded before the changelog (issue6303)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44687
diff changeset
1675 # load dirstate before changelog to avoid race see issue6303
35b255e474d9 dirstate: make sure the dirstate is loaded before the changelog (issue6303)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44687
diff changeset
1676 self.dirstate.prefetch_parents()
46607
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46414
diff changeset
1677 return self.store.changelog(
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46414
diff changeset
1678 txnutil.mayhavepending(self.root),
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46414
diff changeset
1679 concurrencychecker=revlogchecker.get_checker(self.ui, b'changelog'),
e9901d01d135 revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents: 46414
diff changeset
1680 )
8260
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8244
diff changeset
1681
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1682 @storecache(b'00manifest.i')
29825
426d931e5db2 manifest: introduce manifestlog and manifestctx classes
Durham Goode <durham@fb.com>
parents: 29709
diff changeset
1683 def manifestlog(self):
42905
3df3b139a43d localrepo: push manifestlog and changelog construction code into store
Augie Fackler <augie@google.com>
parents: 42814
diff changeset
1684 return self.store.manifestlog(self, self._storenarrowmatch)
29825
426d931e5db2 manifest: introduce manifestlog and manifestctx classes
Durham Goode <durham@fb.com>
parents: 29709
diff changeset
1685
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1686 @repofilecache(b'dirstate')
8260
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8244
diff changeset
1687 def dirstate(self):
38128
1cba497491be narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents: 37848
diff changeset
1688 return self._makedirstate()
1cba497491be narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents: 37848
diff changeset
1689
1cba497491be narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents: 37848
diff changeset
1690 def _makedirstate(self):
38132
2b8cb0ab231c localrepo: add docstring to _makedirstate to make it less likely to be removed
Kyle Lippincott <spectral@google.com>
parents: 38128
diff changeset
1691 """Extension point for wrapping the dirstate per-repo."""
33373
fb320398a21c dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33336
diff changeset
1692 sparsematchfn = lambda: sparse.matcher(self)
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47279
diff changeset
1693 v2_req = requirementsmod.DIRSTATE_V2_REQUIREMENT
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47279
diff changeset
1694 use_dirstate_v2 = v2_req in self.requirements
33373
fb320398a21c dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33336
diff changeset
1695
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1696 return dirstate.dirstate(
46780
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46713
diff changeset
1697 self.vfs,
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46713
diff changeset
1698 self.ui,
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46713
diff changeset
1699 self.root,
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46713
diff changeset
1700 self._dirstatevalidate,
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46713
diff changeset
1701 sparsematchfn,
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46713
diff changeset
1702 self.nodeconstants,
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47279
diff changeset
1703 use_dirstate_v2,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1704 )
13032
e41e2b79883d dirstate: warn on invalid parents rather than aborting
Matt Mackall <mpm@selenic.com>
parents: 13001
diff changeset
1705
26155
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
1706 def _dirstatevalidate(self, node):
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
1707 try:
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
1708 self.changelog.rev(node)
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
1709 return node
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
1710 except error.LookupError:
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
1711 if not self._dirstatevalidatewarned:
51a30cae2bff localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents: 26118
diff changeset
1712 self._dirstatevalidatewarned = True
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1713 self.ui.warn(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
1714 _(b"warning: ignoring unknown working parent %s!\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1715 % short(node)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1716 )
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46907
diff changeset
1717 return self.nullid
2155
ff255b41b4aa support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2150
diff changeset
1718
38872
576eef1ab43d narrow: move .hg/narrowspec to .hg/store/narrowspec (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 38869
diff changeset
1719 @storecache(narrowspec.FILENAME)
36471
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
1720 def narrowpats(self):
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
1721 """matcher patterns for this repository's narrowspec
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
1722
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
1723 A tuple of (includes, excludes).
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
1724 """
39758
543f26ece6cf narrow: remove hack to read narowspec from shared .hg directory
Martin von Zweigbergk <martinvonz@google.com>
parents: 39700
diff changeset
1725 return narrowspec.load(self)
36471
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
1726
38872
576eef1ab43d narrow: move .hg/narrowspec to .hg/store/narrowspec (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 38869
diff changeset
1727 @storecache(narrowspec.FILENAME)
41230
d2d716cc0700 narrow: extract repo property for store narrowmatcher
Martin von Zweigbergk <martinvonz@google.com>
parents: 41229
diff changeset
1728 def _storenarrowmatch(self):
45372
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
1729 if requirementsmod.NARROW_REQUIREMENT not in self.requirements:
41676
0531dff73d0b match: delete unused root and cwd arguments from {always,never,exact}() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41675
diff changeset
1730 return matchmod.always()
41230
d2d716cc0700 narrow: extract repo property for store narrowmatcher
Martin von Zweigbergk <martinvonz@google.com>
parents: 41229
diff changeset
1731 include, exclude = self.narrowpats
d2d716cc0700 narrow: extract repo property for store narrowmatcher
Martin von Zweigbergk <martinvonz@google.com>
parents: 41229
diff changeset
1732 return narrowspec.match(self.root, include=include, exclude=exclude)
d2d716cc0700 narrow: extract repo property for store narrowmatcher
Martin von Zweigbergk <martinvonz@google.com>
parents: 41229
diff changeset
1733
d2d716cc0700 narrow: extract repo property for store narrowmatcher
Martin von Zweigbergk <martinvonz@google.com>
parents: 41229
diff changeset
1734 @storecache(narrowspec.FILENAME)
36471
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
1735 def _narrowmatch(self):
45372
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
1736 if requirementsmod.NARROW_REQUIREMENT not in self.requirements:
41676
0531dff73d0b match: delete unused root and cwd arguments from {always,never,exact}() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41675
diff changeset
1737 return matchmod.always()
41043
ce0bc2952e2a narrow: detect if narrowspec was changed in a different share
Martin von Zweigbergk <martinvonz@google.com>
parents: 41038
diff changeset
1738 narrowspec.checkworkingcopynarrowspec(self)
36471
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
1739 include, exclude = self.narrowpats
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
1740 return narrowspec.match(self.root, include=include, exclude=exclude)
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
1741
40086
41fcdfe3bfeb narrow: allow repo.narrowmatch(match) to include exact matches from "match"
Martin von Zweigbergk <martinvonz@google.com>
parents: 40082
diff changeset
1742 def narrowmatch(self, match=None, includeexact=False):
40082
4fd0fac48922 localrepo: allow narrowmatch() to accept matcher to intersect with
Martin von Zweigbergk <martinvonz@google.com>
parents: 40064
diff changeset
1743 """matcher corresponding the the repo's narrowspec
4fd0fac48922 localrepo: allow narrowmatch() to accept matcher to intersect with
Martin von Zweigbergk <martinvonz@google.com>
parents: 40064
diff changeset
1744
4fd0fac48922 localrepo: allow narrowmatch() to accept matcher to intersect with
Martin von Zweigbergk <martinvonz@google.com>
parents: 40064
diff changeset
1745 If `match` is given, then that will be intersected with the narrow
4fd0fac48922 localrepo: allow narrowmatch() to accept matcher to intersect with
Martin von Zweigbergk <martinvonz@google.com>
parents: 40064
diff changeset
1746 matcher.
40086
41fcdfe3bfeb narrow: allow repo.narrowmatch(match) to include exact matches from "match"
Martin von Zweigbergk <martinvonz@google.com>
parents: 40082
diff changeset
1747
41fcdfe3bfeb narrow: allow repo.narrowmatch(match) to include exact matches from "match"
Martin von Zweigbergk <martinvonz@google.com>
parents: 40082
diff changeset
1748 If `includeexact` is True, then any exact matches from `match` will
41fcdfe3bfeb narrow: allow repo.narrowmatch(match) to include exact matches from "match"
Martin von Zweigbergk <martinvonz@google.com>
parents: 40082
diff changeset
1749 be included even if they're outside the narrowspec.
40082
4fd0fac48922 localrepo: allow narrowmatch() to accept matcher to intersect with
Martin von Zweigbergk <martinvonz@google.com>
parents: 40064
diff changeset
1750 """
4fd0fac48922 localrepo: allow narrowmatch() to accept matcher to intersect with
Martin von Zweigbergk <martinvonz@google.com>
parents: 40064
diff changeset
1751 if match:
40086
41fcdfe3bfeb narrow: allow repo.narrowmatch(match) to include exact matches from "match"
Martin von Zweigbergk <martinvonz@google.com>
parents: 40082
diff changeset
1752 if includeexact and not self._narrowmatch.always():
41fcdfe3bfeb narrow: allow repo.narrowmatch(match) to include exact matches from "match"
Martin von Zweigbergk <martinvonz@google.com>
parents: 40082
diff changeset
1753 # do not exclude explicitly-specified paths so that they can
41fcdfe3bfeb narrow: allow repo.narrowmatch(match) to include exact matches from "match"
Martin von Zweigbergk <martinvonz@google.com>
parents: 40082
diff changeset
1754 # be warned later on
41676
0531dff73d0b match: delete unused root and cwd arguments from {always,never,exact}() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41675
diff changeset
1755 em = matchmod.exact(match.files())
40086
41fcdfe3bfeb narrow: allow repo.narrowmatch(match) to include exact matches from "match"
Martin von Zweigbergk <martinvonz@google.com>
parents: 40082
diff changeset
1756 nm = matchmod.unionmatcher([self._narrowmatch, em])
41fcdfe3bfeb narrow: allow repo.narrowmatch(match) to include exact matches from "match"
Martin von Zweigbergk <martinvonz@google.com>
parents: 40082
diff changeset
1757 return matchmod.intersectmatchers(match, nm)
40082
4fd0fac48922 localrepo: allow narrowmatch() to accept matcher to intersect with
Martin von Zweigbergk <martinvonz@google.com>
parents: 40064
diff changeset
1758 return matchmod.intersectmatchers(match, self._narrowmatch)
36471
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
1759 return self._narrowmatch
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
1760
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
1761 def setnarrowpats(self, newincludes, newexcludes):
39557
623081f2abc2 narrow: remove hack to write narrowspec to shared .hg directory
Yuya Nishihara <yuya@tcha.org>
parents: 39551
diff changeset
1762 narrowspec.save(self, newincludes, newexcludes)
36471
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
1763 self.invalidate(clearfilecache=True)
c28b6d609c47 narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents: 36422
diff changeset
1764
44104
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
1765 @unfilteredpropertycache
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
1766 def _quick_access_changeid_null(self):
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
1767 return {
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46907
diff changeset
1768 b'null': (nullrev, self.nodeconstants.nullid),
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46907
diff changeset
1769 nullrev: (nullrev, self.nodeconstants.nullid),
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46907
diff changeset
1770 self.nullid: (nullrev, self.nullid),
44104
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
1771 }
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
1772
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
1773 @unfilteredpropertycache
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
1774 def _quick_access_changeid_wc(self):
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
1775 # also fast path access to the working copy parents
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
1776 # however, only do it for filter that ensure wc is visible.
45464
4a0ccbecbaa6 repo: avoid copying/updating a dict on every `repo.__getitem__`
Kyle Lippincott <spectral@google.com>
parents: 45433
diff changeset
1777 quick = self._quick_access_changeid_null.copy()
44104
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
1778 cl = self.unfiltered().changelog
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
1779 for node in self.dirstate.parents():
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46907
diff changeset
1780 if node == self.nullid:
44104
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
1781 continue
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
1782 rev = cl.index.get_rev(node)
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
1783 if rev is None:
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
1784 # unknown working copy parent case:
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
1785 #
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
1786 # skip the fast path and let higher code deal with it
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
1787 continue
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
1788 pair = (rev, node)
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
1789 quick[rev] = pair
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
1790 quick[node] = pair
44107
5a012404503b localrepo: also fast past the parents of working copies parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44106
diff changeset
1791 # also add the parents of the parents
5a012404503b localrepo: also fast past the parents of working copies parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44106
diff changeset
1792 for r in cl.parentrevs(rev):
5a012404503b localrepo: also fast past the parents of working copies parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44106
diff changeset
1793 if r == nullrev:
5a012404503b localrepo: also fast past the parents of working copies parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44106
diff changeset
1794 continue
5a012404503b localrepo: also fast past the parents of working copies parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44106
diff changeset
1795 n = cl.node(r)
5a012404503b localrepo: also fast past the parents of working copies parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44106
diff changeset
1796 pair = (r, n)
5a012404503b localrepo: also fast past the parents of working copies parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44106
diff changeset
1797 quick[r] = pair
5a012404503b localrepo: also fast past the parents of working copies parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44106
diff changeset
1798 quick[n] = pair
44105
d86dede17392 localrepo: fastpath access to "."
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44104
diff changeset
1799 p1node = self.dirstate.p1()
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46907
diff changeset
1800 if p1node != self.nullid:
44105
d86dede17392 localrepo: fastpath access to "."
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44104
diff changeset
1801 quick[b'.'] = quick[p1node]
44104
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
1802 return quick
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
1803
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
1804 @unfilteredmethod
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
1805 def _quick_access_changeid_invalidate(self):
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
1806 if '_quick_access_changeid_wc' in vars(self):
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
1807 del self.__dict__['_quick_access_changeid_wc']
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
1808
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
1809 @property
43765
e89e3275f658 localrepo: introduce a `_quick_access_changeid` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43763
diff changeset
1810 def _quick_access_changeid(self):
e89e3275f658 localrepo: introduce a `_quick_access_changeid` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43763
diff changeset
1811 """an helper dictionnary for __getitem__ calls
e89e3275f658 localrepo: introduce a `_quick_access_changeid` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43763
diff changeset
1812
e89e3275f658 localrepo: introduce a `_quick_access_changeid` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43763
diff changeset
1813 This contains a list of symbol we can recognise right away without
e89e3275f658 localrepo: introduce a `_quick_access_changeid` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43763
diff changeset
1814 further processing.
e89e3275f658 localrepo: introduce a `_quick_access_changeid` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43763
diff changeset
1815 """
44104
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
1816 if self.filtername in repoview.filter_has_wc:
45464
4a0ccbecbaa6 repo: avoid copying/updating a dict on every `repo.__getitem__`
Kyle Lippincott <spectral@google.com>
parents: 45433
diff changeset
1817 return self._quick_access_changeid_wc
4a0ccbecbaa6 repo: avoid copying/updating a dict on every `repo.__getitem__`
Kyle Lippincott <spectral@google.com>
parents: 45433
diff changeset
1818 return self._quick_access_changeid_null
43765
e89e3275f658 localrepo: introduce a `_quick_access_changeid` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43763
diff changeset
1819
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6743
diff changeset
1820 def __getitem__(self, changeid):
43750
9c83d28776af localrepo: add some basic comment for block in __getitem__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43735
diff changeset
1821 # dealing with special cases
32660
a722c8e17363 localrepo: map integer and hex wdir identifiers to workingctx
Yuya Nishihara <yuya@tcha.org>
parents: 32481
diff changeset
1822 if changeid is None:
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6743
diff changeset
1823 return context.workingctx(self)
37174
bb47dc2f71a0 context: move reuse of context object to repo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37172
diff changeset
1824 if isinstance(changeid, context.basectx):
bb47dc2f71a0 context: move reuse of context object to repo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37172
diff changeset
1825 return changeid
43750
9c83d28776af localrepo: add some basic comment for block in __getitem__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43735
diff changeset
1826
9c83d28776af localrepo: add some basic comment for block in __getitem__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43735
diff changeset
1827 # dealing with multiple revisions
23630
b9af235810cc localrepo.__getitem__: add slicing support
Eric Sumner <ericsumner@fb.com>
parents: 23561
diff changeset
1828 if isinstance(changeid, slice):
32660
a722c8e17363 localrepo: map integer and hex wdir identifiers to workingctx
Yuya Nishihara <yuya@tcha.org>
parents: 32481
diff changeset
1829 # wdirrev isn't contiguous so the slice shouldn't include it
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1830 return [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1831 self[i]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1832 for i in pycompat.xrange(*changeid.indices(len(self)))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1833 if i not in self.changelog.filteredrevs
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1834 ]
43750
9c83d28776af localrepo: add some basic comment for block in __getitem__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43735
diff changeset
1835
43751
6237cb11753e localrepo: extract handling of some special value in __getitem__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43750
diff changeset
1836 # dealing with some special values
43765
e89e3275f658 localrepo: introduce a `_quick_access_changeid` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43763
diff changeset
1837 quick_access = self._quick_access_changeid.get(changeid)
e89e3275f658 localrepo: introduce a `_quick_access_changeid` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43763
diff changeset
1838 if quick_access is not None:
e89e3275f658 localrepo: introduce a `_quick_access_changeid` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43763
diff changeset
1839 rev, node = quick_access
e89e3275f658 localrepo: introduce a `_quick_access_changeid` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43763
diff changeset
1840 return context.changectx(self, rev, node, maybe_filtered=False)
43752
657bdb724b47 localrepo: extract handling of some special value in __getitem__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43751
diff changeset
1841 if changeid == b'tip':
657bdb724b47 localrepo: extract handling of some special value in __getitem__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43751
diff changeset
1842 node = self.changelog.tip()
657bdb724b47 localrepo: extract handling of some special value in __getitem__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43751
diff changeset
1843 rev = self.changelog.rev(node)
657bdb724b47 localrepo: extract handling of some special value in __getitem__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43751
diff changeset
1844 return context.changectx(self, rev, node)
657bdb724b47 localrepo: extract handling of some special value in __getitem__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43751
diff changeset
1845
43750
9c83d28776af localrepo: add some basic comment for block in __getitem__
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43735
diff changeset
1846 # dealing with arbitrary values
32660
a722c8e17363 localrepo: map integer and hex wdir identifiers to workingctx
Yuya Nishihara <yuya@tcha.org>
parents: 32481
diff changeset
1847 try:
39958
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
1848 if isinstance(changeid, int):
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
1849 node = self.changelog.node(changeid)
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
1850 rev = changeid
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1851 elif changeid == b'.':
39958
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
1852 # this is a hack to delay/avoid loading obsmarkers
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
1853 # when we know that '.' won't be hidden
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
1854 node = self.dirstate.p1()
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
1855 rev = self.unfiltered().changelog.rev(node)
47042
c5e1cc0b4c77 core: don't hard-code node length
Joerg Sonnenberger <joerg@bec.de>
parents: 47041
diff changeset
1856 elif len(changeid) == self.nodeconstants.nodelen:
39958
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
1857 try:
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
1858 node = changeid
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
1859 rev = self.changelog.rev(changeid)
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
1860 except error.FilteredLookupError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1861 changeid = hex(changeid) # for the error message
39958
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
1862 raise
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
1863 except LookupError:
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
1864 # check if it might have come from damaged dirstate
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
1865 #
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
1866 # XXX we could avoid the unfiltered if we had a recognizable
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
1867 # exception for filtered changeset access
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1868 if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1869 self.local()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1870 and changeid in self.unfiltered().dirstate.parents()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1871 ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1872 msg = _(b"working directory has unknown parent '%s'!")
39958
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
1873 raise error.Abort(msg % short(changeid))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1874 changeid = hex(changeid) # for the error message
40063
f84d7ed3bb35 repo: remove the last few "pass" statements in localrepo.__getitem__
Martin von Zweigbergk <martinvonz@google.com>
parents: 40056
diff changeset
1875 raise
39958
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
1876
47041
a407fe56d6e8 core: don't hard-code hex node lengths
Joerg Sonnenberger <joerg@bec.de>
parents: 47012
diff changeset
1877 elif len(changeid) == 2 * self.nodeconstants.nodelen:
40063
f84d7ed3bb35 repo: remove the last few "pass" statements in localrepo.__getitem__
Martin von Zweigbergk <martinvonz@google.com>
parents: 40056
diff changeset
1878 node = bin(changeid)
f84d7ed3bb35 repo: remove the last few "pass" statements in localrepo.__getitem__
Martin von Zweigbergk <martinvonz@google.com>
parents: 40056
diff changeset
1879 rev = self.changelog.rev(node)
39958
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
1880 else:
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
1881 raise error.ProgrammingError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1882 b"unsupported changeid '%s' of type %s"
43710
c5bcd946a34b py3: use pycompat.bytestr() instead of pycompat.sysstr()
Manuel Jacob <me@manueljacob.de>
parents: 43587
diff changeset
1883 % (changeid, pycompat.bytestr(type(changeid)))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1884 )
39958
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
1885
40064
5c3585a58845 repo: create changectx in a single place in localrepo.__getitem__
Martin von Zweigbergk <martinvonz@google.com>
parents: 40063
diff changeset
1886 return context.changectx(self, rev, node)
5c3585a58845 repo: create changectx in a single place in localrepo.__getitem__
Martin von Zweigbergk <martinvonz@google.com>
parents: 40063
diff changeset
1887
39958
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
1888 except (error.FilteredIndexError, error.FilteredLookupError):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1889 raise error.FilteredRepoLookupError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1890 _(b"filtered revision '%s'") % pycompat.bytestr(changeid)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1891 )
40063
f84d7ed3bb35 repo: remove the last few "pass" statements in localrepo.__getitem__
Martin von Zweigbergk <martinvonz@google.com>
parents: 40056
diff changeset
1892 except (IndexError, LookupError):
40353
a2ebdca4d10e localrepo: ensure we properly %-format int in exception throw
Augie Fackler <augie@google.com>
parents: 40324
diff changeset
1893 raise error.RepoLookupError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1894 _(b"unknown revision '%s'") % pycompat.bytestr(changeid)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1895 )
32660
a722c8e17363 localrepo: map integer and hex wdir identifiers to workingctx
Yuya Nishihara <yuya@tcha.org>
parents: 32481
diff changeset
1896 except error.WdirUnsupported:
a722c8e17363 localrepo: map integer and hex wdir identifiers to workingctx
Yuya Nishihara <yuya@tcha.org>
parents: 32481
diff changeset
1897 return context.workingctx(self)
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6743
diff changeset
1898
9924
ea3acaae25bb localrepo: support 'rev in repo' syntax
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9820
diff changeset
1899 def __contains__(self, changeid):
46114
c6ae1982b2a1 localrepo: delete obsolete comment about `prefix in repo` raising exception
Martin von Zweigbergk <martinvonz@google.com>
parents: 46096
diff changeset
1900 """True if the given changeid exists"""
9924
ea3acaae25bb localrepo: support 'rev in repo' syntax
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9820
diff changeset
1901 try:
24320
b9f7f3eeb99c localrepo: extend "changeid in repo" to return True for workingctx revision
Yuya Nishihara <yuya@tcha.org>
parents: 24306
diff changeset
1902 self[changeid]
b9f7f3eeb99c localrepo: extend "changeid in repo" to return True for workingctx revision
Yuya Nishihara <yuya@tcha.org>
parents: 24306
diff changeset
1903 return True
37797
43221a57e22f context: translate FilteredIndex/LookupError at repo[changeid] (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37717
diff changeset
1904 except error.RepoLookupError:
9924
ea3acaae25bb localrepo: support 'rev in repo' syntax
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9820
diff changeset
1905 return False
ea3acaae25bb localrepo: support 'rev in repo' syntax
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9820
diff changeset
1906
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
1907 def __nonzero__(self):
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
1908 return True
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
1909
31476
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31466
diff changeset
1910 __bool__ = __nonzero__
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31466
diff changeset
1911
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
1912 def __len__(self):
35736
29f57ce416ed localrepo: micro-optimize __len__() to bypass repoview
Yuya Nishihara <yuya@tcha.org>
parents: 35726
diff changeset
1913 # no need to pay the cost of repoview.changelog
29f57ce416ed localrepo: micro-optimize __len__() to bypass repoview
Yuya Nishihara <yuya@tcha.org>
parents: 35726
diff changeset
1914 unfi = self.unfiltered()
29f57ce416ed localrepo: micro-optimize __len__() to bypass repoview
Yuya Nishihara <yuya@tcha.org>
parents: 35726
diff changeset
1915 return len(unfi.changelog)
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
1916
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6747
diff changeset
1917 def __iter__(self):
17675
8575f4a2126e clfilter: remove usage of `range` in favor of iteration over changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17670
diff changeset
1918 return iter(self.changelog)
2155
ff255b41b4aa support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2150
diff changeset
1919
15403
e27561eb4a76 localrepo: add revs helper method
Matt Mackall <mpm@selenic.com>
parents: 15381
diff changeset
1920 def revs(self, expr, *args):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
1921 """Find revisions matching a revset.
27071
dfb31eebd949 localrepo: improve docstring for revset methods
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26998
diff changeset
1922
dfb31eebd949 localrepo: improve docstring for revset methods
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26998
diff changeset
1923 The revset is specified as a string ``expr`` that may contain
31024
0b8356705de6 revset: split language services to revsetlang module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 30989
diff changeset
1924 %-formatting to escape certain types. See ``revsetlang.formatspec``.
27071
dfb31eebd949 localrepo: improve docstring for revset methods
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26998
diff changeset
1925
29417
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29373
diff changeset
1926 Revset aliases from the configuration are not expanded. To expand
31025
6cf2857526c7 scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents: 31024
diff changeset
1927 user aliases, consider calling ``scmutil.revrange()`` or
6cf2857526c7 scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents: 31024
diff changeset
1928 ``repo.anyrevs([expr], user=True)``.
29417
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29373
diff changeset
1929
44075
2122ffa903ea doc: fix references to `revset.abstractsmartset`
Matt Harbison <matt_harbison@yahoo.com>
parents: 44060
diff changeset
1930 Returns a smartset.abstractsmartset, which is a list-like interface
27071
dfb31eebd949 localrepo: improve docstring for revset methods
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26998
diff changeset
1931 that contains integer revisions.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
1932 """
41222
8aca89a694d4 revset: introduce an API that avoids `formatspec` input serialization
Boris Feld <boris.feld@octobus.net>
parents: 41202
diff changeset
1933 tree = revsetlang.spectree(expr, *args)
8aca89a694d4 revset: introduce an API that avoids `formatspec` input serialization
Boris Feld <boris.feld@octobus.net>
parents: 41202
diff changeset
1934 return revset.makematcher(tree)(self)
15403
e27561eb4a76 localrepo: add revs helper method
Matt Mackall <mpm@selenic.com>
parents: 15381
diff changeset
1935
14902
96a72cbc6c29 localrepo: add set method to iterate over a given revset
Matt Mackall <mpm@selenic.com>
parents: 14870
diff changeset
1936 def set(self, expr, *args):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
1937 """Find revisions matching a revset and emit changectx instances.
27071
dfb31eebd949 localrepo: improve docstring for revset methods
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26998
diff changeset
1938
dfb31eebd949 localrepo: improve docstring for revset methods
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26998
diff changeset
1939 This is a convenience wrapper around ``revs()`` that iterates the
dfb31eebd949 localrepo: improve docstring for revset methods
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26998
diff changeset
1940 result and is a generator of changectx instances.
29417
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29373
diff changeset
1941
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29373
diff changeset
1942 Revset aliases from the configuration are not expanded. To expand
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29373
diff changeset
1943 user aliases, consider calling ``scmutil.revrange()``.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
1944 """
15403
e27561eb4a76 localrepo: add revs helper method
Matt Mackall <mpm@selenic.com>
parents: 15381
diff changeset
1945 for r in self.revs(expr, *args):
14902
96a72cbc6c29 localrepo: add set method to iterate over a given revset
Matt Mackall <mpm@selenic.com>
parents: 14870
diff changeset
1946 yield self[r]
96a72cbc6c29 localrepo: add set method to iterate over a given revset
Matt Mackall <mpm@selenic.com>
parents: 14870
diff changeset
1947
33336
4672db164c98 revset: make repo.anyrevs accept customized alias override (API)
Jun Wu <quark@fb.com>
parents: 33302
diff changeset
1948 def anyrevs(self, specs, user=False, localalias=None):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
1949 """Find revisions matching one of the given revsets.
31025
6cf2857526c7 scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents: 31024
diff changeset
1950
6cf2857526c7 scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents: 31024
diff changeset
1951 Revset aliases from the configuration are not expanded by default. To
33336
4672db164c98 revset: make repo.anyrevs accept customized alias override (API)
Jun Wu <quark@fb.com>
parents: 33302
diff changeset
1952 expand user aliases, specify ``user=True``. To provide some local
4672db164c98 revset: make repo.anyrevs accept customized alias override (API)
Jun Wu <quark@fb.com>
parents: 33302
diff changeset
1953 definitions overriding user aliases, set ``localalias`` to
4672db164c98 revset: make repo.anyrevs accept customized alias override (API)
Jun Wu <quark@fb.com>
parents: 33302
diff changeset
1954 ``{name: definitionstring}``.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
1955 """
43758
09409a3fc3cc localrepo: recognize trivial "null" queries in `anyrev`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43757
diff changeset
1956 if specs == [b'null']:
09409a3fc3cc localrepo: recognize trivial "null" queries in `anyrev`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43757
diff changeset
1957 return revset.baseset([nullrev])
44106
bfaf4c673bec localrepo: recognize trivial request for '.'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44105
diff changeset
1958 if specs == [b'.']:
bfaf4c673bec localrepo: recognize trivial request for '.'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44105
diff changeset
1959 quick_data = self._quick_access_changeid.get(b'.')
bfaf4c673bec localrepo: recognize trivial request for '.'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44105
diff changeset
1960 if quick_data is not None:
bfaf4c673bec localrepo: recognize trivial request for '.'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44105
diff changeset
1961 return revset.baseset([quick_data[0]])
31025
6cf2857526c7 scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents: 31024
diff changeset
1962 if user:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1963 m = revset.matchany(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1964 self.ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1965 specs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1966 lookup=revset.lookupfn(self),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1967 localalias=localalias,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
1968 )
31025
6cf2857526c7 scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents: 31024
diff changeset
1969 else:
33336
4672db164c98 revset: make repo.anyrevs accept customized alias override (API)
Jun Wu <quark@fb.com>
parents: 33302
diff changeset
1970 m = revset.matchany(None, specs, localalias=localalias)
31025
6cf2857526c7 scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents: 31024
diff changeset
1971 return m(self)
6cf2857526c7 scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents: 31024
diff changeset
1972
2673
109a22f5434a hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2661
diff changeset
1973 def url(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1974 return b'file:' + self.root
2673
109a22f5434a hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2661
diff changeset
1975
1718
c1996b84d4f5 make hook code nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1717
diff changeset
1976 def hook(self, name, throw=False, **args):
21866
a2ca9dcb4b77 localrepo: document localrepo.hook()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21702
diff changeset
1977 """Call a hook, passing this repo instance.
a2ca9dcb4b77 localrepo: document localrepo.hook()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21702
diff changeset
1978
a2ca9dcb4b77 localrepo: document localrepo.hook()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21702
diff changeset
1979 This a convenience method to aid invoking hooks. Extensions likely
a2ca9dcb4b77 localrepo: document localrepo.hook()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21702
diff changeset
1980 won't call this unless they have registered a custom hook or are
a2ca9dcb4b77 localrepo: document localrepo.hook()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21702
diff changeset
1981 replacing code that is expected to call a hook.
a2ca9dcb4b77 localrepo: document localrepo.hook()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21702
diff changeset
1982 """
4622
fff50306e6dd hooks: separate hook code into a separate module
Matt Mackall <mpm@selenic.com>
parents: 4619
diff changeset
1983 return hook.hook(self.ui, self, name, throw, **args)
487
2ad41189bee5 Add initial hook support
mpm@selenic.com
parents: 484
diff changeset
1984
18013
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
1985 @filteredpropertycache
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
1986 def _tagscache(self):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
1987 """Returns a tagscache object that contains various tags related
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
1988 caches."""
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
1989
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
1990 # This simplifies its cache management by having one decorated
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
1991 # function (this one) and the rest simply fetch things from it.
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
1992 class tagscache(object):
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
1993 def __init__(self):
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
1994 # These two define the set of tags for this repository. tags
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
1995 # maps tag name to node; tagtypes maps tag name to 'global' or
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
1996 # 'local'. (Global tags are defined by .hgtags across all
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
1997 # heads, and local tags are defined in .hg/localtags.)
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
1998 # They constitute the in-memory cache of tags.
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
1999 self.tags = self.tagtypes = None
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
2000
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
2001 self.nodetagscache = self.tagslist = None
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
2002
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
2003 cache = tagscache()
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
2004 cache.tags, cache.tagtypes = self._findtags()
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
2005
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
2006 return cache
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
2007
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
2008 def tags(self):
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
2009 '''return a mapping of tag to node'''
16371
4417eb761ba8 tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents: 16361
diff changeset
2010 t = {}
17715
21c503480986 clfilter: do not use tags cache if there are filtered changesets
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17714
diff changeset
2011 if self.changelog.filteredrevs:
21c503480986 clfilter: do not use tags cache if there are filtered changesets
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17714
diff changeset
2012 tags, tt = self._findtags()
21c503480986 clfilter: do not use tags cache if there are filtered changesets
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17714
diff changeset
2013 else:
21c503480986 clfilter: do not use tags cache if there are filtered changesets
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17714
diff changeset
2014 tags = self._tagscache.tags
40745
300f8564220f tags: cache `repo.changelog` access when checking tags nodes
Boris Feld <boris.feld@octobus.net>
parents: 40729
diff changeset
2015 rev = self.changelog.rev
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43104
diff changeset
2016 for k, v in pycompat.iteritems(tags):
16371
4417eb761ba8 tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents: 16361
diff changeset
2017 try:
4417eb761ba8 tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents: 16361
diff changeset
2018 # ignore tags to unknown nodes
40745
300f8564220f tags: cache `repo.changelog` access when checking tags nodes
Boris Feld <boris.feld@octobus.net>
parents: 40729
diff changeset
2019 rev(v)
16371
4417eb761ba8 tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents: 16361
diff changeset
2020 t[k] = v
16679
2950d186a927 parsers: strictly check for 20-byte hashes where they're required
Bryan O'Sullivan <bryano@fb.com>
parents: 16551
diff changeset
2021 except (error.LookupError, ValueError):
16371
4417eb761ba8 tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents: 16361
diff changeset
2022 pass
4417eb761ba8 tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents: 16361
diff changeset
2023 return t
4210
caff92047e87 Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents: 4178
diff changeset
2024
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
2025 def _findtags(self):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
2026 """Do the hard work of finding tags. Return a pair of dicts
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
2027 (tags, tagtypes) where tags maps tag name to node, and tagtypes
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
2028 maps tag name to a string like \'global\' or \'local\'.
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
2029 Subclasses or extensions are free to add their own tags, but
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
2030 should be aware that the returned dicts will be retained for the
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
2031 duration of the localrepo object."""
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
2032
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
2033 # XXX what tagtype should subclasses/extensions use? Currently
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
2034 # mq and bookmarks add tags, but do not set the tagtype at all.
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
2035 # Should each extension invent its own tag type? Should there
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
2036 # be one tagtype for all such "virtual" tags? Or is the status
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
2037 # quo fine?
4210
caff92047e87 Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents: 4178
diff changeset
2038
31709
c34c170b25f3 tags: only return 'alltags' in 'findglobaltags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31706
diff changeset
2039 # map tag name to (node, hist)
c34c170b25f3 tags: only return 'alltags' in 'findglobaltags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31706
diff changeset
2040 alltags = tagsmod.findglobaltags(self.ui, self)
c34c170b25f3 tags: only return 'alltags' in 'findglobaltags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31706
diff changeset
2041 # map tag name to tag type
44452
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44445
diff changeset
2042 tagtypes = {tag: b'global' for tag in alltags}
31706
63d4deda1b31 tags: do not feed dictionaries to 'findglobaltags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31672
diff changeset
2043
10651
5f091fc1bab7 style: use consistent variable names (*mod) with imports which would shadow
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10547
diff changeset
2044 tagsmod.readlocaltags(self.ui, self, alltags, tagtypes)
5657
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
2045
9152
4017291c4c48 tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents: 9151
diff changeset
2046 # Build the return dicts. Have to re-encode tag names because
4017291c4c48 tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents: 9151
diff changeset
2047 # the tags module always uses UTF-8 (in order not to lose info
4017291c4c48 tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents: 9151
diff changeset
2048 # writing to the cache), but the rest of Mercurial wants them in
4017291c4c48 tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents: 9151
diff changeset
2049 # local encoding.
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
2050 tags = {}
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43104
diff changeset
2051 for (name, (node, hist)) in pycompat.iteritems(alltags):
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46907
diff changeset
2052 if node != self.nullid:
16371
4417eb761ba8 tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents: 16361
diff changeset
2053 tags[encoding.tolocal(name)] = node
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2054 tags[b'tip'] = self.changelog.tip()
44452
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44445
diff changeset
2055 tagtypes = {
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44445
diff changeset
2056 encoding.tolocal(name): value
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44445
diff changeset
2057 for (name, value) in pycompat.iteritems(tagtypes)
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44445
diff changeset
2058 }
9145
6b03f93b8ff3 localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9134
diff changeset
2059 return (tags, tagtypes)
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
2060
5657
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
2061 def tagtype(self, tagname):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
2062 """
5657
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
2063 return the type of the given tag. result can be:
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
2064
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
2065 'local' : a local tag
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
2066 'global' : a global tag
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
2067 None : tag does not exist
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
2068 """
5657
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
2069
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
2070 return self._tagscache.tagtypes.get(tagname)
5657
47915bf68c44 Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents: 5637
diff changeset
2071
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
2072 def tagslist(self):
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
2073 '''return a list of tags ordered by revision'''
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
2074 if not self._tagscache.tagslist:
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
2075 l = []
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43104
diff changeset
2076 for t, n in pycompat.iteritems(self.tags()):
22201
269688a398c4 cleanup: fix some list comprehension redefinitions of existing vars
Mads Kiilerich <madski@unity3d.com>
parents: 22080
diff changeset
2077 l.append((self.changelog.rev(n), t, n))
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
2078 self._tagscache.tagslist = [(t, n) for r, t, n in sorted(l)]
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
2079
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
2080 return self._tagscache.tagslist
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
2081
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
2082 def nodetags(self, node):
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
2083 '''return the tags associated with a node'''
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
2084 if not self._tagscache.nodetagscache:
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
2085 nodetagscache = {}
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43104
diff changeset
2086 for t, n in pycompat.iteritems(self._tagscache.tags):
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
2087 nodetagscache.setdefault(n, []).append(t)
43104
74802979dd9d py3: define and use pycompat.itervalues()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43090
diff changeset
2088 for tags in pycompat.itervalues(nodetagscache):
11047
c7dbd6c4877a tags: return tags in sorted order
Eric Eisner <ede@mit.edu>
parents: 10970
diff changeset
2089 tags.sort()
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
2090 self._tagscache.nodetagscache = nodetagscache
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
2091 return self._tagscache.nodetagscache.get(node, [])
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
2092
13384
caa561759538 context: add method to return all bookmarks pointing to a node
David Soria Parra <dsp@php.net>
parents: 13365
diff changeset
2093 def nodebookmarks(self, node):
27166
263db31329a6 localrepo: document nodebookmarks
Augie Fackler <augie@google.com>
parents: 27165
diff changeset
2094 """return the list of bookmarks pointing to the specified node"""
37848
6e2259847f5f bookmarks: extract function that looks up bookmark names by node
Yuya Nishihara <yuya@tcha.org>
parents: 37810
diff changeset
2095 return self._bookmarks.names(node)
13384
caa561759538 context: add method to return all bookmarks pointing to a node
David Soria Parra <dsp@php.net>
parents: 13365
diff changeset
2096
12066
d01e28657429 localrepo: introduce method for explicit branch cache update
Georg Brandl <georg@python.org>
parents: 12035
diff changeset
2097 def branchmap(self):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
2098 """returns a dictionary {branch: [branchheads]} with branchheads
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
2099 ordered by increasing revision number"""
41615
328ca3b9e545 branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents: 41529
diff changeset
2100 return self._branchcaches[self]
17714
5210e5a556d9 clfilter: do not use branchmap cache if there are filtered changesets
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17675
diff changeset
2101
24373
59cc09240afb revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents: 24320
diff changeset
2102 @unfilteredmethod
59cc09240afb revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents: 24320
diff changeset
2103 def revbranchcache(self):
59cc09240afb revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents: 24320
diff changeset
2104 if not self._revbranchcache:
59cc09240afb revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents: 24320
diff changeset
2105 self._revbranchcache = branchmap.revbranchcache(self.unfiltered())
59cc09240afb revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents: 24320
diff changeset
2106 return self._revbranchcache
59cc09240afb revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents: 24320
diff changeset
2107
46371
0903d6b9b1df repository: introduce register_changeset callback
Joerg Sonnenberger <joerg@bec.de>
parents: 46334
diff changeset
2108 def register_changeset(self, rev, changelogrevision):
46372
3e91d9978bec branchmap: update rev-branch-cache incrementally
Joerg Sonnenberger <joerg@bec.de>
parents: 46371
diff changeset
2109 self.revbranchcache().setdata(rev, changelogrevision)
46371
0903d6b9b1df repository: introduce register_changeset callback
Joerg Sonnenberger <joerg@bec.de>
parents: 46334
diff changeset
2110
23775
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
2111 def branchtip(self, branch, ignoremissing=False):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
2112 """return the tip node for a given branch
23775
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
2113
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
2114 If ignoremissing is True, then this method will not raise an error.
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
2115 This is helpful for callers that only expect None for a missing branch
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
2116 (e.g. namespace).
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
2117
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
2118 """
20187
4d6d5ef88538 localrepo: refactor repo.branchtip() to use repo.branchmap().branchtip()
Brodie Rao <brodie@sf.io>
parents: 20184
diff changeset
2119 try:
4d6d5ef88538 localrepo: refactor repo.branchtip() to use repo.branchmap().branchtip()
Brodie Rao <brodie@sf.io>
parents: 20184
diff changeset
2120 return self.branchmap().branchtip(branch)
4d6d5ef88538 localrepo: refactor repo.branchtip() to use repo.branchmap().branchtip()
Brodie Rao <brodie@sf.io>
parents: 20184
diff changeset
2121 except KeyError:
23775
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
2122 if not ignoremissing:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2123 raise error.RepoLookupError(_(b"unknown branch '%s'") % branch)
23775
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
2124 else:
885c0290f7d5 localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents: 23749
diff changeset
2125 pass
16719
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16716
diff changeset
2126
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 337
diff changeset
2127 def lookup(self, key):
42079
fcd7a91dec23 localrepo: don't allow lookup of working directory revision
Martin von Zweigbergk <martinvonz@google.com>
parents: 42062
diff changeset
2128 node = scmutil.revsymbol(self, key).node()
fcd7a91dec23 localrepo: don't allow lookup of working directory revision
Martin von Zweigbergk <martinvonz@google.com>
parents: 42062
diff changeset
2129 if node is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2130 raise error.RepoLookupError(_(b"unknown revision '%s'") % key)
42079
fcd7a91dec23 localrepo: don't allow lookup of working directory revision
Martin von Zweigbergk <martinvonz@google.com>
parents: 42062
diff changeset
2131 return node
67
a182f2561c8e Add tag support
mpm@selenic.com
parents: 65
diff changeset
2132
37351
fdd22bf6398f localrepo: drop "remote" argument from lookupbranch() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 37321
diff changeset
2133 def lookupbranch(self, key):
42004
0bd730fbcc2b branchcache: introduce hasbranch()
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42001
diff changeset
2134 if self.branchmap().hasbranch(key):
10960
ca739acf1a98 commands: add more robust support for 'hg log -b' (issue2078)
Steve Losh <steve@stevelosh.com>
parents: 10926
diff changeset
2135 return key
ca739acf1a98 commands: add more robust support for 'hg log -b' (issue2078)
Steve Losh <steve@stevelosh.com>
parents: 10926
diff changeset
2136
37352
92171562c7f3 localrepo: use revsymbol in lookupbranch() too
Martin von Zweigbergk <martinvonz@google.com>
parents: 37351
diff changeset
2137 return scmutil.revsymbol(self, key).branch()
10960
ca739acf1a98 commands: add more robust support for 'hg log -b' (issue2078)
Steve Losh <steve@stevelosh.com>
parents: 10926
diff changeset
2138
13723
e615765fdcc7 wireproto: add known([id]) function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13720
diff changeset
2139 def known(self, nodes):
27319
b64b6fdc5c9b discovery: properly filter changeset in 'peer.known' (issue4982)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27291
diff changeset
2140 cl = self.changelog
43555
ded3d545b6f0 index: use `index.get_rev` in `localrepo.known`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43537
diff changeset
2141 get_rev = cl.index.get_rev
27319
b64b6fdc5c9b discovery: properly filter changeset in 'peer.known' (issue4982)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27291
diff changeset
2142 filtered = cl.filteredrevs
15889
816209eaf963 phases: make secret changeset undiscoverable in all case
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15888
diff changeset
2143 result = []
816209eaf963 phases: make secret changeset undiscoverable in all case
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15888
diff changeset
2144 for n in nodes:
43555
ded3d545b6f0 index: use `index.get_rev` in `localrepo.known`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43537
diff changeset
2145 r = get_rev(n)
27319
b64b6fdc5c9b discovery: properly filter changeset in 'peer.known' (issue4982)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27291
diff changeset
2146 resp = not (r is None or r in filtered)
15889
816209eaf963 phases: make secret changeset undiscoverable in all case
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15888
diff changeset
2147 result.append(resp)
816209eaf963 phases: make secret changeset undiscoverable in all case
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15888
diff changeset
2148 return result
13723
e615765fdcc7 wireproto: add known([id]) function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13720
diff changeset
2149
926
b765e970c9ff Add a local() method to repository classes
mpm@selenic.com
parents: 923
diff changeset
2150 def local(self):
14603
68a43fdd7d80 localrepo: local() returns self
Matt Mackall <mpm@selenic.com>
parents: 14549
diff changeset
2151 return self
926
b765e970c9ff Add a local() method to repository classes
mpm@selenic.com
parents: 923
diff changeset
2152
25623
0bee97fa1fa8 publishing: add helper method to localrepo
Matt Mackall <mpm@selenic.com>
parents: 25290
diff changeset
2153 def publishing(self):
25625
ce9e231265c1 publishing: unconditionally trust publishing flag
Matt Mackall <mpm@selenic.com>
parents: 25624
diff changeset
2154 # it's safe (and desirable) to trust the publish flag unconditionally
ce9e231265c1 publishing: unconditionally trust publishing flag
Matt Mackall <mpm@selenic.com>
parents: 25624
diff changeset
2155 # so that we don't finalize changes shared between users via ssh or nfs
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2156 return self.ui.configbool(b'phases', b'publish', untrusted=True)
25623
0bee97fa1fa8 publishing: add helper method to localrepo
Matt Mackall <mpm@selenic.com>
parents: 25290
diff changeset
2157
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
2158 def cancopy(self):
20332
a959f7167077 clone: do not turn hidden changeset public on publishing clone (issue3935)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20314
diff changeset
2159 # so statichttprepo's override of local() works
a959f7167077 clone: do not turn hidden changeset public on publishing clone (issue3935)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20314
diff changeset
2160 if not self.local():
a959f7167077 clone: do not turn hidden changeset public on publishing clone (issue3935)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20314
diff changeset
2161 return False
25624
f0745da75056 publishing: use new helper method
Matt Mackall <mpm@selenic.com>
parents: 25623
diff changeset
2162 if not self.publishing():
20332
a959f7167077 clone: do not turn hidden changeset public on publishing clone (issue3935)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20314
diff changeset
2163 return True
a959f7167077 clone: do not turn hidden changeset public on publishing clone (issue3935)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20314
diff changeset
2164 # if publishing we can't copy if there is filtered content
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2165 return not self.filtered(b'visible').changelog.filteredrevs
17192
1ac628cd7113 peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 17183
diff changeset
2166
23666
965788d9ae09 localrepo: introduce shared method to check if a repository is shared
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23648
diff changeset
2167 def shared(self):
965788d9ae09 localrepo: introduce shared method to check if a repository is shared
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23648
diff changeset
2168 '''the type of shared repository (None if not shared)'''
965788d9ae09 localrepo: introduce shared method to check if a repository is shared
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23648
diff changeset
2169 if self.sharedpath != self.path:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2170 return b'store'
23666
965788d9ae09 localrepo: introduce shared method to check if a repository is shared
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23648
diff changeset
2171 return None
965788d9ae09 localrepo: introduce shared method to check if a repository is shared
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23648
diff changeset
2172
22362
c9b32c6a2944 localrepo: make it possible to pass multiple path elements to join and wjoin
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 22342
diff changeset
2173 def wjoin(self, f, *insidef):
23714
e3a0e7e21f54 localrepo: use vfs.reljoin rather than os.path.join in the localrepository class
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23710
diff changeset
2174 return self.vfs.reljoin(self.root, f, *insidef)
244
43105253cf5e root relative IO and valid commit states
mpm@selenic.com
parents: 241
diff changeset
2175
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46907
diff changeset
2176 def setparents(self, p1, p2=None):
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46907
diff changeset
2177 if p2 is None:
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46907
diff changeset
2178 p2 = self.nullid
44052
b74270da5eee workingctx: move setparents() logic from localrepo to mirror overlayworkingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 44043
diff changeset
2179 self[None].setparents(p1, p2)
44104
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
2180 self._quick_access_changeid_invalidate()
16551
ebf6d38c9063 localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents: 16536
diff changeset
2181
37172
daef13da66fe context: avoid using a context object as a changeid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37137
diff changeset
2182 def filectx(self, path, changeid=None, fileid=None, changectx=None):
40718
5bcf264bb1a0 localrepo: correct docstring of filectx()
Yuya Nishihara <yuya@tcha.org>
parents: 40535
diff changeset
2183 """changeid must be a changeset revision, if specified.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
2184 fileid can be a file revision or node."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2185 return context.filectx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2186 self, path, changeid, fileid, changectx=changectx
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2187 )
2564
55e592041076 Add context helper functions to localrepo
Matt Mackall <mpm@selenic.com>
parents: 2491
diff changeset
2188
627
b6c42714d900 Add locate command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 624
diff changeset
2189 def getcwd(self):
870
a82eae840447 Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents: 839
diff changeset
2190 return self.dirstate.getcwd()
627
b6c42714d900 Add locate command.
Bryan O'Sullivan <bos@serpentine.com>
parents: 624
diff changeset
2191
4525
78b6add1f966 Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4516
diff changeset
2192 def pathto(self, f, cwd=None):
78b6add1f966 Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4516
diff changeset
2193 return self.dirstate.pathto(f, cwd)
78b6add1f966 Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4516
diff changeset
2194
11698
9df481f8036d localrepo: refactor filter computation
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11669
diff changeset
2195 def _loadfilter(self, filter):
37137
db90a5793103 localrepo: make filterpats private (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37135
diff changeset
2196 if filter not in self._filterpats:
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
2197 l = []
4004
c83c35f2f4e2 unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents: 4003
diff changeset
2198 for pat, cmd in self.ui.configitems(filter):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2199 if cmd == b'!':
7226
b71a52f101dc Make it possible to disable filtering for a pattern.
Mads Kiilerich <mads@kiilerich.com>
parents: 7208
diff changeset
2200 continue
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2201 mf = matchmod.match(self.root, b'', [pat])
5966
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
2202 fn = None
6066
f3a8b5360100 Strip filter name from command before passing to filter function.
Jesse Glick <jesse.glick@sun.com>
parents: 6065
diff changeset
2203 params = cmd
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43104
diff changeset
2204 for name, filterfn in pycompat.iteritems(self._datafilters):
6210
942287cb1f57 Removed trailing spaces from everything except test output
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6201
diff changeset
2205 if cmd.startswith(name):
5966
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
2206 fn = filterfn
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2207 params = cmd[len(name) :].lstrip()
5966
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
2208 break
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
2209 if not fn:
37120
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
2210 fn = lambda s, c, **kwargs: procutil.filter(s, c)
43201
6ceb3721e203 localrepo: debug log of filter name when filtering through a function
Mads Kiilerich <mads@kiilerich.com>
parents: 43167
diff changeset
2211 fn.__name__ = 'commandfilter'
5967
f8ad3b76e923 Provide better context for custom Python encode/decode filters.
Jesse Glick <jesse.glick@sun.com>
parents: 5966
diff changeset
2212 # Wrap old filters not supporting keyword arguments
36178
646002338365 py3: introduce and use pycompat.getargspec
Augie Fackler <augie@google.com>
parents: 36009
diff changeset
2213 if not pycompat.getargspec(fn)[2]:
5967
f8ad3b76e923 Provide better context for custom Python encode/decode filters.
Jesse Glick <jesse.glick@sun.com>
parents: 5966
diff changeset
2214 oldfn = fn
43202
8864aa96f1f6 localrepo: fix variable binding in handling of old filters
Mads Kiilerich <mads@kiilerich.com>
parents: 43201
diff changeset
2215 fn = lambda s, c, oldfn=oldfn, **kwargs: oldfn(s, c)
43201
6ceb3721e203 localrepo: debug log of filter name when filtering through a function
Mads Kiilerich <mads@kiilerich.com>
parents: 43167
diff changeset
2216 fn.__name__ = 'compat-' + oldfn.__name__
6066
f3a8b5360100 Strip filter name from command before passing to filter function.
Jesse Glick <jesse.glick@sun.com>
parents: 6065
diff changeset
2217 l.append((mf, fn, params))
37137
db90a5793103 localrepo: make filterpats private (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37135
diff changeset
2218 self._filterpats[filter] = l
db90a5793103 localrepo: make filterpats private (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37135
diff changeset
2219 return self._filterpats[filter]
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
2220
12707
2216ab103ea8 localrepo: load filter patterns outside of _filter
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12706
diff changeset
2221 def _filter(self, filterpats, filename, data):
2216ab103ea8 localrepo: load filter patterns outside of _filter
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12706
diff changeset
2222 for mf, fn, cmd in filterpats:
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
2223 if mf(filename):
43201
6ceb3721e203 localrepo: debug log of filter name when filtering through a function
Mads Kiilerich <mads@kiilerich.com>
parents: 43167
diff changeset
2224 self.ui.debug(
6ceb3721e203 localrepo: debug log of filter name when filtering through a function
Mads Kiilerich <mads@kiilerich.com>
parents: 43167
diff changeset
2225 b"filtering %s through %s\n"
6ceb3721e203 localrepo: debug log of filter name when filtering through a function
Mads Kiilerich <mads@kiilerich.com>
parents: 43167
diff changeset
2226 % (filename, cmd or pycompat.sysbytes(fn.__name__))
6ceb3721e203 localrepo: debug log of filter name when filtering through a function
Mads Kiilerich <mads@kiilerich.com>
parents: 43167
diff changeset
2227 )
5967
f8ad3b76e923 Provide better context for custom Python encode/decode filters.
Jesse Glick <jesse.glick@sun.com>
parents: 5966
diff changeset
2228 data = fn(data, cmd, ui=self.ui, repo=self, filename=filename)
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
2229 break
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
2230
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
2231 return data
1019
a9cca981c423 Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents: 1013
diff changeset
2232
18013
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
2233 @unfilteredpropertycache
12708
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
2234 def _encodefilterpats(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2235 return self._loadfilter(b'encode')
12708
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
2236
18013
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
2237 @unfilteredpropertycache
12708
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
2238 def _decodefilterpats(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2239 return self._loadfilter(b'decode')
12708
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
2240
5966
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
2241 def adddatafilter(self, name, filter):
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
2242 self._datafilters[name] = filter
11af38a592ae Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents: 5915
diff changeset
2243
4004
c83c35f2f4e2 unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents: 4003
diff changeset
2244 def wread(self, filename):
31428
9b361478b03a localrepo: use self.wvfs.islink directly
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31418
diff changeset
2245 if self.wvfs.islink(filename):
18950
647e3b0c8751 localrepo: use "vfs.readlink()" instead of "os.readlink()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18949
diff changeset
2246 data = self.wvfs.readlink(filename)
4004
c83c35f2f4e2 unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents: 4003
diff changeset
2247 else:
23854
f6070d3a9cb8 localrepo: remove all internal uses of localrepo.wopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23853
diff changeset
2248 data = self.wvfs.read(filename)
12708
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
2249 return self._filter(self._encodefilterpats, filename, data)
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
2250
35725
2a7e777c9eed write: add the possibility to pass keyword argument from batchget to vfs
Boris Feld <boris.feld@octobus.net>
parents: 35708
diff changeset
2251 def wwrite(self, filename, data, flags, backgroundclose=False, **kwargs):
24843
21b33f0460e0 revert: apply normallookup on reverted file if size isn't changed (issue4583)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24825
diff changeset
2252 """write ``data`` into ``filename`` in the working directory
21b33f0460e0 revert: apply normallookup on reverted file if size isn't changed (issue4583)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24825
diff changeset
2253
21b33f0460e0 revert: apply normallookup on reverted file if size isn't changed (issue4583)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24825
diff changeset
2254 This returns length of written (maybe decoded) data.
21b33f0460e0 revert: apply normallookup on reverted file if size isn't changed (issue4583)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24825
diff changeset
2255 """
12708
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
2256 data = self._filter(self._decodefilterpats, filename, data)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2257 if b'l' in flags:
23854
f6070d3a9cb8 localrepo: remove all internal uses of localrepo.wopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23853
diff changeset
2258 self.wvfs.symlink(data, filename)
6877
1d38f3605b20 util: set_flags shouldn't know about repo flag formats
Matt Mackall <mpm@selenic.com>
parents: 6875
diff changeset
2259 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2260 self.wvfs.write(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2261 filename, data, backgroundclose=backgroundclose, **kwargs
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2262 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2263 if b'x' in flags:
18951
d13916a00b7e localrepo: use "vfs.setflags()" instead of "util.setflags()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18950
diff changeset
2264 self.wvfs.setflags(filename, False, True)
35726
45b678bf3a78 atomicupdate: add an experimental option to use atomictemp when updating
Boris Feld <boris.feld@octobus.net>
parents: 35725
diff changeset
2265 else:
45b678bf3a78 atomicupdate: add an experimental option to use atomictemp when updating
Boris Feld <boris.feld@octobus.net>
parents: 35725
diff changeset
2266 self.wvfs.setflags(filename, False, False)
24843
21b33f0460e0 revert: apply normallookup on reverted file if size isn't changed (issue4583)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24825
diff changeset
2267 return len(data)
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents: 1236
diff changeset
2268
4005
656e06eebda7 replace filehandle version of wwrite with wwritedata
Matt Mackall <mpm@selenic.com>
parents: 4004
diff changeset
2269 def wwritedata(self, filename, data):
12708
8a08b12ae88e localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12707
diff changeset
2270 return self._filter(self._decodefilterpats, filename, data)
1019
a9cca981c423 Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents: 1013
diff changeset
2271
23379
86c6f06feb04 localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23311
diff changeset
2272 def currenttransaction(self):
86c6f06feb04 localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23311
diff changeset
2273 """return the current transaction or None if non exists"""
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24284
diff changeset
2274 if self._transref:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24284
diff changeset
2275 tr = self._transref()
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24284
diff changeset
2276 else:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24284
diff changeset
2277 tr = None
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24284
diff changeset
2278
8072
ecf7795479d5 transaction: support multiple, separate transactions
Henrik Stuart <henrik.stuart@edlund.dk>
parents: 7948
diff changeset
2279 if tr and tr.running():
23379
86c6f06feb04 localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23311
diff changeset
2280 return tr
86c6f06feb04 localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23311
diff changeset
2281 return None
86c6f06feb04 localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23311
diff changeset
2282
86c6f06feb04 localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23311
diff changeset
2283 def transaction(self, desc, report=None):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2284 if self.ui.configbool(b'devel', b'all-warnings') or self.ui.configbool(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2285 b'devel', b'check-locks'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2286 ):
29705
41689e293994 develwarn: use the lock helper in local repo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29417
diff changeset
2287 if self._currentlock(self._lockref) is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2288 raise error.ProgrammingError(b'transaction requires locking')
23379
86c6f06feb04 localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23311
diff changeset
2289 tr = self.currenttransaction()
86c6f06feb04 localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23311
diff changeset
2290 if tr is not None:
36819
aff5996f3043 transaction: add a name and a __repr__ implementation (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 36554
diff changeset
2291 return tr.nest(name=desc)
1806
a2c69737e65e Automatic nesting into running transactions in the same repository.
mason@suse.com
parents: 1802
diff changeset
2292
5865
e7127f669edb transactions: don't show a backtrace when journal exists
Matt Mackall <mpm@selenic.com>
parents: 5814
diff changeset
2293 # abort here if the journal already exists
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2294 if self.svfs.exists(b"journal"):
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
2295 raise error.RepoError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2296 _(b"abandoned transaction found"),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2297 hint=_(b"run 'hg recover' to clean up transaction"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2298 )
5865
e7127f669edb transactions: don't show a backtrace when journal exists
Matt Mackall <mpm@selenic.com>
parents: 5814
diff changeset
2299
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2300 idbase = b"%.40f#%f" % (random.random(), time.time())
44060
a61287a95dc3 core: migrate uses of hashlib.sha1 to hashutil.sha1
Augie Fackler <augie@google.com>
parents: 44052
diff changeset
2301 ha = hex(hashutil.sha1(idbase).digest())
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2302 txnid = b'TXN:' + ha
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2303 self.hook(b'pretxnopen', throw=True, txnname=desc, txnid=txnid)
24281
e9ede9b4c2f8 hook: have a generic hook for transaction opening
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24234
diff changeset
2304
16236
97efd26eb957 localrepo: refactor retrieving of journal/undo files paths
Idan Kamara <idankk86@gmail.com>
parents: 16208
diff changeset
2305 self._writejournal(desc)
18952
8086b530e2ac localrepo: use "vfs.rename()" instead of "util.rename()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18951
diff changeset
2306 renames = [(vfs, x, undoname(x)) for vfs, x in self._journalfiles()]
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24284
diff changeset
2307 if report:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24284
diff changeset
2308 rp = report
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24284
diff changeset
2309 else:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24284
diff changeset
2310 rp = self.ui.warn
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2311 vfsmap = {b'plain': self.vfs, b'store': self.svfs} # root of .hg/
24284
ff14b26fe5f4 hook: add a generic hook right before we commit a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24282
diff changeset
2312 # we must avoid cyclic reference between repo and transaction.
ff14b26fe5f4 hook: add a generic hook right before we commit a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24282
diff changeset
2313 reporef = weakref.ref(self)
31994
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2314 # Code to track tag movement
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2315 #
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2316 # Since tags are all handled as file content, it is actually quite hard
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2317 # to track these movement from a code perspective. So we fallback to a
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2318 # tracking at the repository level. One could envision to track changes
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2319 # to the '.hgtags' file through changegroup apply but that fails to
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2320 # cope with case where transaction expose new heads without changegroup
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2321 # being involved (eg: phase movement).
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2322 #
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2323 # For now, We gate the feature behind a flag since this likely comes
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2324 # with performance impacts. The current code run more often than needed
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2325 # and do not use caches as much as it could. The current focus is on
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2326 # the behavior of the feature so we disable it by default. The flag
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2327 # will be removed when we are happy with the performance impact.
31996
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
2328 #
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
2329 # Once this feature is no longer experimental move the following
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
2330 # documentation to the appropriate help section:
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
2331 #
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
2332 # The ``HG_TAG_MOVED`` variable will be set if the transaction touched
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
2333 # tags (new or changed or deleted tags). In addition the details of
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
2334 # these changes are made available in a file at:
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
2335 # ``REPOROOT/.hg/changes/tags.changes``.
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
2336 # Make sure you check for HG_TAG_MOVED before reading that file as it
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
2337 # might exist from a previous transaction even if no tag were touched
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
2338 # in this one. Changes are recorded in a line base format::
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
2339 #
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
2340 # <action> <hex-node> <tag-name>\n
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
2341 #
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
2342 # Actions are defined as follow:
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
2343 # "-R": tag is removed,
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
2344 # "+A": tag is added,
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
2345 # "-M": tag is moved (old value),
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
2346 # "+M": tag is moved (new value),
31994
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2347 tracktags = lambda x: None
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2348 # experimental config: experimental.hook-track-tags
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2349 shouldtracktags = self.ui.configbool(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2350 b'experimental', b'hook-track-tags'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2351 )
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2352 if desc != b'strip' and shouldtracktags:
31994
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2353 oldheads = self.changelog.headrevs()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2354
31994
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2355 def tracktags(tr2):
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2356 repo = reporef()
46792
7e08fa9b3d13 typing: add assertions to localrepo.py to appease pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 46572
diff changeset
2357 assert repo is not None # help pytype
31994
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2358 oldfnodes = tagsmod.fnoderevs(repo.ui, repo, oldheads)
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2359 newheads = repo.changelog.headrevs()
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2360 newfnodes = tagsmod.fnoderevs(repo.ui, repo, newheads)
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2361 # notes: we compare lists here.
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2362 # As we do it only once buiding set would not be cheaper
31995
fe9c4d614600 track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31994
diff changeset
2363 changes = tagsmod.difftags(repo.ui, repo, oldfnodes, newfnodes)
fe9c4d614600 track-tags: compute the actual differences between tags pre/post transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31994
diff changeset
2364 if changes:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2365 tr2.hookargs[b'tag_moved'] = b'1'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2366 with repo.vfs(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2367 b'changes/tags.changes', b'w', atomictemp=True
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2368 ) as changesfile:
31996
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
2369 # note: we do not register the file to the transaction
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
2370 # because we needs it to still exist on the transaction
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
2371 # is close (for txnclose hooks)
e6e1884df298 track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31995
diff changeset
2372 tagsmod.writediff(changesfile, changes)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2373
31994
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2374 def validate(tr2):
24284
ff14b26fe5f4 hook: add a generic hook right before we commit a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24282
diff changeset
2375 """will run pre-closing hooks"""
31994
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2376 # XXX the transaction API is a bit lacking here so we take a hacky
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2377 # path for now
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2378 #
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2379 # We cannot add this as a "pending" hooks since the 'tr.hookargs'
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2380 # dict is copied before these run. In addition we needs the data
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2381 # available to in memory hooks too.
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2382 #
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2383 # Moreover, we also need to make sure this runs before txnclose
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2384 # hooks and there is no "pending" mechanism that would execute
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2385 # logic only if hooks are about to run.
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2386 #
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2387 # Fixing this limitation of the transaction is also needed to track
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2388 # other families of changes (bookmarks, phases, obsolescence).
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2389 #
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2390 # This will have to be fixed before we remove the experimental
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2391 # gating.
b36318e6d2ef track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31819
diff changeset
2392 tracktags(tr2)
34709
c212947273a7 bookmark: add a dedicated pretxnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
2393 repo = reporef()
46792
7e08fa9b3d13 typing: add assertions to localrepo.py to appease pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 46572
diff changeset
2394 assert repo is not None # help pytype
42969
76608f9f27f6 singlehead: introduce special handling of closed heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2395
43734
88a306478556 singlehead: making config item a bool again
Georges Racinet <georges.racinet@octobus.net>
parents: 43710
diff changeset
2396 singleheadopt = (b'experimental', b'single-head-per-branch')
88a306478556 singlehead: making config item a bool again
Georges Racinet <georges.racinet@octobus.net>
parents: 43710
diff changeset
2397 singlehead = repo.ui.configbool(*singleheadopt)
42969
76608f9f27f6 singlehead: introduce special handling of closed heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42905
diff changeset
2398 if singlehead:
43734
88a306478556 singlehead: making config item a bool again
Georges Racinet <georges.racinet@octobus.net>
parents: 43710
diff changeset
2399 singleheadsub = repo.ui.configsuboptions(*singleheadopt)[1]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2400 accountclosed = singleheadsub.get(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2401 b"account-closed-heads", False
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2402 )
46096
4d5e2fd53707 singlehead: introduce option to restrict to public changes
Joerg Sonnenberger <joerg@bec.de>
parents: 46004
diff changeset
2403 if singleheadsub.get(b"public-changes-only", False):
4d5e2fd53707 singlehead: introduce option to restrict to public changes
Joerg Sonnenberger <joerg@bec.de>
parents: 46004
diff changeset
2404 filtername = b"immutable"
4d5e2fd53707 singlehead: introduce option to restrict to public changes
Joerg Sonnenberger <joerg@bec.de>
parents: 46004
diff changeset
2405 else:
4d5e2fd53707 singlehead: introduce option to restrict to public changes
Joerg Sonnenberger <joerg@bec.de>
parents: 46004
diff changeset
2406 filtername = b"visible"
4d5e2fd53707 singlehead: introduce option to restrict to public changes
Joerg Sonnenberger <joerg@bec.de>
parents: 46004
diff changeset
2407 scmutil.enforcesinglehead(
4d5e2fd53707 singlehead: introduce option to restrict to public changes
Joerg Sonnenberger <joerg@bec.de>
parents: 46004
diff changeset
2408 repo, tr2, desc, accountclosed, filtername
4d5e2fd53707 singlehead: introduce option to restrict to public changes
Joerg Sonnenberger <joerg@bec.de>
parents: 46004
diff changeset
2409 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2410 if hook.hashook(repo.ui, b'pretxnclose-bookmark'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2411 for name, (old, new) in sorted(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2412 tr.changes[b'bookmarks'].items()
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2413 ):
34709
c212947273a7 bookmark: add a dedicated pretxnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
2414 args = tr.hookargs.copy()
c212947273a7 bookmark: add a dedicated pretxnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34708
diff changeset
2415 args.update(bookmarks.preparehookargs(name, old, new))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2416 repo.hook(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2417 b'pretxnclose-bookmark',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2418 throw=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2419 **pycompat.strkwargs(args)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2420 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2421 if hook.hashook(repo.ui, b'pretxnclose-phase'):
34711
f6d17075608f phase: add a dedicated pretxnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34710
diff changeset
2422 cl = repo.unfiltered().changelog
44548
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
2423 for revs, (old, new) in tr.changes[b'phases']:
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
2424 for rev in revs:
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
2425 args = tr.hookargs.copy()
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
2426 node = hex(cl.node(rev))
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
2427 args.update(phases.preparehookargs(node, old, new))
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
2428 repo.hook(
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
2429 b'pretxnclose-phase',
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
2430 throw=True,
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
2431 **pycompat.strkwargs(args)
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
2432 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2433
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2434 repo.hook(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2435 b'pretxnclose', throw=True, **pycompat.strkwargs(tr.hookargs)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2436 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2437
26577
8f2ff40fe9c9 localrepo: execute appropriate actions for dirstate at releasing transaction
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26499
diff changeset
2438 def releasefn(tr, success):
8f2ff40fe9c9 localrepo: execute appropriate actions for dirstate at releasing transaction
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26499
diff changeset
2439 repo = reporef()
42669
36c692eb28d3 transaction: leave unfinished without crashing when not properly released
Martin von Zweigbergk <martinvonz@google.com>
parents: 42621
diff changeset
2440 if repo is None:
36c692eb28d3 transaction: leave unfinished without crashing when not properly released
Martin von Zweigbergk <martinvonz@google.com>
parents: 42621
diff changeset
2441 # If the repo has been GC'd (and this release function is being
36c692eb28d3 transaction: leave unfinished without crashing when not properly released
Martin von Zweigbergk <martinvonz@google.com>
parents: 42621
diff changeset
2442 # called from transaction.__del__), there's not much we can do,
36c692eb28d3 transaction: leave unfinished without crashing when not properly released
Martin von Zweigbergk <martinvonz@google.com>
parents: 42621
diff changeset
2443 # so just leave the unfinished transaction there and let the
36c692eb28d3 transaction: leave unfinished without crashing when not properly released
Martin von Zweigbergk <martinvonz@google.com>
parents: 42621
diff changeset
2444 # user run `hg recover`.
36c692eb28d3 transaction: leave unfinished without crashing when not properly released
Martin von Zweigbergk <martinvonz@google.com>
parents: 42621
diff changeset
2445 return
26577
8f2ff40fe9c9 localrepo: execute appropriate actions for dirstate at releasing transaction
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26499
diff changeset
2446 if success:
26634
09bb1ee7e73e dirstate: make writing in-memory changes aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26631
diff changeset
2447 # this should be explicitly invoked here, because
09bb1ee7e73e dirstate: make writing in-memory changes aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26631
diff changeset
2448 # in-memory changes aren't written out at closing
09bb1ee7e73e dirstate: make writing in-memory changes aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26631
diff changeset
2449 # transaction, if tr.addfilegenerator (via
09bb1ee7e73e dirstate: make writing in-memory changes aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26631
diff changeset
2450 # dirstate.write or so) isn't invoked while
09bb1ee7e73e dirstate: make writing in-memory changes aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26631
diff changeset
2451 # transaction running
26748
5ba0a99ff27f dirstate: make dirstate.write() callers pass transaction object to it
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26741
diff changeset
2452 repo.dirstate.write(None)
26577
8f2ff40fe9c9 localrepo: execute appropriate actions for dirstate at releasing transaction
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26499
diff changeset
2453 else:
8f2ff40fe9c9 localrepo: execute appropriate actions for dirstate at releasing transaction
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26499
diff changeset
2454 # discard all changes (including ones already written
8f2ff40fe9c9 localrepo: execute appropriate actions for dirstate at releasing transaction
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26499
diff changeset
2455 # out) in this transaction
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2456 narrowspec.restorebackup(self, b'journal.narrowspec')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2457 narrowspec.restorewcbackup(self, b'journal.narrowspec.dirstate')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2458 repo.dirstate.restorebackup(None, b'journal.dirstate')
24284
ff14b26fe5f4 hook: add a generic hook right before we commit a transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24282
diff changeset
2459
26831
0a7610758c42 localrepo: discard objects in _filecache at transaction failure (issue4876)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26781
diff changeset
2460 repo.invalidate(clearfilecache=True)
0a7610758c42 localrepo: discard objects in _filecache at transaction failure (issue4876)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26781
diff changeset
2461
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2462 tr = transaction.transaction(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2463 rp,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2464 self.svfs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2465 vfsmap,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2466 b"journal",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2467 b"undo",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2468 aftertrans(renames),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2469 self.store.createmode,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2470 validator=validate,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2471 releasefn=releasefn,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2472 checkambigfiles=_cachedfiles,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2473 name=desc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2474 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2475 tr.changes[b'origrepolen'] = len(self)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2476 tr.changes[b'obsmarkers'] = set()
44548
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
2477 tr.changes[b'phases'] = []
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2478 tr.changes[b'bookmarks'] = {}
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2479
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2480 tr.hookargs[b'txnid'] = txnid
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2481 tr.hookargs[b'txnname'] = desc
44835
09da5cf44772 hooks: provide access to transaction changes for internal hooks
Joerg Sonnenberger <joerg@bec.de>
parents: 44796
diff changeset
2482 tr.hookargs[b'changes'] = tr.changes
23511
acc73273b27e fncache: document the fact fncache is outdate at hook run time
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23510
diff changeset
2483 # note: writing the fncache only during finalize mean that the file is
acc73273b27e fncache: document the fact fncache is outdate at hook run time
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23510
diff changeset
2484 # outdated when running hooks. As fncache is used for streaming clone,
acc73273b27e fncache: document the fact fncache is outdate at hook run time
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23510
diff changeset
2485 # this is not expected to break anything that happen during the hooks.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2486 tr.addfinalize(b'flush-fncache', self.store.write)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2487
24282
db8679812f84 hook: add a generic hook after transaction has been closed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24281
diff changeset
2488 def txnclosehook(tr2):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
2489 """To be run if transaction is successful, will schedule a hook run"""
27907
e219dbfd0342 localrepo: don't reference transaction from hook closure (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27846
diff changeset
2490 # Don't reference tr2 in hook() so we don't hold a reference.
e219dbfd0342 localrepo: don't reference transaction from hook closure (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27846
diff changeset
2491 # This reduces memory consumption when there are multiple
e219dbfd0342 localrepo: don't reference transaction from hook closure (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27846
diff changeset
2492 # transactions per lock. This can likely go away if issue5045
e219dbfd0342 localrepo: don't reference transaction from hook closure (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27846
diff changeset
2493 # fixes the function accumulation.
e219dbfd0342 localrepo: don't reference transaction from hook closure (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27846
diff changeset
2494 hookargs = tr2.hookargs
e219dbfd0342 localrepo: don't reference transaction from hook closure (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27846
diff changeset
2495
43778
888bd39ed555 lock: pass "success" boolean to _afterlock callbacks
Kyle Lippincott <spectral@google.com>
parents: 43765
diff changeset
2496 def hookfunc(unused_success):
34708
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34520
diff changeset
2497 repo = reporef()
46792
7e08fa9b3d13 typing: add assertions to localrepo.py to appease pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 46572
diff changeset
2498 assert repo is not None # help pytype
7e08fa9b3d13 typing: add assertions to localrepo.py to appease pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 46572
diff changeset
2499
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2500 if hook.hashook(repo.ui, b'txnclose-bookmark'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2501 bmchanges = sorted(tr.changes[b'bookmarks'].items())
34708
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34520
diff changeset
2502 for name, (old, new) in bmchanges:
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34520
diff changeset
2503 args = tr.hookargs.copy()
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34520
diff changeset
2504 args.update(bookmarks.preparehookargs(name, old, new))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2505 repo.hook(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2506 b'txnclose-bookmark',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2507 throw=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2508 **pycompat.strkwargs(args)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2509 )
34708
ee5f0d047b41 bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents: 34520
diff changeset
2510
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2511 if hook.hashook(repo.ui, b'txnclose-phase'):
34710
cdf833d7de98 phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents: 34709
diff changeset
2512 cl = repo.unfiltered().changelog
44548
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
2513 phasemv = sorted(
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
2514 tr.changes[b'phases'], key=lambda r: r[0][0]
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
2515 )
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
2516 for revs, (old, new) in phasemv:
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
2517 for rev in revs:
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
2518 args = tr.hookargs.copy()
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
2519 node = hex(cl.node(rev))
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
2520 args.update(phases.preparehookargs(node, old, new))
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
2521 repo.hook(
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
2522 b'txnclose-phase',
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
2523 throw=False,
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
2524 **pycompat.strkwargs(args)
fdc802f29b2c transactions: convert changes['phases'] to list of ranges
Joerg Sonnenberger <joerg@bec.de>
parents: 44482
diff changeset
2525 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2526
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2527 repo.hook(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2528 b'txnclose', throw=False, **pycompat.strkwargs(hookargs)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2529 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2530
46792
7e08fa9b3d13 typing: add assertions to localrepo.py to appease pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 46572
diff changeset
2531 repo = reporef()
7e08fa9b3d13 typing: add assertions to localrepo.py to appease pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 46572
diff changeset
2532 assert repo is not None # help pytype
7e08fa9b3d13 typing: add assertions to localrepo.py to appease pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 46572
diff changeset
2533 repo._afterlock(hookfunc)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2534
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2535 tr.addfinalize(b'txnclose-hook', txnclosehook)
35749
3a3b59bbe7ce localrepo: run cache-warming transaction callback before report callback
Martin von Zweigbergk <martinvonz@google.com>
parents: 35736
diff changeset
2536 # Include a leading "-" to make it happen before the transaction summary
3a3b59bbe7ce localrepo: run cache-warming transaction callback before report callback
Martin von Zweigbergk <martinvonz@google.com>
parents: 35736
diff changeset
2537 # reports registered via scmutil.registersummarycallback() whose names
3a3b59bbe7ce localrepo: run cache-warming transaction callback before report callback
Martin von Zweigbergk <martinvonz@google.com>
parents: 35736
diff changeset
2538 # are 00-txnreport etc. That way, the caches will be warm when the
3a3b59bbe7ce localrepo: run cache-warming transaction callback before report callback
Martin von Zweigbergk <martinvonz@google.com>
parents: 35736
diff changeset
2539 # callbacks run.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2540 tr.addpostclose(b'-warm-cache', self._buildcacheupdater(tr))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2541
24792
7d0421de8de3 hooks: add a 'txnabort' hook
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24784
diff changeset
2542 def txnaborthook(tr2):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
2543 """To be run if transaction is aborted"""
46792
7e08fa9b3d13 typing: add assertions to localrepo.py to appease pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 46572
diff changeset
2544 repo = reporef()
7e08fa9b3d13 typing: add assertions to localrepo.py to appease pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 46572
diff changeset
2545 assert repo is not None # help pytype
7e08fa9b3d13 typing: add assertions to localrepo.py to appease pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 46572
diff changeset
2546 repo.hook(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2547 b'txnabort', throw=False, **pycompat.strkwargs(tr2.hookargs)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2548 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2549
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2550 tr.addabort(b'txnabort-hook', txnaborthook)
26251
5c0f5db65c6b localrepo: refresh filecache stats only if transaction finished successfully
Yuya Nishihara <yuya@tcha.org>
parents: 26250
diff changeset
2551 # avoid eager cache invalidation. in-memory data should be identical
5c0f5db65c6b localrepo: refresh filecache stats only if transaction finished successfully
Yuya Nishihara <yuya@tcha.org>
parents: 26250
diff changeset
2552 # to stored data if transaction has no error.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2553 tr.addpostclose(b'refresh-filecachestats', self._refreshfilecachestats)
14266
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
2554 self._transref = weakref.ref(tr)
33541
b47fef6d2365 transaction-summary: display the summary for all transactions
Boris Feld <boris.feld@octobus.net>
parents: 33539
diff changeset
2555 scmutil.registersummarycallback(self, tr, desc)
14266
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
2556 return tr
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
2557
16236
97efd26eb957 localrepo: refactor retrieving of journal/undo files paths
Idan Kamara <idankk86@gmail.com>
parents: 16208
diff changeset
2558 def _journalfiles(self):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2559 return (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2560 (self.svfs, b'journal'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2561 (self.svfs, b'journal.narrowspec'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2562 (self.vfs, b'journal.narrowspec.dirstate'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2563 (self.vfs, b'journal.dirstate'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2564 (self.vfs, b'journal.branch'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2565 (self.vfs, b'journal.desc'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2566 (bookmarks.bookmarksvfs(self), b'journal.bookmarks'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2567 (self.svfs, b'journal.phaseroots'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2568 )
16236
97efd26eb957 localrepo: refactor retrieving of journal/undo files paths
Idan Kamara <idankk86@gmail.com>
parents: 16208
diff changeset
2569
97efd26eb957 localrepo: refactor retrieving of journal/undo files paths
Idan Kamara <idankk86@gmail.com>
parents: 16208
diff changeset
2570 def undofiles(self):
20975
37cdf1fca1b2 localrepo: make "undofiles()" return list of tuples "(vfs, relative filename)"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20969
diff changeset
2571 return [(vfs, undoname(x)) for vfs, x in self._journalfiles()]
16236
97efd26eb957 localrepo: refactor retrieving of journal/undo files paths
Idan Kamara <idankk86@gmail.com>
parents: 16208
diff changeset
2572
32452
b647b923486f transaction: run _writejournal unfiltered
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32381
diff changeset
2573 @unfilteredmethod
14266
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
2574 def _writejournal(self, desc):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2575 self.dirstate.savebackup(None, b'journal.dirstate')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2576 narrowspec.savewcbackup(self, b'journal.narrowspec.dirstate')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2577 narrowspec.savebackup(self, b'journal.narrowspec')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2578 self.vfs.write(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2579 b"journal.branch", encoding.fromlocal(self.dirstate.branch())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2580 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2581 self.vfs.write(b"journal.desc", b"%d\n%s\n" % (len(self), desc))
42325
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42300
diff changeset
2582 bookmarksvfs = bookmarks.bookmarksvfs(self)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2583 bookmarksvfs.write(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2584 b"journal.bookmarks", bookmarksvfs.tryread(b"bookmarks")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2585 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2586 self.svfs.write(b"journal.phaseroots", self.svfs.tryread(b"phaseroots"))
14266
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
2587
210
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
2588 def recover(self):
27846
63821023ea79 with: use context manager in localrepo recover
Bryan O'Sullivan <bryano@fb.com>
parents: 27698
diff changeset
2589 with self.lock():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2590 if self.svfs.exists(b"journal"):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2591 self.ui.status(_(b"rolling back interrupted transaction\n"))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2592 vfsmap = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2593 b'': self.svfs,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2594 b'plain': self.vfs,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2595 }
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2596 transaction.rollback(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2597 self.svfs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2598 vfsmap,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2599 b"journal",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2600 self.ui.warn,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2601 checkambigfiles=_cachedfiles,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2602 )
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
2603 self.invalidate()
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
2604 return True
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
2605 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2606 self.ui.warn(_(b"no interrupted transaction available\n"))
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
2607 return False
210
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 207
diff changeset
2608
15183
59e8bc22506e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 15131
diff changeset
2609 def rollback(self, dryrun=False, force=False):
26631
e077ce385609 localrepo: restore dirstate to one before rollbacking if not parent-gone
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26587
diff changeset
2610 wlock = lock = dsguard = None
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
2611 try:
1712
21dcf38e5d7d Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents: 1709
diff changeset
2612 wlock = self.wlock()
4438
3900f684a150 Fix hg import --exact bug that hangs hg on failure.
Eric Hopper <hopper@omnifarious.org>
parents: 4417
diff changeset
2613 lock = self.lock()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2614 if self.svfs.exists(b"undo"):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2615 dsguard = dirstateguard.dirstateguard(self, b'rollback')
26631
e077ce385609 localrepo: restore dirstate to one before rollbacking if not parent-gone
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26587
diff changeset
2616
e077ce385609 localrepo: restore dirstate to one before rollbacking if not parent-gone
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26587
diff changeset
2617 return self._rollback(dryrun, force, dsguard)
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
2618 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2619 self.ui.warn(_(b"no rollback information available\n"))
11177
6a64813276ed commands: initial audit of exit codes
Matt Mackall <mpm@selenic.com>
parents: 11174
diff changeset
2620 return 1
4915
97b734fb9c6f Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents: 4914
diff changeset
2621 finally:
26631
e077ce385609 localrepo: restore dirstate to one before rollbacking if not parent-gone
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26587
diff changeset
2622 release(dsguard, lock, wlock)
162
5dcbe4d9a30c Implement recover and undo commands
mpm@selenic.com
parents: 161
diff changeset
2623
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2624 @unfilteredmethod # Until we get smarter cache management
26631
e077ce385609 localrepo: restore dirstate to one before rollbacking if not parent-gone
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26587
diff changeset
2625 def _rollback(self, dryrun, force, dsguard):
15130
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
2626 ui = self.ui
15097
cda7a87c1871 rollback: improve readability; clarify that the return value is an int.
Greg Ward <greg-hg@gerg.ca>
parents: 15057
diff changeset
2627 try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2628 args = self.vfs.read(b'undo.desc').splitlines()
15130
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
2629 (oldlen, desc, detail) = (int(args[0]), args[1], None)
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
2630 if len(args) >= 3:
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
2631 detail = args[2]
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
2632 oldtip = oldlen - 1
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
2633
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
2634 if detail and ui.verbose:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2635 msg = _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2636 b'repository tip rolled back to revision %d'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2637 b' (undo %s: %s)\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2638 ) % (oldtip, desc, detail)
15130
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
2639 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2640 msg = _(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
2641 b'repository tip rolled back to revision %d (undo %s)\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2642 ) % (oldtip, desc)
15097
cda7a87c1871 rollback: improve readability; clarify that the return value is an int.
Greg Ward <greg-hg@gerg.ca>
parents: 15057
diff changeset
2643 except IOError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2644 msg = _(b'rolling back unknown transaction\n')
15183
59e8bc22506e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 15131
diff changeset
2645 desc = None
59e8bc22506e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 15131
diff changeset
2646
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2647 if not force and self[b'.'] != self[b'tip'] and desc == b'commit':
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26577
diff changeset
2648 raise error.Abort(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2649 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2650 b'rollback of last commit while not checked out '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2651 b'may lose data'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2652 ),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2653 hint=_(b'use -f to force'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2654 )
15183
59e8bc22506e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 15131
diff changeset
2655
15130
3d44e68360a6 rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents: 15101
diff changeset
2656 ui.status(msg)
15097
cda7a87c1871 rollback: improve readability; clarify that the return value is an int.
Greg Ward <greg-hg@gerg.ca>
parents: 15057
diff changeset
2657 if dryrun:
cda7a87c1871 rollback: improve readability; clarify that the return value is an int.
Greg Ward <greg-hg@gerg.ca>
parents: 15057
diff changeset
2658 return 0
15131
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
2659
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
2660 parents = self.dirstate.parents()
18310
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
2661 self.destroying()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2662 vfsmap = {b'plain': self.vfs, b'': self.svfs}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2663 transaction.rollback(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2664 self.svfs, vfsmap, b'undo', ui.warn, checkambigfiles=_cachedfiles
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2665 )
42325
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42300
diff changeset
2666 bookmarksvfs = bookmarks.bookmarksvfs(self)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2667 if bookmarksvfs.exists(b'undo.bookmarks'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2668 bookmarksvfs.rename(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2669 b'undo.bookmarks', b'bookmarks', checkambig=True
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2670 )
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2671 if self.svfs.exists(b'undo.phaseroots'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2672 self.svfs.rename(b'undo.phaseroots', b'phaseroots', checkambig=True)
15097
cda7a87c1871 rollback: improve readability; clarify that the return value is an int.
Greg Ward <greg-hg@gerg.ca>
parents: 15057
diff changeset
2673 self.invalidate()
15131
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
2674
43537
7f489b9a79a1 index: use `index.has_node` in `repo._rollback`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43506
diff changeset
2675 has_node = self.changelog.index.has_node
7f489b9a79a1 index: use `index.has_node` in `repo._rollback`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43506
diff changeset
2676 parentgone = any(not has_node(p) for p in parents)
15131
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
2677 if parentgone:
26631
e077ce385609 localrepo: restore dirstate to one before rollbacking if not parent-gone
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26587
diff changeset
2678 # prevent dirstateguard from overwriting already restored one
e077ce385609 localrepo: restore dirstate to one before rollbacking if not parent-gone
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26587
diff changeset
2679 dsguard.close()
e077ce385609 localrepo: restore dirstate to one before rollbacking if not parent-gone
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26587
diff changeset
2680
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2681 narrowspec.restorebackup(self, b'undo.narrowspec')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2682 narrowspec.restorewcbackup(self, b'undo.narrowspec.dirstate')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2683 self.dirstate.restorebackup(None, b'undo.dirstate')
15131
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
2684 try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2685 branch = self.vfs.read(b'undo.branch')
17360
935831597e16 rollback: write dirstate branch with correct encoding
Sune Foldager <cryo@cyanite.org>
parents: 17324
diff changeset
2686 self.dirstate.setbranch(encoding.tolocal(branch))
15131
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
2687 except IOError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2688 ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2689 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2690 b'named branch could not be reset: '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2691 b'current branch is still \'%s\'\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2692 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2693 % self.dirstate.branch()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2694 )
15131
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
2695
27167
3fe8cb40c9c5 commands: inline definition of localrepo.parents() and drop the method (API)
Augie Fackler <augie@google.com>
parents: 27166
diff changeset
2696 parents = tuple([p.rev() for p in self[None].parents()])
15131
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
2697 if len(parents) > 1:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2698 ui.status(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2699 _(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2700 b'working directory now based on '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2701 b'revisions %d and %d\n'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2702 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2703 % parents
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2704 )
15131
7c26ce9edbd2 rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents: 15130
diff changeset
2705 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2706 ui.status(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
2707 _(b'working directory now based on revision %d\n') % parents
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2708 )
45490
0ce6af73f481 mergestate: make some callers not pass pointless node argument
Martin von Zweigbergk <martinvonz@google.com>
parents: 45485
diff changeset
2709 mergestatemod.mergestate.clean(self)
24784
59406b8b1303 rollback: clear resolve state (issue4593)
Matt Mackall <mpm@selenic.com>
parents: 24750
diff changeset
2710
17013
c8eda7bbdcab strip: incrementally update the branchheads cache after a strip
Joshua Redstone <joshua.redstone@fb.com>
parents: 17012
diff changeset
2711 # TODO: if we know which new heads may result from this rollback, pass
c8eda7bbdcab strip: incrementally update the branchheads cache after a strip
Joshua Redstone <joshua.redstone@fb.com>
parents: 17012
diff changeset
2712 # them to destroy(), which will prevent the branchhead cache from being
c8eda7bbdcab strip: incrementally update the branchheads cache after a strip
Joshua Redstone <joshua.redstone@fb.com>
parents: 17012
diff changeset
2713 # invalidated.
15604
b8d8599410da rollback: always call destroyed() (regression from 1.9)
Greg Ward <greg-hg@gerg.ca>
parents: 15381
diff changeset
2714 self.destroyed()
15097
cda7a87c1871 rollback: improve readability; clarify that the return value is an int.
Greg Ward <greg-hg@gerg.ca>
parents: 15057
diff changeset
2715 return 0
cda7a87c1871 rollback: improve readability; clarify that the return value is an int.
Greg Ward <greg-hg@gerg.ca>
parents: 15057
diff changeset
2716
32332
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
2717 def _buildcacheupdater(self, newtransaction):
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
2718 """called during transaction to build the callback updating cache
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
2719
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
2720 Lives on the repository to help extension who might want to augment
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
2721 this logic. For this purpose, the created transaction is passed to the
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
2722 method.
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
2723 """
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
2724 # we must avoid cyclic reference between repo and transaction.
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
2725 reporef = weakref.ref(self)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2726
32332
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
2727 def updater(tr):
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
2728 repo = reporef()
46792
7e08fa9b3d13 typing: add assertions to localrepo.py to appease pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 46572
diff changeset
2729 assert repo is not None # help pytype
32332
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
2730 repo.updatecaches(tr)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2731
32332
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
2732 return updater
7aa4a4cf0dde cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32314
diff changeset
2733
32263
604d65e2c0b2 caches: introduce a function to warm cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32262
diff changeset
2734 @unfilteredmethod
47297
1337bfaa88ca updatecaches: adds a `caches` parameters to `repo.updatecaches`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47296
diff changeset
2735 def updatecaches(self, tr=None, full=False, caches=None):
32264
a72caf0af38e caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32263
diff changeset
2736 """warm appropriate caches
a72caf0af38e caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32263
diff changeset
2737
a72caf0af38e caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32263
diff changeset
2738 If this function is called after a transaction closed. The transaction
a72caf0af38e caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32263
diff changeset
2739 will be available in the 'tr' argument. This can be used to selectively
a72caf0af38e caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32263
diff changeset
2740 update caches relevant to the changes in that transaction.
36952
b24cde12061b debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents: 36819
diff changeset
2741
b24cde12061b debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents: 36819
diff changeset
2742 If 'full' is set, make sure all caches the function knows about have
b24cde12061b debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents: 36819
diff changeset
2743 up-to-date data. Even the ones usually loaded more lazily.
47183
8be95673eb8a cache: avoid warming the fnodetags cache after clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46907
diff changeset
2744
8be95673eb8a cache: avoid warming the fnodetags cache after clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46907
diff changeset
2745 The `full` argument can take a special "post-clone" value. In this case
8be95673eb8a cache: avoid warming the fnodetags cache after clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46907
diff changeset
2746 the cache warming is made after a clone and of the slower cache might
8be95673eb8a cache: avoid warming the fnodetags cache after clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46907
diff changeset
2747 be skipped, namely the `.fnodetags` one. This argument is 5.8 specific
8be95673eb8a cache: avoid warming the fnodetags cache after clone
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46907
diff changeset
2748 as we plan for a cleaner way to deal with this for 5.9.
32264
a72caf0af38e caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32263
diff changeset
2749 """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2750 if tr is not None and tr.hookargs.get(b'source') == b'strip':
32263
604d65e2c0b2 caches: introduce a function to warm cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32262
diff changeset
2751 # During strip, many caches are invalid but
604d65e2c0b2 caches: introduce a function to warm cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32262
diff changeset
2752 # later call to `destroyed` will refresh them.
604d65e2c0b2 caches: introduce a function to warm cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32262
diff changeset
2753 return
604d65e2c0b2 caches: introduce a function to warm cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32262
diff changeset
2754
47296
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
2755 unfi = self.unfiltered()
32263
604d65e2c0b2 caches: introduce a function to warm cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32262
diff changeset
2756
47300
8b2d09c7e5cd updatecaches: deprecate the `full` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47299
diff changeset
2757 if full:
8b2d09c7e5cd updatecaches: deprecate the `full` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47299
diff changeset
2758 msg = (
8b2d09c7e5cd updatecaches: deprecate the `full` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47299
diff changeset
2759 "`full` argument for `repo.updatecaches` is deprecated\n"
8b2d09c7e5cd updatecaches: deprecate the `full` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47299
diff changeset
2760 "(use `caches=repository.CACHE_ALL` instead)"
8b2d09c7e5cd updatecaches: deprecate the `full` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47299
diff changeset
2761 )
8b2d09c7e5cd updatecaches: deprecate the `full` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47299
diff changeset
2762 self.ui.deprecwarn(msg, "5.9")
8b2d09c7e5cd updatecaches: deprecate the `full` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47299
diff changeset
2763 caches = repository.CACHES_ALL
8b2d09c7e5cd updatecaches: deprecate the `full` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47299
diff changeset
2764 if full == b"post-clone":
8b2d09c7e5cd updatecaches: deprecate the `full` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47299
diff changeset
2765 caches = repository.CACHES_POST_CLONE
8b2d09c7e5cd updatecaches: deprecate the `full` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47299
diff changeset
2766 caches = repository.CACHES_ALL
8b2d09c7e5cd updatecaches: deprecate the `full` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47299
diff changeset
2767 elif caches is None:
8b2d09c7e5cd updatecaches: deprecate the `full` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47299
diff changeset
2768 caches = repository.CACHES_DEFAULT
47296
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
2769
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
2770 if repository.CACHE_BRANCHMAP_SERVED in caches:
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
2771 if tr is None or tr.changes[b'origrepolen'] < len(self):
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
2772 # accessing the 'served' branchmap should refresh all the others,
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
2773 self.ui.debug(b'updating the branch cache\n')
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
2774 self.filtered(b'served').branchmap()
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
2775 self.filtered(b'served.hidden').branchmap()
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
2776
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
2777 if repository.CACHE_CHANGELOG_CACHE in caches:
44445
336ec75ed1ac nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44442
diff changeset
2778 self.changelog.update_caches(transaction=tr)
47296
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
2779
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
2780 if repository.CACHE_MANIFESTLOG_CACHE in caches:
44787
97ebdb192b00 nodemap: also warm manifest nodemap with other caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44733
diff changeset
2781 self.manifestlog.update_caches(transaction=tr)
44445
336ec75ed1ac nodemap: warm the persistent nodemap on disk with debugupdatecache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44442
diff changeset
2782
47296
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
2783 if repository.CACHE_REV_BRANCH in caches:
41933
2eee280a1354 updatecaches: also warm revbranchcache for filtered revisions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41896
diff changeset
2784 rbc = unfi.revbranchcache()
2eee280a1354 updatecaches: also warm revbranchcache for filtered revisions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41896
diff changeset
2785 for r in unfi.changelog:
36952
b24cde12061b debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents: 36819
diff changeset
2786 rbc.branchinfo(r)
b24cde12061b debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents: 36819
diff changeset
2787 rbc.write()
b24cde12061b debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents: 36819
diff changeset
2788
47296
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
2789 if repository.CACHE_FULL_MANIFEST in caches:
38781
0a57945aaf7f manifest: persist the manifestfulltext cache
Martijn Pieters <mj@zopatista.com>
parents: 38760
diff changeset
2790 # ensure the working copy parents are in the manifestfulltextcache
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2791 for ctx in self[b'.'].parents():
38781
0a57945aaf7f manifest: persist the manifestfulltext cache
Martijn Pieters <mj@zopatista.com>
parents: 38760
diff changeset
2792 ctx.manifest() # accessing the manifest is enough
0a57945aaf7f manifest: persist the manifestfulltext cache
Martijn Pieters <mj@zopatista.com>
parents: 38760
diff changeset
2793
47296
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
2794 if repository.CACHE_FILE_NODE_TAGS in caches:
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
2795 # accessing fnode cache warms the cache
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
2796 tagsmod.fnoderevs(self.ui, unfi, unfi.changelog.revs())
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
2797
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
2798 if repository.CACHE_TAGS_DEFAULT in caches:
41934
481259af4bdf updatecaches: also warm the tags caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41933
diff changeset
2799 # accessing tags warm the cache
481259af4bdf updatecaches: also warm the tags caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41933
diff changeset
2800 self.tags()
47296
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
2801 if repository.CACHE_TAGS_SERVED in caches:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2802 self.filtered(b'served').tags()
41934
481259af4bdf updatecaches: also warm the tags caches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41933
diff changeset
2803
47296
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
2804 if repository.CACHE_BRANCHMAP_ALL in caches:
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
2805 # The CACHE_BRANCHMAP_ALL updates lazily-loaded caches immediately,
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
2806 # so we're forcing a write to cause these caches to be warmed up
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
2807 # even if they haven't explicitly been requested yet (if they've
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
2808 # never been used by hg, they won't ever have been written, even if
d1589957fdcb updatecaches: introduce a set of constants to control which are updated
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47280
diff changeset
2809 # they're a subset of another kind of cache that *has* been used).
42712
cdf0e9523de1 branchmap: explicitly warm+write all subsets of the branchmap caches
Kyle Lippincott <spectral@google.com>
parents: 42685
diff changeset
2810 for filt in repoview.filtertable.keys():
cdf0e9523de1 branchmap: explicitly warm+write all subsets of the branchmap caches
Kyle Lippincott <spectral@google.com>
parents: 42685
diff changeset
2811 filtered = self.filtered(filt)
cdf0e9523de1 branchmap: explicitly warm+write all subsets of the branchmap caches
Kyle Lippincott <spectral@google.com>
parents: 42685
diff changeset
2812 filtered.branchmap().write(filtered)
cdf0e9523de1 branchmap: explicitly warm+write all subsets of the branchmap caches
Kyle Lippincott <spectral@google.com>
parents: 42685
diff changeset
2813
10547
bae9bb09166b strip: invalidate all caches after stripping (fixes issue1951)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10522
diff changeset
2814 def invalidatecaches(self):
15988
827e0126738d localrepo: delete _phaserev when invalidating caches
Idan Kamara <idankk86@gmail.com>
parents: 15987
diff changeset
2815
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43421
diff changeset
2816 if '_tagscache' in vars(self):
18013
98c867ac1330 clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18009
diff changeset
2817 # can't use delattr on proxy
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43421
diff changeset
2818 del self.__dict__['_tagscache']
14936
9dca7653b525 localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents: 14935
diff changeset
2819
41615
328ca3b9e545 branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents: 41529
diff changeset
2820 self._branchcaches.clear()
18105
312262ebc223 cache: group obscache and revsfiltercache invalidation in a single function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18101
diff changeset
2821 self.invalidatevolatilesets()
33302
36a415b5a4b2 localrepo: add sparse caches
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33278
diff changeset
2822 self._sparsesignaturecache.clear()
18105
312262ebc223 cache: group obscache and revsfiltercache invalidation in a single function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18101
diff changeset
2823
312262ebc223 cache: group obscache and revsfiltercache invalidation in a single function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18101
diff changeset
2824 def invalidatevolatilesets(self):
312262ebc223 cache: group obscache and revsfiltercache invalidation in a single function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18101
diff changeset
2825 self.filteredrevcache.clear()
17469
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17434
diff changeset
2826 obsolete.clearobscaches(self)
44104
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44075
diff changeset
2827 self._quick_access_changeid_invalidate()
1784
2e0a288ca93e revalidate revlog data after locking the repo (issue132)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1782
diff changeset
2828
14930
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
2829 def invalidatedirstate(self):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
2830 """Invalidates the dirstate, causing the next call to dirstate
14930
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
2831 to check if it was modified since the last time it was read,
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
2832 rereading it if it has.
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
2833
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
2834 This is different to dirstate.invalidate() that it doesn't always
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
2835 rereads the dirstate. Use dirstate.invalidate() if you want to
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
2836 explicitly read the dirstate again (i.e. restoring it to a previous
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
2837 known good state)."""
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43421
diff changeset
2838 if hasunfilteredcache(self, 'dirstate'):
16200
9d4a2942a732 dirstate: add filecache support
Idan Kamara <idankk86@gmail.com>
parents: 16198
diff changeset
2839 for k in self.dirstate._filecache:
9d4a2942a732 dirstate: add filecache support
Idan Kamara <idankk86@gmail.com>
parents: 16198
diff changeset
2840 try:
9d4a2942a732 dirstate: add filecache support
Idan Kamara <idankk86@gmail.com>
parents: 16198
diff changeset
2841 delattr(self.dirstate, k)
9d4a2942a732 dirstate: add filecache support
Idan Kamara <idankk86@gmail.com>
parents: 16198
diff changeset
2842 except AttributeError:
9d4a2942a732 dirstate: add filecache support
Idan Kamara <idankk86@gmail.com>
parents: 16198
diff changeset
2843 pass
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43421
diff changeset
2844 delattr(self.unfiltered(), 'dirstate')
14930
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
2845
26831
0a7610758c42 localrepo: discard objects in _filecache at transaction failure (issue4876)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26781
diff changeset
2846 def invalidate(self, clearfilecache=False):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
2847 """Invalidates both store and non-store parts other than dirstate
29918
d9c49138ab93 localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29883
diff changeset
2848
d9c49138ab93 localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29883
diff changeset
2849 If a transaction is running, invalidation of store is omitted,
d9c49138ab93 localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29883
diff changeset
2850 because discarding in-memory changes might cause inconsistency
d9c49138ab93 localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29883
diff changeset
2851 (e.g. incomplete fncache causes unintentional failure, but
d9c49138ab93 localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29883
diff changeset
2852 redundant one doesn't).
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
2853 """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2854 unfiltered = self.unfiltered() # all file caches are stored unfiltered
31510
2244fb3eee49 localrepo: forcibly copy list of filecache keys
Augie Fackler <augie@google.com>
parents: 31509
diff changeset
2855 for k in list(self._filecache.keys()):
14935
4ae7473f5b73 localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents: 14934
diff changeset
2856 # dirstate is invalidated separately in invalidatedirstate()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2857 if k == b'dirstate':
14935
4ae7473f5b73 localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents: 14934
diff changeset
2858 continue
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2859 if (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2860 k == b'changelog'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2861 and self.currenttransaction()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2862 and self.changelog._delayed
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2863 ):
33706
01a1c4e66816 repo: skip invalidation of changelog if it has 'delayed' changes (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33703
diff changeset
2864 # The changelog object may store unwritten revisions. We don't
01a1c4e66816 repo: skip invalidation of changelog if it has 'delayed' changes (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33703
diff changeset
2865 # want to lose them.
01a1c4e66816 repo: skip invalidation of changelog if it has 'delayed' changes (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33703
diff changeset
2866 # TODO: Solve the problem instead of working around it.
01a1c4e66816 repo: skip invalidation of changelog if it has 'delayed' changes (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33703
diff changeset
2867 continue
14935
4ae7473f5b73 localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents: 14934
diff changeset
2868
26831
0a7610758c42 localrepo: discard objects in _filecache at transaction failure (issue4876)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26781
diff changeset
2869 if clearfilecache:
0a7610758c42 localrepo: discard objects in _filecache at transaction failure (issue4876)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26781
diff changeset
2870 del self._filecache[k]
14935
4ae7473f5b73 localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents: 14934
diff changeset
2871 try:
17997
6089956e9880 clfilter: ensure cache invalidation is done on the main unfiltered repo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17996
diff changeset
2872 delattr(unfiltered, k)
14935
4ae7473f5b73 localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents: 14934
diff changeset
2873 except AttributeError:
4ae7473f5b73 localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents: 14934
diff changeset
2874 pass
10547
bae9bb09166b strip: invalidate all caches after stripping (fixes issue1951)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10522
diff changeset
2875 self.invalidatecaches()
29918
d9c49138ab93 localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29883
diff changeset
2876 if not self.currenttransaction():
d9c49138ab93 localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29883
diff changeset
2877 # TODO: Changing contents of store outside transaction
d9c49138ab93 localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29883
diff changeset
2878 # causes inconsistency. We should make in-memory store
d9c49138ab93 localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29883
diff changeset
2879 # changes detectable, and abort if changed.
d9c49138ab93 localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29883
diff changeset
2880 self.store.invalidatecaches()
10547
bae9bb09166b strip: invalidate all caches after stripping (fixes issue1951)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10522
diff changeset
2881
20627
a42ea6d209e6 localrepo: add hook point to invalidate everything on each command-server run
Yuya Nishihara <yuya@tcha.org>
parents: 20567
diff changeset
2882 def invalidateall(self):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
2883 """Fully invalidates both store and non-store parts, causing the
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
2884 subsequent operation to reread any outside changes."""
20627
a42ea6d209e6 localrepo: add hook point to invalidate everything on each command-server run
Yuya Nishihara <yuya@tcha.org>
parents: 20567
diff changeset
2885 # extension should hook this to invalidate its caches
a42ea6d209e6 localrepo: add hook point to invalidate everything on each command-server run
Yuya Nishihara <yuya@tcha.org>
parents: 20567
diff changeset
2886 self.invalidate()
a42ea6d209e6 localrepo: add hook point to invalidate everything on each command-server run
Yuya Nishihara <yuya@tcha.org>
parents: 20567
diff changeset
2887 self.invalidatedirstate()
a42ea6d209e6 localrepo: add hook point to invalidate everything on each command-server run
Yuya Nishihara <yuya@tcha.org>
parents: 20567
diff changeset
2888
29920
e35a83cedde1 localrepo: make _refreshfilecachestats unfiltered method to refresh correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29918
diff changeset
2889 @unfilteredmethod
26251
5c0f5db65c6b localrepo: refresh filecache stats only if transaction finished successfully
Yuya Nishihara <yuya@tcha.org>
parents: 26250
diff changeset
2890 def _refreshfilecachestats(self, tr):
26250
bc1f8a79b4e4 localrepo: move closure of lock release to class
Yuya Nishihara <yuya@tcha.org>
parents: 26155
diff changeset
2891 """Reload stats of cached files so that they are flagged as valid"""
bc1f8a79b4e4 localrepo: move closure of lock release to class
Yuya Nishihara <yuya@tcha.org>
parents: 26155
diff changeset
2892 for k, ce in self._filecache.items():
35839
9dad46c23185 localrepo: consistently use native str when __dict__ is involved
Augie Fackler <augie@google.com>
parents: 35785
diff changeset
2893 k = pycompat.sysstr(k)
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43421
diff changeset
2894 if k == 'dirstate' or k not in self.__dict__:
26250
bc1f8a79b4e4 localrepo: move closure of lock release to class
Yuya Nishihara <yuya@tcha.org>
parents: 26155
diff changeset
2895 continue
bc1f8a79b4e4 localrepo: move closure of lock release to class
Yuya Nishihara <yuya@tcha.org>
parents: 26155
diff changeset
2896 ce.refresh()
bc1f8a79b4e4 localrepo: move closure of lock release to class
Yuya Nishihara <yuya@tcha.org>
parents: 26155
diff changeset
2897
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2898 def _lock(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
2899 self,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
2900 vfs,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
2901 lockname,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
2902 wait,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
2903 releasefn,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
2904 acquirefn,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
2905 desc,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2906 ):
35208
1b758105b5c7 lock: add a trylock method handling the timeout and messaging logic
Boris Feld <boris.feld@octobus.net>
parents: 35207
diff changeset
2907 timeout = 0
35209
9153871d50e0 lock: allow to configure when the lock messages are displayed
Boris Feld <boris.feld@octobus.net>
parents: 35208
diff changeset
2908 warntimeout = 0
35208
1b758105b5c7 lock: add a trylock method handling the timeout and messaging logic
Boris Feld <boris.feld@octobus.net>
parents: 35207
diff changeset
2909 if wait:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2910 timeout = self.ui.configint(b"ui", b"timeout")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2911 warntimeout = self.ui.configint(b"ui", b"timeout.warn")
38038
8c828beb7543 lock: add internal config to not replace signal handlers while locking
Yuya Nishihara <yuya@tcha.org>
parents: 37810
diff changeset
2912 # internal config: ui.signal-safe-lock
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2913 signalsafe = self.ui.configbool(b'ui', b'signal-safe-lock')
35208
1b758105b5c7 lock: add a trylock method handling the timeout and messaging logic
Boris Feld <boris.feld@octobus.net>
parents: 35207
diff changeset
2914
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2915 l = lockmod.trylock(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2916 self.ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2917 vfs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2918 lockname,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2919 timeout,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2920 warntimeout,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2921 releasefn=releasefn,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2922 acquirefn=acquirefn,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2923 desc=desc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2924 signalsafe=signalsafe,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2925 )
1751
e9bf415a8ecb localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1747
diff changeset
2926 return l
e9bf415a8ecb localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1747
diff changeset
2927
15587
809d5d30e377 localrepo: rename _postrelease to _afterlock
Matt Mackall <mpm@selenic.com>
parents: 15586
diff changeset
2928 def _afterlock(self, callback):
24821
57f1dbc99631 afterlock: add the callback to the top level lock (issue4608)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24799
diff changeset
2929 """add a callback to be run when the repository is fully unlocked
15583
926a06f7a353 lock: add mechanism to register post release callback
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15486
diff changeset
2930
24821
57f1dbc99631 afterlock: add the callback to the top level lock (issue4608)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24799
diff changeset
2931 The callback will be executed when the outermost lock is released
57f1dbc99631 afterlock: add the callback to the top level lock (issue4608)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24799
diff changeset
2932 (with wlock being higher level than 'lock')."""
57f1dbc99631 afterlock: add the callback to the top level lock (issue4608)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24799
diff changeset
2933 for ref in (self._wlockref, self._lockref):
57f1dbc99631 afterlock: add the callback to the top level lock (issue4608)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24799
diff changeset
2934 l = ref and ref()
57f1dbc99631 afterlock: add the callback to the top level lock (issue4608)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24799
diff changeset
2935 if l and l.held:
57f1dbc99631 afterlock: add the callback to the top level lock (issue4608)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24799
diff changeset
2936 l.postrelease.append(callback)
57f1dbc99631 afterlock: add the callback to the top level lock (issue4608)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24799
diff changeset
2937 break
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2938 else: # no lock have been found.
43778
888bd39ed555 lock: pass "success" boolean to _afterlock callbacks
Kyle Lippincott <spectral@google.com>
parents: 43765
diff changeset
2939 callback(True)
15583
926a06f7a353 lock: add mechanism to register post release callback
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15486
diff changeset
2940
4914
9a2a73ea6135 repo locks: use True/False
Matt Mackall <mpm@selenic.com>
parents: 4913
diff changeset
2941 def lock(self, wait=True):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
2942 """Lock the repository store (.hg/store) and return a weak reference
9309
cfdcb7a465af localrepo: document the locking scheme a little better
Greg Ward <greg-hg@gerg.ca>
parents: 9152
diff changeset
2943 to the lock. Use this before modifying the store (e.g. committing or
24746
e0c810d0ab69 lock: update the docstring with order information
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24745
diff changeset
2944 stripping). If you are opening a transaction, get a lock as well.)
e0c810d0ab69 lock: update the docstring with order information
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24745
diff changeset
2945
e0c810d0ab69 lock: update the docstring with order information
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24745
diff changeset
2946 If both 'lock' and 'wlock' must be acquired, ensure you always acquires
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
2947 'wlock' first to avoid a dead-lock hazard."""
29705
41689e293994 develwarn: use the lock helper in local repo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29417
diff changeset
2948 l = self._currentlock(self._lockref)
41689e293994 develwarn: use the lock helper in local repo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29417
diff changeset
2949 if l is not None:
8108
a26d33749bd8 made repo locks recursive and deprecate refcounting based lock releasing
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8072
diff changeset
2950 l.lock()
a26d33749bd8 made repo locks recursive and deprecate refcounting based lock releasing
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8072
diff changeset
2951 return l
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4916
diff changeset
2952
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2953 l = self._lock(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2954 vfs=self.svfs,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2955 lockname=b"lock",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2956 wait=wait,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2957 releasefn=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2958 acquirefn=self.invalidate,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2959 desc=_(b'repository %s') % self.origroot,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2960 )
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4916
diff changeset
2961 self._lockref = weakref.ref(l)
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4916
diff changeset
2962 return l
1751
e9bf415a8ecb localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1747
diff changeset
2963
4914
9a2a73ea6135 repo locks: use True/False
Matt Mackall <mpm@selenic.com>
parents: 4913
diff changeset
2964 def wlock(self, wait=True):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
2965 """Lock the non-store parts of the repository (everything under
9309
cfdcb7a465af localrepo: document the locking scheme a little better
Greg Ward <greg-hg@gerg.ca>
parents: 9152
diff changeset
2966 .hg except .hg/store) and return a weak reference to the lock.
24746
e0c810d0ab69 lock: update the docstring with order information
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24745
diff changeset
2967
e0c810d0ab69 lock: update the docstring with order information
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24745
diff changeset
2968 Use this before modifying files in .hg.
e0c810d0ab69 lock: update the docstring with order information
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24745
diff changeset
2969
e0c810d0ab69 lock: update the docstring with order information
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24745
diff changeset
2970 If both 'lock' and 'wlock' must be acquired, ensure you always acquires
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
2971 'wlock' first to avoid a dead-lock hazard."""
46793
86b47ec1960a typing: rewrite a conditional assignment to unconfuse pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 46792
diff changeset
2972 l = self._wlockref() if self._wlockref else None
24744
bedefc611f25 wlock: only issue devel warning when actually acquiring the lock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24740
diff changeset
2973 if l is not None and l.held:
bedefc611f25 wlock: only issue devel warning when actually acquiring the lock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24740
diff changeset
2974 l.lock()
bedefc611f25 wlock: only issue devel warning when actually acquiring the lock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24740
diff changeset
2975 return l
bedefc611f25 wlock: only issue devel warning when actually acquiring the lock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24740
diff changeset
2976
26781
1aee2ab0f902 spelling: trivial spell checking
Mads Kiilerich <madski@unity3d.com>
parents: 26767
diff changeset
2977 # We do not need to check for non-waiting lock acquisition. Such
24750
aaf835407bf2 wlock: do not warn for non-wait locking
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24748
diff changeset
2978 # acquisition would not cause dead-lock as they would just fail.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2979 if wait and (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2980 self.ui.configbool(b'devel', b'all-warnings')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2981 or self.ui.configbool(b'devel', b'check-locks')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2982 ):
29705
41689e293994 develwarn: use the lock helper in local repo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29417
diff changeset
2983 if self._currentlock(self._lockref) is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2984 self.ui.develwarn(b'"wlock" acquired after "lock"')
1531
2ba8bf7defda add localrepo.wlock for protecting the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1516
diff changeset
2985
14930
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
2986 def unlock():
22404
12bc7f06fc41 dirstate: add begin/endparentchange to dirstate
Durham Goode <durham@fb.com>
parents: 22362
diff changeset
2987 if self.dirstate.pendingparentchange():
12bc7f06fc41 dirstate: add begin/endparentchange to dirstate
Durham Goode <durham@fb.com>
parents: 22362
diff changeset
2988 self.dirstate.invalidate()
12bc7f06fc41 dirstate: add begin/endparentchange to dirstate
Durham Goode <durham@fb.com>
parents: 22362
diff changeset
2989 else:
26748
5ba0a99ff27f dirstate: make dirstate.write() callers pass transaction object to it
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26741
diff changeset
2990 self.dirstate.write(None)
22404
12bc7f06fc41 dirstate: add begin/endparentchange to dirstate
Durham Goode <durham@fb.com>
parents: 22362
diff changeset
2991
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2992 self._filecache[b'dirstate'].refresh()
14930
372d9d8b1da4 localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents: 14929
diff changeset
2993
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2994 l = self._lock(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2995 self.vfs,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2996 b"wlock",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2997 wait,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2998 unlock,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
2999 self.invalidatedirstate,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3000 _(b'working directory of %s') % self.origroot,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3001 )
4917
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4916
diff changeset
3002 self._wlockref = weakref.ref(l)
126f527b3ba3 Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents: 4916
diff changeset
3003 return l
1531
2ba8bf7defda add localrepo.wlock for protecting the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1516
diff changeset
3004
26488
df2dc5141721 localrepo: add a way to get the current lock if it's held
Siddharth Agarwal <sid0@fb.com>
parents: 26475
diff changeset
3005 def _currentlock(self, lockref):
df2dc5141721 localrepo: add a way to get the current lock if it's held
Siddharth Agarwal <sid0@fb.com>
parents: 26475
diff changeset
3006 """Returns the lock if it's held, or None if it's not."""
df2dc5141721 localrepo: add a way to get the current lock if it's held
Siddharth Agarwal <sid0@fb.com>
parents: 26475
diff changeset
3007 if lockref is None:
df2dc5141721 localrepo: add a way to get the current lock if it's held
Siddharth Agarwal <sid0@fb.com>
parents: 26475
diff changeset
3008 return None
df2dc5141721 localrepo: add a way to get the current lock if it's held
Siddharth Agarwal <sid0@fb.com>
parents: 26475
diff changeset
3009 l = lockref()
df2dc5141721 localrepo: add a way to get the current lock if it's held
Siddharth Agarwal <sid0@fb.com>
parents: 26475
diff changeset
3010 if l is None or not l.held:
df2dc5141721 localrepo: add a way to get the current lock if it's held
Siddharth Agarwal <sid0@fb.com>
parents: 26475
diff changeset
3011 return None
df2dc5141721 localrepo: add a way to get the current lock if it's held
Siddharth Agarwal <sid0@fb.com>
parents: 26475
diff changeset
3012 return l
df2dc5141721 localrepo: add a way to get the current lock if it's held
Siddharth Agarwal <sid0@fb.com>
parents: 26475
diff changeset
3013
26489
2a3fc0272e3f localrepo: add a way to get the current wlock if it's held
Siddharth Agarwal <sid0@fb.com>
parents: 26488
diff changeset
3014 def currentwlock(self):
2a3fc0272e3f localrepo: add a way to get the current wlock if it's held
Siddharth Agarwal <sid0@fb.com>
parents: 26488
diff changeset
3015 """Returns the wlock if it's held, or None if it's not."""
2a3fc0272e3f localrepo: add a way to get the current wlock if it's held
Siddharth Agarwal <sid0@fb.com>
parents: 26488
diff changeset
3016 return self._currentlock(self._wlockref)
2a3fc0272e3f localrepo: add a way to get the current wlock if it's held
Siddharth Agarwal <sid0@fb.com>
parents: 26488
diff changeset
3017
43712
f965b1027fb0 commit: drop unused "vdirs" argument from repo.checkcommitpatterns()
Martin von Zweigbergk <martinvonz@google.com>
parents: 43711
diff changeset
3018 def checkcommitpatterns(self, wctx, match, status, fail):
30332
318a24b52eeb spelling: fixes of non-dictionary words
Mads Kiilerich <madski@unity3d.com>
parents: 30272
diff changeset
3019 """check for commit arguments that aren't committable"""
28814
1f65f291a5b7 localrepo: drop force check from checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28813
diff changeset
3020 if match.isexact() or match.prefix():
28813
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
3021 matched = set(status.modified + status.added + status.removed)
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
3022
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
3023 for f in match.files():
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
3024 f = self.dirstate.normalize(f)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3025 if f == b'.' or f in matched or f in wctx.substate:
28813
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
3026 continue
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
3027 if f in status.deleted:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3028 fail(f, _(b'file not found!'))
43711
7f443cce2972 commit: rewrite check for `hg ci <path>` being a directory
Martin von Zweigbergk <martinvonz@google.com>
parents: 43661
diff changeset
3029 # Is it a directory that exists or used to exist?
7f443cce2972 commit: rewrite check for `hg ci <path>` being a directory
Martin von Zweigbergk <martinvonz@google.com>
parents: 43661
diff changeset
3030 if self.wvfs.isdir(f) or wctx.p1().hasdir(f):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3031 d = f + b'/'
28813
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
3032 for mf in matched:
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
3033 if mf.startswith(d):
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
3034 break
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
3035 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3036 fail(f, _(b"no match under directory!"))
28813
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
3037 elif f not in self.dirstate:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3038 fail(f, _(b"file not tracked!"))
28813
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
3039
18016
2a393df0f5cc clfilter: rename `unfilteredmeth` to `unfilteredmethod`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18014
diff changeset
3040 @unfilteredmethod
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3041 def commit(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3042 self,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3043 text=b"",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3044 user=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3045 date=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3046 match=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3047 force=False,
44023
3216cabffd4a commit: change default `editor` parameter to None
Matt Harbison <matt_harbison@yahoo.com>
parents: 44014
diff changeset
3048 editor=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3049 extra=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3050 ):
8515
865e08a7d6b0 localrepo: update commit*() docstrings
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8503
diff changeset
3051 """Add a new revision to current repository.
865e08a7d6b0 localrepo: update commit*() docstrings
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8503
diff changeset
3052
8706
25e9c71b89de commit: drop the now-unused files parameter
Matt Mackall <mpm@selenic.com>
parents: 8705
diff changeset
3053 Revision information is gathered from the working directory,
25e9c71b89de commit: drop the now-unused files parameter
Matt Mackall <mpm@selenic.com>
parents: 8705
diff changeset
3054 match can be used to filter the committed files. If editor is
25e9c71b89de commit: drop the now-unused files parameter
Matt Mackall <mpm@selenic.com>
parents: 8705
diff changeset
3055 supplied, it is called to get a commit message.
8515
865e08a7d6b0 localrepo: update commit*() docstrings
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8503
diff changeset
3056 """
26322
2cd19782d2d4 commit: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26321
diff changeset
3057 if extra is None:
2cd19782d2d4 commit: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26321
diff changeset
3058 extra = {}
8709
b9e0ddb04c5c commit: move explicit file checking into repo.commit
Matt Mackall <mpm@selenic.com>
parents: 8707
diff changeset
3059
8715
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
3060 def fail(f, msg):
45846
96ca817ec192 errors: raise InputError when given non-existent paths etc
Martin von Zweigbergk <martinvonz@google.com>
parents: 45785
diff changeset
3061 raise error.InputError(b'%s: %s' % (f, msg))
8715
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
3062
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
3063 if not match:
41676
0531dff73d0b match: delete unused root and cwd arguments from {always,never,exact}() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41675
diff changeset
3064 match = matchmod.always()
8715
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
3065
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
3066 if not force:
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
3067 match.bad = fail
8c667f4c482e commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents: 8712
diff changeset
3068
41363
b87a009d1b3b localrepo: use context manager for locks in commit()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41362
diff changeset
3069 # lock() for recent changelog (see issue4368)
b87a009d1b3b localrepo: use context manager for locks in commit()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41362
diff changeset
3070 with self.wlock(), self.lock():
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8799
diff changeset
3071 wctx = self[None]
10970
3213e8947975 localrepo.commit: use explicit variables, avoid creating new contexts
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10969
diff changeset
3072 merge = len(wctx.parents()) > 1
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
3073
32312
0d6b3572ad92 match: remove ispartial()
Martin von Zweigbergk <martinvonz@google.com>
parents: 32292
diff changeset
3074 if not force and merge and not match.always():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3075 raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3076 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3077 b'cannot partially commit a merge '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3078 b'(do not specify files or patterns)'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3079 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3080 )
6706
716a1296e182 localrepo: replace dirstate by workingfilectx in filecommit()
Patrick Mezard <pmezard@gmail.com>
parents: 6705
diff changeset
3081
22928
5e5d297ccbd0 localrepo: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22910
diff changeset
3082 status = self.status(match=match, clean=force)
8706
25e9c71b89de commit: drop the now-unused files parameter
Matt Mackall <mpm@selenic.com>
parents: 8705
diff changeset
3083 if force:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3084 status.modified.extend(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3085 status.clean
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3086 ) # mq may commit clean files
3621
7d3d603e7df9 localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3620
diff changeset
3087
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8799
diff changeset
3088 # check subrepos
36009
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35896
diff changeset
3089 subs, commitsubs, newstate = subrepoutil.precommit(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3090 self.ui, wctx, status, match, force=force
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3091 )
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8799
diff changeset
3092
8709
b9e0ddb04c5c commit: move explicit file checking into repo.commit
Matt Mackall <mpm@selenic.com>
parents: 8707
diff changeset
3093 # make sure all explicit patterns are matched
28813
d77b790bd8d6 localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents: 28198
diff changeset
3094 if not force:
43712
f965b1027fb0 commit: drop unused "vdirs" argument from repo.checkcommitpatterns()
Martin von Zweigbergk <martinvonz@google.com>
parents: 43711
diff changeset
3095 self.checkcommitpatterns(wctx, match, status, fail)
8709
b9e0ddb04c5c commit: move explicit file checking into repo.commit
Matt Mackall <mpm@selenic.com>
parents: 8707
diff changeset
3096
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3097 cctx = context.workingcommitctx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3098 self, status, text, user, date, extra
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3099 )
18659
b946470efed9 localrepo: create context used for actual commit earlier
David Schleimer <dschleimer@fb.com>
parents: 18644
diff changeset
3100
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44852
diff changeset
3101 ms = mergestatemod.mergestate.read(self)
44409
f935b680860d commit: error out on unresolved files even if commit would be empty
Martin von Zweigbergk <martinvonz@google.com>
parents: 44382
diff changeset
3102 mergeutil.checkunresolved(ms)
f935b680860d commit: error out on unresolved files even if commit would be empty
Martin von Zweigbergk <martinvonz@google.com>
parents: 44382
diff changeset
3103
25840
25897d778738 commit: mark internal-only option
Matt Mackall <mpm@selenic.com>
parents: 25839
diff changeset
3104 # internal config: ui.allowemptycommit
45088
3e40abe0a170 commit: factor out empty commit check to `basectx.isempty()`
Manuel Jacob <me@manueljacob.de>
parents: 45084
diff changeset
3105 if cctx.isempty() and not self.ui.configbool(
3e40abe0a170 commit: factor out empty commit check to `basectx.isempty()`
Manuel Jacob <me@manueljacob.de>
parents: 45084
diff changeset
3106 b'ui', b'allowemptycommit'
3e40abe0a170 commit: factor out empty commit check to `basectx.isempty()`
Manuel Jacob <me@manueljacob.de>
parents: 45084
diff changeset
3107 ):
44442
6306baa7d19a commit: print debug message when clearing dirstate and wdir clean
Martin von Zweigbergk <martinvonz@google.com>
parents: 44437
diff changeset
3108 self.ui.debug(b'nothing to commit, clearing merge state\n')
44437
6a34e438461b commit: clear resolved mergestate even if working copy is clean
Martin von Zweigbergk <martinvonz@google.com>
parents: 44409
diff changeset
3109 ms.reset()
8404
a2bc39ade36b commit: move 'nothing changed' test into commit()
Matt Mackall <mpm@selenic.com>
parents: 8403
diff changeset
3110 return None
a2bc39ade36b commit: move 'nothing changed' test into commit()
Matt Mackall <mpm@selenic.com>
parents: 8403
diff changeset
3111
18660
7e6946ed5756 localrepo: use workingctx for validation in commit
David Schleimer <dschleimer@fb.com>
parents: 18659
diff changeset
3112 if merge and cctx.deleted():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3113 raise error.Abort(_(b"cannot commit merge with missing files"))
16536
63c817ea4a70 commit: abort on merge with missing files
Patrick Mezard <patrick@mezard.eu>
parents: 16456
diff changeset
3114
8496
a21605de1509 commit: move editor outside transaction
Matt Mackall <mpm@selenic.com>
parents: 8481
diff changeset
3115 if editor:
8994
4a1187d3cb00 commit: report modified subrepos in commit editor
Matt Mackall <mpm@selenic.com>
parents: 8954
diff changeset
3116 cctx._text = editor(self, cctx, subs)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3117 edited = text != cctx._text
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8799
diff changeset
3118
20765
f042d4b263f4 localrepo: save manually edited commit message as soon as possible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20332
diff changeset
3119 # Save commit message in case this transaction gets rolled back
f042d4b263f4 localrepo: save manually edited commit message as soon as possible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20332
diff changeset
3120 # (e.g. by a pretxncommit hook). Leave the content alone on
f042d4b263f4 localrepo: save manually edited commit message as soon as possible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20332
diff changeset
3121 # the assumption that the user will use the same editor again.
f042d4b263f4 localrepo: save manually edited commit message as soon as possible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20332
diff changeset
3122 msgfn = self.savecommitmessage(cctx._text)
f042d4b263f4 localrepo: save manually edited commit message as soon as possible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20332
diff changeset
3123
16073
b254f827b7a6 subrepo: rewrite handling of subrepo state at commit (issue2403)
Matt Mackall <mpm@selenic.com>
parents: 16030
diff changeset
3124 # commit subs and write new state
b254f827b7a6 subrepo: rewrite handling of subrepo state at commit (issue2403)
Matt Mackall <mpm@selenic.com>
parents: 16030
diff changeset
3125 if subs:
41688
ec7bba81ebf4 commit: respect ui.relative-paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 41676
diff changeset
3126 uipathfn = scmutil.getuipathfn(self)
16073
b254f827b7a6 subrepo: rewrite handling of subrepo state at commit (issue2403)
Matt Mackall <mpm@selenic.com>
parents: 16030
diff changeset
3127 for s in sorted(commitsubs):
11112
4a9bee613737 subrepo: print paths relative to upper repo root for push/pull/commit
Edouard Gomez <ed.gomez@free.fr>
parents: 11063
diff changeset
3128 sub = wctx.sub(s)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3129 self.ui.status(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3130 _(b'committing subrepository %s\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3131 % uipathfn(subrepoutil.subrelpath(sub))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3132 )
11112
4a9bee613737 subrepo: print paths relative to upper repo root for push/pull/commit
Edouard Gomez <ed.gomez@free.fr>
parents: 11063
diff changeset
3133 sr = sub.commit(cctx._text, user, date)
16073
b254f827b7a6 subrepo: rewrite handling of subrepo state at commit (issue2403)
Matt Mackall <mpm@selenic.com>
parents: 16030
diff changeset
3134 newstate[s] = (newstate[s][0], sr)
36009
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35896
diff changeset
3135 subrepoutil.writestate(self, newstate)
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8799
diff changeset
3136
10970
3213e8947975 localrepo.commit: use explicit variables, avoid creating new contexts
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10969
diff changeset
3137 p1, p2 = self.dirstate.parents()
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46907
diff changeset
3138 hookp1, hookp2 = hex(p1), (p2 != self.nullid and hex(p2) or b'')
9935
48b81d9bca8d commit: if relevant, tell user their commit message was saved.
Greg Ward <greg-hg@gerg.ca>
parents: 9934
diff changeset
3139 try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3140 self.hook(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3141 b"precommit", throw=True, parent1=hookp1, parent2=hookp2
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3142 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3143 with self.transaction(b'commit'):
41362
57c462db87fd localrepo: use context manager for transaction in commit()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41361
diff changeset
3144 ret = self.commitctx(cctx, True)
57c462db87fd localrepo: use context manager for transaction in commit()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41361
diff changeset
3145 # update bookmarks, dirstate and mergestate
57c462db87fd localrepo: use context manager for transaction in commit()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41361
diff changeset
3146 bookmarks.update(self, [p1, p2], ret)
57c462db87fd localrepo: use context manager for transaction in commit()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41361
diff changeset
3147 cctx.markcommitted(ret)
57c462db87fd localrepo: use context manager for transaction in commit()
Martin von Zweigbergk <martinvonz@google.com>
parents: 41361
diff changeset
3148 ms.reset()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3149 except: # re-raises
9935
48b81d9bca8d commit: if relevant, tell user their commit message was saved.
Greg Ward <greg-hg@gerg.ca>
parents: 9934
diff changeset
3150 if edited:
48b81d9bca8d commit: if relevant, tell user their commit message was saved.
Greg Ward <greg-hg@gerg.ca>
parents: 9934
diff changeset
3151 self.ui.write(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3152 _(b'note: commit message saved in %s\n') % msgfn
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3153 )
44733
c6d31e659a28 commit: tell user what to do with .hg/last-message.txt
Martin von Zweigbergk <martinvonz@google.com>
parents: 44687
diff changeset
3154 self.ui.write(
c6d31e659a28 commit: tell user what to do with .hg/last-message.txt
Martin von Zweigbergk <martinvonz@google.com>
parents: 44687
diff changeset
3155 _(
c6d31e659a28 commit: tell user what to do with .hg/last-message.txt
Martin von Zweigbergk <martinvonz@google.com>
parents: 44687
diff changeset
3156 b"note: use 'hg commit --logfile "
c6d31e659a28 commit: tell user what to do with .hg/last-message.txt
Martin von Zweigbergk <martinvonz@google.com>
parents: 44687
diff changeset
3157 b".hg/last-message.txt --edit' to reuse it\n"
c6d31e659a28 commit: tell user what to do with .hg/last-message.txt
Martin von Zweigbergk <martinvonz@google.com>
parents: 44687
diff changeset
3158 )
c6d31e659a28 commit: tell user what to do with .hg/last-message.txt
Martin von Zweigbergk <martinvonz@google.com>
parents: 44687
diff changeset
3159 )
9935
48b81d9bca8d commit: if relevant, tell user their commit message was saved.
Greg Ward <greg-hg@gerg.ca>
parents: 9934
diff changeset
3160 raise
6710
0aa91f69a4c4 localrepo: extract _commitctx() from commit()
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
3161
43778
888bd39ed555 lock: pass "success" boolean to _afterlock callbacks
Kyle Lippincott <spectral@google.com>
parents: 43765
diff changeset
3162 def commithook(unused_success):
23129
eb315418224c hook: protect commit hooks against stripping of temporary commit (issue4422)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23126
diff changeset
3163 # hack for command that use a temporary commit (eg: histedit)
eb315418224c hook: protect commit hooks against stripping of temporary commit (issue4422)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23126
diff changeset
3164 # temporary commit got stripped before hook release
24992
7df090c9c9fe localrepo: use changelog.hasnode instead of self.__contains__
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24956
diff changeset
3165 if self.changelog.hasnode(ret):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3166 self.hook(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3167 b"commit", node=hex(ret), parent1=hookp1, parent2=hookp2
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3168 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3169
16680
d0e419b0f7de tag: run commit hook when lock is released (issue3344)
Mads Kiilerich <mads@kiilerich.com>
parents: 16679
diff changeset
3170 self._afterlock(commithook)
10492
0e64d814d7d0 run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents: 10435
diff changeset
3171 return ret
0e64d814d7d0 run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents: 10435
diff changeset
3172
18016
2a393df0f5cc clfilter: rename `unfilteredmeth` to `unfilteredmethod`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18014
diff changeset
3173 @unfilteredmethod
42620
d98ec36be808 convert: add a config option to help doing identity hg->hg conversion
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42546
diff changeset
3174 def commitctx(self, ctx, error=False, origctx=None):
45203
ae5c1a3bc339 commitctx: extract the function in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45202
diff changeset
3175 return commit.commitctx(self, ctx, error=error, origctx=origctx)
660
2c83350784c3 Move commit hook after commit completes
Matt Mackall <mpm@selenic.com>
parents: 659
diff changeset
3176
18016
2a393df0f5cc clfilter: rename `unfilteredmeth` to `unfilteredmethod`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18014
diff changeset
3177 @unfilteredmethod
18310
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
3178 def destroying(self):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
3179 """Inform the repository that nodes are about to be destroyed.
18310
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
3180 Intended for use by strip and rollback, so there's a common
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
3181 place for anything that has to be done before destroying history.
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
3182
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
3183 This is mostly useful for saving state that is in memory and waiting
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
3184 to be flushed when the current lock is released. Because a call to
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
3185 destroyed is imminent, the repo will be invalidated causing those
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
3186 changes to stay in memory (waiting for the next unlock), or vanish
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
3187 completely.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
3188 """
18312
7331ee72f99c localrepo: write the phasecache when destroying nodes
Idan Kamara <idankk86@gmail.com>
parents: 18311
diff changeset
3189 # When using the same lock to commit and strip, the phasecache is left
7331ee72f99c localrepo: write the phasecache when destroying nodes
Idan Kamara <idankk86@gmail.com>
parents: 18311
diff changeset
3190 # dirty after committing. Then when we strip, the repo is invalidated,
7331ee72f99c localrepo: write the phasecache when destroying nodes
Idan Kamara <idankk86@gmail.com>
parents: 18311
diff changeset
3191 # causing those changes to disappear.
43421
be384a2052aa py3: don't use bytes with vars() or __dict__
Martin von Zweigbergk <martinvonz@google.com>
parents: 43414
diff changeset
3192 if '_phasecache' in vars(self):
18312
7331ee72f99c localrepo: write the phasecache when destroying nodes
Idan Kamara <idankk86@gmail.com>
parents: 18311
diff changeset
3193 self._phasecache.write()
7331ee72f99c localrepo: write the phasecache when destroying nodes
Idan Kamara <idankk86@gmail.com>
parents: 18311
diff changeset
3194
18310
4499ba5ac35c localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents: 18309
diff changeset
3195 @unfilteredmethod
18395
904b7109938e destroyed: drop complex branchcache rebuilt logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18394
diff changeset
3196 def destroyed(self):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
3197 """Inform the repository that nodes have been destroyed.
9150
09a1ee498756 localrepo: add destroyed() method for strip/rollback to use (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9149
diff changeset
3198 Intended for use by strip and rollback, so there's a common
17013
c8eda7bbdcab strip: incrementally update the branchheads cache after a strip
Joshua Redstone <joshua.redstone@fb.com>
parents: 17012
diff changeset
3199 place for anything that has to be done after destroying history.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
3200 """
18221
082d6929fd4d localrepo: filter unknown nodes from the phasecache on destroyed
Idan Kamara <idankk86@gmail.com>
parents: 18219
diff changeset
3201 # When one tries to:
082d6929fd4d localrepo: filter unknown nodes from the phasecache on destroyed
Idan Kamara <idankk86@gmail.com>
parents: 18219
diff changeset
3202 # 1) destroy nodes thus calling this method (e.g. strip)
082d6929fd4d localrepo: filter unknown nodes from the phasecache on destroyed
Idan Kamara <idankk86@gmail.com>
parents: 18219
diff changeset
3203 # 2) use phasecache somewhere (e.g. commit)
082d6929fd4d localrepo: filter unknown nodes from the phasecache on destroyed
Idan Kamara <idankk86@gmail.com>
parents: 18219
diff changeset
3204 #
082d6929fd4d localrepo: filter unknown nodes from the phasecache on destroyed
Idan Kamara <idankk86@gmail.com>
parents: 18219
diff changeset
3205 # then 2) will fail because the phasecache contains nodes that were
082d6929fd4d localrepo: filter unknown nodes from the phasecache on destroyed
Idan Kamara <idankk86@gmail.com>
parents: 18219
diff changeset
3206 # removed. We can either remove phasecache from the filecache,
082d6929fd4d localrepo: filter unknown nodes from the phasecache on destroyed
Idan Kamara <idankk86@gmail.com>
parents: 18219
diff changeset
3207 # causing it to reload next time it is accessed, or simply filter
082d6929fd4d localrepo: filter unknown nodes from the phasecache on destroyed
Idan Kamara <idankk86@gmail.com>
parents: 18219
diff changeset
3208 # the removed nodes now and write the updated cache.
18757
1c8e0d6ac3b0 localrepo: always write the filtered phasecache when nodes are destroyed (issue3827)
Idan Kamara <idankk86@gmail.com>
parents: 18739
diff changeset
3209 self._phasecache.filterunknown(self)
1c8e0d6ac3b0 localrepo: always write the filtered phasecache when nodes are destroyed (issue3827)
Idan Kamara <idankk86@gmail.com>
parents: 18739
diff changeset
3210 self._phasecache.write()
18221
082d6929fd4d localrepo: filter unknown nodes from the phasecache on destroyed
Idan Kamara <idankk86@gmail.com>
parents: 18219
diff changeset
3211
32264
a72caf0af38e caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32263
diff changeset
3212 # refresh all repository caches
a72caf0af38e caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32263
diff changeset
3213 self.updatecaches()
18223
6d6d0248530b destroyed: filter unknown before computing branchcache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18222
diff changeset
3214
9151
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
3215 # Ensure the persistent tag cache is updated. Doing it now
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
3216 # means that the tag cache only has to worry about destroyed
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
3217 # heads immediately after a strip/rollback. That in turn
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
3218 # guarantees that "cachetip == currenttip" (comparing both rev
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
3219 # and node) always means no nodes have been added or destroyed.
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
3220
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
3221 # XXX this is suboptimal when qrefresh'ing: we strip the current
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
3222 # head, refresh the tag cache, then immediately add a new head.
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
3223 # But I think doing it this way is necessary for the "instant
f528d1a93491 tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents: 9150
diff changeset
3224 # tag cache retrieval" case to work.
18313
3e4a944c0d04 destroyed: keep the filecache in sync with __dict__ (issue3335) (issue3693) (issue3743)
Idan Kamara <idankk86@gmail.com>
parents: 18312
diff changeset
3225 self.invalidate()
17324
9f94358f9f93 localrepo: clear the filecache on _rollback() and destroyed()
Idan Kamara <idankk86@gmail.com>
parents: 17306
diff changeset
3226
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3227 def status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3228 self,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3229 node1=b'.',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3230 node2=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3231 match=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3232 ignored=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3233 clean=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3234 unknown=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3235 listsubrepos=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3236 ):
21596
83bbfb23cb24 localrepo: replace status method with a shim
Sean Farley <sean.michael.farley@gmail.com>
parents: 21591
diff changeset
3237 '''a convenience method that calls node1.status(node2)'''
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3238 return self[node1].status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3239 node2, match, ignored, clean, unknown, listsubrepos
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3240 )
2661
5c10b7ed3411 status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2621
diff changeset
3241
32814
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
3242 def addpostdsstatus(self, ps):
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
3243 """Add a callback to run within the wlock, at the point at which status
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
3244 fixups happen.
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
3245
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
3246 On status completion, callback(wctx, status) will be called with the
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
3247 wlock held, unless the dirstate has changed from underneath or the wlock
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
3248 couldn't be grabbed.
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
3249
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
3250 Callbacks should not capture and use a cached copy of the dirstate --
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
3251 it might change in the meanwhile. Instead, they should access the
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
3252 dirstate via wctx.repo().dirstate.
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
3253
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
3254 This list is emptied out after each status run -- extensions should
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
3255 make sure it adds to this list each time dirstate.status is called.
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
3256 Extensions should also make sure they don't call this for statuses
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
3257 that don't involve the dirstate.
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
3258 """
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
3259
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
3260 # The list is located here for uniqueness reasons -- it is actually
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
3261 # managed by the workingctx, but that isn't unique per-repo.
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
3262 self._postdsstatus.append(ps)
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
3263
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
3264 def postdsstatus(self):
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
3265 """Used by workingctx to get the list of post-dirstate-status hooks."""
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
3266 return self._postdsstatus
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
3267
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
3268 def clearpostdsstatus(self):
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
3269 """Used by workingctx to clear post-dirstate-status hooks."""
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
3270 del self._postdsstatus[:]
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32730
diff changeset
3271
8796
2bcef677a6c3 localrepo: remove 'closed' argument to heads(...) function
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 8731
diff changeset
3272 def heads(self, start=None):
30875
1791be8a95c5 localrepo: avoid unnecessary conversion from node to rev
Stanislau Hlebik <stash@fb.com>
parents: 30818
diff changeset
3273 if start is None:
30905
6037caa6a2f3 localrepo: cache self.changelog in local variable
Stanislau Hlebik <stash@fb.com>
parents: 30875
diff changeset
3274 cl = self.changelog
30906
72f25e17af9d localrepo: avoid unnecessary sorting
Stanislau Hlebik <stash@fb.com>
parents: 30905
diff changeset
3275 headrevs = reversed(cl.headrevs())
30905
6037caa6a2f3 localrepo: cache self.changelog in local variable
Stanislau Hlebik <stash@fb.com>
parents: 30875
diff changeset
3276 return [cl.node(rev) for rev in headrevs]
30875
1791be8a95c5 localrepo: avoid unnecessary conversion from node to rev
Stanislau Hlebik <stash@fb.com>
parents: 30818
diff changeset
3277
1550
ccb9b62de892 add a -r/--rev option to heads to show only heads descendant from rev
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1532
diff changeset
3278 heads = self.changelog.heads(start)
ccb9b62de892 add a -r/--rev option to heads to show only heads descendant from rev
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1532
diff changeset
3279 # sort the output in rev descending order
13075
d73c3034deee coding style: fix gratuitous whitespace after Python keywords
Thomas Arendsen Hein <thomas@jtah.de>
parents: 13047
diff changeset
3280 return sorted(heads, key=self.changelog.rev, reverse=True)
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 220
diff changeset
3281
8694
ca8d05e1f1d1 localrepo: set heads and branchheads to be closed=False by default
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 8680
diff changeset
3282 def branchheads(self, branch=None, start=None, closed=False):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
3283 """return a (possibly filtered) list of heads for the given branch
9475
c295a82a020b localrepo: fix bugs in branchheads and add docstring
Sune Foldager <cryo@cyanite.org>
parents: 9423
diff changeset
3284
c295a82a020b localrepo: fix bugs in branchheads and add docstring
Sune Foldager <cryo@cyanite.org>
parents: 9423
diff changeset
3285 Heads are returned in topological order, from newest to oldest.
c295a82a020b localrepo: fix bugs in branchheads and add docstring
Sune Foldager <cryo@cyanite.org>
parents: 9423
diff changeset
3286 If branch is None, use the dirstate branch.
c295a82a020b localrepo: fix bugs in branchheads and add docstring
Sune Foldager <cryo@cyanite.org>
parents: 9423
diff changeset
3287 If start is not None, return only heads reachable from start.
c295a82a020b localrepo: fix bugs in branchheads and add docstring
Sune Foldager <cryo@cyanite.org>
parents: 9423
diff changeset
3288 If closed is True, return heads that are marked as closed as well.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
3289 """
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6743
diff changeset
3290 if branch is None:
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6743
diff changeset
3291 branch = self[None].branch()
9675
ee913987e4b0 localrepo/branchcache: remove lbranchmap(), convert users to use utf-8 names
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 9674
diff changeset
3292 branches = self.branchmap()
42004
0bd730fbcc2b branchcache: introduce hasbranch()
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42001
diff changeset
3293 if not branches.hasbranch(branch):
4648
8e503fa54d2d Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents: 4635
diff changeset
3294 return []
7654
816b708f23af store all heads of a branch in the branch cache
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7644
diff changeset
3295 # the cache returns heads ordered lowest to highest
20189
1831993d0902 localrepo: refactor repo.branchheads() to use repo.branchmap().branchheads()
Brodie Rao <brodie@sf.io>
parents: 20187
diff changeset
3296 bheads = list(reversed(branches.branchheads(branch, closed=closed)))
4648
8e503fa54d2d Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents: 4635
diff changeset
3297 if start is not None:
7654
816b708f23af store all heads of a branch in the branch cache
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7644
diff changeset
3298 # filter out the heads that cannot be reached from startrev
9475
c295a82a020b localrepo: fix bugs in branchheads and add docstring
Sune Foldager <cryo@cyanite.org>
parents: 9423
diff changeset
3299 fbheads = set(self.changelog.nodesbetween([start], bheads)[2])
c295a82a020b localrepo: fix bugs in branchheads and add docstring
Sune Foldager <cryo@cyanite.org>
parents: 9423
diff changeset
3300 bheads = [h for h in bheads if h in fbheads]
7654
816b708f23af store all heads of a branch in the branch cache
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 7644
diff changeset
3301 return bheads
4648
8e503fa54d2d Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents: 4635
diff changeset
3302
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
3303 def branches(self, nodes):
1615
83238c1db6de Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1597
diff changeset
3304 if not nodes:
83238c1db6de Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1597
diff changeset
3305 nodes = [self.changelog.tip()]
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
3306 b = []
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
3307 for n in nodes:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
3308 t = n
14494
1ffeeb91c55d check-code: flag 0/1 used as constant Boolean expression
Martin Geisler <mg@lazybytes.net>
parents: 14482
diff changeset
3309 while True:
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
3310 p = self.changelog.parents(n)
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46907
diff changeset
3311 if p[1] != self.nullid or p[0] == self.nullid:
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
3312 b.append((t, n, p[0], p[1]))
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
3313 break
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
3314 n = p[0]
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
3315 return b
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
3316
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
3317 def between(self, pairs):
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
3318 r = []
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
3319
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
3320 for top, bottom in pairs:
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
3321 n, l, i = top, [], 0
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
3322 f = 1
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
3323
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46907
diff changeset
3324 while n != bottom and n != self.nullid:
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
3325 p = self.changelog.parents(n)[0]
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
3326 if i == f:
575
7f5ce4bbdd7b More whitespace cleanups
mpm@selenic.com
parents: 566
diff changeset
3327 l.append(n)
56
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
3328 f = f * 2
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
3329 n = p
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
3330 i += 1
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
3331
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
3332 r.append(l)
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
3333
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
3334 return r
ad2ea1185f04 Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents: 55
diff changeset
3335
20924
e10000369b47 push: pass a `pushoperation` object to localrepo.checkpush
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20884
diff changeset
3336 def checkpush(self, pushop):
13327
dc11e30b48a3 mq: factor out push conditions checks
Patrick Mezard <pmezard@gmail.com>
parents: 13272
diff changeset
3337 """Extensions can override this function if additional checks have
dc11e30b48a3 mq: factor out push conditions checks
Patrick Mezard <pmezard@gmail.com>
parents: 13272
diff changeset
3338 to be performed before pushing, or call it if they override push
dc11e30b48a3 mq: factor out push conditions checks
Patrick Mezard <pmezard@gmail.com>
parents: 13272
diff changeset
3339 command.
dc11e30b48a3 mq: factor out push conditions checks
Patrick Mezard <pmezard@gmail.com>
parents: 13272
diff changeset
3340 """
dc11e30b48a3 mq: factor out push conditions checks
Patrick Mezard <pmezard@gmail.com>
parents: 13272
diff changeset
3341
21043
6c383c871fdb localrepo: introduce "prepushoutgoinghooks" to extend outgoing check easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20987
diff changeset
3342 @unfilteredpropertycache
6c383c871fdb localrepo: introduce "prepushoutgoinghooks" to extend outgoing check easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20987
diff changeset
3343 def prepushoutgoinghooks(self):
28876
79b8f052ee51 localrepo: refactor prepushoutgoinghook to take a pushop
Mads Kiilerich <madski@unity3d.com>
parents: 28814
diff changeset
3344 """Return util.hooks consists of a pushop with repo, remote, outgoing
79b8f052ee51 localrepo: refactor prepushoutgoinghook to take a pushop
Mads Kiilerich <madski@unity3d.com>
parents: 28814
diff changeset
3345 methods, which are called before pushing changesets.
21043
6c383c871fdb localrepo: introduce "prepushoutgoinghooks" to extend outgoing check easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20987
diff changeset
3346 """
6c383c871fdb localrepo: introduce "prepushoutgoinghooks" to extend outgoing check easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20987
diff changeset
3347 return util.hooks()
6c383c871fdb localrepo: introduce "prepushoutgoinghooks" to extend outgoing check easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20987
diff changeset
3348
11368
b9eb005c54ad pushkey: add localrepo support
Matt Mackall <mpm@selenic.com>
parents: 11303
diff changeset
3349 def pushkey(self, namespace, key, old, new):
23416
53a65929ef1f pushkey: gracefully handle prepushkey hook failure (issue4455)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23129
diff changeset
3350 try:
24824
0325c0da05df pushkey: use hook arguments from transaction when one exists
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24821
diff changeset
3351 tr = self.currenttransaction()
0325c0da05df pushkey: use hook arguments from transaction when one exists
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24821
diff changeset
3352 hookargs = {}
0325c0da05df pushkey: use hook arguments from transaction when one exists
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24821
diff changeset
3353 if tr is not None:
0325c0da05df pushkey: use hook arguments from transaction when one exists
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24821
diff changeset
3354 hookargs.update(tr.hookargs)
36400
7b86aa31b004 py3: fix handling of keyword arguments at more places
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36373
diff changeset
3355 hookargs = pycompat.strkwargs(hookargs)
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43421
diff changeset
3356 hookargs['namespace'] = namespace
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43421
diff changeset
3357 hookargs['key'] = key
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43421
diff changeset
3358 hookargs['old'] = old
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43421
diff changeset
3359 hookargs['new'] = new
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3360 self.hook(b'prepushkey', throw=True, **hookargs)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25629
diff changeset
3361 except error.HookAbort as exc:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3362 self.ui.write_err(_(b"pushkey-abort: %s\n") % exc)
23416
53a65929ef1f pushkey: gracefully handle prepushkey hook failure (issue4455)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23129
diff changeset
3363 if exc.hint:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3364 self.ui.write_err(_(b"(%s)\n") % exc.hint)
23416
53a65929ef1f pushkey: gracefully handle prepushkey hook failure (issue4455)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23129
diff changeset
3365 return False
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3366 self.ui.debug(b'pushing key for "%s:%s"\n' % (namespace, key))
14102
7f45b1911893 pushkey: add hooks for pushkey/listkeys
Brodie Rao <brodie@bitheap.org>
parents: 14076
diff changeset
3367 ret = pushkey.push(self, namespace, key, old, new)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3368
43778
888bd39ed555 lock: pass "success" boolean to _afterlock callbacks
Kyle Lippincott <spectral@google.com>
parents: 43765
diff changeset
3369 def runhook(unused_success):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3370 self.hook(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3371 b'pushkey',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3372 namespace=namespace,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3373 key=key,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3374 old=old,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3375 new=new,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3376 ret=ret,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3377 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3378
23648
915ac9403e13 pushkey: run hook after the lock release
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23630
diff changeset
3379 self._afterlock(runhook)
14102
7f45b1911893 pushkey: add hooks for pushkey/listkeys
Brodie Rao <brodie@bitheap.org>
parents: 14076
diff changeset
3380 return ret
11368
b9eb005c54ad pushkey: add localrepo support
Matt Mackall <mpm@selenic.com>
parents: 11303
diff changeset
3381
b9eb005c54ad pushkey: add localrepo support
Matt Mackall <mpm@selenic.com>
parents: 11303
diff changeset
3382 def listkeys(self, namespace):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3383 self.hook(b'prelistkeys', throw=True, namespace=namespace)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3384 self.ui.debug(b'listing keys for "%s"\n' % namespace)
14102
7f45b1911893 pushkey: add hooks for pushkey/listkeys
Brodie Rao <brodie@bitheap.org>
parents: 14076
diff changeset
3385 values = pushkey.list(self, namespace)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3386 self.hook(b'listkeys', namespace=namespace, values=values)
14102
7f45b1911893 pushkey: add hooks for pushkey/listkeys
Brodie Rao <brodie@bitheap.org>
parents: 14076
diff changeset
3387 return values
11368
b9eb005c54ad pushkey: add localrepo support
Matt Mackall <mpm@selenic.com>
parents: 11303
diff changeset
3388
14048
58e58406ed19 wireproto: add test for new optional arg missing on server
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14036
diff changeset
3389 def debugwireargs(self, one, two, three=None, four=None, five=None):
13720
9c4e04fe267e debug: add debugwireargs to test argument passing over the wire
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13716
diff changeset
3390 '''used to test argument passing over the wire'''
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3391 return b"%s %s %s %s %s" % (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3392 one,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3393 two,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3394 pycompat.bytestr(three),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3395 pycompat.bytestr(four),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3396 pycompat.bytestr(five),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3397 )
11368
b9eb005c54ad pushkey: add localrepo support
Matt Mackall <mpm@selenic.com>
parents: 11303
diff changeset
3398
14529
e7a1814854b9 localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents: 14522
diff changeset
3399 def savecommitmessage(self, text):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3400 fp = self.vfs(b'last-message.txt', b'wb')
14529
e7a1814854b9 localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents: 14522
diff changeset
3401 try:
e7a1814854b9 localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents: 14522
diff changeset
3402 fp.write(text)
e7a1814854b9 localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents: 14522
diff changeset
3403 finally:
e7a1814854b9 localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents: 14522
diff changeset
3404 fp.close()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3405 return self.pathto(fp.name[len(self.root) + 1 :])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3406
46713
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
3407 def register_wanted_sidedata(self, category):
47260
ccdd280d1d0d sidedata: use the "feature" to detect that sidedata are enabled
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47238
diff changeset
3408 if repository.REPO_FEATURE_SIDE_DATA not in self.features:
47075
5554aacd783f sidedata: gate sidedata functionality to revlogv2 in more places
Raphaël Gomès <rgomes@octobus.net>
parents: 47073
diff changeset
3409 # Only revlogv2 repos can want sidedata.
5554aacd783f sidedata: gate sidedata functionality to revlogv2 in more places
Raphaël Gomès <rgomes@octobus.net>
parents: 47073
diff changeset
3410 return
46713
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
3411 self._wanted_sidedata.add(pycompat.bytestr(category))
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
3412
47083
81eb7091c494 sidedata: add a way of replacing an existing sidedata computer
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
3413 def register_sidedata_computer(
81eb7091c494 sidedata: add a way of replacing an existing sidedata computer
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
3414 self, kind, category, keys, computer, flags, replace=False
81eb7091c494 sidedata: add a way of replacing an existing sidedata computer
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
3415 ):
47073
64cd1496bb70 revlog: replace the old `revlog_kind` approach with the new `target` one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47042
diff changeset
3416 if kind not in revlogconst.ALL_KINDS:
46713
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
3417 msg = _(b"unexpected revlog kind '%s'.")
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
3418 raise error.ProgrammingError(msg % kind)
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
3419 category = pycompat.bytestr(category)
47083
81eb7091c494 sidedata: add a way of replacing an existing sidedata computer
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
3420 already_registered = category in self._sidedata_computers.get(kind, [])
81eb7091c494 sidedata: add a way of replacing an existing sidedata computer
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
3421 if already_registered and not replace:
46713
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
3422 msg = _(
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
3423 b"cannot register a sidedata computer twice for category '%s'."
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
3424 )
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
3425 raise error.ProgrammingError(msg % category)
47083
81eb7091c494 sidedata: add a way of replacing an existing sidedata computer
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
3426 if replace and not already_registered:
81eb7091c494 sidedata: add a way of replacing an existing sidedata computer
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
3427 msg = _(
81eb7091c494 sidedata: add a way of replacing an existing sidedata computer
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
3428 b"cannot replace a sidedata computer that isn't registered "
81eb7091c494 sidedata: add a way of replacing an existing sidedata computer
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
3429 b"for category '%s'."
81eb7091c494 sidedata: add a way of replacing an existing sidedata computer
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
3430 )
81eb7091c494 sidedata: add a way of replacing an existing sidedata computer
Raphaël Gomès <rgomes@octobus.net>
parents: 47078
diff changeset
3431 raise error.ProgrammingError(msg % category)
46713
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
3432 self._sidedata_computers.setdefault(kind, {})
47078
223b47235d1c sidedata: enable sidedata computers to optionally rewrite flags
Raphaël Gomès <rgomes@octobus.net>
parents: 47075
diff changeset
3433 self._sidedata_computers[kind][category] = (keys, computer, flags)
46713
bc2519513ae0 sidedata-exchange: add `wanted_sidedata` and `sidedata_computers` to repos
Raphaël Gomès <rgomes@octobus.net>
parents: 46711
diff changeset
3434
14529
e7a1814854b9 localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents: 14522
diff changeset
3435
1806
a2c69737e65e Automatic nesting into running transactions in the same repository.
mason@suse.com
parents: 1802
diff changeset
3436 # used to avoid circular references so destructors work
3790
f183c18568df localrepo: change aftertrans to be independant of the store path
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3773
diff changeset
3437 def aftertrans(files):
f183c18568df localrepo: change aftertrans to be independant of the store path
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3773
diff changeset
3438 renamefiles = [tuple(t) for t in files]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3439
1806
a2c69737e65e Automatic nesting into running transactions in the same repository.
mason@suse.com
parents: 1802
diff changeset
3440 def a():
18952
8086b530e2ac localrepo: use "vfs.rename()" instead of "util.rename()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18951
diff changeset
3441 for vfs, src, dest in renamefiles:
31550
66c3ae6d886c localrepo: use tryunlink
Ryan McElroy <rmcelroy@fb.com>
parents: 31536
diff changeset
3442 # if src and dest refer to a same file, vfs.rename is a no-op,
66c3ae6d886c localrepo: use tryunlink
Ryan McElroy <rmcelroy@fb.com>
parents: 31536
diff changeset
3443 # leaving both src and dest on disk. delete dest to make sure
66c3ae6d886c localrepo: use tryunlink
Ryan McElroy <rmcelroy@fb.com>
parents: 31536
diff changeset
3444 # the rename couldn't be such a no-op.
66c3ae6d886c localrepo: use tryunlink
Ryan McElroy <rmcelroy@fb.com>
parents: 31536
diff changeset
3445 vfs.tryunlink(dest)
31209
dd2364f5180a localrepo: handle rename with hardlinks properly
Jun Wu <quark@fb.com>
parents: 31148
diff changeset
3446 try:
18952
8086b530e2ac localrepo: use "vfs.rename()" instead of "util.rename()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18951
diff changeset
3447 vfs.rename(src, dest)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3448 except OSError: # journal file does not yet exist
16441
9dd10a574af2 localrepo: do not complain about missing journal files
Alain Leufroy <alain.leufroy@logilab.fr>
parents: 16426
diff changeset
3449 pass
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3450
1806
a2c69737e65e Automatic nesting into running transactions in the same repository.
mason@suse.com
parents: 1802
diff changeset
3451 return a
a2c69737e65e Automatic nesting into running transactions in the same repository.
mason@suse.com
parents: 1802
diff changeset
3452
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3453
14266
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
3454 def undoname(fn):
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
3455 base, name = os.path.split(fn)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3456 assert name.startswith(b'journal')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3457 return os.path.join(base, name.replace(b'journal', b'undo', 1))
14266
89e7d35e0ef0 fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents: 13957
diff changeset
3458
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3459
39549
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
3460 def instance(ui, path, create, intents=None, createopts=None):
46907
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46902
diff changeset
3461 localpath = urlutil.urllocalpath(path)
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
3462 if create:
39591
76b58f240821 localrepo: use urllocalpath() for path to create repo too
Martin von Zweigbergk <martinvonz@google.com>
parents: 39590
diff changeset
3463 createrepository(ui, localpath, createopts=createopts)
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
3464
39687
bfeab472e3c0 localrepo: create new function for instantiating a local repo object
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39668
diff changeset
3465 return makelocalrepository(ui, localpath, intents=intents)
3223
53e843840349 Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3164
diff changeset
3466
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3467
2740
386f04d6ecb3 clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2673
diff changeset
3468 def islocal(path):
386f04d6ecb3 clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2673
diff changeset
3469 return True
28164
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
3470
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3471
39996
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
3472 def defaultcreateopts(ui, createopts=None):
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
3473 """Populate the default creation options for a repository.
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
3474
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
3475 A dictionary of explicitly requested creation options can be passed
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
3476 in. Missing keys will be populated.
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
3477 """
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
3478 createopts = dict(createopts or {})
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
3479
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3480 if b'backend' not in createopts:
39996
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
3481 # experimental config: storage.new-repo-backend
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3482 createopts[b'backend'] = ui.config(b'storage', b'new-repo-backend')
39996
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
3483
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
3484 return createopts
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
3485
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3486
39996
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
3487 def newreporequirements(ui, createopts):
28164
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
3488 """Determine the set of requirements for a new local repository.
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
3489
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
3490 Extensions can wrap this function to specify custom requirements for
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
3491 new repositories.
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
3492 """
39848
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
3493 # If the repo is being created from a shared repository, we copy
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
3494 # its requirements.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3495 if b'sharedrepo' in createopts:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3496 requirements = set(createopts[b'sharedrepo'].requirements)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3497 if createopts.get(b'sharedrelative'):
45386
034d94f8761b requirements: introduce constants for `shared` and `relshared` requirements
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45373
diff changeset
3498 requirements.add(requirementsmod.RELATIVE_SHARED_REQUIREMENT)
39848
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
3499 else:
45386
034d94f8761b requirements: introduce constants for `shared` and `relshared` requirements
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45373
diff changeset
3500 requirements.add(requirementsmod.SHARED_REQUIREMENT)
39848
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
3501
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
3502 return requirements
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
3503
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3504 if b'backend' not in createopts:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3505 raise error.ProgrammingError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3506 b'backend key not present in createopts; '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3507 b'was defaultcreateopts() called?'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3508 )
39996
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
3509
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3510 if createopts[b'backend'] != b'revlogv1':
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3511 raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3512 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3513 b'unable to determine repository requirements for '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3514 b'storage backend: %s'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3515 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3516 % createopts[b'backend']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3517 )
39996
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
3518
46626
ee91966aec0f requirements: add constant for revlog v1 requirement
Raphaël Gomès <rgomes@octobus.net>
parents: 46607
diff changeset
3519 requirements = {requirementsmod.REVLOGV1_REQUIREMENT}
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3520 if ui.configbool(b'format', b'usestore'):
46637
ab58098bebed requirements: also add a store constant
Raphaël Gomès <rgomes@octobus.net>
parents: 46636
diff changeset
3521 requirements.add(requirementsmod.STORE_REQUIREMENT)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3522 if ui.configbool(b'format', b'usefncache'):
46638
b4c2a2af25e2 requirements: also add a fncache constant
Raphaël Gomès <rgomes@octobus.net>
parents: 46637
diff changeset
3523 requirements.add(requirementsmod.FNCACHE_REQUIREMENT)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3524 if ui.configbool(b'format', b'dotencode'):
46636
c3773636ddbb requirements: also add a dotencode constant
Raphaël Gomès <rgomes@octobus.net>
parents: 46627
diff changeset
3525 requirements.add(requirementsmod.DOTENCODE_REQUIREMENT)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3526
44382
f0027a3dd7cb revlog-compression: update the config to be a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44363
diff changeset
3527 compengines = ui.configlist(b'format', b'revlog-compression')
f0027a3dd7cb revlog-compression: update the config to be a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44363
diff changeset
3528 for compengine in compengines:
f0027a3dd7cb revlog-compression: update the config to be a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44363
diff changeset
3529 if compengine in util.compengines:
46851
3aa78f2aea48 revlog-compression: fix computation of engine availability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46819
diff changeset
3530 engine = util.compengines[compengine]
3aa78f2aea48 revlog-compression: fix computation of engine availability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46819
diff changeset
3531 if engine.available() and engine.revlogheader():
3aa78f2aea48 revlog-compression: fix computation of engine availability
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46819
diff changeset
3532 break
44382
f0027a3dd7cb revlog-compression: update the config to be a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44363
diff changeset
3533 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3534 raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3535 _(
44382
f0027a3dd7cb revlog-compression: update the config to be a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44363
diff changeset
3536 b'compression engines %s defined by '
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3537 b'format.revlog-compression not available'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3538 )
44382
f0027a3dd7cb revlog-compression: update the config to be a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44363
diff changeset
3539 % b', '.join(b'"%s"' % e for e in compengines),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3540 hint=_(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3541 b'run "hg debuginstall" to list available '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3542 b'compression engines'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3543 ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3544 )
30818
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30634
diff changeset
3545
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30634
diff changeset
3546 # zlib is the historical default and doesn't need an explicit requirement.
44382
f0027a3dd7cb revlog-compression: update the config to be a list
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44363
diff changeset
3547 if compengine == b'zstd':
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3548 requirements.add(b'revlog-compression-zstd')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3549 elif compengine != b'zlib':
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3550 requirements.add(b'exp-compression-%s' % compengine)
30818
4c0a5a256ae8 localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30634
diff changeset
3551
28164
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
3552 if scmutil.gdinitconfig(ui):
46627
f4c325bf80fc requirements: also add a generaldelta constant
Raphaël Gomès <rgomes@octobus.net>
parents: 46626
diff changeset
3553 requirements.add(requirementsmod.GENERALDELTA_REQUIREMENT)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3554 if ui.configbool(b'format', b'sparse-revlog'):
45373
d7dcc75a3eae localrepo: move requirements constant to requirements module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45372
diff changeset
3555 requirements.add(requirementsmod.SPARSEREVLOG_REQUIREMENT)
43030
827cb4fe62a3 sidedata: introduce a new requirement to protect the feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43026
diff changeset
3556
47277
ed0d54b20c5b dirstate-v2: Add a new experimental `exp-dirstate-v2` repository requirement
Simon Sapin <simon.sapin@octobus.net>
parents: 47265
diff changeset
3557 # experimental config: format.exp-dirstate-v2
47279
40b51c28b242 dirstate-v2: Update the expected output of some tests for new requirement
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
3558 # Keep this logic in sync with `has_dirstate_v2()` in `tests/hghave.py`
47277
ed0d54b20c5b dirstate-v2: Add a new experimental `exp-dirstate-v2` repository requirement
Simon Sapin <simon.sapin@octobus.net>
parents: 47265
diff changeset
3559 if ui.configbool(b'format', b'exp-dirstate-v2'):
ed0d54b20c5b dirstate-v2: Add a new experimental `exp-dirstate-v2` repository requirement
Simon Sapin <simon.sapin@octobus.net>
parents: 47265
diff changeset
3560 if dirstate.SUPPORTS_DIRSTATE_V2:
ed0d54b20c5b dirstate-v2: Add a new experimental `exp-dirstate-v2` repository requirement
Simon Sapin <simon.sapin@octobus.net>
parents: 47265
diff changeset
3561 requirements.add(requirementsmod.DIRSTATE_V2_REQUIREMENT)
ed0d54b20c5b dirstate-v2: Add a new experimental `exp-dirstate-v2` repository requirement
Simon Sapin <simon.sapin@octobus.net>
parents: 47265
diff changeset
3562 else:
ed0d54b20c5b dirstate-v2: Add a new experimental `exp-dirstate-v2` repository requirement
Simon Sapin <simon.sapin@octobus.net>
parents: 47265
diff changeset
3563 raise error.Abort(
ed0d54b20c5b dirstate-v2: Add a new experimental `exp-dirstate-v2` repository requirement
Simon Sapin <simon.sapin@octobus.net>
parents: 47265
diff changeset
3564 _(
ed0d54b20c5b dirstate-v2: Add a new experimental `exp-dirstate-v2` repository requirement
Simon Sapin <simon.sapin@octobus.net>
parents: 47265
diff changeset
3565 b"dirstate v2 format requested by config "
ed0d54b20c5b dirstate-v2: Add a new experimental `exp-dirstate-v2` repository requirement
Simon Sapin <simon.sapin@octobus.net>
parents: 47265
diff changeset
3566 b"but not supported (requires Rust extensions)"
ed0d54b20c5b dirstate-v2: Add a new experimental `exp-dirstate-v2` repository requirement
Simon Sapin <simon.sapin@octobus.net>
parents: 47265
diff changeset
3567 )
ed0d54b20c5b dirstate-v2: Add a new experimental `exp-dirstate-v2` repository requirement
Simon Sapin <simon.sapin@octobus.net>
parents: 47265
diff changeset
3568 )
ed0d54b20c5b dirstate-v2: Add a new experimental `exp-dirstate-v2` repository requirement
Simon Sapin <simon.sapin@octobus.net>
parents: 47265
diff changeset
3569
43137
81efc4a295e7 sidedatacopies: add a new requirement for storing copies into sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
3570 # experimental config: format.exp-use-copies-side-data-changeset
81efc4a295e7 sidedatacopies: add a new requirement for storing copies into sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
3571 if ui.configbool(b'format', b'exp-use-copies-side-data-changeset'):
47265
a07381751dc9 changelogv2: `copies-side-data` now implies `changelogv2`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47263
diff changeset
3572 requirements.add(requirementsmod.CHANGELOGV2_REQUIREMENT)
45373
d7dcc75a3eae localrepo: move requirements constant to requirements module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45372
diff changeset
3573 requirements.add(requirementsmod.COPIESSDC_REQUIREMENT)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3574 if ui.configbool(b'experimental', b'treemanifest'):
45372
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
3575 requirements.add(requirementsmod.TREEMANIFEST_REQUIREMENT)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3576
47263
6c84fc9c9a90 changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47260
diff changeset
3577 changelogv2 = ui.config(b'format', b'exp-use-changelog-v2')
6c84fc9c9a90 changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47260
diff changeset
3578 if changelogv2 == b'enable-unstable-format-and-corrupt-my-data':
6c84fc9c9a90 changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47260
diff changeset
3579 requirements.add(requirementsmod.CHANGELOGV2_REQUIREMENT)
6c84fc9c9a90 changelogv2: introduce a "changelogv2" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47260
diff changeset
3580
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3581 revlogv2 = ui.config(b'experimental', b'revlogv2')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3582 if revlogv2 == b'enable-unstable-format-and-corrupt-my-data':
46705
fd55a9eb1507 revlogv2: allow upgrading to v2
Raphaël Gomès <rgomes@octobus.net>
parents: 46675
diff changeset
3583 requirements.discard(requirementsmod.REVLOGV1_REQUIREMENT)
45373
d7dcc75a3eae localrepo: move requirements constant to requirements module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45372
diff changeset
3584 requirements.add(requirementsmod.REVLOGV2_REQUIREMENT)
39298
7a9f15ed3b96 phases: add a repository requirement about internal phase
Boris Feld <boris.feld@octobus.net>
parents: 39111
diff changeset
3585 # experimental config: format.internal-phase
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3586 if ui.configbool(b'format', b'internal-phase'):
45372
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
3587 requirements.add(requirementsmod.INTERNAL_PHASE_REQUIREMENT)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3588
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3589 if createopts.get(b'narrowfiles'):
45372
77b8588dd84e requirements: introduce new requirements related module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45371
diff changeset
3590 requirements.add(requirementsmod.NARROW_REQUIREMENT)
39551
261f1e8dc300 localrepo: add requirement when narrow files creation option present
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
3591
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3592 if createopts.get(b'lfs'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3593 requirements.add(b'lfs')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3594
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3595 if ui.configbool(b'format', b'bookmarks-in-store'):
42325
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42300
diff changeset
3596 requirements.add(bookmarks.BOOKMARKS_IN_STORE_REQUIREMENT)
526750cdd02d bookmarks: keep bookmarks in .hg/store if new config set
Martin von Zweigbergk <martinvonz@google.com>
parents: 42300
diff changeset
3597
44793
d688a8d537b9 nodemap: move the main switch to the `format` section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44792
diff changeset
3598 if ui.configbool(b'format', b'use-persistent-nodemap'):
45373
d7dcc75a3eae localrepo: move requirements constant to requirements module
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45372
diff changeset
3599 requirements.add(requirementsmod.NODEMAP_REQUIREMENT)
44791
b81486b609a3 nodemap: gate the feature behind a new requirement
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44788
diff changeset
3600
45483
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
3601 # if share-safe is enabled, let's create the new repository with the new
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
3602 # requirement
46334
4b0192f592cf share: move share safe functionality out of experimental
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46333
diff changeset
3603 if ui.configbool(b'format', b'use-share-safe'):
45483
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
3604 requirements.add(requirementsmod.SHARESAFE_REQUIREMENT)
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
3605
28164
ad11edefa7c4 localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28163
diff changeset
3606 return requirements
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
3607
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3608
45300
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
3609 def checkrequirementscompat(ui, requirements):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
3610 """Checks compatibility of repository requirements enabled and disabled.
45300
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
3611
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
3612 Returns a set of requirements which needs to be dropped because dependend
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45846
diff changeset
3613 requirements are not enabled. Also warns users about it"""
45300
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
3614
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
3615 dropped = set()
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
3616
46637
ab58098bebed requirements: also add a store constant
Raphaël Gomès <rgomes@octobus.net>
parents: 46636
diff changeset
3617 if requirementsmod.STORE_REQUIREMENT not in requirements:
45300
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
3618 if bookmarks.BOOKMARKS_IN_STORE_REQUIREMENT in requirements:
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
3619 ui.warn(
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
3620 _(
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
3621 b'ignoring enabled \'format.bookmarks-in-store\' config '
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
3622 b'beacuse it is incompatible with disabled '
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
3623 b'\'format.usestore\' config\n'
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
3624 )
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
3625 )
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
3626 dropped.add(bookmarks.BOOKMARKS_IN_STORE_REQUIREMENT)
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
3627
45386
034d94f8761b requirements: introduce constants for `shared` and `relshared` requirements
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45373
diff changeset
3628 if (
034d94f8761b requirements: introduce constants for `shared` and `relshared` requirements
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45373
diff changeset
3629 requirementsmod.SHARED_REQUIREMENT in requirements
034d94f8761b requirements: introduce constants for `shared` and `relshared` requirements
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45373
diff changeset
3630 or requirementsmod.RELATIVE_SHARED_REQUIREMENT in requirements
034d94f8761b requirements: introduce constants for `shared` and `relshared` requirements
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45373
diff changeset
3631 ):
45301
dc283bc7e033 localrepo: abort creating a shared repo if the source does not have store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45300
diff changeset
3632 raise error.Abort(
dc283bc7e033 localrepo: abort creating a shared repo if the source does not have store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45300
diff changeset
3633 _(
dc283bc7e033 localrepo: abort creating a shared repo if the source does not have store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45300
diff changeset
3634 b"cannot create shared repository as source was created"
dc283bc7e033 localrepo: abort creating a shared repo if the source does not have store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45300
diff changeset
3635 b" with 'format.usestore' config disabled"
dc283bc7e033 localrepo: abort creating a shared repo if the source does not have store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45300
diff changeset
3636 )
dc283bc7e033 localrepo: abort creating a shared repo if the source does not have store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45300
diff changeset
3637 )
dc283bc7e033 localrepo: abort creating a shared repo if the source does not have store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45300
diff changeset
3638
45483
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
3639 if requirementsmod.SHARESAFE_REQUIREMENT in requirements:
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
3640 ui.warn(
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
3641 _(
46334
4b0192f592cf share: move share safe functionality out of experimental
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46333
diff changeset
3642 b"ignoring enabled 'format.use-share-safe' config because "
45483
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
3643 b"it is incompatible with disabled 'format.usestore'"
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
3644 b" config\n"
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
3645 )
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
3646 )
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
3647 dropped.add(requirementsmod.SHARESAFE_REQUIREMENT)
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
3648
45300
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
3649 return dropped
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
3650
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
3651
39549
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
3652 def filterknowncreateopts(ui, createopts):
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
3653 """Filters a dict of repo creation options against options that are known.
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
3654
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
3655 Receives a dict of repo creation options and returns a dict of those
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
3656 options that we don't know how to handle.
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
3657
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
3658 This function is called as part of repository creation. If the
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
3659 returned dict contains any items, repository creation will not
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
3660 be allowed, as it means there was a request to create a repository
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
3661 with options not recognized by loaded code.
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
3662
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
3663 Extensions can wrap this function to filter out creation options
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
3664 they know how to handle.
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
3665 """
39848
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
3666 known = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3667 b'backend',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3668 b'lfs',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3669 b'narrowfiles',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3670 b'sharedrepo',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3671 b'sharedrelative',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3672 b'shareditems',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3673 b'shallowfilestore',
39848
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
3674 }
39551
261f1e8dc300 localrepo: add requirement when narrow files creation option present
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
3675
261f1e8dc300 localrepo: add requirement when narrow files creation option present
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
3676 return {k: v for k, v in createopts.items() if k not in known}
39549
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
3677
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3678
39590
e471cb2852ea localrepo: move check for existing repo into createrepository()
Martin von Zweigbergk <martinvonz@google.com>
parents: 39580
diff changeset
3679 def createrepository(ui, path, createopts=None):
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
3680 """Create a new repository in a vfs.
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
3681
39590
e471cb2852ea localrepo: move check for existing repo into createrepository()
Martin von Zweigbergk <martinvonz@google.com>
parents: 39580
diff changeset
3682 ``path`` path to the new repo's working directory.
39580
a64a965b3610 localrepo: fix a mixmatched arg name in createrepository() docstring
Martin von Zweigbergk <martinvonz@google.com>
parents: 39557
diff changeset
3683 ``createopts`` options for the new repository.
39848
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
3684
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
3685 The following keys for ``createopts`` are recognized:
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
3686
39996
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
3687 backend
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
3688 The storage backend to use.
40324
6637b079ae45 lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents: 40296
diff changeset
3689 lfs
6637b079ae45 lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents: 40296
diff changeset
3690 Repository will be created with ``lfs`` requirement. The lfs extension
6637b079ae45 lfs: autoload the extension when cloning from repo with lfs enabled
Matt Harbison <matt_harbison@yahoo.com>
parents: 40296
diff changeset
3691 will automatically be loaded when the repository is accessed.
39848
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
3692 narrowfiles
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
3693 Set up repository to support narrow file storage.
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
3694 sharedrepo
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
3695 Repository object from which storage should be shared.
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
3696 sharedrelative
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
3697 Boolean indicating if the path to the shared repo should be
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
3698 stored as relative. By default, the pointer to the "parent" repo
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
3699 is stored as an absolute path.
39849
d3d4b4b5f725 localrepo: support writing shared file (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39848
diff changeset
3700 shareditems
d3d4b4b5f725 localrepo: support writing shared file (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39848
diff changeset
3701 Set of items to share to the new repository (in addition to storage).
40390
7e3b6c4f01a2 localrepo: support marking repos as having shallow file storage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40360
diff changeset
3702 shallowfilestore
7e3b6c4f01a2 localrepo: support marking repos as having shallow file storage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40360
diff changeset
3703 Indicates that storage for files should be shallow (not all ancestor
7e3b6c4f01a2 localrepo: support marking repos as having shallow file storage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40360
diff changeset
3704 revisions are known).
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
3705 """
39996
dbcb466d0065 localrepo: define storage backend in creation options (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39994
diff changeset
3706 createopts = defaultcreateopts(ui, createopts=createopts)
39549
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
3707
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
3708 unknownopts = filterknowncreateopts(ui, createopts)
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
3709
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
3710 if not isinstance(unknownopts, dict):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3711 raise error.ProgrammingError(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
3712 b'filterknowncreateopts() did not return a dict'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3713 )
39549
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
3714
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
3715 if unknownopts:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3716 raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3717 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3718 b'unable to create repository because of unknown '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3719 b'creation option: %s'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3720 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3721 % b', '.join(sorted(unknownopts)),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3722 hint=_(b'is a required extension not loaded?'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3723 )
39549
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
3724
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39548
diff changeset
3725 requirements = newreporequirements(ui, createopts=createopts)
45300
dc457177dbc1 localrepo: only use 'bookmarksinstore' requirement if we have 'store'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45204
diff changeset
3726 requirements -= checkrequirementscompat(ui, requirements)
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
3727
39590
e471cb2852ea localrepo: move check for existing repo into createrepository()
Martin von Zweigbergk <martinvonz@google.com>
parents: 39580
diff changeset
3728 wdirvfs = vfsmod.vfs(path, expandpath=True, realpath=True)
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
3729
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
3730 hgvfs = vfsmod.vfs(wdirvfs.join(b'.hg'))
39590
e471cb2852ea localrepo: move check for existing repo into createrepository()
Martin von Zweigbergk <martinvonz@google.com>
parents: 39580
diff changeset
3731 if hgvfs.exists():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3732 raise error.RepoError(_(b'repository %s already exists') % path)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3733
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3734 if b'sharedrepo' in createopts:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3735 sharedpath = createopts[b'sharedrepo'].sharedpath
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3736
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3737 if createopts.get(b'sharedrelative'):
39848
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
3738 try:
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
3739 sharedpath = os.path.relpath(sharedpath, hgvfs.base)
46888
218a26df7813 share: store relative share paths with '/' separators
Matt Harbison <matt_harbison@yahoo.com>
parents: 46851
diff changeset
3740 sharedpath = util.pconvert(sharedpath)
39848
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
3741 except (IOError, ValueError) as e:
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
3742 # ValueError is raised on Windows if the drive letters differ
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
3743 # on each path.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3744 raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3745 _(b'cannot calculate relative path'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3746 hint=stringutil.forcebytestr(e),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3747 )
39848
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
3748
39847
b504ff813c4f localrepo: validate directories before creating any
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39846
diff changeset
3749 if not wdirvfs.exists():
b504ff813c4f localrepo: validate directories before creating any
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39846
diff changeset
3750 wdirvfs.makedirs()
b504ff813c4f localrepo: validate directories before creating any
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39846
diff changeset
3751
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
3752 hgvfs.makedir(notindexed=True)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3753 if b'sharedrepo' not in createopts:
40793
64cdfcc73706 cache: create `cache` directory at init time
Boris Feld <boris.feld@octobus.net>
parents: 40785
diff changeset
3754 hgvfs.mkdir(b'cache')
40794
d5622dfe4ba3 cache: create `wcache` directory at init time
Boris Feld <boris.feld@octobus.net>
parents: 40793
diff changeset
3755 hgvfs.mkdir(b'wcache')
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
3756
46637
ab58098bebed requirements: also add a store constant
Raphaël Gomès <rgomes@octobus.net>
parents: 46636
diff changeset
3757 has_store = requirementsmod.STORE_REQUIREMENT in requirements
ab58098bebed requirements: also add a store constant
Raphaël Gomès <rgomes@octobus.net>
parents: 46636
diff changeset
3758 if has_store and b'sharedrepo' not in createopts:
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
3759 hgvfs.mkdir(b'store')
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
3760
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
3761 # We create an invalid changelog outside the store so very old
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
3762 # Mercurial versions (which didn't know about the requirements
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
3763 # file) encounter an error on reading the changelog. This
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
3764 # effectively locks out old clients and prevents them from
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
3765 # mucking with a repo in an unknown format.
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
3766 #
46406
95054317e172 revlog: use a less probable revlog version for backwards compatibility
Raphaël Gomès <rgomes@octobus.net>
parents: 46372
diff changeset
3767 # The revlog header has version 65535, which won't be recognized by
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
3768 # such old clients.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3769 hgvfs.append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3770 b'00changelog.i',
46406
95054317e172 revlog: use a less probable revlog version for backwards compatibility
Raphaël Gomès <rgomes@octobus.net>
parents: 46372
diff changeset
3771 b'\0\0\xFF\xFF dummy changelog to prevent using the old repo '
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3772 b'layout',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3773 )
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39546
diff changeset
3774
45483
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
3775 # Filter the requirements into working copy and store ones
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
3776 wcreq, storereq = scmutil.filterrequirements(requirements)
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
3777 # write working copy ones
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
3778 scmutil.writerequires(hgvfs, wcreq)
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
3779 # If there are store requirements and the current repository
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
3780 # is not a shared one, write stored requirements
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
3781 # For new shared repository, we don't need to write the store
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
3782 # requirements as they are already present in store requires
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
3783 if storereq and b'sharedrepo' not in createopts:
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
3784 storevfs = vfsmod.vfs(hgvfs.join(b'store'), cacheaudited=True)
d252f51ab032 share: introduce config option to store requires in .hg/store
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45464
diff changeset
3785 scmutil.writerequires(storevfs, storereq)
39606
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
3786
39848
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
3787 # Write out file telling readers where to find the shared store.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3788 if b'sharedrepo' in createopts:
39848
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
3789 hgvfs.write(b'sharedpath', sharedpath)
4ece3cdfd907 localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39847
diff changeset
3790
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3791 if createopts.get(b'shareditems'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
3792 shared = b'\n'.join(sorted(createopts[b'shareditems'])) + b'\n'
39849
d3d4b4b5f725 localrepo: support writing shared file (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39848
diff changeset
3793 hgvfs.write(b'shared', shared)
d3d4b4b5f725 localrepo: support writing shared file (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39848
diff changeset
3794
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3795
39606
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
3796 def poisonrepository(repo):
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
3797 """Poison a repository instance so it can no longer be used."""
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
3798 # Perform any cleanup on the instance.
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
3799 repo.close()
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
3800
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
3801 # Our strategy is to replace the type of the object with one that
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
3802 # has all attribute lookups result in error.
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
3803 #
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
3804 # But we have to allow the close() method because some constructors
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
3805 # of repos call close() on repo references.
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
3806 class poisonedrepository(object):
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
3807 def __getattribute__(self, item):
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43421
diff changeset
3808 if item == 'close':
39606
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
3809 return object.__getattribute__(self, item)
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
3810
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3811 raise error.ProgrammingError(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
3812 b'repo instances should not be used after unshare'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43030
diff changeset
3813 )
39606
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
3814
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
3815 def close(self):
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
3816 pass
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
3817
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
3818 # We may have a repoview, which intercepts __setattr__. So be sure
c5e6c1ba1c79 hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39591
diff changeset
3819 # we operate at the lowest level possible.
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43421
diff changeset
3820 object.__setattr__(repo, '__class__', poisonedrepository)