Mercurial > hg
annotate mercurial/localrepo.py @ 39899:f9232b0310ef
pullreport: issue a message about "extinct" pulled changesets
Changeset pulled from a remote repository while already obsolete locally can
end up hidden after the pull. Hiding obsolete changesets is a good behavior
but silently "skipping" some of the pulled content can get confusing.
We now detect this situation and emit a message about it. The message is
simple and the wording could be improved, however, we focus on the detection
here. Evolution is still an experimental feature, so the output is open to
changes.
In particular, we could point out at the latest successors of the obsolete
changesets, however, it can get tricky is there are many of them. So we delay
these improvements to another adventure.
Another easy improvement would be to merge this message with the previous line
about the new nodes and their phases.
This is a good example of cases where we can only transmit a limited amount of
data to users by default. We need some sort of "transaction journal" we could
point the user to.
author | Boris Feld <boris.feld@octobus.net> |
---|---|
date | Thu, 27 Sep 2018 16:52:25 +0200 |
parents | 823a580448d7 |
children | e1e3d1b498d3 |
rev | line source |
---|---|
1089 | 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 # |
4635
63b9d2deed48
Updated copyright notices and add "and others" to "hg version"
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4633
diff
changeset
|
3 # Copyright 2005-2007 Matt Mackall <mpm@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 | 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 |
29341
0d83ad967bf8
cleanup: replace uses of util.(md5|sha1|sha256|sha512) with hashlib.\1
Augie Fackler <raf@durin42.com>
parents:
29237
diff
changeset
|
11 import hashlib |
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 ( |
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
20 hex, |
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
21 nullid, |
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
22 short, |
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
23 ) |
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
24 from . import ( |
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
25 bookmarks, |
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
26 branchmap, |
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
27 bundle2, |
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
28 changegroup, |
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
29 changelog, |
31111
95ec3ad62f62
color: initialize color for the localrepo ui
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31054
diff
changeset
|
30 color, |
27522
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
31 context, |
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
32 dirstate, |
30492
77cd647b04ac
localrepo: refer to dirstateguard by its new name
Augie Fackler <augie@google.com>
parents:
30377
diff
changeset
|
33 dirstateguard, |
34097
f7d41b85bbf6
changegroup: replace changegroupsubset with makechangegroup
Durham Goode <durham@fb.com>
parents:
33803
diff
changeset
|
34 discovery, |
27522
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
35 encoding, |
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
36 error, |
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
37 exchange, |
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
38 extensions, |
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
39 filelog, |
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
40 hook, |
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
41 lock as lockmod, |
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
42 manifest, |
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
43 match as matchmod, |
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
44 merge as mergemod, |
30496
a90867a22daf
localrepo: refer to checkunresolved by its new name
Augie Fackler <augie@google.com>
parents:
30492
diff
changeset
|
45 mergeutil, |
27522
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
46 namespaces, |
36471
c28b6d609c47
narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents:
36422
diff
changeset
|
47 narrowspec, |
27522
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
48 obsolete, |
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
49 pathutil, |
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
50 phases, |
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
51 pushkey, |
31508
590319c07259
localrepo: ensure transaction id is fully bytes on py3
Augie Fackler <augie@google.com>
parents:
31476
diff
changeset
|
52 pycompat, |
33803
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
53 repository, |
27522
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
54 repoview, |
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
55 revset, |
31024
0b8356705de6
revset: split language services to revsetlang module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
30989
diff
changeset
|
56 revsetlang, |
27522
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
57 scmutil, |
33373
fb320398a21c
dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33336
diff
changeset
|
58 sparse, |
39697
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
59 store as storemod, |
36009
55e8efa2451a
subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents:
35896
diff
changeset
|
60 subrepoutil, |
27522
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
61 tags as tagsmod, |
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
62 transaction, |
31054
59e69ed81776
localrepo: check HG_PENDING strictly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
31025
diff
changeset
|
63 txnutil, |
27522
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
64 util, |
31231
0a38a313033e
vfs: use 'vfs' module directly in 'mercurial.localrepo'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31209
diff
changeset
|
65 vfs as vfsmod, |
27522
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
66 ) |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36952
diff
changeset
|
67 from .utils import ( |
37810
856f381ad74b
interfaceutil: module to stub out zope.interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37797
diff
changeset
|
68 interfaceutil, |
37120
a8a902d7176e
procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37084
diff
changeset
|
69 procutil, |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36952
diff
changeset
|
70 stringutil, |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36952
diff
changeset
|
71 ) |
27522
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
72 |
39506
b66ea3fc3a86
sparse-revlog: set max delta chain length to on thousand
Boris Feld <boris.feld@octobus.net>
parents:
39312
diff
changeset
|
73 from .revlogutils import ( |
b66ea3fc3a86
sparse-revlog: set max delta chain length to on thousand
Boris Feld <boris.feld@octobus.net>
parents:
39312
diff
changeset
|
74 constants as revlogconst, |
b66ea3fc3a86
sparse-revlog: set max delta chain length to on thousand
Boris Feld <boris.feld@octobus.net>
parents:
39312
diff
changeset
|
75 ) |
b66ea3fc3a86
sparse-revlog: set max delta chain length to on thousand
Boris Feld <boris.feld@octobus.net>
parents:
39312
diff
changeset
|
76 |
27522
798535853345
localrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27319
diff
changeset
|
77 release = lockmod.release |
28883
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28876
diff
changeset
|
78 urlerr = util.urlerr |
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28876
diff
changeset
|
79 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
|
80 |
33277
4470508eb6f2
localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33260
diff
changeset
|
81 # 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
|
82 # - '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
|
83 # - '' 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
|
84 _cachedfiles = set() |
4470508eb6f2
localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33260
diff
changeset
|
85 |
33176
edb7f628ef8b
localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
32895
diff
changeset
|
86 class _basefilecache(scmutil.filecache): |
18014
a39fe76c4c65
clfilter: ensure that filecache on localrepo is unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18013
diff
changeset
|
87 """All filecache usage on repo are done for logic that should be unfiltered |
a39fe76c4c65
clfilter: ensure that filecache on localrepo is unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18013
diff
changeset
|
88 """ |
a39fe76c4c65
clfilter: ensure that filecache on localrepo is unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18013
diff
changeset
|
89 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
|
90 if repo is None: |
36fbd72c2f39
scmutil: allow access to filecache descriptor on class
Martijn Pieters <mjpieters@fb.com>
parents:
29352
diff
changeset
|
91 return self |
33176
edb7f628ef8b
localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
32895
diff
changeset
|
92 return super(_basefilecache, self).__get__(repo.unfiltered(), type) |
18014
a39fe76c4c65
clfilter: ensure that filecache on localrepo is unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18013
diff
changeset
|
93 def __set__(self, repo, value): |
33176
edb7f628ef8b
localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
32895
diff
changeset
|
94 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
|
95 def __delete__(self, repo): |
33176
edb7f628ef8b
localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
32895
diff
changeset
|
96 return super(_basefilecache, self).__delete__(repo.unfiltered()) |
18014
a39fe76c4c65
clfilter: ensure that filecache on localrepo is unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18013
diff
changeset
|
97 |
33176
edb7f628ef8b
localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
32895
diff
changeset
|
98 class repofilecache(_basefilecache): |
edb7f628ef8b
localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
32895
diff
changeset
|
99 """filecache for files in .hg but outside of .hg/store""" |
33277
4470508eb6f2
localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33260
diff
changeset
|
100 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
|
101 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
|
102 for path in paths: |
4470508eb6f2
localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33260
diff
changeset
|
103 _cachedfiles.add((path, 'plain')) |
4470508eb6f2
localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33260
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 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
|
106 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
|
107 |
edb7f628ef8b
localrepo: factor out base of filecache annotation class
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
32895
diff
changeset
|
108 class storecache(_basefilecache): |
16198
fa8488565afd
filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents:
16144
diff
changeset
|
109 """filecache for files in the store""" |
33277
4470508eb6f2
localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33260
diff
changeset
|
110 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
|
111 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
|
112 for path in paths: |
4470508eb6f2
localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33260
diff
changeset
|
113 _cachedfiles.add((path, '')) |
4470508eb6f2
localrepo: store path and vfs location of cached properties
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33260
diff
changeset
|
114 |
16198
fa8488565afd
filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents:
16144
diff
changeset
|
115 def join(self, obj, fname): |
fa8488565afd
filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents:
16144
diff
changeset
|
116 return obj.sjoin(fname) |
fa8488565afd
filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents:
16144
diff
changeset
|
117 |
33382
b107a7660f4e
localrepo: add isfilecached to check filecache-ed property is already cached
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33373
diff
changeset
|
118 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
|
119 """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
|
120 |
b107a7660f4e
localrepo: add isfilecached to check filecache-ed property is already cached
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33373
diff
changeset
|
121 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
|
122 """ |
b107a7660f4e
localrepo: add isfilecached to check filecache-ed property is already cached
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33373
diff
changeset
|
123 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
|
124 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
|
125 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
|
126 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
|
127 |
29104
b207653ada10
localrepo: remove a couple of local type aliases
Augie Fackler <augie@google.com>
parents:
29075
diff
changeset
|
128 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
|
129 """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
|
130 |
98c867ac1330
clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18009
diff
changeset
|
131 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
|
132 unfi = repo.unfiltered() |
9789670992d6
repoview: have unfilteredpropertycache using the underlying cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19515
diff
changeset
|
133 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
|
134 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
|
135 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
|
136 |
29104
b207653ada10
localrepo: remove a couple of local type aliases
Augie Fackler <augie@google.com>
parents:
29075
diff
changeset
|
137 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
|
138 """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
|
139 |
98c867ac1330
clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18009
diff
changeset
|
140 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
|
141 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
|
142 |
98c867ac1330
clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18009
diff
changeset
|
143 |
98c867ac1330
clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18009
diff
changeset
|
144 def hasunfilteredcache(repo, name): |
18644
3e92772d5383
spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents:
18520
diff
changeset
|
145 """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
|
146 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
|
147 |
18016
2a393df0f5cc
clfilter: rename `unfilteredmeth` to `unfilteredmethod`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18014
diff
changeset
|
148 def unfilteredmethod(orig): |
17994
8899bf48116a
clfilter: introduce an `unfilteredmethod` decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17993
diff
changeset
|
149 """decorate method that always need to be run on unfiltered version""" |
8899bf48116a
clfilter: introduce an `unfilteredmethod` decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17993
diff
changeset
|
150 def wrapper(repo, *args, **kwargs): |
8899bf48116a
clfilter: introduce an `unfilteredmethod` decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17993
diff
changeset
|
151 return orig(repo.unfiltered(), *args, **kwargs) |
8899bf48116a
clfilter: introduce an `unfilteredmethod` decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17993
diff
changeset
|
152 return wrapper |
8899bf48116a
clfilter: introduce an `unfilteredmethod` decorator
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17993
diff
changeset
|
153 |
32291
bd872f64a8ba
cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents:
32267
diff
changeset
|
154 moderncaps = {'lookup', 'branchmap', 'pushkey', 'known', 'getbundle', |
bd872f64a8ba
cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents:
32267
diff
changeset
|
155 'unbundle'} |
bd872f64a8ba
cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents:
32267
diff
changeset
|
156 legacycaps = moderncaps.union({'changegroupsubset'}) |
17192
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
157 |
37810
856f381ad74b
interfaceutil: module to stub out zope.interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37797
diff
changeset
|
158 @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
|
159 class localcommandexecutor(object): |
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
160 def __init__(self, peer): |
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
161 self._peer = peer |
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
162 self._sent = False |
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
163 self._closed = False |
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
164 |
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
165 def __enter__(self): |
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
166 return self |
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
167 |
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
168 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
|
169 self.close() |
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
170 |
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
171 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
|
172 if self._sent: |
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
173 raise error.ProgrammingError('callcommand() cannot be used after ' |
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
174 'sendcommands()') |
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
175 |
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
176 if self._closed: |
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
177 raise error.ProgrammingError('callcommand() cannot be used after ' |
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
178 'close()') |
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
179 |
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
180 # 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
|
181 # 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
|
182 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
|
183 |
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
184 f = pycompat.futures.Future() |
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
185 |
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
186 try: |
37670
719b8cb22936
localrepo: add some overlooked strkwargs love for py3
Augie Fackler <augie@google.com>
parents:
37669
diff
changeset
|
187 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
|
188 except Exception: |
37669
1cb54e6193a6
py3: paper over differences in future exception handling
Augie Fackler <augie@google.com>
parents:
37650
diff
changeset
|
189 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
|
190 else: |
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
191 f.set_result(result) |
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
192 |
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
193 return f |
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
194 |
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
195 def sendcommands(self): |
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
196 self._sent = True |
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
197 |
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
198 def close(self): |
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
199 self._closed = True |
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
200 |
37810
856f381ad74b
interfaceutil: module to stub out zope.interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37797
diff
changeset
|
201 @interfaceutil.implementer(repository.ipeercommands) |
33803
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
202 class localpeer(repository.peer): |
17192
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
203 '''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
|
204 |
31412
ecc87acb4d10
localrepo: don't use mutable default argument value
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31373
diff
changeset
|
205 def __init__(self, repo, caps=None): |
33803
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
206 super(localpeer, self).__init__() |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
207 |
31412
ecc87acb4d10
localrepo: don't use mutable default argument value
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31373
diff
changeset
|
208 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
|
209 caps = moderncaps.copy() |
18382
f3b21beb9802
filtering: rename filters to their antonyms
Kevin Bullock <kbullock@ringworld.org>
parents:
18364
diff
changeset
|
210 self._repo = repo.filtered('served') |
37321
e826fe7a08c7
peer: make ui an attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37316
diff
changeset
|
211 self.ui = repo.ui |
17192
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
212 self._caps = repo._restrictcapabilities(caps) |
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
213 |
33803
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
214 # Begin of _basepeer interface. |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
215 |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
216 def url(self): |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
217 return self._repo.url() |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
218 |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
219 def local(self): |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
220 return self._repo |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
221 |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
222 def peer(self): |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
223 return self |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
224 |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
225 def canpush(self): |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
226 return True |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
227 |
17192
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
228 def close(self): |
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
229 self._repo.close() |
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
230 |
33803
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
231 # End of _basepeer interface. |
17192
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
232 |
33803
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
233 # Begin of _basewirecommands interface. |
17192
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
234 |
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
235 def branchmap(self): |
18279
679767c38cb5
clfilter: drop extra filtering in localpeer
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18278
diff
changeset
|
236 return self._repo.branchmap() |
17192
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
237 |
33803
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
238 def capabilities(self): |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
239 return self._caps |
17192
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
240 |
37649
a168799687e5
wireproto: properly call clonebundles command
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37646
diff
changeset
|
241 def clonebundles(self): |
a168799687e5
wireproto: properly call clonebundles command
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37646
diff
changeset
|
242 return self._repo.tryread('clonebundles.manifest') |
a168799687e5
wireproto: properly call clonebundles command
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37646
diff
changeset
|
243 |
33803
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
244 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
|
245 """Used to test argument passing over the wire""" |
36554
06f59bdde626
py3: use pycompat.bytestr() to convert None to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36471
diff
changeset
|
246 return "%s %s %s %s %s" % (one, two, pycompat.bytestr(three), |
06f59bdde626
py3: use pycompat.bytestr() to convert None to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36471
diff
changeset
|
247 pycompat.bytestr(four), |
06f59bdde626
py3: use pycompat.bytestr() to convert None to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36471
diff
changeset
|
248 pycompat.bytestr(five)) |
17192
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
249 |
20953
8d853cad6b14
localpeer: propagate bundlecaps in getbundle call
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20933
diff
changeset
|
250 def getbundle(self, source, heads=None, common=None, bundlecaps=None, |
24639
c79b1e690110
localrepo.getbundle: drop unused 'format' argument
Martin von Zweigbergk <martinvonz@google.com>
parents:
24571
diff
changeset
|
251 **kwargs): |
30187
3e86261bf110
exchange: refactor APIs to obtain bundle data (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29975
diff
changeset
|
252 chunks = exchange.getbundlechunks(self._repo, source, heads=heads, |
3e86261bf110
exchange: refactor APIs to obtain bundle data (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29975
diff
changeset
|
253 common=common, bundlecaps=bundlecaps, |
35785
ba15580e53d5
exchange: return bundle info from getbundlechunks() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35783
diff
changeset
|
254 **kwargs)[1] |
30187
3e86261bf110
exchange: refactor APIs to obtain bundle data (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29975
diff
changeset
|
255 cb = util.chunkbuffer(chunks) |
3e86261bf110
exchange: refactor APIs to obtain bundle data (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29975
diff
changeset
|
256 |
32149
9a9d54ae9963
localrepo: reuse exchange.bundle2requested()
Martin von Zweigbergk <martinvonz@google.com>
parents:
32121
diff
changeset
|
257 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
|
258 # 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
|
259 # 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
|
260 # 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
|
261 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
|
262 else: |
3e86261bf110
exchange: refactor APIs to obtain bundle data (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29975
diff
changeset
|
263 return changegroup.getunbundler('01', cb, None) |
17192
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
264 |
33803
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
265 def heads(self): |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
266 return self._repo.heads() |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
267 |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
268 def known(self, nodes): |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
269 return self._repo.known(nodes) |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
270 |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
271 def listkeys(self, namespace): |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
272 return self._repo.listkeys(namespace) |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
273 |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
274 def lookup(self, key): |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
275 return self._repo.lookup(key) |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
276 |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
277 def pushkey(self, namespace, key, old, new): |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
278 return self._repo.pushkey(namespace, key, old, new) |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
279 |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
280 def stream_out(self): |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
281 raise error.Abort(_('cannot perform stream clone against local ' |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
282 'peer')) |
17192
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
283 |
37646
72e26319f3b8
wireproto: use command executor for unbundle
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37635
diff
changeset
|
284 def unbundle(self, bundle, heads, url): |
20969
7a679918ee2b
localrepo: add unbundle support
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20963
diff
changeset
|
285 """apply a bundle on a repo |
7a679918ee2b
localrepo: add unbundle support
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20963
diff
changeset
|
286 |
7a679918ee2b
localrepo: add unbundle support
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20963
diff
changeset
|
287 This function handles the repo locking itself.""" |
7a679918ee2b
localrepo: add unbundle support
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20963
diff
changeset
|
288 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
|
289 try: |
37646
72e26319f3b8
wireproto: use command executor for unbundle
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37635
diff
changeset
|
290 bundle = exchange.readbundle(self.ui, bundle, None) |
72e26319f3b8
wireproto: use command executor for unbundle
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37635
diff
changeset
|
291 ret = exchange.unbundle(self._repo, bundle, heads, 'push', url) |
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
|
292 if util.safehasattr(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
|
293 # 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
|
294 # 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
|
295 # 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
|
296 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
|
297 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
|
298 return ret |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25629
diff
changeset
|
299 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
|
300 # 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
|
301 # 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
|
302 # 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
|
303 # 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
|
304 # |
d99d7e3f5cda
bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24798
diff
changeset
|
305 # 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
|
306 # issue4594 |
d99d7e3f5cda
bundle2-localpeer: properly propagate the server output on error (issue4594)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24798
diff
changeset
|
307 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
|
308 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
|
309 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
|
310 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
|
311 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
|
312 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
|
313 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
|
314 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
|
315 raise |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25629
diff
changeset
|
316 except error.PushRaced as exc: |
36422
04c319a07c7b
py3: hunt down str(exception) instances and use util.forcebytestr
Augie Fackler <augie@google.com>
parents:
36400
diff
changeset
|
317 raise error.ResponseError(_('push failed:'), |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36952
diff
changeset
|
318 stringutil.forcebytestr(exc)) |
20969
7a679918ee2b
localrepo: add unbundle support
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20963
diff
changeset
|
319 |
33803
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
320 # End of _basewirecommands interface. |
17192
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
321 |
33803
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
322 # Begin of peer interface. |
17192
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
323 |
37630
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
324 def commandexecutor(self): |
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
325 return localcommandexecutor(self) |
e1b32dc4646c
wireproto: implement command executor interface for version 1 peers
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37615
diff
changeset
|
326 |
33803
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
327 # End of peer interface. |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
328 |
37810
856f381ad74b
interfaceutil: module to stub out zope.interface
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37797
diff
changeset
|
329 @interfaceutil.implementer(repository.ipeerlegacycommands) |
37635
cc8c06835097
wireproto: convert legacy commands to command executor
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37633
diff
changeset
|
330 class locallegacypeer(localpeer): |
17192
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
331 '''peer extension which implements legacy methods too; used for tests with |
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
332 restricted capabilities''' |
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
333 |
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
334 def __init__(self, repo): |
33803
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
335 super(locallegacypeer, self).__init__(repo, caps=legacycaps) |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
336 |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
337 # Begin of baselegacywirecommands interface. |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
338 |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
339 def between(self, pairs): |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
340 return self._repo.between(pairs) |
17192
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
341 |
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
342 def branches(self, nodes): |
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
343 return self._repo.branches(nodes) |
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
344 |
37635
cc8c06835097
wireproto: convert legacy commands to command executor
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37633
diff
changeset
|
345 def changegroup(self, nodes, source): |
cc8c06835097
wireproto: convert legacy commands to command executor
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37633
diff
changeset
|
346 outgoing = discovery.outgoing(self._repo, missingroots=nodes, |
34100
1632999d4bed
changegroup: replace changegroup with makechangegroup
Durham Goode <durham@fb.com>
parents:
34097
diff
changeset
|
347 missingheads=self._repo.heads()) |
1632999d4bed
changegroup: replace changegroup with makechangegroup
Durham Goode <durham@fb.com>
parents:
34097
diff
changeset
|
348 return changegroup.makechangegroup(self._repo, outgoing, '01', source) |
17192
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
349 |
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
350 def changegroupsubset(self, bases, heads, source): |
34097
f7d41b85bbf6
changegroup: replace changegroupsubset with makechangegroup
Durham Goode <durham@fb.com>
parents:
33803
diff
changeset
|
351 outgoing = discovery.outgoing(self._repo, missingroots=bases, |
f7d41b85bbf6
changegroup: replace changegroupsubset with makechangegroup
Durham Goode <durham@fb.com>
parents:
33803
diff
changeset
|
352 missingheads=heads) |
f7d41b85bbf6
changegroup: replace changegroupsubset with makechangegroup
Durham Goode <durham@fb.com>
parents:
33803
diff
changeset
|
353 return changegroup.makechangegroup(self._repo, outgoing, '01', source) |
17192
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
354 |
33803
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
355 # End of baselegacywirecommands interface. |
707750e5310b
localrepo: use peer interfaces
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33737
diff
changeset
|
356 |
32697
19b9fc40cc51
revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32660
diff
changeset
|
357 # Increment the sub-version when the revlog v2 format changes to lock out old |
19b9fc40cc51
revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32660
diff
changeset
|
358 # clients. |
19b9fc40cc51
revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32660
diff
changeset
|
359 REVLOGV2_REQUIREMENT = 'exp-revlogv2.0' |
19b9fc40cc51
revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32660
diff
changeset
|
360 |
38717
aa21a9ad46ea
sparse-revlog: new requirement enabled with format.sparse-revlog
Paul Morelle <paul.morelle@octobus.net>
parents:
38239
diff
changeset
|
361 # A repository with the sparserevlog feature will have delta chains that |
aa21a9ad46ea
sparse-revlog: new requirement enabled with format.sparse-revlog
Paul Morelle <paul.morelle@octobus.net>
parents:
38239
diff
changeset
|
362 # can spread over a larger span. Sparse reading cuts these large spans into |
aa21a9ad46ea
sparse-revlog: new requirement enabled with format.sparse-revlog
Paul Morelle <paul.morelle@octobus.net>
parents:
38239
diff
changeset
|
363 # pieces, so that each piece isn't too big. |
aa21a9ad46ea
sparse-revlog: new requirement enabled with format.sparse-revlog
Paul Morelle <paul.morelle@octobus.net>
parents:
38239
diff
changeset
|
364 # Without the sparserevlog capability, reading from the repository could use |
aa21a9ad46ea
sparse-revlog: new requirement enabled with format.sparse-revlog
Paul Morelle <paul.morelle@octobus.net>
parents:
38239
diff
changeset
|
365 # huge amounts of memory, because the whole span would be read at once, |
aa21a9ad46ea
sparse-revlog: new requirement enabled with format.sparse-revlog
Paul Morelle <paul.morelle@octobus.net>
parents:
38239
diff
changeset
|
366 # including all the intermediate revisions that aren't pertinent for the chain. |
aa21a9ad46ea
sparse-revlog: new requirement enabled with format.sparse-revlog
Paul Morelle <paul.morelle@octobus.net>
parents:
38239
diff
changeset
|
367 # This is why once a repository has enabled sparse-read, it becomes required. |
aa21a9ad46ea
sparse-revlog: new requirement enabled with format.sparse-revlog
Paul Morelle <paul.morelle@octobus.net>
parents:
38239
diff
changeset
|
368 SPARSEREVLOG_REQUIREMENT = 'sparserevlog' |
aa21a9ad46ea
sparse-revlog: new requirement enabled with format.sparse-revlog
Paul Morelle <paul.morelle@octobus.net>
parents:
38239
diff
changeset
|
369 |
37135
ecac0006b90e
localrepo: move featuresetupfuncs out of localrepository class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37120
diff
changeset
|
370 # 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
|
371 # 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
|
372 # 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
|
373 # |
ecac0006b90e
localrepo: move featuresetupfuncs out of localrepository class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37120
diff
changeset
|
374 # 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
|
375 # 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
|
376 # 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
|
377 featuresetupfuncs = set() |
ecac0006b90e
localrepo: move featuresetupfuncs out of localrepository class (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37120
diff
changeset
|
378 |
39689
f19bba3f4d3f
localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39688
diff
changeset
|
379 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
|
380 """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
|
381 |
bfeab472e3c0
localrepo: create new function for instantiating a local repo object
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39668
diff
changeset
|
382 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
|
383 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
|
384 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
|
385 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
|
386 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
|
387 |
bfeab472e3c0
localrepo: create new function for instantiating a local repo object
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39668
diff
changeset
|
388 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
|
389 interface. |
39764
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
390 |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
391 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
|
392 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
|
393 ``REPO_INTERFACES``. |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
394 |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
395 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
|
396 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
|
397 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
|
398 repository. |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
399 |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
400 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
|
401 as part of deriving a type. |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
402 |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
403 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
|
404 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
|
405 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
|
406 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
|
407 ``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
|
408 not. |
39687
bfeab472e3c0
localrepo: create new function for instantiating a local repo object
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39668
diff
changeset
|
409 """ |
39689
f19bba3f4d3f
localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39688
diff
changeset
|
410 ui = baseui.copy() |
f19bba3f4d3f
localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39688
diff
changeset
|
411 # Prevent copying repo configuration. |
f19bba3f4d3f
localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39688
diff
changeset
|
412 ui.copy = baseui.copy |
f19bba3f4d3f
localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39688
diff
changeset
|
413 |
39688
2f9cdb5b3644
localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39687
diff
changeset
|
414 # 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
|
415 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
|
416 |
2f9cdb5b3644
localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39687
diff
changeset
|
417 # Main VFS for .hg/ directory. |
2f9cdb5b3644
localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39687
diff
changeset
|
418 hgpath = wdirvfs.join(b'.hg') |
2f9cdb5b3644
localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39687
diff
changeset
|
419 hgvfs = vfsmod.vfs(hgpath, cacheaudited=True) |
2f9cdb5b3644
localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39687
diff
changeset
|
420 |
39691
2f067e365532
localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39690
diff
changeset
|
421 # 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
|
422 # cases are errors. |
2f067e365532
localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39690
diff
changeset
|
423 if not hgvfs.isdir(): |
2f067e365532
localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39690
diff
changeset
|
424 try: |
2f067e365532
localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39690
diff
changeset
|
425 hgvfs.stat() |
2f067e365532
localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39690
diff
changeset
|
426 except OSError as e: |
2f067e365532
localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39690
diff
changeset
|
427 if e.errno != errno.ENOENT: |
2f067e365532
localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39690
diff
changeset
|
428 raise |
2f067e365532
localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39690
diff
changeset
|
429 |
2f067e365532
localrepo: check for .hg/ directory in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39690
diff
changeset
|
430 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
|
431 |
39692
6a3162ed881d
localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39691
diff
changeset
|
432 # .hg/requires file contains a newline-delimited list of |
6a3162ed881d
localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39691
diff
changeset
|
433 # features/capabilities the opener (us) must have in order to use |
6a3162ed881d
localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39691
diff
changeset
|
434 # the repository. This file was introduced in Mercurial 0.9.2, |
6a3162ed881d
localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39691
diff
changeset
|
435 # which means very old repositories may not have one. We assume |
6a3162ed881d
localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39691
diff
changeset
|
436 # a missing file translates to no requirements. |
6a3162ed881d
localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39691
diff
changeset
|
437 try: |
6a3162ed881d
localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39691
diff
changeset
|
438 requirements = set(hgvfs.read(b'requires').splitlines()) |
6a3162ed881d
localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39691
diff
changeset
|
439 except IOError as e: |
6a3162ed881d
localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39691
diff
changeset
|
440 if e.errno != errno.ENOENT: |
6a3162ed881d
localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39691
diff
changeset
|
441 raise |
6a3162ed881d
localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39691
diff
changeset
|
442 requirements = set() |
6a3162ed881d
localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39691
diff
changeset
|
443 |
39690
e0c5017124b3
localrepo: load extensions in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39689
diff
changeset
|
444 # 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
|
445 # 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
|
446 # process any new extensions that it may have pulled in. |
e0c5017124b3
localrepo: load extensions in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39689
diff
changeset
|
447 try: |
e0c5017124b3
localrepo: load extensions in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39689
diff
changeset
|
448 ui.readconfig(hgvfs.join(b'hgrc'), root=wdirvfs.base) |
39852
2c2fadbc9851
localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
449 # Run this before extensions.loadall() so extensions can be |
2c2fadbc9851
localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
450 # automatically enabled. |
2c2fadbc9851
localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
451 afterhgrcload(ui, wdirvfs, hgvfs, requirements) |
39690
e0c5017124b3
localrepo: load extensions in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39689
diff
changeset
|
452 except IOError: |
e0c5017124b3
localrepo: load extensions in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39689
diff
changeset
|
453 pass |
e0c5017124b3
localrepo: load extensions in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39689
diff
changeset
|
454 else: |
e0c5017124b3
localrepo: load extensions in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39689
diff
changeset
|
455 extensions.loadall(ui) |
e0c5017124b3
localrepo: load extensions in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39689
diff
changeset
|
456 |
39764
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
457 # 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
|
458 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
|
459 |
39693
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
460 supportedrequirements = gathersupportedrequirements(ui) |
39695
cb2dcfa5cade
localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39693
diff
changeset
|
461 |
cb2dcfa5cade
localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39693
diff
changeset
|
462 # 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
|
463 ensurerequirementsrecognized(requirements, supportedrequirements) |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
464 |
39695
cb2dcfa5cade
localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39693
diff
changeset
|
465 # 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
|
466 ensurerequirementscompatible(ui, requirements) |
cb2dcfa5cade
localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39693
diff
changeset
|
467 |
39696
9de1a1c83cd7
localrepo: document and test bug around opening shared repos
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39695
diff
changeset
|
468 # 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
|
469 # 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
|
470 # 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
|
471 # 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
|
472 # 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
|
473 # in this hgrc. |
9de1a1c83cd7
localrepo: document and test bug around opening shared repos
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39695
diff
changeset
|
474 # |
9de1a1c83cd7
localrepo: document and test bug around opening shared repos
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39695
diff
changeset
|
475 # 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
|
476 # 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
|
477 # 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
|
478 # 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
|
479 # 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
|
480 |
39693
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
481 # 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
|
482 # Now get on with doing that. |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
483 |
39850
d89d5bc06eaa
localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39849
diff
changeset
|
484 features = set() |
d89d5bc06eaa
localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39849
diff
changeset
|
485 |
39697
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
486 # The "store" part of the repository holds versioned data. How it is |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
487 # accessed is determined by various requirements. The ``shared`` or |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
488 # ``relshared`` requirements indicate the store lives in the path contained |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
489 # in the ``.hg/sharedpath`` file. This is an absolute path for |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
490 # ``shared`` and relative to ``.hg/`` for ``relshared``. |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
491 if b'shared' in requirements or b'relshared' in requirements: |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
492 sharedpath = hgvfs.read(b'sharedpath').rstrip(b'\n') |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
493 if b'relshared' in requirements: |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
494 sharedpath = hgvfs.join(sharedpath) |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
495 |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
496 sharedvfs = vfsmod.vfs(sharedpath, realpath=True) |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
497 |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
498 if not sharedvfs.exists(): |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
499 raise error.RepoError(_(b'.hg/sharedpath points to nonexistent ' |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
500 b'directory %s') % sharedvfs.base) |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
501 |
39850
d89d5bc06eaa
localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39849
diff
changeset
|
502 features.add(repository.REPO_FEATURE_SHARED_STORAGE) |
d89d5bc06eaa
localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39849
diff
changeset
|
503 |
39697
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
504 storebasepath = sharedvfs.base |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
505 cachepath = sharedvfs.join(b'cache') |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
506 else: |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
507 storebasepath = hgvfs.base |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
508 cachepath = hgvfs.join(b'cache') |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
509 |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
510 # 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
|
511 # 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
|
512 # of them. |
39698
f44187605315
localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39697
diff
changeset
|
513 store = makestore(requirements, storebasepath, |
f44187605315
localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39697
diff
changeset
|
514 lambda base: vfsmod.vfs(base, cacheaudited=True)) |
39697
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
515 hgvfs.createmode = store.createmode |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
516 |
39700
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
517 storevfs = store.vfs |
39850
d89d5bc06eaa
localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39849
diff
changeset
|
518 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
|
519 |
39697
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
520 # 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
|
521 cachevfs = vfsmod.vfs(cachepath, cacheaudited=True) |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
522 cachevfs.createmode = store.createmode |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
523 |
39764
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
524 # 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
|
525 # 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
|
526 # 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
|
527 # 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
|
528 |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
529 bases = [] |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
530 extrastate = {} |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
531 |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
532 for iface, fn in REPO_INTERFACES: |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
533 # 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
|
534 # flexibility. |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
535 typ = fn(ui=ui, |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
536 intents=intents, |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
537 requirements=requirements, |
39850
d89d5bc06eaa
localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39849
diff
changeset
|
538 features=features, |
39764
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
539 wdirvfs=wdirvfs, |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
540 hgvfs=hgvfs, |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
541 store=store, |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
542 storevfs=storevfs, |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
543 storeoptions=storevfs.options, |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
544 cachevfs=cachevfs, |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
545 extensionmodulenames=extensionmodulenames, |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
546 extrastate=extrastate, |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
547 baseclasses=bases) |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
548 |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
549 if not isinstance(typ, type): |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
550 raise error.ProgrammingError('unable to construct type for %s' % |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
551 iface) |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
552 |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
553 bases.append(typ) |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
554 |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
555 # 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
|
556 # 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
|
557 # rich information about our constructed repo. |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
558 name = pycompat.sysstr(b'derivedrepo:%s<%s>' % ( |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
559 wdirvfs.base, |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
560 b','.join(sorted(requirements)))) |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
561 |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
562 cls = type(name, tuple(bases), {}) |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
563 |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
564 return cls( |
39689
f19bba3f4d3f
localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39688
diff
changeset
|
565 baseui=baseui, |
f19bba3f4d3f
localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39688
diff
changeset
|
566 ui=ui, |
f19bba3f4d3f
localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39688
diff
changeset
|
567 origroot=path, |
39688
2f9cdb5b3644
localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39687
diff
changeset
|
568 wdirvfs=wdirvfs, |
2f9cdb5b3644
localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39687
diff
changeset
|
569 hgvfs=hgvfs, |
39692
6a3162ed881d
localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39691
diff
changeset
|
570 requirements=requirements, |
39693
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
571 supportedrequirements=supportedrequirements, |
39697
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
572 sharedpath=storebasepath, |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
573 store=store, |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
574 cachevfs=cachevfs, |
39850
d89d5bc06eaa
localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39849
diff
changeset
|
575 features=features, |
39688
2f9cdb5b3644
localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39687
diff
changeset
|
576 intents=intents) |
39687
bfeab472e3c0
localrepo: create new function for instantiating a local repo object
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39668
diff
changeset
|
577 |
39852
2c2fadbc9851
localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
578 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
|
579 """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
|
580 |
2c2fadbc9851
localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
581 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
|
582 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
|
583 |
2c2fadbc9851
localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
584 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
|
585 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
|
586 """ |
2c2fadbc9851
localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
587 |
2c2fadbc9851
localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
588 # 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
|
589 # requirement is present. |
2c2fadbc9851
localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
590 autoextensions = { |
39854
823a580448d7
largefiles: automatically load largefiles extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39852
diff
changeset
|
591 b'largefiles': [b'largefiles'], |
39852
2c2fadbc9851
localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
592 b'lfs': [b'lfs'], |
2c2fadbc9851
localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
593 } |
2c2fadbc9851
localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
594 |
2c2fadbc9851
localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
595 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
|
596 if requirement not in requirements: |
2c2fadbc9851
localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
597 continue |
2c2fadbc9851
localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
598 |
2c2fadbc9851
localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
599 for name in names: |
2c2fadbc9851
localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
600 if not ui.hasconfig(b'extensions', name): |
2c2fadbc9851
localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
601 ui.setconfig(b'extensions', name, b'', source='autoload') |
2c2fadbc9851
localrepo: automatically load lfs extension when required (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39850
diff
changeset
|
602 |
39693
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
603 def gathersupportedrequirements(ui): |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
604 """Determine the complete set of recognized requirements.""" |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
605 # 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
|
606 supported = set(localrepository._basesupported) |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
607 |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
608 # 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
|
609 # relevant to this ui instance. |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
610 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
|
611 |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
612 for fn in featuresetupfuncs: |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
613 if fn.__module__ in modules: |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
614 fn(ui, supported) |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
615 |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
616 # Add derived requirements from registered compression engines. |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
617 for name in util.compengines: |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
618 engine = util.compengines[name] |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
619 if engine.revlogheader(): |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
620 supported.add(b'exp-compression-%s' % name) |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
621 |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
622 return supported |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
623 |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
624 def ensurerequirementsrecognized(requirements, supported): |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
625 """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
|
626 |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
627 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
|
628 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
|
629 recognize. |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
630 |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
631 Returns a set of supported requirements. |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
632 """ |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
633 missing = set() |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
634 |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
635 for requirement in requirements: |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
636 if requirement in supported: |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
637 continue |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
638 |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
639 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
|
640 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
|
641 |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
642 missing.add(requirement) |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
643 |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
644 if missing: |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
645 raise error.RequirementError( |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
646 _(b'repository requires features unknown to this Mercurial: %s') % |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
647 b' '.join(sorted(missing)), |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
648 hint=_(b'see https://mercurial-scm.org/wiki/MissingRequirement ' |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
649 b'for more information')) |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
650 |
39695
cb2dcfa5cade
localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39693
diff
changeset
|
651 def ensurerequirementscompatible(ui, requirements): |
cb2dcfa5cade
localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39693
diff
changeset
|
652 """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
|
653 |
cb2dcfa5cade
localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39693
diff
changeset
|
654 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
|
655 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
|
656 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
|
657 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
|
658 |
cb2dcfa5cade
localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39693
diff
changeset
|
659 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
|
660 checking. |
cb2dcfa5cade
localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39693
diff
changeset
|
661 |
cb2dcfa5cade
localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39693
diff
changeset
|
662 ``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
|
663 """ |
cb2dcfa5cade
localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39693
diff
changeset
|
664 if b'exp-sparse' in requirements and not sparse.enabled: |
cb2dcfa5cade
localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39693
diff
changeset
|
665 raise error.RepoError(_(b'repository is using sparse feature but ' |
cb2dcfa5cade
localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39693
diff
changeset
|
666 b'sparse is not enabled; enable the ' |
cb2dcfa5cade
localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39693
diff
changeset
|
667 b'"sparse" extensions to access')) |
cb2dcfa5cade
localrepo: move requirements reasonability testing to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39693
diff
changeset
|
668 |
39698
f44187605315
localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39697
diff
changeset
|
669 def makestore(requirements, path, vfstype): |
f44187605315
localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39697
diff
changeset
|
670 """Construct a storage object for a repository.""" |
f44187605315
localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39697
diff
changeset
|
671 if b'store' in requirements: |
f44187605315
localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39697
diff
changeset
|
672 if b'fncache' in requirements: |
f44187605315
localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39697
diff
changeset
|
673 return storemod.fncachestore(path, vfstype, |
f44187605315
localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39697
diff
changeset
|
674 b'dotencode' in requirements) |
f44187605315
localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39697
diff
changeset
|
675 |
f44187605315
localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39697
diff
changeset
|
676 return storemod.encodedstore(path, vfstype) |
f44187605315
localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39697
diff
changeset
|
677 |
f44187605315
localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39697
diff
changeset
|
678 return storemod.basicstore(path, vfstype) |
f44187605315
localrepo: move store() from store module
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39697
diff
changeset
|
679 |
39850
d89d5bc06eaa
localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39849
diff
changeset
|
680 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
|
681 """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
|
682 |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
683 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
|
684 """ |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
685 options = {} |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
686 |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
687 if b'treemanifest' in requirements: |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
688 options[b'treemanifest'] = True |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
689 |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
690 # experimental config: format.manifestcachesize |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
691 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
|
692 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
|
693 options[b'manifestcachesize'] = manifestcachesize |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
694 |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
695 # 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
|
696 # 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
|
697 # 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
|
698 # 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
|
699 # meaningful on such old repos. |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
700 if b'revlogv1' in requirements or REVLOGV2_REQUIREMENT in requirements: |
39850
d89d5bc06eaa
localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39849
diff
changeset
|
701 options.update(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
|
702 |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
703 return options |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
704 |
39850
d89d5bc06eaa
localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39849
diff
changeset
|
705 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
|
706 """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
|
707 |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
708 options = {} |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
709 |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
710 if b'revlogv1' in requirements: |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
711 options[b'revlogv1'] = True |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
712 if REVLOGV2_REQUIREMENT in requirements: |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
713 options[b'revlogv2'] = True |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
714 |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
715 if b'generaldelta' in requirements: |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
716 options[b'generaldelta'] = True |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
717 |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
718 # experimental config: format.chunkcachesize |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
719 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
|
720 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
|
721 options[b'chunkcachesize'] = chunkcachesize |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
722 |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
723 deltabothparents = ui.configbool(b'storage', |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
724 b'revlog.optimize-delta-parent-choice') |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
725 options[b'deltabothparents'] = deltabothparents |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
726 |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
727 options[b'lazydeltabase'] = not scmutil.gddeltaconfig(ui) |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
728 |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
729 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
|
730 if 0 <= chainspan: |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
731 options[b'maxdeltachainspan'] = chainspan |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
732 |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
733 mmapindexthreshold = ui.configbytes(b'experimental', |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
734 b'mmapindexthreshold') |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
735 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
|
736 options[b'mmapindexthreshold'] = mmapindexthreshold |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
737 |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
738 withsparseread = ui.configbool(b'experimental', b'sparse-read') |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
739 srdensitythres = float(ui.config(b'experimental', |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
740 b'sparse-read.density-threshold')) |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
741 srmingapsize = ui.configbytes(b'experimental', |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
742 b'sparse-read.min-gap-size') |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
743 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
|
744 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
|
745 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
|
746 |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
747 sparserevlog = SPARSEREVLOG_REQUIREMENT in requirements |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
748 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
|
749 if sparserevlog: |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
750 options[b'generaldelta'] = True |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
751 |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
752 maxchainlen = None |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
753 if sparserevlog: |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
754 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
|
755 # experimental config: format.maxchainlen |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
756 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
|
757 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
|
758 options[b'maxchainlen'] = maxchainlen |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
759 |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
760 for r in requirements: |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
761 if r.startswith(b'exp-compression-'): |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
762 options[b'compengine'] = r[len(b'exp-compression-'):] |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
763 |
39770
7aa440222323
localrepo: enable ellipsis flag on revlogs when repo is narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39765
diff
changeset
|
764 if repository.NARROW_REQUIREMENT in requirements: |
7aa440222323
localrepo: enable ellipsis flag on revlogs when repo is narrow
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39765
diff
changeset
|
765 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
|
766 |
39700
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
767 return options |
b10d145837bc
localrepo: extract resolving of opener options to standalone functions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39699
diff
changeset
|
768 |
39764
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
769 def makemain(**kwargs): |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
770 """Produce a type conforming to ``ilocalrepositorymain``.""" |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
771 return localrepository |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
772 |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
773 @interfaceutil.implementer(repository.ilocalrepositoryfilestorage) |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
774 class revlogfilestorage(object): |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
775 """File storage when using revlogs.""" |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
776 |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
777 def file(self, path): |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
778 if path[0] == b'/': |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
779 path = path[1:] |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
780 |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
781 return filelog.filelog(self.svfs, path) |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
782 |
39765
3e801ffd7269
filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39764
diff
changeset
|
783 @interfaceutil.implementer(repository.ilocalrepositoryfilestorage) |
3e801ffd7269
filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39764
diff
changeset
|
784 class revlognarrowfilestorage(object): |
3e801ffd7269
filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39764
diff
changeset
|
785 """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
|
786 |
3e801ffd7269
filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39764
diff
changeset
|
787 def file(self, path): |
3e801ffd7269
filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39764
diff
changeset
|
788 if path[0] == b'/': |
3e801ffd7269
filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39764
diff
changeset
|
789 path = path[1:] |
3e801ffd7269
filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39764
diff
changeset
|
790 |
3e801ffd7269
filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39764
diff
changeset
|
791 return filelog.narrowfilelog(self.svfs, path, self.narrowmatch()) |
3e801ffd7269
filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39764
diff
changeset
|
792 |
39850
d89d5bc06eaa
localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39849
diff
changeset
|
793 def makefilestorage(requirements, features, **kwargs): |
39764
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
794 """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
|
795 features.add(repository.REPO_FEATURE_REVLOG_FILE_STORAGE) |
d89d5bc06eaa
localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39849
diff
changeset
|
796 |
39765
3e801ffd7269
filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39764
diff
changeset
|
797 if repository.NARROW_REQUIREMENT in requirements: |
3e801ffd7269
filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39764
diff
changeset
|
798 return revlognarrowfilestorage |
3e801ffd7269
filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39764
diff
changeset
|
799 else: |
3e801ffd7269
filelog: custom filelog to be used with narrow repos
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39764
diff
changeset
|
800 return revlogfilestorage |
39764
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
801 |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
802 # 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
|
803 # will be called in order during ``makelocalrepository()`` to iteratively |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
804 # derive the final type for a local repository instance. |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
805 REPO_INTERFACES = [ |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
806 (repository.ilocalrepositorymain, makemain), |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
807 (repository.ilocalrepositoryfilestorage, makefilestorage), |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
808 ] |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
809 |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
810 @interfaceutil.implementer(repository.ilocalrepositorymain) |
17192
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
811 class localrepository(object): |
39764
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
812 """Main class for representing local repositories. |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
813 |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
814 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
|
815 |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
816 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
|
817 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
|
818 ``hg.repository()``, ``localrepo.instance()``, or |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
819 ``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
|
820 ``instance()`` adds support for creating new repositories. |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
821 ``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
|
822 ``reposetup()``. Generally speaking, ``hg.repository()`` should be |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
823 used. |
e4e881572382
localrepo: iteratively derive local repository type
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39763
diff
changeset
|
824 """ |
17192
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
825 |
36373
0147a4730420
cleanup: say goodbye to manifestv2 format
Augie Fackler <augie@google.com>
parents:
36178
diff
changeset
|
826 # obsolete experimental requirements: |
0147a4730420
cleanup: say goodbye to manifestv2 format
Augie Fackler <augie@google.com>
parents:
36178
diff
changeset
|
827 # - manifestv2: An experimental new manifest format that allowed |
0147a4730420
cleanup: say goodbye to manifestv2 format
Augie Fackler <augie@google.com>
parents:
36178
diff
changeset
|
828 # 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
|
829 # 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
|
830 # 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
|
831 supportedformats = { |
9f35c7836f60
localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32312
diff
changeset
|
832 'revlogv1', |
9f35c7836f60
localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32312
diff
changeset
|
833 'generaldelta', |
9f35c7836f60
localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32312
diff
changeset
|
834 'treemanifest', |
32697
19b9fc40cc51
revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32660
diff
changeset
|
835 REVLOGV2_REQUIREMENT, |
38717
aa21a9ad46ea
sparse-revlog: new requirement enabled with format.sparse-revlog
Paul Morelle <paul.morelle@octobus.net>
parents:
38239
diff
changeset
|
836 SPARSEREVLOG_REQUIREMENT, |
32314
9f35c7836f60
localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32312
diff
changeset
|
837 } |
9f35c7836f60
localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32312
diff
changeset
|
838 _basesupported = supportedformats | { |
9f35c7836f60
localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32312
diff
changeset
|
839 'store', |
9f35c7836f60
localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32312
diff
changeset
|
840 'fncache', |
9f35c7836f60
localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32312
diff
changeset
|
841 'shared', |
9f35c7836f60
localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32312
diff
changeset
|
842 'relshared', |
9f35c7836f60
localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32312
diff
changeset
|
843 'dotencode', |
33556
22371eabb3b1
sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33541
diff
changeset
|
844 'exp-sparse', |
39298
7a9f15ed3b96
phases: add a repository requirement about internal phase
Boris Feld <boris.feld@octobus.net>
parents:
39111
diff
changeset
|
845 'internal-phase' |
32314
9f35c7836f60
localrepo: reformat set literals
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32312
diff
changeset
|
846 } |
17137
b090601a80d1
localrepo: make requirements and openerreqs mutable by subclasses
Bryan O'Sullivan <bryano@fb.com>
parents:
17075
diff
changeset
|
847 |
33436
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
848 # 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
|
849 # 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
|
850 _wlockfreeprefix = { |
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
851 # 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
|
852 # 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
|
853 # 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
|
854 # now. |
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
855 'hgrc', |
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
856 'requires', |
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
857 # 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
|
858 # should investigate this in depth at some point |
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
859 'cache/', |
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
860 # XXX shouldn't be dirstate covered by the wlock? |
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
861 'dirstate', |
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
862 # 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
|
863 # 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
|
864 # the remainig bit and drop this line |
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
865 'bisect.state', |
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
866 } |
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
867 |
39692
6a3162ed881d
localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39691
diff
changeset
|
868 def __init__(self, baseui, ui, origroot, wdirvfs, hgvfs, requirements, |
39697
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
869 supportedrequirements, sharedpath, store, cachevfs, |
39850
d89d5bc06eaa
localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39849
diff
changeset
|
870 features, intents=None): |
39548
7ce9dea3a14a
localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39546
diff
changeset
|
871 """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
|
872 |
39688
2f9cdb5b3644
localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39687
diff
changeset
|
873 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
|
874 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
|
875 object. |
2f9cdb5b3644
localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39687
diff
changeset
|
876 |
2f9cdb5b3644
localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39687
diff
changeset
|
877 Arguments: |
2f9cdb5b3644
localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39687
diff
changeset
|
878 |
2f9cdb5b3644
localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39687
diff
changeset
|
879 baseui |
39689
f19bba3f4d3f
localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39688
diff
changeset
|
880 ``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
|
881 |
f19bba3f4d3f
localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39688
diff
changeset
|
882 ui |
f19bba3f4d3f
localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39688
diff
changeset
|
883 ``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
|
884 |
2f9cdb5b3644
localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39687
diff
changeset
|
885 origroot |
2f9cdb5b3644
localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39687
diff
changeset
|
886 ``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
|
887 |
2f9cdb5b3644
localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39687
diff
changeset
|
888 wdirvfs |
2f9cdb5b3644
localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39687
diff
changeset
|
889 ``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
|
890 |
2f9cdb5b3644
localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39687
diff
changeset
|
891 hgvfs |
2f9cdb5b3644
localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39687
diff
changeset
|
892 ``vfs.vfs`` rooted at .hg/ |
2f9cdb5b3644
localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39687
diff
changeset
|
893 |
39692
6a3162ed881d
localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39691
diff
changeset
|
894 requirements |
6a3162ed881d
localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39691
diff
changeset
|
895 ``set`` of bytestrings representing repository opening requirements. |
6a3162ed881d
localrepo: read requirements file in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39691
diff
changeset
|
896 |
39693
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
897 supportedrequirements |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
898 ``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
|
899 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
|
900 |
39697
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
901 sharedpath |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
902 ``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
|
903 ``.hg/`` directory somewhere. |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
904 |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
905 store |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
906 ``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
|
907 versioned storage. |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
908 |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
909 cachevfs |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
910 ``vfs.vfs`` used for cache files. |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
911 |
39850
d89d5bc06eaa
localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39849
diff
changeset
|
912 features |
d89d5bc06eaa
localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39849
diff
changeset
|
913 ``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
|
914 instance. |
d89d5bc06eaa
localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39849
diff
changeset
|
915 |
39688
2f9cdb5b3644
localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39687
diff
changeset
|
916 intents |
2f9cdb5b3644
localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39687
diff
changeset
|
917 ``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
|
918 for. |
39548
7ce9dea3a14a
localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39546
diff
changeset
|
919 """ |
39688
2f9cdb5b3644
localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39687
diff
changeset
|
920 self.baseui = baseui |
39689
f19bba3f4d3f
localrepo: copy ui in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39688
diff
changeset
|
921 self.ui = ui |
39688
2f9cdb5b3644
localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39687
diff
changeset
|
922 self.origroot = origroot |
2f9cdb5b3644
localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39687
diff
changeset
|
923 # vfs rooted at working directory. |
2f9cdb5b3644
localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39687
diff
changeset
|
924 self.wvfs = wdirvfs |
2f9cdb5b3644
localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39687
diff
changeset
|
925 self.root = wdirvfs.base |
2f9cdb5b3644
localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39687
diff
changeset
|
926 # 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
|
927 self.vfs = hgvfs |
2f9cdb5b3644
localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39687
diff
changeset
|
928 self.path = hgvfs.base |
39693
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
929 self.requirements = requirements |
5b8e9b2060ef
localrepo: validate supported requirements in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39692
diff
changeset
|
930 self.supported = supportedrequirements |
39697
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
931 self.sharedpath = sharedpath |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
932 self.store = store |
98ca9078807a
localrepo: resolve store and cachevfs in makelocalrepository()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39696
diff
changeset
|
933 self.cachevfs = cachevfs |
39850
d89d5bc06eaa
localrepo: define "features" on repository instances (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39849
diff
changeset
|
934 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
|
935 |
32730
b8ff7d0ff361
localrepo: move filtername to __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32729
diff
changeset
|
936 self.filtername = None |
39688
2f9cdb5b3644
localrepo: move some vfs initialization out of __init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39687
diff
changeset
|
937 |
33436
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
938 if (self.ui.configbool('devel', 'all-warnings') or |
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
939 self.ui.configbool('devel', 'check-locks')): |
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
940 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
|
941 # 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
|
942 # 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
|
943 # 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
|
944 self._phasedefaults = [] |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
945 |
31111
95ec3ad62f62
color: initialize color for the localrepo ui
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31054
diff
changeset
|
946 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
|
947 |
6840
80e51429cb9a
introduce store classes
Adrian Buehlmann <adrian@cadifra.com>
parents:
6839
diff
changeset
|
948 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
|
949 self.svfs = self.store.vfs |
6840
80e51429cb9a
introduce store classes
Adrian Buehlmann <adrian@cadifra.com>
parents:
6839
diff
changeset
|
950 self.sjoin = self.store.join |
33437
0720e6265c8a
reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33436
diff
changeset
|
951 if (self.ui.configbool('devel', 'all-warnings') or |
0720e6265c8a
reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33436
diff
changeset
|
952 self.ui.configbool('devel', 'check-locks')): |
0720e6265c8a
reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33436
diff
changeset
|
953 if util.safehasattr(self.svfs, 'vfs'): # this is filtervfs |
0720e6265c8a
reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33436
diff
changeset
|
954 self.svfs.vfs.audit = self._getsvfsward(self.svfs.vfs.audit) |
0720e6265c8a
reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33436
diff
changeset
|
955 else: # standard vfs |
0720e6265c8a
reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33436
diff
changeset
|
956 self.svfs.audit = self._getsvfsward(self.svfs.audit) |
3850
a4457828ca1a
move code around
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3803
diff
changeset
|
957 |
26155
51a30cae2bff
localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents:
26118
diff
changeset
|
958 self._dirstatevalidatewarned = False |
9146
5614a628d173
localrepo: rename in-memory tag cache instance attributes (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9145
diff
changeset
|
959 |
18189
b9026ba002f6
branchmap: enable caching for filtered version too
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18186
diff
changeset
|
960 self._branchcaches = {} |
24373
59cc09240afb
revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents:
24320
diff
changeset
|
961 self._revbranchcache = None |
37137
db90a5793103
localrepo: make filterpats private (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37135
diff
changeset
|
962 self._filterpats = {} |
5966
11af38a592ae
Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents:
5915
diff
changeset
|
963 self._datafilters = {} |
4916
5c5d23d93447
Use a weakref for recursive transactions
Matt Mackall <mpm@selenic.com>
parents:
4915
diff
changeset
|
964 self._transref = self._lockref = self._wlockref = None |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
965 |
14929
4bf9493e7b07
localrepo: add a cache with stat info for files under .hg/
Idan Kamara <idankk86@gmail.com>
parents:
14905
diff
changeset
|
966 # 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
|
967 # (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
|
968 # |
4bf9493e7b07
localrepo: add a cache with stat info for files under .hg/
Idan Kamara <idankk86@gmail.com>
parents:
14905
diff
changeset
|
969 # 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
|
970 self._filecache = {} |
4bf9493e7b07
localrepo: add a cache with stat info for files under .hg/
Idan Kamara <idankk86@gmail.com>
parents:
14905
diff
changeset
|
971 |
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
|
972 # 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
|
973 # 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
|
974 # - 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
|
975 # - 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
|
976 # - 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
|
977 # - 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
|
978 # - 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
|
979 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
|
980 |
32814
2083d1643d69
workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents:
32730
diff
changeset
|
981 # 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
|
982 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
|
983 |
23558
3198aac7a95d
namespaces: add bookmarks to the names data structure
Sean Farley <sean.michael.farley@gmail.com>
parents:
23546
diff
changeset
|
984 # generic mapping between names and nodes |
23561
3c2419e07df5
namespaces: remove weakref; always pass in repo
Ryan McElroy <rmcelroy@fb.com>
parents:
23558
diff
changeset
|
985 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
|
986 |
33302
36a415b5a4b2
localrepo: add sparse caches
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33278
diff
changeset
|
987 # Key to signature value. |
36a415b5a4b2
localrepo: add sparse caches
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33278
diff
changeset
|
988 self._sparsesignaturecache = {} |
36a415b5a4b2
localrepo: add sparse caches
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33278
diff
changeset
|
989 # Signature to cached matcher instance. |
36a415b5a4b2
localrepo: add sparse caches
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33278
diff
changeset
|
990 self._sparsematchercache = {} |
36a415b5a4b2
localrepo: add sparse caches
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33278
diff
changeset
|
991 |
33436
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
992 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
|
993 """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
|
994 rref = weakref.ref(self) |
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
995 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
|
996 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
|
997 repo = rref() |
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
998 if (repo is None |
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
999 or not util.safehasattr(repo, '_wlockref') |
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
1000 or not util.safehasattr(repo, '_lockref')): |
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
1001 return |
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
1002 if mode in (None, 'r', 'rb'): |
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
1003 return |
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
1004 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
|
1005 # truncate name relative to the repository (.hg) |
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
1006 path = path[len(repo.path) + 1:] |
33538
54b36d3ff7f6
cachevfs: add a devel warning for cache access though 'vfs'
Boris Feld <boris.feld@octobus.net>
parents:
33533
diff
changeset
|
1007 if path.startswith('cache/'): |
54b36d3ff7f6
cachevfs: add a devel warning for cache access though 'vfs'
Boris Feld <boris.feld@octobus.net>
parents:
33533
diff
changeset
|
1008 msg = 'accessing cache with vfs instead of cachevfs: "%s"' |
54b36d3ff7f6
cachevfs: add a devel warning for cache access though 'vfs'
Boris Feld <boris.feld@octobus.net>
parents:
33533
diff
changeset
|
1009 repo.ui.develwarn(msg % path, stacklevel=2, config="cache-vfs") |
33436
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
1010 if path.startswith('journal.'): |
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
1011 # journal is covered by 'lock' |
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
1012 if repo._currentlock(repo._lockref) is None: |
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
1013 repo.ui.develwarn('write with no lock: "%s"' % path, |
33532
d645fdfb749f
vfsward: register 'write with no lock' warnings as 'check-locks' config
Boris Feld <boris.feld@octobus.net>
parents:
33516
diff
changeset
|
1014 stacklevel=2, config='check-locks') |
33436
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
1015 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
|
1016 # 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
|
1017 # |
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
1018 # 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
|
1019 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
|
1020 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
|
1021 return |
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
1022 repo.ui.develwarn('write with no wlock: "%s"' % path, |
33532
d645fdfb749f
vfsward: register 'write with no lock' warnings as 'check-locks' config
Boris Feld <boris.feld@octobus.net>
parents:
33516
diff
changeset
|
1023 stacklevel=2, config='check-locks') |
33436
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
1024 return ret |
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
1025 return checkvfs |
9bb4decd43b0
repovfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33403
diff
changeset
|
1026 |
33437
0720e6265c8a
reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33436
diff
changeset
|
1027 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
|
1028 """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
|
1029 rref = weakref.ref(self) |
0720e6265c8a
reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33436
diff
changeset
|
1030 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
|
1031 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
|
1032 repo = rref() |
0720e6265c8a
reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33436
diff
changeset
|
1033 if repo is None or not util.safehasattr(repo, '_lockref'): |
0720e6265c8a
reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33436
diff
changeset
|
1034 return |
0720e6265c8a
reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33436
diff
changeset
|
1035 if mode in (None, 'r', 'rb'): |
0720e6265c8a
reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33436
diff
changeset
|
1036 return |
0720e6265c8a
reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33436
diff
changeset
|
1037 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
|
1038 # truncate name relative to the repository (.hg) |
0720e6265c8a
reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33436
diff
changeset
|
1039 path = path[len(repo.sharedpath) + 1:] |
0720e6265c8a
reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33436
diff
changeset
|
1040 if repo._currentlock(repo._lockref) is None: |
0720e6265c8a
reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33436
diff
changeset
|
1041 repo.ui.develwarn('write with no lock: "%s"' % path, |
0720e6265c8a
reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33436
diff
changeset
|
1042 stacklevel=3) |
0720e6265c8a
reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33436
diff
changeset
|
1043 return ret |
0720e6265c8a
reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33436
diff
changeset
|
1044 return checksvfs |
0720e6265c8a
reposvfs: add a ward to check if locks are properly taken
Boris Feld <boris.feld@octobus.net>
parents:
33436
diff
changeset
|
1045 |
17192
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
1046 def close(self): |
24378
9347c15d8136
revbranchcache: write cache even during read operations
Durham Goode <durham@fb.com>
parents:
24373
diff
changeset
|
1047 self._writecaches() |
9347c15d8136
revbranchcache: write cache even during read operations
Durham Goode <durham@fb.com>
parents:
24373
diff
changeset
|
1048 |
9347c15d8136
revbranchcache: write cache even during read operations
Durham Goode <durham@fb.com>
parents:
24373
diff
changeset
|
1049 def _writecaches(self): |
9347c15d8136
revbranchcache: write cache even during read operations
Durham Goode <durham@fb.com>
parents:
24373
diff
changeset
|
1050 if self._revbranchcache: |
9347c15d8136
revbranchcache: write cache even during read operations
Durham Goode <durham@fb.com>
parents:
24373
diff
changeset
|
1051 self._revbranchcache.write() |
17192
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
1052 |
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
1053 def _restrictcapabilities(self, caps): |
33499
0407a51b9d8c
codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents:
33454
diff
changeset
|
1054 if self.ui.configbool('experimental', 'bundle2-advertise'): |
20955
12f161f08d74
bundle2: allow pulling changegroups using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20954
diff
changeset
|
1055 caps = set(caps) |
35783
c97639ad6874
bundle2: specify what capabilities will be used for
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35749
diff
changeset
|
1056 capsblob = bundle2.encodecaps(bundle2.getrepocaps(self, |
c97639ad6874
bundle2: specify what capabilities will be used for
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35749
diff
changeset
|
1057 role='client')) |
28883
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
28876
diff
changeset
|
1058 caps.add('bundle2=' + urlreq.quote(capsblob)) |
17192
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
1059 return caps |
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
1060 |
12295
3388ab21d768
localrepo: factor out requirement application and write
Sune Foldager <cryo@cyanite.org>
parents:
12176
diff
changeset
|
1061 def _writerequirements(self): |
24934
5abd0a76bc8f
requires: move requires file writing func from localrepo to scmutil
Drew Gottlieb <drgott@google.com>
parents:
24918
diff
changeset
|
1062 scmutil.writerequires(self.vfs, self.requirements) |
12295
3388ab21d768
localrepo: factor out requirement application and write
Sune Foldager <cryo@cyanite.org>
parents:
12176
diff
changeset
|
1063 |
39312
9198e41df6ef
localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents:
39301
diff
changeset
|
1064 # 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
|
1065 # 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
|
1066 |
9198e41df6ef
localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents:
39301
diff
changeset
|
1067 @property |
9198e41df6ef
localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents:
39301
diff
changeset
|
1068 def auditor(self): |
9198e41df6ef
localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents:
39301
diff
changeset
|
1069 # 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
|
1070 # 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
|
1071 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
|
1072 |
9198e41df6ef
localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents:
39301
diff
changeset
|
1073 @property |
9198e41df6ef
localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents:
39301
diff
changeset
|
1074 def nofsauditor(self): |
9198e41df6ef
localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents:
39301
diff
changeset
|
1075 # 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
|
1076 # files in subrepos. |
9198e41df6ef
localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents:
39301
diff
changeset
|
1077 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
|
1078 realfs=False, cached=True) |
9198e41df6ef
localrepo: do not cache auditor/nofsauditor which would make reference cycle
Yuya Nishihara <yuya@tcha.org>
parents:
39301
diff
changeset
|
1079 |
12162
af8c4929931c
localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12127
diff
changeset
|
1080 def _checknested(self, path): |
af8c4929931c
localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12127
diff
changeset
|
1081 """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
|
1082 if not path.startswith(self.root): |
af8c4929931c
localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12127
diff
changeset
|
1083 return False |
af8c4929931c
localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12127
diff
changeset
|
1084 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
|
1085 normsubpath = util.pconvert(subpath) |
12162
af8c4929931c
localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12127
diff
changeset
|
1086 |
af8c4929931c
localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12127
diff
changeset
|
1087 # 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
|
1088 # 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
|
1089 # |
af8c4929931c
localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12127
diff
changeset
|
1090 # $ 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
|
1091 # |
af8c4929931c
localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12127
diff
changeset
|
1092 # 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
|
1093 # parent revision. |
af8c4929931c
localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12127
diff
changeset
|
1094 # |
af8c4929931c
localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12127
diff
changeset
|
1095 # 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
|
1096 # 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
|
1097 # 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
|
1098 # 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
|
1099 # panics when it sees sub/.hg/. |
af8c4929931c
localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12127
diff
changeset
|
1100 # |
12174
7bccd04292a2
localrepo: check nested repos against working directory
Martin Geisler <mg@lazybytes.net>
parents:
12166
diff
changeset
|
1101 # 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
|
1102 # 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
|
1103 # the filesystem *now*. |
7bccd04292a2
localrepo: check nested repos against working directory
Martin Geisler <mg@lazybytes.net>
parents:
12166
diff
changeset
|
1104 ctx = self[None] |
12162
af8c4929931c
localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12127
diff
changeset
|
1105 parts = util.splitpath(subpath) |
af8c4929931c
localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12127
diff
changeset
|
1106 while parts: |
15722
417127af3996
windows: use normalized path to check repository nesting
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15604
diff
changeset
|
1107 prefix = '/'.join(parts) |
12162
af8c4929931c
localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12127
diff
changeset
|
1108 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
|
1109 if prefix == normsubpath: |
12162
af8c4929931c
localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12127
diff
changeset
|
1110 return True |
af8c4929931c
localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12127
diff
changeset
|
1111 else: |
af8c4929931c
localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12127
diff
changeset
|
1112 sub = ctx.sub(prefix) |
af8c4929931c
localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12127
diff
changeset
|
1113 return sub.checknested(subpath[len(prefix) + 1:]) |
af8c4929931c
localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12127
diff
changeset
|
1114 else: |
af8c4929931c
localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12127
diff
changeset
|
1115 parts.pop() |
af8c4929931c
localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12127
diff
changeset
|
1116 return False |
af8c4929931c
localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12127
diff
changeset
|
1117 |
17192
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
1118 def peer(self): |
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
1119 return localpeer(self) # not cached to avoid reference cycle |
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
1120 |
17993
1a6f8820eb71
clfilter: introduce an "unfiltered" method on localrepo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17922
diff
changeset
|
1121 def unfiltered(self): |
1a6f8820eb71
clfilter: introduce an "unfiltered" method on localrepo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17922
diff
changeset
|
1122 """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
|
1123 |
18644
3e92772d5383
spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents:
18520
diff
changeset
|
1124 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
|
1125 return self |
1a6f8820eb71
clfilter: introduce an "unfiltered" method on localrepo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17922
diff
changeset
|
1126 |
35492
3ad582b2895c
repoview: add visibilityexceptions as an optional argument to repo.filtered()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
35309
diff
changeset
|
1127 def filtered(self, name, visibilityexceptions=None): |
18100
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18092
diff
changeset
|
1128 """Return a filtered version of a repository""" |
35248
c752fbe228fb
repoview: extract a factory function of proxy class
Yuya Nishihara <yuya@tcha.org>
parents:
35247
diff
changeset
|
1129 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
|
1130 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
|
1131 |
27698
dad6404ccddb
bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents:
27522
diff
changeset
|
1132 @repofilecache('bookmarks', 'bookmarks.current') |
13355
cce2e7b77e36
bookmarks: move property methods into localrepo
Matt Mackall <mpm@selenic.com>
parents:
13341
diff
changeset
|
1133 def _bookmarks(self): |
17922
7f5dab94e48c
bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents:
17857
diff
changeset
|
1134 return bookmarks.bmstore(self) |
13355
cce2e7b77e36
bookmarks: move property methods into localrepo
Matt Mackall <mpm@selenic.com>
parents:
13341
diff
changeset
|
1135 |
27698
dad6404ccddb
bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents:
27522
diff
changeset
|
1136 @property |
24947
a02d293a1079
bookmarks: rename bookmarkcurrent to activebookmark (API)
Ryan McElroy <rmcelroy@fb.com>
parents:
24946
diff
changeset
|
1137 def _activebookmark(self): |
27698
dad6404ccddb
bmstore: add handling of the active bookmark
Augie Fackler <augie@google.com>
parents:
27522
diff
changeset
|
1138 return self._bookmarks.active |
12162
af8c4929931c
localrepo: add auditor attribute which knows about subrepos
Martin Geisler <mg@lazybytes.net>
parents:
12127
diff
changeset
|
1139 |
35309
d13526333835
phases: drop the list with phase of each rev, always comput phase sets
Joerg Sonnenberger <joerg@bec.de>
parents:
35308
diff
changeset
|
1140 # _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
|
1141 # _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
|
1142 # can't be easily expressed in filecache mechanism. |
c15d8f84343e
localrepo: recreate phasecache if changelog was modified (issue4855)
Yuya Nishihara <yuya@tcha.org>
parents:
25878
diff
changeset
|
1143 @storecache('phaseroots', '00changelog.i') |
16657
b6081c2c4647
phases: introduce phasecache
Patrick Mezard <patrick@mezard.eu>
parents:
16646
diff
changeset
|
1144 def _phasecache(self): |
b6081c2c4647
phases: introduce phasecache
Patrick Mezard <patrick@mezard.eu>
parents:
16646
diff
changeset
|
1145 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
|
1146 |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
17013
diff
changeset
|
1147 @storecache('obsstore') |
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
17013
diff
changeset
|
1148 def obsstore(self): |
32729
c8177792fef6
obsolete: move obsstore creation logic from localrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32697
diff
changeset
|
1149 return obsolete.makestore(self.ui, self) |
17070
ad0d6c2b3279
obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
17013
diff
changeset
|
1150 |
16198
fa8488565afd
filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents:
16144
diff
changeset
|
1151 @storecache('00changelog.i') |
8260
54a4b520bd7d
localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8244
diff
changeset
|
1152 def changelog(self): |
32292
0ad0d26ff703
changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32291
diff
changeset
|
1153 return changelog.changelog(self.svfs, |
0ad0d26ff703
changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32291
diff
changeset
|
1154 trypending=txnutil.mayhavepending(self.root)) |
8260
54a4b520bd7d
localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8244
diff
changeset
|
1155 |
30219
3c8811efdddc
manifest: make manifestlog a storecache
Durham Goode <durham@fb.com>
parents:
30218
diff
changeset
|
1156 @storecache('00manifest.i') |
29825
426d931e5db2
manifest: introduce manifestlog and manifestctx classes
Durham Goode <durham@fb.com>
parents:
29709
diff
changeset
|
1157 def manifestlog(self): |
39763
5ccd791344f3
localrepo: pass root manifest into manifestlog.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39758
diff
changeset
|
1158 rootstore = manifest.manifestrevlog(self.svfs) |
5ccd791344f3
localrepo: pass root manifest into manifestlog.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39758
diff
changeset
|
1159 return manifest.manifestlog(self.svfs, self, rootstore) |
29825
426d931e5db2
manifest: introduce manifestlog and manifestctx classes
Durham Goode <durham@fb.com>
parents:
29709
diff
changeset
|
1160 |
18014
a39fe76c4c65
clfilter: ensure that filecache on localrepo is unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18013
diff
changeset
|
1161 @repofilecache('dirstate') |
8260
54a4b520bd7d
localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents:
8244
diff
changeset
|
1162 def dirstate(self): |
38128
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
37848
diff
changeset
|
1163 return self._makedirstate() |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
37848
diff
changeset
|
1164 |
1cba497491be
narrow: only wrap dirstate functions once, instead of per-reposetup
Kyle Lippincott <spectral@google.com>
parents:
37848
diff
changeset
|
1165 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
|
1166 """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
|
1167 sparsematchfn = lambda: sparse.matcher(self) |
fb320398a21c
dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33336
diff
changeset
|
1168 |
26155
51a30cae2bff
localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents:
26118
diff
changeset
|
1169 return dirstate.dirstate(self.vfs, self.ui, self.root, |
33373
fb320398a21c
dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33336
diff
changeset
|
1170 self._dirstatevalidate, sparsematchfn) |
13032
e41e2b79883d
dirstate: warn on invalid parents rather than aborting
Matt Mackall <mpm@selenic.com>
parents:
13001
diff
changeset
|
1171 |
26155
51a30cae2bff
localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents:
26118
diff
changeset
|
1172 def _dirstatevalidate(self, node): |
51a30cae2bff
localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents:
26118
diff
changeset
|
1173 try: |
51a30cae2bff
localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents:
26118
diff
changeset
|
1174 self.changelog.rev(node) |
51a30cae2bff
localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents:
26118
diff
changeset
|
1175 return node |
51a30cae2bff
localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents:
26118
diff
changeset
|
1176 except error.LookupError: |
51a30cae2bff
localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents:
26118
diff
changeset
|
1177 if not self._dirstatevalidatewarned: |
51a30cae2bff
localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents:
26118
diff
changeset
|
1178 self._dirstatevalidatewarned = True |
51a30cae2bff
localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents:
26118
diff
changeset
|
1179 self.ui.warn(_("warning: ignoring unknown" |
51a30cae2bff
localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents:
26118
diff
changeset
|
1180 " working parent %s!\n") % short(node)) |
51a30cae2bff
localrepo: move dirstate validate function to class scope
Siddharth Agarwal <sid0@fb.com>
parents:
26118
diff
changeset
|
1181 return nullid |
2155
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
1182 |
38872
576eef1ab43d
narrow: move .hg/narrowspec to .hg/store/narrowspec (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents:
38869
diff
changeset
|
1183 @storecache(narrowspec.FILENAME) |
36471
c28b6d609c47
narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents:
36422
diff
changeset
|
1184 def narrowpats(self): |
c28b6d609c47
narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents:
36422
diff
changeset
|
1185 """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
|
1186 |
c28b6d609c47
narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents:
36422
diff
changeset
|
1187 A tuple of (includes, excludes). |
c28b6d609c47
narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents:
36422
diff
changeset
|
1188 """ |
39758
543f26ece6cf
narrow: remove hack to read narowspec from shared .hg directory
Martin von Zweigbergk <martinvonz@google.com>
parents:
39700
diff
changeset
|
1189 return narrowspec.load(self) |
36471
c28b6d609c47
narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents:
36422
diff
changeset
|
1190 |
38872
576eef1ab43d
narrow: move .hg/narrowspec to .hg/store/narrowspec (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents:
38869
diff
changeset
|
1191 @storecache(narrowspec.FILENAME) |
36471
c28b6d609c47
narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents:
36422
diff
changeset
|
1192 def _narrowmatch(self): |
38835
a232e6744ba3
narrow: move requirement constant from changegroup to repository
Martin von Zweigbergk <martinvonz@google.com>
parents:
38783
diff
changeset
|
1193 if repository.NARROW_REQUIREMENT not in self.requirements: |
36471
c28b6d609c47
narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents:
36422
diff
changeset
|
1194 return matchmod.always(self.root, '') |
c28b6d609c47
narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents:
36422
diff
changeset
|
1195 include, exclude = self.narrowpats |
c28b6d609c47
narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents:
36422
diff
changeset
|
1196 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
|
1197 |
c28b6d609c47
narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents:
36422
diff
changeset
|
1198 # TODO(martinvonz): make this property-like instead? |
c28b6d609c47
narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents:
36422
diff
changeset
|
1199 def narrowmatch(self): |
c28b6d609c47
narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents:
36422
diff
changeset
|
1200 return self._narrowmatch |
c28b6d609c47
narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents:
36422
diff
changeset
|
1201 |
c28b6d609c47
narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents:
36422
diff
changeset
|
1202 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
|
1203 narrowspec.save(self, newincludes, newexcludes) |
36471
c28b6d609c47
narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents:
36422
diff
changeset
|
1204 self.invalidate(clearfilecache=True) |
c28b6d609c47
narrow: move narrowmatch-related methods to localrepo
Martin von Zweigbergk <martinvonz@google.com>
parents:
36422
diff
changeset
|
1205 |
6747
f6c00b17387c
use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents:
6743
diff
changeset
|
1206 def __getitem__(self, changeid): |
32660
a722c8e17363
localrepo: map integer and hex wdir identifiers to workingctx
Yuya Nishihara <yuya@tcha.org>
parents:
32481
diff
changeset
|
1207 if changeid is None: |
6747
f6c00b17387c
use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents:
6743
diff
changeset
|
1208 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
|
1209 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
|
1210 return changeid |
23630
b9af235810cc
localrepo.__getitem__: add slicing support
Eric Sumner <ericsumner@fb.com>
parents:
23561
diff
changeset
|
1211 if isinstance(changeid, slice): |
32660
a722c8e17363
localrepo: map integer and hex wdir identifiers to workingctx
Yuya Nishihara <yuya@tcha.org>
parents:
32481
diff
changeset
|
1212 # wdirrev isn't contiguous so the slice shouldn't include it |
23630
b9af235810cc
localrepo.__getitem__: add slicing support
Eric Sumner <ericsumner@fb.com>
parents:
23561
diff
changeset
|
1213 return [context.changectx(self, i) |
38783
e7aa113b14f7
global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38781
diff
changeset
|
1214 for i in pycompat.xrange(*changeid.indices(len(self))) |
23630
b9af235810cc
localrepo.__getitem__: add slicing support
Eric Sumner <ericsumner@fb.com>
parents:
23561
diff
changeset
|
1215 if i not in self.changelog.filteredrevs] |
32660
a722c8e17363
localrepo: map integer and hex wdir identifiers to workingctx
Yuya Nishihara <yuya@tcha.org>
parents:
32481
diff
changeset
|
1216 try: |
a722c8e17363
localrepo: map integer and hex wdir identifiers to workingctx
Yuya Nishihara <yuya@tcha.org>
parents:
32481
diff
changeset
|
1217 return context.changectx(self, changeid) |
a722c8e17363
localrepo: map integer and hex wdir identifiers to workingctx
Yuya Nishihara <yuya@tcha.org>
parents:
32481
diff
changeset
|
1218 except error.WdirUnsupported: |
a722c8e17363
localrepo: map integer and hex wdir identifiers to workingctx
Yuya Nishihara <yuya@tcha.org>
parents:
32481
diff
changeset
|
1219 return context.workingctx(self) |
6747
f6c00b17387c
use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents:
6743
diff
changeset
|
1220 |
9924
ea3acaae25bb
localrepo: support 'rev in repo' syntax
Alexander Solovyov <piranha@piranha.org.ua>
parents:
9820
diff
changeset
|
1221 def __contains__(self, changeid): |
32481
a87dabb053d0
localrepo: document that __contains__() may raise LookupError
Yuya Nishihara <yuya@tcha.org>
parents:
32452
diff
changeset
|
1222 """True if the given changeid exists |
a87dabb053d0
localrepo: document that __contains__() may raise LookupError
Yuya Nishihara <yuya@tcha.org>
parents:
32452
diff
changeset
|
1223 |
38841
df0873ab5c14
revlog: use specialized exception for ambiguous prefix lookup
Martin von Zweigbergk <martinvonz@google.com>
parents:
38835
diff
changeset
|
1224 error.AmbiguousPrefixLookupError is raised if an ambiguous node |
df0873ab5c14
revlog: use specialized exception for ambiguous prefix lookup
Martin von Zweigbergk <martinvonz@google.com>
parents:
38835
diff
changeset
|
1225 specified. |
32481
a87dabb053d0
localrepo: document that __contains__() may raise LookupError
Yuya Nishihara <yuya@tcha.org>
parents:
32452
diff
changeset
|
1226 """ |
9924
ea3acaae25bb
localrepo: support 'rev in repo' syntax
Alexander Solovyov <piranha@piranha.org.ua>
parents:
9820
diff
changeset
|
1227 try: |
24320
b9f7f3eeb99c
localrepo: extend "changeid in repo" to return True for workingctx revision
Yuya Nishihara <yuya@tcha.org>
parents:
24306
diff
changeset
|
1228 self[changeid] |
b9f7f3eeb99c
localrepo: extend "changeid in repo" to return True for workingctx revision
Yuya Nishihara <yuya@tcha.org>
parents:
24306
diff
changeset
|
1229 return True |
37797
43221a57e22f
context: translate FilteredIndex/LookupError at repo[changeid] (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37717
diff
changeset
|
1230 except error.RepoLookupError: |
9924
ea3acaae25bb
localrepo: support 'rev in repo' syntax
Alexander Solovyov <piranha@piranha.org.ua>
parents:
9820
diff
changeset
|
1231 return False |
ea3acaae25bb
localrepo: support 'rev in repo' syntax
Alexander Solovyov <piranha@piranha.org.ua>
parents:
9820
diff
changeset
|
1232 |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6747
diff
changeset
|
1233 def __nonzero__(self): |
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6747
diff
changeset
|
1234 return True |
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6747
diff
changeset
|
1235 |
31476
413b44003462
py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
31466
diff
changeset
|
1236 __bool__ = __nonzero__ |
413b44003462
py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
31466
diff
changeset
|
1237 |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6747
diff
changeset
|
1238 def __len__(self): |
35736
29f57ce416ed
localrepo: micro-optimize __len__() to bypass repoview
Yuya Nishihara <yuya@tcha.org>
parents:
35726
diff
changeset
|
1239 # 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
|
1240 unfi = self.unfiltered() |
29f57ce416ed
localrepo: micro-optimize __len__() to bypass repoview
Yuya Nishihara <yuya@tcha.org>
parents:
35726
diff
changeset
|
1241 return len(unfi.changelog) |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6747
diff
changeset
|
1242 |
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6747
diff
changeset
|
1243 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
|
1244 return iter(self.changelog) |
2155
ff255b41b4aa
support hooks written in python.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2150
diff
changeset
|
1245 |
15403
e27561eb4a76
localrepo: add revs helper method
Matt Mackall <mpm@selenic.com>
parents:
15381
diff
changeset
|
1246 def revs(self, expr, *args): |
27071
dfb31eebd949
localrepo: improve docstring for revset methods
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26998
diff
changeset
|
1247 '''Find revisions matching a revset. |
dfb31eebd949
localrepo: improve docstring for revset methods
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26998
diff
changeset
|
1248 |
dfb31eebd949
localrepo: improve docstring for revset methods
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26998
diff
changeset
|
1249 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
|
1250 %-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
|
1251 |
29417
526b027b0130
scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29373
diff
changeset
|
1252 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
|
1253 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
|
1254 ``repo.anyrevs([expr], user=True)``. |
29417
526b027b0130
scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29373
diff
changeset
|
1255 |
526b027b0130
scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29373
diff
changeset
|
1256 Returns a revset.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
|
1257 that contains integer revisions. |
dfb31eebd949
localrepo: improve docstring for revset methods
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26998
diff
changeset
|
1258 ''' |
31024
0b8356705de6
revset: split language services to revsetlang module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
30989
diff
changeset
|
1259 expr = revsetlang.formatspec(expr, *args) |
15403
e27561eb4a76
localrepo: add revs helper method
Matt Mackall <mpm@selenic.com>
parents:
15381
diff
changeset
|
1260 m = revset.match(None, expr) |
24114
fafd9a1284cf
revset: make match function initiate query from full set by default
Yuya Nishihara <yuya@tcha.org>
parents:
24113
diff
changeset
|
1261 return m(self) |
15403
e27561eb4a76
localrepo: add revs helper method
Matt Mackall <mpm@selenic.com>
parents:
15381
diff
changeset
|
1262 |
14902
96a72cbc6c29
localrepo: add set method to iterate over a given revset
Matt Mackall <mpm@selenic.com>
parents:
14870
diff
changeset
|
1263 def set(self, expr, *args): |
27071
dfb31eebd949
localrepo: improve docstring for revset methods
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26998
diff
changeset
|
1264 '''Find revisions matching a revset and emit changectx instances. |
dfb31eebd949
localrepo: improve docstring for revset methods
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26998
diff
changeset
|
1265 |
dfb31eebd949
localrepo: improve docstring for revset methods
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26998
diff
changeset
|
1266 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
|
1267 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
|
1268 |
526b027b0130
scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29373
diff
changeset
|
1269 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
|
1270 user aliases, consider calling ``scmutil.revrange()``. |
14902
96a72cbc6c29
localrepo: add set method to iterate over a given revset
Matt Mackall <mpm@selenic.com>
parents:
14870
diff
changeset
|
1271 ''' |
15403
e27561eb4a76
localrepo: add revs helper method
Matt Mackall <mpm@selenic.com>
parents:
15381
diff
changeset
|
1272 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
|
1273 yield self[r] |
96a72cbc6c29
localrepo: add set method to iterate over a given revset
Matt Mackall <mpm@selenic.com>
parents:
14870
diff
changeset
|
1274 |
33336
4672db164c98
revset: make repo.anyrevs accept customized alias override (API)
Jun Wu <quark@fb.com>
parents:
33302
diff
changeset
|
1275 def anyrevs(self, specs, user=False, localalias=None): |
31025
6cf2857526c7
scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents:
31024
diff
changeset
|
1276 '''Find revisions matching one of the given revsets. |
6cf2857526c7
scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents:
31024
diff
changeset
|
1277 |
6cf2857526c7
scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents:
31024
diff
changeset
|
1278 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
|
1279 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
|
1280 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
|
1281 ``{name: definitionstring}``. |
31025
6cf2857526c7
scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents:
31024
diff
changeset
|
1282 ''' |
6cf2857526c7
scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents:
31024
diff
changeset
|
1283 if user: |
37674
f83cb91b052e
revset: pass in lookup function instead of repo (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37670
diff
changeset
|
1284 m = revset.matchany(self.ui, specs, |
f83cb91b052e
revset: pass in lookup function instead of repo (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37670
diff
changeset
|
1285 lookup=revset.lookupfn(self), |
33336
4672db164c98
revset: make repo.anyrevs accept customized alias override (API)
Jun Wu <quark@fb.com>
parents:
33302
diff
changeset
|
1286 localalias=localalias) |
31025
6cf2857526c7
scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents:
31024
diff
changeset
|
1287 else: |
33336
4672db164c98
revset: make repo.anyrevs accept customized alias override (API)
Jun Wu <quark@fb.com>
parents:
33302
diff
changeset
|
1288 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
|
1289 return m(self) |
6cf2857526c7
scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents:
31024
diff
changeset
|
1290 |
2673
109a22f5434a
hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2661
diff
changeset
|
1291 def url(self): |
109a22f5434a
hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2661
diff
changeset
|
1292 return 'file:' + self.root |
109a22f5434a
hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2661
diff
changeset
|
1293 |
1718
c1996b84d4f5
make hook code nicer.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1717
diff
changeset
|
1294 def hook(self, name, throw=False, **args): |
21866
a2ca9dcb4b77
localrepo: document localrepo.hook()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21702
diff
changeset
|
1295 """Call a hook, passing this repo instance. |
a2ca9dcb4b77
localrepo: document localrepo.hook()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21702
diff
changeset
|
1296 |
a2ca9dcb4b77
localrepo: document localrepo.hook()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21702
diff
changeset
|
1297 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
|
1298 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
|
1299 replacing code that is expected to call a hook. |
a2ca9dcb4b77
localrepo: document localrepo.hook()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21702
diff
changeset
|
1300 """ |
4622
fff50306e6dd
hooks: separate hook code into a separate module
Matt Mackall <mpm@selenic.com>
parents:
4619
diff
changeset
|
1301 return hook.hook(self.ui, self, name, throw, **args) |
487 | 1302 |
18013
98c867ac1330
clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18009
diff
changeset
|
1303 @filteredpropertycache |
14936
9dca7653b525
localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents:
14935
diff
changeset
|
1304 def _tagscache(self): |
16683 | 1305 '''Returns a tagscache object that contains various tags related |
1306 caches.''' | |
14936
9dca7653b525
localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents:
14935
diff
changeset
|
1307 |
9dca7653b525
localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents:
14935
diff
changeset
|
1308 # 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
|
1309 # 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
|
1310 class tagscache(object): |
9dca7653b525
localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents:
14935
diff
changeset
|
1311 def __init__(self): |
9dca7653b525
localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents:
14935
diff
changeset
|
1312 # 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
|
1313 # 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
|
1314 # '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
|
1315 # 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
|
1316 # 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
|
1317 self.tags = self.tagtypes = None |
9dca7653b525
localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents:
14935
diff
changeset
|
1318 |
9dca7653b525
localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents:
14935
diff
changeset
|
1319 self.nodetagscache = self.tagslist = None |
9dca7653b525
localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents:
14935
diff
changeset
|
1320 |
9dca7653b525
localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents:
14935
diff
changeset
|
1321 cache = tagscache() |
9dca7653b525
localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents:
14935
diff
changeset
|
1322 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
|
1323 |
9dca7653b525
localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents:
14935
diff
changeset
|
1324 return cache |
9dca7653b525
localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents:
14935
diff
changeset
|
1325 |
343 | 1326 def tags(self): |
1327 '''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
|
1328 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
|
1329 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
|
1330 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
|
1331 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
|
1332 tags = self._tagscache.tags |
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
|
1333 for k, v in tags.iteritems(): |
16371
4417eb761ba8
tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents:
16361
diff
changeset
|
1334 try: |
4417eb761ba8
tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents:
16361
diff
changeset
|
1335 # ignore tags to unknown nodes |
4417eb761ba8
tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents:
16361
diff
changeset
|
1336 self.changelog.rev(v) |
4417eb761ba8
tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents:
16361
diff
changeset
|
1337 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
|
1338 except (error.LookupError, ValueError): |
16371
4417eb761ba8
tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents:
16361
diff
changeset
|
1339 pass |
4417eb761ba8
tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents:
16361
diff
changeset
|
1340 return t |
4210
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4178
diff
changeset
|
1341 |
9145
6b03f93b8ff3
localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9134
diff
changeset
|
1342 def _findtags(self): |
6b03f93b8ff3
localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9134
diff
changeset
|
1343 '''Do the hard work of finding tags. Return a pair of dicts |
6b03f93b8ff3
localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9134
diff
changeset
|
1344 (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
|
1345 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
|
1346 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
|
1347 should be aware that the returned dicts will be retained for the |
6b03f93b8ff3
localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9134
diff
changeset
|
1348 duration of the localrepo object.''' |
6b03f93b8ff3
localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9134
diff
changeset
|
1349 |
6b03f93b8ff3
localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9134
diff
changeset
|
1350 # 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
|
1351 # 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
|
1352 # 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
|
1353 # 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
|
1354 # quo fine? |
4210
caff92047e87
Refactor tags code to prepare for improving the algorithm
Matt Mackall <mpm@selenic.com>
parents:
4178
diff
changeset
|
1355 |
659 | 1356 |
31709
c34c170b25f3
tags: only return 'alltags' in 'findglobaltags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31706
diff
changeset
|
1357 # 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
|
1358 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
|
1359 # map tag name to tag type |
c34c170b25f3
tags: only return 'alltags' in 'findglobaltags'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31706
diff
changeset
|
1360 tagtypes = dict((tag, '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
|
1361 |
10651
5f091fc1bab7
style: use consistent variable names (*mod) with imports which would shadow
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10547
diff
changeset
|
1362 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
|
1363 |
9152
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9151
diff
changeset
|
1364 # 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
|
1365 # 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
|
1366 # 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
|
1367 # local encoding. |
9145
6b03f93b8ff3
localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9134
diff
changeset
|
1368 tags = {} |
9147
234a230cc33b
localrepo: improve readability of _findtags(), readtags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9146
diff
changeset
|
1369 for (name, (node, hist)) in alltags.iteritems(): |
234a230cc33b
localrepo: improve readability of _findtags(), readtags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9146
diff
changeset
|
1370 if node != nullid: |
16371
4417eb761ba8
tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents:
16361
diff
changeset
|
1371 tags[encoding.tolocal(name)] = node |
9145
6b03f93b8ff3
localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9134
diff
changeset
|
1372 tags['tip'] = self.changelog.tip() |
9152
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9151
diff
changeset
|
1373 tagtypes = dict([(encoding.tolocal(name), value) |
4017291c4c48
tags: support 'instant' tag retrieval (issue548)
Greg Ward <greg-hg@gerg.ca>
parents:
9151
diff
changeset
|
1374 for (name, value) in tagtypes.iteritems()]) |
9145
6b03f93b8ff3
localrepo: factor _findtags() out of tags() (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9134
diff
changeset
|
1375 return (tags, tagtypes) |
343 | 1376 |
5657
47915bf68c44
Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents:
5637
diff
changeset
|
1377 def tagtype(self, tagname): |
47915bf68c44
Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents:
5637
diff
changeset
|
1378 ''' |
47915bf68c44
Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents:
5637
diff
changeset
|
1379 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
|
1380 |
47915bf68c44
Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents:
5637
diff
changeset
|
1381 '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
|
1382 '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
|
1383 None : tag does not exist |
47915bf68c44
Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents:
5637
diff
changeset
|
1384 ''' |
47915bf68c44
Properly check tag's existence as a local/global tag when removing it.
Osku Salerma <osku@iki.fi>
parents:
5637
diff
changeset
|
1385 |
14936
9dca7653b525
localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents:
14935
diff
changeset
|
1386 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
|
1387 |
343 | 1388 def tagslist(self): |
1389 '''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
|
1390 if not self._tagscache.tagslist: |
9dca7653b525
localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents:
14935
diff
changeset
|
1391 l = [] |
9dca7653b525
localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents:
14935
diff
changeset
|
1392 for t, n in self.tags().iteritems(): |
22201
269688a398c4
cleanup: fix some list comprehension redefinitions of existing vars
Mads Kiilerich <madski@unity3d.com>
parents:
22080
diff
changeset
|
1393 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
|
1394 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
|
1395 |
9dca7653b525
localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents:
14935
diff
changeset
|
1396 return self._tagscache.tagslist |
343 | 1397 |
1398 def nodetags(self, node): | |
1399 '''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
|
1400 if not self._tagscache.nodetagscache: |
9dca7653b525
localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents:
14935
diff
changeset
|
1401 nodetagscache = {} |
16371
4417eb761ba8
tags: defer tag validation until repo.tags() is called
Matt Mackall <mpm@selenic.com>
parents:
16361
diff
changeset
|
1402 for t, n in self._tagscache.tags.iteritems(): |
14936
9dca7653b525
localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents:
14935
diff
changeset
|
1403 nodetagscache.setdefault(n, []).append(t) |
9dca7653b525
localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents:
14935
diff
changeset
|
1404 for tags in nodetagscache.itervalues(): |
11047
c7dbd6c4877a
tags: return tags in sorted order
Eric Eisner <ede@mit.edu>
parents:
10970
diff
changeset
|
1405 tags.sort() |
14936
9dca7653b525
localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents:
14935
diff
changeset
|
1406 self._tagscache.nodetagscache = nodetagscache |
9dca7653b525
localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents:
14935
diff
changeset
|
1407 return self._tagscache.nodetagscache.get(node, []) |
343 | 1408 |
13384
caa561759538
context: add method to return all bookmarks pointing to a node
David Soria Parra <dsp@php.net>
parents:
13365
diff
changeset
|
1409 def nodebookmarks(self, node): |
27166
263db31329a6
localrepo: document nodebookmarks
Augie Fackler <augie@google.com>
parents:
27165
diff
changeset
|
1410 """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
|
1411 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
|
1412 |
12066
d01e28657429
localrepo: introduce method for explicit branch cache update
Georg Brandl <georg@python.org>
parents:
12035
diff
changeset
|
1413 def branchmap(self): |
20245
4edd179fefb8
help: branch names primarily denote the tipmost unclosed branch head
Mads Kiilerich <madski@unity3d.com>
parents:
20226
diff
changeset
|
1414 '''returns a dictionary {branch: [branchheads]} with branchheads |
4edd179fefb8
help: branch names primarily denote the tipmost unclosed branch head
Mads Kiilerich <madski@unity3d.com>
parents:
20226
diff
changeset
|
1415 ordered by increasing revision number''' |
18189
b9026ba002f6
branchmap: enable caching for filtered version too
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18186
diff
changeset
|
1416 branchmap.updatecache(self) |
b9026ba002f6
branchmap: enable caching for filtered version too
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18186
diff
changeset
|
1417 return self._branchcaches[self.filtername] |
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
|
1418 |
24373
59cc09240afb
revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents:
24320
diff
changeset
|
1419 @unfilteredmethod |
59cc09240afb
revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents:
24320
diff
changeset
|
1420 def revbranchcache(self): |
59cc09240afb
revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents:
24320
diff
changeset
|
1421 if not self._revbranchcache: |
59cc09240afb
revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents:
24320
diff
changeset
|
1422 self._revbranchcache = branchmap.revbranchcache(self.unfiltered()) |
59cc09240afb
revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents:
24320
diff
changeset
|
1423 return self._revbranchcache |
59cc09240afb
revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents:
24320
diff
changeset
|
1424 |
23775
885c0290f7d5
localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents:
23749
diff
changeset
|
1425 def branchtip(self, branch, ignoremissing=False): |
885c0290f7d5
localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents:
23749
diff
changeset
|
1426 '''return the tip node for a given branch |
885c0290f7d5
localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents:
23749
diff
changeset
|
1427 |
885c0290f7d5
localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents:
23749
diff
changeset
|
1428 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
|
1429 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
|
1430 (e.g. namespace). |
885c0290f7d5
localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents:
23749
diff
changeset
|
1431 |
885c0290f7d5
localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents:
23749
diff
changeset
|
1432 ''' |
20187
4d6d5ef88538
localrepo: refactor repo.branchtip() to use repo.branchmap().branchtip()
Brodie Rao <brodie@sf.io>
parents:
20184
diff
changeset
|
1433 try: |
4d6d5ef88538
localrepo: refactor repo.branchtip() to use repo.branchmap().branchtip()
Brodie Rao <brodie@sf.io>
parents:
20184
diff
changeset
|
1434 return self.branchmap().branchtip(branch) |
4d6d5ef88538
localrepo: refactor repo.branchtip() to use repo.branchmap().branchtip()
Brodie Rao <brodie@sf.io>
parents:
20184
diff
changeset
|
1435 except KeyError: |
23775
885c0290f7d5
localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents:
23749
diff
changeset
|
1436 if not ignoremissing: |
885c0290f7d5
localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents:
23749
diff
changeset
|
1437 raise error.RepoLookupError(_("unknown branch '%s'") % branch) |
885c0290f7d5
localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents:
23749
diff
changeset
|
1438 else: |
885c0290f7d5
localrepo: add ignoremissing parameter to branchtip
Sean Farley <sean.michael.farley@gmail.com>
parents:
23749
diff
changeset
|
1439 pass |
16719
e7bf09acd410
localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents:
16716
diff
changeset
|
1440 |
343 | 1441 def lookup(self, key): |
37315
0a1fb171dc1d
localrepo: use revsymbol() in lookup()
Martin von Zweigbergk <martinvonz@google.com>
parents:
37181
diff
changeset
|
1442 return scmutil.revsymbol(self, key).node() |
67 | 1443 |
37351
fdd22bf6398f
localrepo: drop "remote" argument from lookupbranch() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
37321
diff
changeset
|
1444 def lookupbranch(self, key): |
fdd22bf6398f
localrepo: drop "remote" argument from lookupbranch() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
37321
diff
changeset
|
1445 if key in self.branchmap(): |
10960
ca739acf1a98
commands: add more robust support for 'hg log -b' (issue2078)
Steve Losh <steve@stevelosh.com>
parents:
10926
diff
changeset
|
1446 return key |
ca739acf1a98
commands: add more robust support for 'hg log -b' (issue2078)
Steve Losh <steve@stevelosh.com>
parents:
10926
diff
changeset
|
1447 |
37352
92171562c7f3
localrepo: use revsymbol in lookupbranch() too
Martin von Zweigbergk <martinvonz@google.com>
parents:
37351
diff
changeset
|
1448 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
|
1449 |
13723
e615765fdcc7
wireproto: add known([id]) function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13720
diff
changeset
|
1450 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
|
1451 cl = self.changelog |
b64b6fdc5c9b
discovery: properly filter changeset in 'peer.known' (issue4982)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27291
diff
changeset
|
1452 nm = cl.nodemap |
b64b6fdc5c9b
discovery: properly filter changeset in 'peer.known' (issue4982)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27291
diff
changeset
|
1453 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
|
1454 result = [] |
816209eaf963
phases: make secret changeset undiscoverable in all case
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15888
diff
changeset
|
1455 for n in nodes: |
816209eaf963
phases: make secret changeset undiscoverable in all case
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15888
diff
changeset
|
1456 r = nm.get(n) |
27319
b64b6fdc5c9b
discovery: properly filter changeset in 'peer.known' (issue4982)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27291
diff
changeset
|
1457 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
|
1458 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
|
1459 return result |
13723
e615765fdcc7
wireproto: add known([id]) function
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
13720
diff
changeset
|
1460 |
926 | 1461 def local(self): |
14603
68a43fdd7d80
localrepo: local() returns self
Matt Mackall <mpm@selenic.com>
parents:
14549
diff
changeset
|
1462 return self |
926 | 1463 |
25623
0bee97fa1fa8
publishing: add helper method to localrepo
Matt Mackall <mpm@selenic.com>
parents:
25290
diff
changeset
|
1464 def publishing(self): |
25625
ce9e231265c1
publishing: unconditionally trust publishing flag
Matt Mackall <mpm@selenic.com>
parents:
25624
diff
changeset
|
1465 # 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
|
1466 # so that we don't finalize changes shared between users via ssh or nfs |
33499
0407a51b9d8c
codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents:
33454
diff
changeset
|
1467 return self.ui.configbool('phases', 'publish', untrusted=True) |
25623
0bee97fa1fa8
publishing: add helper method to localrepo
Matt Mackall <mpm@selenic.com>
parents:
25290
diff
changeset
|
1468 |
17192
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
1469 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
|
1470 # 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
|
1471 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
|
1472 return False |
25624
f0745da75056
publishing: use new helper method
Matt Mackall <mpm@selenic.com>
parents:
25623
diff
changeset
|
1473 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
|
1474 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
|
1475 # if publishing we can't copy if there is filtered content |
a959f7167077
clone: do not turn hidden changeset public on publishing clone (issue3935)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
20314
diff
changeset
|
1476 return not self.filtered('visible').changelog.filteredrevs |
17192
1ac628cd7113
peer: introduce real peer classes
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
17183
diff
changeset
|
1477 |
23666
965788d9ae09
localrepo: introduce shared method to check if a repository is shared
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
23648
diff
changeset
|
1478 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
|
1479 '''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
|
1480 if self.sharedpath != self.path: |
965788d9ae09
localrepo: introduce shared method to check if a repository is shared
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
23648
diff
changeset
|
1481 return 'store' |
965788d9ae09
localrepo: introduce shared method to check if a repository is shared
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
23648
diff
changeset
|
1482 return None |
965788d9ae09
localrepo: introduce shared method to check if a repository is shared
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
23648
diff
changeset
|
1483 |
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
|
1484 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
|
1485 return self.vfs.reljoin(self.root, f, *insidef) |
244 | 1486 |
16551
ebf6d38c9063
localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents:
16536
diff
changeset
|
1487 def setparents(self, p1, p2=nullid): |
32350
9742f937c971
localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents:
32332
diff
changeset
|
1488 with self.dirstate.parentchange(): |
9742f937c971
localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents:
32332
diff
changeset
|
1489 copies = self.dirstate.setparents(p1, p2) |
9742f937c971
localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents:
32332
diff
changeset
|
1490 pctx = self[p1] |
9742f937c971
localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents:
32332
diff
changeset
|
1491 if copies: |
9742f937c971
localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents:
32332
diff
changeset
|
1492 # Adjust copy records, the dirstate cannot do it, it |
9742f937c971
localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents:
32332
diff
changeset
|
1493 # requires access to parents manifests. Preserve them |
9742f937c971
localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents:
32332
diff
changeset
|
1494 # only for entries added to first parent. |
9742f937c971
localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents:
32332
diff
changeset
|
1495 for f in copies: |
9742f937c971
localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents:
32332
diff
changeset
|
1496 if f not in pctx and copies[f] in pctx: |
9742f937c971
localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents:
32332
diff
changeset
|
1497 self.dirstate.copy(copies[f], f) |
9742f937c971
localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents:
32332
diff
changeset
|
1498 if p2 == nullid: |
9742f937c971
localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents:
32332
diff
changeset
|
1499 for f, s in sorted(self.dirstate.copies().items()): |
9742f937c971
localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents:
32332
diff
changeset
|
1500 if f not in pctx and s not in pctx: |
9742f937c971
localrepo: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents:
32332
diff
changeset
|
1501 self.dirstate.copy(None, f) |
16551
ebf6d38c9063
localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents:
16536
diff
changeset
|
1502 |
37172
daef13da66fe
context: avoid using a context object as a changeid
Martin von Zweigbergk <martinvonz@google.com>
parents:
37137
diff
changeset
|
1503 def filectx(self, path, changeid=None, fileid=None, changectx=None): |
2564
55e592041076
Add context helper functions to localrepo
Matt Mackall <mpm@selenic.com>
parents:
2491
diff
changeset
|
1504 """changeid can be a changeset revision, node, or tag. |
55e592041076
Add context helper functions to localrepo
Matt Mackall <mpm@selenic.com>
parents:
2491
diff
changeset
|
1505 fileid can be a file revision or node.""" |
37172
daef13da66fe
context: avoid using a context object as a changeid
Martin von Zweigbergk <martinvonz@google.com>
parents:
37137
diff
changeset
|
1506 return context.filectx(self, path, changeid, fileid, |
daef13da66fe
context: avoid using a context object as a changeid
Martin von Zweigbergk <martinvonz@google.com>
parents:
37137
diff
changeset
|
1507 changectx=changectx) |
2564
55e592041076
Add context helper functions to localrepo
Matt Mackall <mpm@selenic.com>
parents:
2491
diff
changeset
|
1508 |
627 | 1509 def getcwd(self): |
870
a82eae840447
Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents:
839
diff
changeset
|
1510 return self.dirstate.getcwd() |
627 | 1511 |
4525
78b6add1f966
Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4516
diff
changeset
|
1512 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
|
1513 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
|
1514 |
11698
9df481f8036d
localrepo: refactor filter computation
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11669
diff
changeset
|
1515 def _loadfilter(self, filter): |
37137
db90a5793103
localrepo: make filterpats private (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37135
diff
changeset
|
1516 if filter not in self._filterpats: |
1258 | 1517 l = [] |
4004
c83c35f2f4e2
unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents:
4003
diff
changeset
|
1518 for pat, cmd in self.ui.configitems(filter): |
7226
b71a52f101dc
Make it possible to disable filtering for a pattern.
Mads Kiilerich <mads@kiilerich.com>
parents:
7208
diff
changeset
|
1519 if cmd == '!': |
b71a52f101dc
Make it possible to disable filtering for a pattern.
Mads Kiilerich <mads@kiilerich.com>
parents:
7208
diff
changeset
|
1520 continue |
10651
5f091fc1bab7
style: use consistent variable names (*mod) with imports which would shadow
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10547
diff
changeset
|
1521 mf = matchmod.match(self.root, '', [pat]) |
5966
11af38a592ae
Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents:
5915
diff
changeset
|
1522 fn = None |
6066
f3a8b5360100
Strip filter name from command before passing to filter function.
Jesse Glick <jesse.glick@sun.com>
parents:
6065
diff
changeset
|
1523 params = cmd |
5966
11af38a592ae
Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents:
5915
diff
changeset
|
1524 for name, filterfn in self._datafilters.iteritems(): |
6210
942287cb1f57
Removed trailing spaces from everything except test output
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6201
diff
changeset
|
1525 if cmd.startswith(name): |
5966
11af38a592ae
Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents:
5915
diff
changeset
|
1526 fn = filterfn |
6066
f3a8b5360100
Strip filter name from command before passing to filter function.
Jesse Glick <jesse.glick@sun.com>
parents:
6065
diff
changeset
|
1527 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
|
1528 break |
11af38a592ae
Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents:
5915
diff
changeset
|
1529 if not fn: |
37120
a8a902d7176e
procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37084
diff
changeset
|
1530 fn = lambda s, c, **kwargs: procutil.filter(s, c) |
5967
f8ad3b76e923
Provide better context for custom Python encode/decode filters.
Jesse Glick <jesse.glick@sun.com>
parents:
5966
diff
changeset
|
1531 # Wrap old filters not supporting keyword arguments |
36178
646002338365
py3: introduce and use pycompat.getargspec
Augie Fackler <augie@google.com>
parents:
36009
diff
changeset
|
1532 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
|
1533 oldfn = fn |
f8ad3b76e923
Provide better context for custom Python encode/decode filters.
Jesse Glick <jesse.glick@sun.com>
parents:
5966
diff
changeset
|
1534 fn = lambda s, c, **kwargs: oldfn(s, c) |
6066
f3a8b5360100
Strip filter name from command before passing to filter function.
Jesse Glick <jesse.glick@sun.com>
parents:
6065
diff
changeset
|
1535 l.append((mf, fn, params)) |
37137
db90a5793103
localrepo: make filterpats private (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37135
diff
changeset
|
1536 self._filterpats[filter] = l |
db90a5793103
localrepo: make filterpats private (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37135
diff
changeset
|
1537 return self._filterpats[filter] |
1258 | 1538 |
12707
2216ab103ea8
localrepo: load filter patterns outside of _filter
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12706
diff
changeset
|
1539 def _filter(self, filterpats, filename, data): |
2216ab103ea8
localrepo: load filter patterns outside of _filter
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12706
diff
changeset
|
1540 for mf, fn, cmd in filterpats: |
1258 | 1541 if mf(filename): |
9467
4c041f1ee1b4
do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents:
9437
diff
changeset
|
1542 self.ui.debug("filtering %s through %s\n" % (filename, cmd)) |
5967
f8ad3b76e923
Provide better context for custom Python encode/decode filters.
Jesse Glick <jesse.glick@sun.com>
parents:
5966
diff
changeset
|
1543 data = fn(data, cmd, ui=self.ui, repo=self, filename=filename) |
1258 | 1544 break |
1545 | |
1546 return data | |
1019
a9cca981c423
Create helper functions for I/O to files in the working directory
mpm@selenic.com
parents:
1013
diff
changeset
|
1547 |
18013
98c867ac1330
clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18009
diff
changeset
|
1548 @unfilteredpropertycache |
12708
8a08b12ae88e
localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12707
diff
changeset
|
1549 def _encodefilterpats(self): |
8a08b12ae88e
localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12707
diff
changeset
|
1550 return self._loadfilter('encode') |
8a08b12ae88e
localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12707
diff
changeset
|
1551 |
18013
98c867ac1330
clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18009
diff
changeset
|
1552 @unfilteredpropertycache |
12708
8a08b12ae88e
localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12707
diff
changeset
|
1553 def _decodefilterpats(self): |
8a08b12ae88e
localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12707
diff
changeset
|
1554 return self._loadfilter('decode') |
8a08b12ae88e
localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12707
diff
changeset
|
1555 |
5966
11af38a592ae
Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents:
5915
diff
changeset
|
1556 def adddatafilter(self, name, filter): |
11af38a592ae
Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents:
5915
diff
changeset
|
1557 self._datafilters[name] = filter |
11af38a592ae
Register data filters in a localrepo instead of util
Patrick Mezard <pmezard@gmail.com>
parents:
5915
diff
changeset
|
1558 |
4004
c83c35f2f4e2
unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents:
4003
diff
changeset
|
1559 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
|
1560 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
|
1561 data = self.wvfs.readlink(filename) |
4004
c83c35f2f4e2
unify encode/decode filter routines
Matt Mackall <mpm@selenic.com>
parents:
4003
diff
changeset
|
1562 else: |
23854
f6070d3a9cb8
localrepo: remove all internal uses of localrepo.wopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
23853
diff
changeset
|
1563 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
|
1564 return self._filter(self._encodefilterpats, filename, data) |
1258 | 1565 |
35725
2a7e777c9eed
write: add the possibility to pass keyword argument from batchget to vfs
Boris Feld <boris.feld@octobus.net>
parents:
35708
diff
changeset
|
1566 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
|
1567 """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
|
1568 |
21b33f0460e0
revert: apply normallookup on reverted file if size isn't changed (issue4583)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24825
diff
changeset
|
1569 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
|
1570 """ |
12708
8a08b12ae88e
localrepo: use propertycaches to access encode/decode filters
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12707
diff
changeset
|
1571 data = self._filter(self._decodefilterpats, filename, data) |
6877
1d38f3605b20
util: set_flags shouldn't know about repo flag formats
Matt Mackall <mpm@selenic.com>
parents:
6875
diff
changeset
|
1572 if 'l' in flags: |
23854
f6070d3a9cb8
localrepo: remove all internal uses of localrepo.wopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
23853
diff
changeset
|
1573 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
|
1574 else: |
35725
2a7e777c9eed
write: add the possibility to pass keyword argument from batchget to vfs
Boris Feld <boris.feld@octobus.net>
parents:
35708
diff
changeset
|
1575 self.wvfs.write(filename, data, backgroundclose=backgroundclose, |
2a7e777c9eed
write: add the possibility to pass keyword argument from batchget to vfs
Boris Feld <boris.feld@octobus.net>
parents:
35708
diff
changeset
|
1576 **kwargs) |
6877
1d38f3605b20
util: set_flags shouldn't know about repo flag formats
Matt Mackall <mpm@selenic.com>
parents:
6875
diff
changeset
|
1577 if 'x' in flags: |
18951
d13916a00b7e
localrepo: use "vfs.setflags()" instead of "util.setflags()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
18950
diff
changeset
|
1578 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
|
1579 else: |
45b678bf3a78
atomicupdate: add an experimental option to use atomictemp when updating
Boris Feld <boris.feld@octobus.net>
parents:
35725
diff
changeset
|
1580 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
|
1581 return len(data) |
1258 | 1582 |
4005
656e06eebda7
replace filehandle version of wwrite with wwritedata
Matt Mackall <mpm@selenic.com>
parents:
4004
diff
changeset
|
1583 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
|
1584 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
|
1585 |
23379
86c6f06feb04
localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
1586 def currenttransaction(self): |
86c6f06feb04
localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
1587 """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
|
1588 if self._transref: |
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
24284
diff
changeset
|
1589 tr = self._transref() |
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
24284
diff
changeset
|
1590 else: |
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
24284
diff
changeset
|
1591 tr = None |
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
24284
diff
changeset
|
1592 |
8072
ecf7795479d5
transaction: support multiple, separate transactions
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
7948
diff
changeset
|
1593 if tr and tr.running(): |
23379
86c6f06feb04
localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
1594 return tr |
86c6f06feb04
localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
1595 return None |
86c6f06feb04
localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
1596 |
86c6f06feb04
localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
1597 def transaction(self, desc, report=None): |
25290
8f88f768e24c
devel: rename 'all' to 'all-warnings' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25274
diff
changeset
|
1598 if (self.ui.configbool('devel', 'all-warnings') |
24388
026f8af88e49
devel: also warn about transaction started without a lock
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24386
diff
changeset
|
1599 or self.ui.configbool('devel', 'check-locks')): |
29705
41689e293994
develwarn: use the lock helper in local repo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29417
diff
changeset
|
1600 if self._currentlock(self._lockref) is None: |
30574 | 1601 raise error.ProgrammingError('transaction requires locking') |
23379
86c6f06feb04
localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
1602 tr = self.currenttransaction() |
86c6f06feb04
localrepo: add a currenttransaction method
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23311
diff
changeset
|
1603 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
|
1604 return tr.nest(name=desc) |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
1605 |
5865
e7127f669edb
transactions: don't show a backtrace when journal exists
Matt Mackall <mpm@selenic.com>
parents:
5814
diff
changeset
|
1606 # abort here if the journal already exists |
18947
9b82f93e3a7a
localrepo: use "vfs.exists()" instead of "os.path.exists()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
18946
diff
changeset
|
1607 if self.svfs.exists("journal"): |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
1608 raise error.RepoError( |
21274
3b4c75690206
journal: set Abort hint when failing due to an abandoned transaction
Johan Bjork <jbjoerk@gmail.com>
parents:
21237
diff
changeset
|
1609 _("abandoned transaction found"), |
3b4c75690206
journal: set Abort hint when failing due to an abandoned transaction
Johan Bjork <jbjoerk@gmail.com>
parents:
21237
diff
changeset
|
1610 hint=_("run 'hg recover' to clean up transaction")) |
5865
e7127f669edb
transactions: don't show a backtrace when journal exists
Matt Mackall <mpm@selenic.com>
parents:
5814
diff
changeset
|
1611 |
25267
69c5cab0b893
transaction: separate calculating TXNID from creating transaction object
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
25219
diff
changeset
|
1612 idbase = "%.40f#%f" % (random.random(), time.time()) |
31523
f42ec07db6a9
localrepo: use node.hex instead of awkward .encode('latin1')
Augie Fackler <augie@google.com>
parents:
31510
diff
changeset
|
1613 ha = hex(hashlib.sha1(idbase).digest()) |
31508
590319c07259
localrepo: ensure transaction id is fully bytes on py3
Augie Fackler <augie@google.com>
parents:
31476
diff
changeset
|
1614 txnid = 'TXN:' + ha |
25268
a973b050621d
localrepo: pass hook argument txnid to pretxnopen hooks
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
25267
diff
changeset
|
1615 self.hook('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
|
1616 |
16236
97efd26eb957
localrepo: refactor retrieving of journal/undo files paths
Idan Kamara <idankk86@gmail.com>
parents:
16208
diff
changeset
|
1617 self._writejournal(desc) |
18952
8086b530e2ac
localrepo: use "vfs.rename()" instead of "util.rename()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
18951
diff
changeset
|
1618 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
|
1619 if report: |
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
24284
diff
changeset
|
1620 rp = report |
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
24284
diff
changeset
|
1621 else: |
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
24284
diff
changeset
|
1622 rp = self.ui.warn |
23852
99e125626352
localrepo: remove all internal uses of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
23775
diff
changeset
|
1623 vfsmap = {'plain': self.vfs} # 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
|
1624 # 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
|
1625 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
|
1626 # 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
|
1627 # |
b36318e6d2ef
track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31819
diff
changeset
|
1628 # 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
|
1629 # 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
|
1630 # 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
|
1631 # 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
|
1632 # 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
|
1633 # 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
|
1634 # |
b36318e6d2ef
track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31819
diff
changeset
|
1635 # 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
|
1636 # 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
|
1637 # 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
|
1638 # 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
|
1639 # 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
|
1640 # |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
1641 # 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
|
1642 # 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
|
1643 # |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
1644 # 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
|
1645 # 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
|
1646 # 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
|
1647 # ``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
|
1648 # 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
|
1649 # 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
|
1650 # 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
|
1651 # |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
1652 # <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
|
1653 # |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
1654 # 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
|
1655 # "-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
|
1656 # "+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
|
1657 # "-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
|
1658 # "+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
|
1659 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
|
1660 # experimental config: experimental.hook-track-tags |
33499
0407a51b9d8c
codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents:
33454
diff
changeset
|
1661 shouldtracktags = self.ui.configbool('experimental', 'hook-track-tags') |
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
|
1662 if desc != 'strip' and shouldtracktags: |
b36318e6d2ef
track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31819
diff
changeset
|
1663 oldheads = self.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
|
1664 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
|
1665 repo = reporef() |
b36318e6d2ef
track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31819
diff
changeset
|
1666 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
|
1667 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
|
1668 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
|
1669 # 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
|
1670 # 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
|
1671 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
|
1672 if changes: |
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
|
1673 tr2.hookargs['tag_moved'] = '1' |
31996
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
1674 with repo.vfs('changes/tags.changes', 'w', |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
1675 atomictemp=True) as changesfile: |
e6e1884df298
track-tags: write all tag changes to a file
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31995
diff
changeset
|
1676 # 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
|
1677 # 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
|
1678 # 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
|
1679 tagsmod.writediff(changesfile, changes) |
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
|
1680 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
|
1681 """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
|
1682 # 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
|
1683 # 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
|
1684 # |
b36318e6d2ef
track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31819
diff
changeset
|
1685 # 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
|
1686 # 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
|
1687 # 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
|
1688 # |
b36318e6d2ef
track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31819
diff
changeset
|
1689 # 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
|
1690 # 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
|
1691 # 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
|
1692 # |
b36318e6d2ef
track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31819
diff
changeset
|
1693 # 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
|
1694 # 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
|
1695 # |
b36318e6d2ef
track-tags: introduce first bits of tags tracking during transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31819
diff
changeset
|
1696 # 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
|
1697 # 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
|
1698 tracktags(tr2) |
34709
c212947273a7
bookmark: add a dedicated pretxnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents:
34708
diff
changeset
|
1699 repo = reporef() |
35185
66ecde8a704d
server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents:
35163
diff
changeset
|
1700 if repo.ui.configbool('experimental', 'single-head-per-branch'): |
66ecde8a704d
server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents:
35163
diff
changeset
|
1701 scmutil.enforcesinglehead(repo, tr2, desc) |
34709
c212947273a7
bookmark: add a dedicated pretxnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents:
34708
diff
changeset
|
1702 if hook.hashook(repo.ui, 'pretxnclose-bookmark'): |
c212947273a7
bookmark: add a dedicated pretxnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents:
34708
diff
changeset
|
1703 for name, (old, new) in sorted(tr.changes['bookmarks'].items()): |
c212947273a7
bookmark: add a dedicated pretxnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents:
34708
diff
changeset
|
1704 args = tr.hookargs.copy() |
c212947273a7
bookmark: add a dedicated pretxnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents:
34708
diff
changeset
|
1705 args.update(bookmarks.preparehookargs(name, old, new)) |
c212947273a7
bookmark: add a dedicated pretxnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents:
34708
diff
changeset
|
1706 repo.hook('pretxnclose-bookmark', throw=True, |
c212947273a7
bookmark: add a dedicated pretxnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents:
34708
diff
changeset
|
1707 txnname=desc, |
c212947273a7
bookmark: add a dedicated pretxnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents:
34708
diff
changeset
|
1708 **pycompat.strkwargs(args)) |
34711
f6d17075608f
phase: add a dedicated pretxnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents:
34710
diff
changeset
|
1709 if hook.hashook(repo.ui, 'pretxnclose-phase'): |
f6d17075608f
phase: add a dedicated pretxnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents:
34710
diff
changeset
|
1710 cl = repo.unfiltered().changelog |
f6d17075608f
phase: add a dedicated pretxnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents:
34710
diff
changeset
|
1711 for rev, (old, new) in tr.changes['phases'].items(): |
f6d17075608f
phase: add a dedicated pretxnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents:
34710
diff
changeset
|
1712 args = tr.hookargs.copy() |
f6d17075608f
phase: add a dedicated pretxnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents:
34710
diff
changeset
|
1713 node = hex(cl.node(rev)) |
f6d17075608f
phase: add a dedicated pretxnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents:
34710
diff
changeset
|
1714 args.update(phases.preparehookargs(node, old, new)) |
f6d17075608f
phase: add a dedicated pretxnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents:
34710
diff
changeset
|
1715 repo.hook('pretxnclose-phase', throw=True, txnname=desc, |
f6d17075608f
phase: add a dedicated pretxnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents:
34710
diff
changeset
|
1716 **pycompat.strkwargs(args)) |
34709
c212947273a7
bookmark: add a dedicated pretxnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents:
34708
diff
changeset
|
1717 |
c212947273a7
bookmark: add a dedicated pretxnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents:
34708
diff
changeset
|
1718 repo.hook('pretxnclose', throw=True, |
c212947273a7
bookmark: add a dedicated pretxnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents:
34708
diff
changeset
|
1719 txnname=desc, **pycompat.strkwargs(tr.hookargs)) |
26577
8f2ff40fe9c9
localrepo: execute appropriate actions for dirstate at releasing transaction
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
26499
diff
changeset
|
1720 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
|
1721 repo = reporef() |
8f2ff40fe9c9
localrepo: execute appropriate actions for dirstate at releasing transaction
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
26499
diff
changeset
|
1722 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
|
1723 # 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
|
1724 # 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
|
1725 # 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
|
1726 # 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
|
1727 # 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
|
1728 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
|
1729 else: |
8f2ff40fe9c9
localrepo: execute appropriate actions for dirstate at releasing transaction
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
26499
diff
changeset
|
1730 # 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
|
1731 # out) in this transaction |
38869
ad24b581e4d9
narrow: call narrowspec.{save,restore,clear}backup directly
Martin von Zweigbergk <martinvonz@google.com>
parents:
38841
diff
changeset
|
1732 narrowspec.restorebackup(self, 'journal.narrowspec') |
33440
ec306bc6915b
dirstate: update backup functions to take full backup filename
Adam Simpkins <simpkins@fb.com>
parents:
33437
diff
changeset
|
1733 repo.dirstate.restorebackup(None, '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
|
1734 |
26831
0a7610758c42
localrepo: discard objects in _filecache at transaction failure (issue4876)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
26781
diff
changeset
|
1735 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
|
1736 |
25667
a69bb29b9638
localrepo: kill off sopener (API)
Siddharth Agarwal <sid0@fb.com>
parents:
25660
diff
changeset
|
1737 tr = transaction.transaction(rp, self.svfs, vfsmap, |
20087
cf3b8285af00
transaction: take journal file path relative to vfs to use file API via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20082
diff
changeset
|
1738 "journal", |
23903
426607be9c69
transaction: pass the name of the "undo" journal to the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23902
diff
changeset
|
1739 "undo", |
14266
89e7d35e0ef0
fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents:
13957
diff
changeset
|
1740 aftertrans(renames), |
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
|
1741 self.store.createmode, |
26577
8f2ff40fe9c9
localrepo: execute appropriate actions for dirstate at releasing transaction
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
26499
diff
changeset
|
1742 validator=validate, |
33278
87bca10a06ed
transaction: avoid file stat ambiguity only for files in blacklist
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33277
diff
changeset
|
1743 releasefn=releasefn, |
36819
aff5996f3043
transaction: add a name and a __repr__ implementation (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
36554
diff
changeset
|
1744 checkambigfiles=_cachedfiles, |
aff5996f3043
transaction: add a name and a __repr__ implementation (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
36554
diff
changeset
|
1745 name=desc) |
39301
5763216ba311
transaction: remember original len(repo) instead of tracking added revs (API)
Yuya Nishihara <yuya@tcha.org>
parents:
39298
diff
changeset
|
1746 tr.changes['origrepolen'] = len(self) |
33251
a5cb2e4460de
transaction: track new obsmarkers in the 'changes' mapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33247
diff
changeset
|
1747 tr.changes['obsmarkers'] = set() |
33451
e44d54260c32
phases: track phase movements in 'advanceboundary'
Boris Feld <boris.feld@octobus.net>
parents:
33440
diff
changeset
|
1748 tr.changes['phases'] = {} |
33516
f9e6e43c7987
bookmark: track bookmark changes at the transaction level
Boris Feld <boris.feld@octobus.net>
parents:
33499
diff
changeset
|
1749 tr.changes['bookmarks'] = {} |
24740
d283517b260b
transaction: introduce a transaction ID, to be available to all hooks
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24739
diff
changeset
|
1750 |
25267
69c5cab0b893
transaction: separate calculating TXNID from creating transaction object
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
25219
diff
changeset
|
1751 tr.hookargs['txnid'] = txnid |
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
|
1752 # 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
|
1753 # 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
|
1754 # this is not expected to break anything that happen during the hooks. |
acc73273b27e
fncache: document the fact fncache is outdate at hook run time
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23510
diff
changeset
|
1755 tr.addfinalize('flush-fncache', self.store.write) |
24282
db8679812f84
hook: add a generic hook after transaction has been closed
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24281
diff
changeset
|
1756 def txnclosehook(tr2): |
db8679812f84
hook: add a generic hook after transaction has been closed
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24281
diff
changeset
|
1757 """To be run if transaction is successful, will schedule a hook run |
db8679812f84
hook: add a generic hook after transaction has been closed
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24281
diff
changeset
|
1758 """ |
27907
e219dbfd0342
localrepo: don't reference transaction from hook closure (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27846
diff
changeset
|
1759 # 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
|
1760 # 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
|
1761 # 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
|
1762 # fixes the function accumulation. |
e219dbfd0342
localrepo: don't reference transaction from hook closure (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27846
diff
changeset
|
1763 hookargs = tr2.hookargs |
e219dbfd0342
localrepo: don't reference transaction from hook closure (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27846
diff
changeset
|
1764 |
34708
ee5f0d047b41
bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents:
34520
diff
changeset
|
1765 def hookfunc(): |
ee5f0d047b41
bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents:
34520
diff
changeset
|
1766 repo = reporef() |
ee5f0d047b41
bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents:
34520
diff
changeset
|
1767 if hook.hashook(repo.ui, 'txnclose-bookmark'): |
ee5f0d047b41
bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents:
34520
diff
changeset
|
1768 bmchanges = sorted(tr.changes['bookmarks'].items()) |
ee5f0d047b41
bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents:
34520
diff
changeset
|
1769 for name, (old, new) in bmchanges: |
ee5f0d047b41
bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents:
34520
diff
changeset
|
1770 args = tr.hookargs.copy() |
ee5f0d047b41
bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents:
34520
diff
changeset
|
1771 args.update(bookmarks.preparehookargs(name, old, new)) |
ee5f0d047b41
bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents:
34520
diff
changeset
|
1772 repo.hook('txnclose-bookmark', throw=False, |
ee5f0d047b41
bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents:
34520
diff
changeset
|
1773 txnname=desc, **pycompat.strkwargs(args)) |
ee5f0d047b41
bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents:
34520
diff
changeset
|
1774 |
34710
cdf833d7de98
phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents:
34709
diff
changeset
|
1775 if hook.hashook(repo.ui, 'txnclose-phase'): |
cdf833d7de98
phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents:
34709
diff
changeset
|
1776 cl = repo.unfiltered().changelog |
cdf833d7de98
phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents:
34709
diff
changeset
|
1777 phasemv = sorted(tr.changes['phases'].items()) |
cdf833d7de98
phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents:
34709
diff
changeset
|
1778 for rev, (old, new) in phasemv: |
cdf833d7de98
phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents:
34709
diff
changeset
|
1779 args = tr.hookargs.copy() |
cdf833d7de98
phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents:
34709
diff
changeset
|
1780 node = hex(cl.node(rev)) |
cdf833d7de98
phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents:
34709
diff
changeset
|
1781 args.update(phases.preparehookargs(node, old, new)) |
cdf833d7de98
phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents:
34709
diff
changeset
|
1782 repo.hook('txnclose-phase', throw=False, txnname=desc, |
cdf833d7de98
phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents:
34709
diff
changeset
|
1783 **pycompat.strkwargs(args)) |
cdf833d7de98
phase: add a dedicated txnclose-phase hook
Boris Feld <boris.feld@octobus.net>
parents:
34709
diff
changeset
|
1784 |
34708
ee5f0d047b41
bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents:
34520
diff
changeset
|
1785 repo.hook('txnclose', throw=False, txnname=desc, |
ee5f0d047b41
bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents:
34520
diff
changeset
|
1786 **pycompat.strkwargs(hookargs)) |
ee5f0d047b41
bookmark: add a dedicated txnclose-bookmark hook
Boris Feld <boris.feld@octobus.net>
parents:
34520
diff
changeset
|
1787 reporef()._afterlock(hookfunc) |
24282
db8679812f84
hook: add a generic hook after transaction has been closed
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24281
diff
changeset
|
1788 tr.addfinalize('txnclose-hook', txnclosehook) |
35749
3a3b59bbe7ce
localrepo: run cache-warming transaction callback before report callback
Martin von Zweigbergk <martinvonz@google.com>
parents:
35736
diff
changeset
|
1789 # 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
|
1790 # 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
|
1791 # 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
|
1792 # callbacks run. |
3a3b59bbe7ce
localrepo: run cache-warming transaction callback before report callback
Martin von Zweigbergk <martinvonz@google.com>
parents:
35736
diff
changeset
|
1793 tr.addpostclose('-warm-cache', self._buildcacheupdater(tr)) |
24792
7d0421de8de3
hooks: add a 'txnabort' hook
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24784
diff
changeset
|
1794 def txnaborthook(tr2): |
7d0421de8de3
hooks: add a 'txnabort' hook
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24784
diff
changeset
|
1795 """To be run if transaction is aborted |
7d0421de8de3
hooks: add a 'txnabort' hook
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24784
diff
changeset
|
1796 """ |
7d0421de8de3
hooks: add a 'txnabort' hook
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24784
diff
changeset
|
1797 reporef().hook('txnabort', throw=False, txnname=desc, |
35840
b43b314cc46a
localrepo: pass transaction kwargs as strings, not bytes
Augie Fackler <augie@google.com>
parents:
35839
diff
changeset
|
1798 **pycompat.strkwargs(tr2.hookargs)) |
24792
7d0421de8de3
hooks: add a 'txnabort' hook
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24784
diff
changeset
|
1799 tr.addabort('txnabort-hook', txnaborthook) |
26251
5c0f5db65c6b
localrepo: refresh filecache stats only if transaction finished successfully
Yuya Nishihara <yuya@tcha.org>
parents:
26250
diff
changeset
|
1800 # 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
|
1801 # to stored data if transaction has no error. |
5c0f5db65c6b
localrepo: refresh filecache stats only if transaction finished successfully
Yuya Nishihara <yuya@tcha.org>
parents:
26250
diff
changeset
|
1802 tr.addpostclose('refresh-filecachestats', self._refreshfilecachestats) |
14266
89e7d35e0ef0
fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents:
13957
diff
changeset
|
1803 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
|
1804 scmutil.registersummarycallback(self, tr, desc) |
14266
89e7d35e0ef0
fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents:
13957
diff
changeset
|
1805 return tr |
89e7d35e0ef0
fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents:
13957
diff
changeset
|
1806 |
16236
97efd26eb957
localrepo: refactor retrieving of journal/undo files paths
Idan Kamara <idankk86@gmail.com>
parents:
16208
diff
changeset
|
1807 def _journalfiles(self): |
18952
8086b530e2ac
localrepo: use "vfs.rename()" instead of "util.rename()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
18951
diff
changeset
|
1808 return ((self.svfs, 'journal'), |
8086b530e2ac
localrepo: use "vfs.rename()" instead of "util.rename()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
18951
diff
changeset
|
1809 (self.vfs, 'journal.dirstate'), |
8086b530e2ac
localrepo: use "vfs.rename()" instead of "util.rename()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
18951
diff
changeset
|
1810 (self.vfs, 'journal.branch'), |
8086b530e2ac
localrepo: use "vfs.rename()" instead of "util.rename()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
18951
diff
changeset
|
1811 (self.vfs, 'journal.desc'), |
8086b530e2ac
localrepo: use "vfs.rename()" instead of "util.rename()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
18951
diff
changeset
|
1812 (self.vfs, 'journal.bookmarks'), |
8086b530e2ac
localrepo: use "vfs.rename()" instead of "util.rename()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
18951
diff
changeset
|
1813 (self.svfs, 'journal.phaseroots')) |
16236
97efd26eb957
localrepo: refactor retrieving of journal/undo files paths
Idan Kamara <idankk86@gmail.com>
parents:
16208
diff
changeset
|
1814 |
97efd26eb957
localrepo: refactor retrieving of journal/undo files paths
Idan Kamara <idankk86@gmail.com>
parents:
16208
diff
changeset
|
1815 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
|
1816 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
|
1817 |
32452
b647b923486f
transaction: run _writejournal unfiltered
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32381
diff
changeset
|
1818 @unfilteredmethod |
14266
89e7d35e0ef0
fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents:
13957
diff
changeset
|
1819 def _writejournal(self, desc): |
33440
ec306bc6915b
dirstate: update backup functions to take full backup filename
Adam Simpkins <simpkins@fb.com>
parents:
33437
diff
changeset
|
1820 self.dirstate.savebackup(None, 'journal.dirstate') |
38869
ad24b581e4d9
narrow: call narrowspec.{save,restore,clear}backup directly
Martin von Zweigbergk <martinvonz@google.com>
parents:
38841
diff
changeset
|
1821 narrowspec.savebackup(self, 'journal.narrowspec') |
23852
99e125626352
localrepo: remove all internal uses of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
23775
diff
changeset
|
1822 self.vfs.write("journal.branch", |
14168
135e244776f0
prevent transient leaks of file handle by using new helper functions
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
14162
diff
changeset
|
1823 encoding.fromlocal(self.dirstate.branch())) |
23852
99e125626352
localrepo: remove all internal uses of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
23775
diff
changeset
|
1824 self.vfs.write("journal.desc", |
14168
135e244776f0
prevent transient leaks of file handle by using new helper functions
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
14162
diff
changeset
|
1825 "%d\n%s\n" % (len(self), desc)) |
23852
99e125626352
localrepo: remove all internal uses of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
23775
diff
changeset
|
1826 self.vfs.write("journal.bookmarks", |
99e125626352
localrepo: remove all internal uses of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
23775
diff
changeset
|
1827 self.vfs.tryread("bookmarks")) |
23853
0cc663e44258
localrepo: remove all internal uses of localrepo.sopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
23852
diff
changeset
|
1828 self.svfs.write("journal.phaseroots", |
0cc663e44258
localrepo: remove all internal uses of localrepo.sopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
23852
diff
changeset
|
1829 self.svfs.tryread("phaseroots")) |
14266
89e7d35e0ef0
fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents:
13957
diff
changeset
|
1830 |
210 | 1831 def recover(self): |
27846
63821023ea79
with: use context manager in localrepo recover
Bryan O'Sullivan <bryano@fb.com>
parents:
27698
diff
changeset
|
1832 with self.lock(): |
18947
9b82f93e3a7a
localrepo: use "vfs.exists()" instead of "os.path.exists()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
18946
diff
changeset
|
1833 if self.svfs.exists("journal"): |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4914
diff
changeset
|
1834 self.ui.status(_("rolling back interrupted transaction\n")) |
23853
0cc663e44258
localrepo: remove all internal uses of localrepo.sopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
23852
diff
changeset
|
1835 vfsmap = {'': self.svfs, |
23852
99e125626352
localrepo: remove all internal uses of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
23775
diff
changeset
|
1836 'plain': self.vfs,} |
23853
0cc663e44258
localrepo: remove all internal uses of localrepo.sopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
23852
diff
changeset
|
1837 transaction.rollback(self.svfs, vfsmap, "journal", |
33278
87bca10a06ed
transaction: avoid file stat ambiguity only for files in blacklist
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33277
diff
changeset
|
1838 self.ui.warn, |
87bca10a06ed
transaction: avoid file stat ambiguity only for files in blacklist
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33277
diff
changeset
|
1839 checkambigfiles=_cachedfiles) |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4914
diff
changeset
|
1840 self.invalidate() |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4914
diff
changeset
|
1841 return True |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4914
diff
changeset
|
1842 else: |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4914
diff
changeset
|
1843 self.ui.warn(_("no interrupted transaction available\n")) |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4914
diff
changeset
|
1844 return False |
210 | 1845 |
15183
59e8bc22506e
rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents:
15131
diff
changeset
|
1846 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
|
1847 wlock = lock = dsguard = None |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4914
diff
changeset
|
1848 try: |
1712
21dcf38e5d7d
Allow callers to pass in the dirstate lock in most localrepo.py funcs.
mason@suse.com
parents:
1709
diff
changeset
|
1849 wlock = self.wlock() |
4438
3900f684a150
Fix hg import --exact bug that hangs hg on failure.
Eric Hopper <hopper@omnifarious.org>
parents:
4417
diff
changeset
|
1850 lock = self.lock() |
18947
9b82f93e3a7a
localrepo: use "vfs.exists()" instead of "os.path.exists()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
18946
diff
changeset
|
1851 if self.svfs.exists("undo"): |
30492
77cd647b04ac
localrepo: refer to dirstateguard by its new name
Augie Fackler <augie@google.com>
parents:
30377
diff
changeset
|
1852 dsguard = dirstateguard.dirstateguard(self, '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
|
1853 |
e077ce385609
localrepo: restore dirstate to one before rollbacking if not parent-gone
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
26587
diff
changeset
|
1854 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
|
1855 else: |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4914
diff
changeset
|
1856 self.ui.warn(_("no rollback information available\n")) |
11177
6a64813276ed
commands: initial audit of exit codes
Matt Mackall <mpm@selenic.com>
parents:
11174
diff
changeset
|
1857 return 1 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4914
diff
changeset
|
1858 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
|
1859 release(dsguard, lock, wlock) |
162 | 1860 |
18016
2a393df0f5cc
clfilter: rename `unfilteredmeth` to `unfilteredmethod`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18014
diff
changeset
|
1861 @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
|
1862 def _rollback(self, dryrun, force, dsguard): |
15130
3d44e68360a6
rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents:
15101
diff
changeset
|
1863 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
|
1864 try: |
23852
99e125626352
localrepo: remove all internal uses of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
23775
diff
changeset
|
1865 args = self.vfs.read('undo.desc').splitlines() |
15130
3d44e68360a6
rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents:
15101
diff
changeset
|
1866 (oldlen, desc, detail) = (int(args[0]), args[1], None) |
3d44e68360a6
rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents:
15101
diff
changeset
|
1867 if len(args) >= 3: |
3d44e68360a6
rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents:
15101
diff
changeset
|
1868 detail = args[2] |
3d44e68360a6
rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents:
15101
diff
changeset
|
1869 oldtip = oldlen - 1 |
3d44e68360a6
rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents:
15101
diff
changeset
|
1870 |
3d44e68360a6
rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents:
15101
diff
changeset
|
1871 if detail and ui.verbose: |
32895
05c213cd8ab8
py3: use '%d' instead of '%s' for integers
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32871
diff
changeset
|
1872 msg = (_('repository tip rolled back to revision %d' |
15130
3d44e68360a6
rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents:
15101
diff
changeset
|
1873 ' (undo %s: %s)\n') |
3d44e68360a6
rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents:
15101
diff
changeset
|
1874 % (oldtip, desc, detail)) |
3d44e68360a6
rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents:
15101
diff
changeset
|
1875 else: |
32895
05c213cd8ab8
py3: use '%d' instead of '%s' for integers
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32871
diff
changeset
|
1876 msg = (_('repository tip rolled back to revision %d' |
15130
3d44e68360a6
rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents:
15101
diff
changeset
|
1877 ' (undo %s)\n') |
3d44e68360a6
rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents:
15101
diff
changeset
|
1878 % (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
|
1879 except IOError: |
15130
3d44e68360a6
rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents:
15101
diff
changeset
|
1880 msg = _('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
|
1881 desc = None |
59e8bc22506e
rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents:
15131
diff
changeset
|
1882 |
59e8bc22506e
rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents:
15131
diff
changeset
|
1883 if not force and self['.'] != self['tip'] and desc == 'commit': |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26577
diff
changeset
|
1884 raise error.Abort( |
15183
59e8bc22506e
rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents:
15131
diff
changeset
|
1885 _('rollback of last commit while not checked out ' |
15187
0292f88d3b86
rollback: use a hint for force
Matt Mackall <mpm@selenic.com>
parents:
15183
diff
changeset
|
1886 'may lose data'), hint=_('use -f to force')) |
15183
59e8bc22506e
rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents:
15131
diff
changeset
|
1887 |
15130
3d44e68360a6
rollback: refactor for readability; cosmetics.
Greg Ward <greg@gerg.ca>
parents:
15101
diff
changeset
|
1888 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
|
1889 if dryrun: |
cda7a87c1871
rollback: improve readability; clarify that the return value is an int.
Greg Ward <greg-hg@gerg.ca>
parents:
15057
diff
changeset
|
1890 return 0 |
15131
7c26ce9edbd2
rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents:
15130
diff
changeset
|
1891 |
7c26ce9edbd2
rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents:
15130
diff
changeset
|
1892 parents = self.dirstate.parents() |
18310
4499ba5ac35c
localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents:
18309
diff
changeset
|
1893 self.destroying() |
23902
bfa52f4ecf54
rollback: have an empty entry for the vfsmap in rollback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23854
diff
changeset
|
1894 vfsmap = {'plain': self.vfs, '': self.svfs} |
33278
87bca10a06ed
transaction: avoid file stat ambiguity only for files in blacklist
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33277
diff
changeset
|
1895 transaction.rollback(self.svfs, vfsmap, 'undo', ui.warn, |
87bca10a06ed
transaction: avoid file stat ambiguity only for files in blacklist
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33277
diff
changeset
|
1896 checkambigfiles=_cachedfiles) |
18947
9b82f93e3a7a
localrepo: use "vfs.exists()" instead of "os.path.exists()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
18946
diff
changeset
|
1897 if self.vfs.exists('undo.bookmarks'): |
29352
37c7f9fb7040
localrepo: make restoring from backup at rollback avoid ambiguity of file stat
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29341
diff
changeset
|
1898 self.vfs.rename('undo.bookmarks', 'bookmarks', checkambig=True) |
18947
9b82f93e3a7a
localrepo: use "vfs.exists()" instead of "os.path.exists()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
18946
diff
changeset
|
1899 if self.svfs.exists('undo.phaseroots'): |
29352
37c7f9fb7040
localrepo: make restoring from backup at rollback avoid ambiguity of file stat
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29341
diff
changeset
|
1900 self.svfs.rename('undo.phaseroots', '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
|
1901 self.invalidate() |
15131
7c26ce9edbd2
rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents:
15130
diff
changeset
|
1902 |
7c26ce9edbd2
rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents:
15130
diff
changeset
|
1903 parentgone = (parents[0] not in self.changelog.nodemap or |
7c26ce9edbd2
rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents:
15130
diff
changeset
|
1904 parents[1] not in self.changelog.nodemap) |
7c26ce9edbd2
rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents:
15130
diff
changeset
|
1905 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
|
1906 # 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
|
1907 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
|
1908 |
38869
ad24b581e4d9
narrow: call narrowspec.{save,restore,clear}backup directly
Martin von Zweigbergk <martinvonz@google.com>
parents:
38841
diff
changeset
|
1909 narrowspec.restorebackup(self, 'undo.narrowspec') |
33440
ec306bc6915b
dirstate: update backup functions to take full backup filename
Adam Simpkins <simpkins@fb.com>
parents:
33437
diff
changeset
|
1910 self.dirstate.restorebackup(None, 'undo.dirstate') |
15131
7c26ce9edbd2
rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents:
15130
diff
changeset
|
1911 try: |
23852
99e125626352
localrepo: remove all internal uses of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
23775
diff
changeset
|
1912 branch = self.vfs.read('undo.branch') |
17360
935831597e16
rollback: write dirstate branch with correct encoding
Sune Foldager <cryo@cyanite.org>
parents:
17324
diff
changeset
|
1913 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
|
1914 except IOError: |
7c26ce9edbd2
rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents:
15130
diff
changeset
|
1915 ui.warn(_('named branch could not be reset: ' |
7c26ce9edbd2
rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents:
15130
diff
changeset
|
1916 'current branch is still \'%s\'\n') |
7c26ce9edbd2
rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents:
15130
diff
changeset
|
1917 % self.dirstate.branch()) |
7c26ce9edbd2
rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents:
15130
diff
changeset
|
1918 |
27167
3fe8cb40c9c5
commands: inline definition of localrepo.parents() and drop the method (API)
Augie Fackler <augie@google.com>
parents:
27166
diff
changeset
|
1919 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
|
1920 if len(parents) > 1: |
7c26ce9edbd2
rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents:
15130
diff
changeset
|
1921 ui.status(_('working directory now based on ' |
7c26ce9edbd2
rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents:
15130
diff
changeset
|
1922 'revisions %d and %d\n') % parents) |
7c26ce9edbd2
rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents:
15130
diff
changeset
|
1923 else: |
7c26ce9edbd2
rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents:
15130
diff
changeset
|
1924 ui.status(_('working directory now based on ' |
7c26ce9edbd2
rollback: only restore dirstate and branch when appropriate.
Greg Ward <greg@gerg.ca>
parents:
15130
diff
changeset
|
1925 'revision %d\n') % parents) |
26989
a65ea44f163e
localrepo: switch to mergestate.clean()
Siddharth Agarwal <sid0@fb.com>
parents:
26907
diff
changeset
|
1926 mergemod.mergestate.clean(self, self['.'].node()) |
24784
59406b8b1303
rollback: clear resolve state (issue4593)
Matt Mackall <mpm@selenic.com>
parents:
24750
diff
changeset
|
1927 |
17013
c8eda7bbdcab
strip: incrementally update the branchheads cache after a strip
Joshua Redstone <joshua.redstone@fb.com>
parents:
17012
diff
changeset
|
1928 # 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
|
1929 # 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
|
1930 # invalidated. |
15604
b8d8599410da
rollback: always call destroyed() (regression from 1.9)
Greg Ward <greg-hg@gerg.ca>
parents:
15381
diff
changeset
|
1931 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
|
1932 return 0 |
cda7a87c1871
rollback: improve readability; clarify that the return value is an int.
Greg Ward <greg-hg@gerg.ca>
parents:
15057
diff
changeset
|
1933 |
32332
7aa4a4cf0dde
cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32314
diff
changeset
|
1934 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
|
1935 """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
|
1936 |
7aa4a4cf0dde
cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32314
diff
changeset
|
1937 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
|
1938 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
|
1939 method. |
7aa4a4cf0dde
cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32314
diff
changeset
|
1940 """ |
7aa4a4cf0dde
cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32314
diff
changeset
|
1941 # 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
|
1942 reporef = weakref.ref(self) |
7aa4a4cf0dde
cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32314
diff
changeset
|
1943 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
|
1944 repo = reporef() |
7aa4a4cf0dde
cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32314
diff
changeset
|
1945 repo.updatecaches(tr) |
7aa4a4cf0dde
cache: make the cache updated callback easily accessible to extension
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32314
diff
changeset
|
1946 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
|
1947 |
32263
604d65e2c0b2
caches: introduce a function to warm cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
32262
diff
changeset
|
1948 @unfilteredmethod |
36952
b24cde12061b
debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents:
36819
diff
changeset
|
1949 def updatecaches(self, tr=None, full=False): |
32264
a72caf0af38e
caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
32263
diff
changeset
|
1950 """warm appropriate caches |
a72caf0af38e
caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
32263
diff
changeset
|
1951 |
a72caf0af38e
caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
32263
diff
changeset
|
1952 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
|
1953 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
|
1954 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
|
1955 |
b24cde12061b
debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents:
36819
diff
changeset
|
1956 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
|
1957 up-to-date data. Even the ones usually loaded more lazily. |
32264
a72caf0af38e
caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
32263
diff
changeset
|
1958 """ |
a72caf0af38e
caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
32263
diff
changeset
|
1959 if tr is not None and tr.hookargs.get('source') == 'strip': |
32263
604d65e2c0b2
caches: introduce a function to warm cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
32262
diff
changeset
|
1960 # 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
|
1961 # 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
|
1962 return |
604d65e2c0b2
caches: introduce a function to warm cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
32262
diff
changeset
|
1963 |
39301
5763216ba311
transaction: remember original len(repo) instead of tracking added revs (API)
Yuya Nishihara <yuya@tcha.org>
parents:
39298
diff
changeset
|
1964 if tr is None or tr.changes['origrepolen'] < len(self): |
32264
a72caf0af38e
caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
32263
diff
changeset
|
1965 # updating the unfiltered branchmap should refresh all the others, |
32267
c2380b448265
caches: move the 'updating the branch cache' message in 'updatecaches'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
32266
diff
changeset
|
1966 self.ui.debug('updating the branch cache\n') |
32263
604d65e2c0b2
caches: introduce a function to warm cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
32262
diff
changeset
|
1967 branchmap.updatecache(self.filtered('served')) |
604d65e2c0b2
caches: introduce a function to warm cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
32262
diff
changeset
|
1968 |
36952
b24cde12061b
debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents:
36819
diff
changeset
|
1969 if full: |
b24cde12061b
debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents:
36819
diff
changeset
|
1970 rbc = self.revbranchcache() |
b24cde12061b
debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents:
36819
diff
changeset
|
1971 for r in self.changelog: |
b24cde12061b
debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents:
36819
diff
changeset
|
1972 rbc.branchinfo(r) |
b24cde12061b
debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents:
36819
diff
changeset
|
1973 rbc.write() |
b24cde12061b
debugupdatecache: also warm rev branch cache
Boris Feld <boris.feld@octobus.net>
parents:
36819
diff
changeset
|
1974 |
38781
0a57945aaf7f
manifest: persist the manifestfulltext cache
Martijn Pieters <mj@zopatista.com>
parents:
38760
diff
changeset
|
1975 # ensure the working copy parents are in the manifestfulltextcache |
0a57945aaf7f
manifest: persist the manifestfulltext cache
Martijn Pieters <mj@zopatista.com>
parents:
38760
diff
changeset
|
1976 for ctx in self['.'].parents(): |
0a57945aaf7f
manifest: persist the manifestfulltext cache
Martijn Pieters <mj@zopatista.com>
parents:
38760
diff
changeset
|
1977 ctx.manifest() # accessing the manifest is enough |
0a57945aaf7f
manifest: persist the manifestfulltext cache
Martijn Pieters <mj@zopatista.com>
parents:
38760
diff
changeset
|
1978 |
10547
bae9bb09166b
strip: invalidate all caches after stripping (fixes issue1951)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10522
diff
changeset
|
1979 def invalidatecaches(self): |
15988
827e0126738d
localrepo: delete _phaserev when invalidating caches
Idan Kamara <idankk86@gmail.com>
parents:
15987
diff
changeset
|
1980 |
18013
98c867ac1330
clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18009
diff
changeset
|
1981 if '_tagscache' in vars(self): |
98c867ac1330
clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18009
diff
changeset
|
1982 # can't use delattr on proxy |
98c867ac1330
clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18009
diff
changeset
|
1983 del self.__dict__['_tagscache'] |
14936
9dca7653b525
localrepo: unify tag related info into a tagscache class
Idan Kamara <idankk86@gmail.com>
parents:
14935
diff
changeset
|
1984 |
18189
b9026ba002f6
branchmap: enable caching for filtered version too
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18186
diff
changeset
|
1985 self.unfiltered()._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
|
1986 self.invalidatevolatilesets() |
33302
36a415b5a4b2
localrepo: add sparse caches
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33278
diff
changeset
|
1987 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
|
1988 |
312262ebc223
cache: group obscache and revsfiltercache invalidation in a single function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18101
diff
changeset
|
1989 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
|
1990 self.filteredrevcache.clear() |
17469
fb72eec7efd8
obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17434
diff
changeset
|
1991 obsolete.clearobscaches(self) |
1784
2e0a288ca93e
revalidate revlog data after locking the repo (issue132)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1782
diff
changeset
|
1992 |
14930
372d9d8b1da4
localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents:
14929
diff
changeset
|
1993 def invalidatedirstate(self): |
372d9d8b1da4
localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents:
14929
diff
changeset
|
1994 '''Invalidates the dirstate, causing the next call to dirstate |
372d9d8b1da4
localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents:
14929
diff
changeset
|
1995 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
|
1996 rereading it if it has. |
372d9d8b1da4
localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents:
14929
diff
changeset
|
1997 |
372d9d8b1da4
localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents:
14929
diff
changeset
|
1998 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
|
1999 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
|
2000 explicitly read the dirstate again (i.e. restoring it to a previous |
372d9d8b1da4
localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents:
14929
diff
changeset
|
2001 known good state).''' |
18013
98c867ac1330
clfilter: add a propertycache that must be unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18009
diff
changeset
|
2002 if hasunfilteredcache(self, 'dirstate'): |
16200
9d4a2942a732
dirstate: add filecache support
Idan Kamara <idankk86@gmail.com>
parents:
16198
diff
changeset
|
2003 for k in self.dirstate._filecache: |
9d4a2942a732
dirstate: add filecache support
Idan Kamara <idankk86@gmail.com>
parents:
16198
diff
changeset
|
2004 try: |
9d4a2942a732
dirstate: add filecache support
Idan Kamara <idankk86@gmail.com>
parents:
16198
diff
changeset
|
2005 delattr(self.dirstate, k) |
9d4a2942a732
dirstate: add filecache support
Idan Kamara <idankk86@gmail.com>
parents:
16198
diff
changeset
|
2006 except AttributeError: |
9d4a2942a732
dirstate: add filecache support
Idan Kamara <idankk86@gmail.com>
parents:
16198
diff
changeset
|
2007 pass |
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
|
2008 delattr(self.unfiltered(), 'dirstate') |
14930
372d9d8b1da4
localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents:
14929
diff
changeset
|
2009 |
26831
0a7610758c42
localrepo: discard objects in _filecache at transaction failure (issue4876)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
26781
diff
changeset
|
2010 def invalidate(self, clearfilecache=False): |
29918
d9c49138ab93
localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29883
diff
changeset
|
2011 '''Invalidates both store and non-store parts other than dirstate |
d9c49138ab93
localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29883
diff
changeset
|
2012 |
d9c49138ab93
localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29883
diff
changeset
|
2013 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
|
2014 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
|
2015 (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
|
2016 redundant one doesn't). |
d9c49138ab93
localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29883
diff
changeset
|
2017 ''' |
18644
3e92772d5383
spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents:
18520
diff
changeset
|
2018 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
|
2019 for k in list(self._filecache.keys()): |
14935
4ae7473f5b73
localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents:
14934
diff
changeset
|
2020 # dirstate is invalidated separately in invalidatedirstate() |
4ae7473f5b73
localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents:
14934
diff
changeset
|
2021 if k == 'dirstate': |
4ae7473f5b73
localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents:
14934
diff
changeset
|
2022 continue |
33706
01a1c4e66816
repo: skip invalidation of changelog if it has 'delayed' changes (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
33703
diff
changeset
|
2023 if (k == 'changelog' and |
01a1c4e66816
repo: skip invalidation of changelog if it has 'delayed' changes (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
33703
diff
changeset
|
2024 self.currenttransaction() and |
01a1c4e66816
repo: skip invalidation of changelog if it has 'delayed' changes (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
33703
diff
changeset
|
2025 self.changelog._delayed): |
01a1c4e66816
repo: skip invalidation of changelog if it has 'delayed' changes (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
33703
diff
changeset
|
2026 # 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
|
2027 # 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
|
2028 # 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
|
2029 continue |
14935
4ae7473f5b73
localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents:
14934
diff
changeset
|
2030 |
26831
0a7610758c42
localrepo: discard objects in _filecache at transaction failure (issue4876)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
26781
diff
changeset
|
2031 if clearfilecache: |
0a7610758c42
localrepo: discard objects in _filecache at transaction failure (issue4876)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
26781
diff
changeset
|
2032 del self._filecache[k] |
14935
4ae7473f5b73
localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents:
14934
diff
changeset
|
2033 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
|
2034 delattr(unfiltered, k) |
14935
4ae7473f5b73
localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents:
14934
diff
changeset
|
2035 except AttributeError: |
4ae7473f5b73
localrepo: make invalidate() walk _filecache
Idan Kamara <idankk86@gmail.com>
parents:
14934
diff
changeset
|
2036 pass |
10547
bae9bb09166b
strip: invalidate all caches after stripping (fixes issue1951)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10522
diff
changeset
|
2037 self.invalidatecaches() |
29918
d9c49138ab93
localrepo: make invalidate avoid invalidating store inside transaction (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29883
diff
changeset
|
2038 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
|
2039 # 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
|
2040 # 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
|
2041 # 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
|
2042 self.store.invalidatecaches() |
10547
bae9bb09166b
strip: invalidate all caches after stripping (fixes issue1951)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10522
diff
changeset
|
2043 |
20627
a42ea6d209e6
localrepo: add hook point to invalidate everything on each command-server run
Yuya Nishihara <yuya@tcha.org>
parents:
20567
diff
changeset
|
2044 def invalidateall(self): |
a42ea6d209e6
localrepo: add hook point to invalidate everything on each command-server run
Yuya Nishihara <yuya@tcha.org>
parents:
20567
diff
changeset
|
2045 '''Fully invalidates both store and non-store parts, causing the |
a42ea6d209e6
localrepo: add hook point to invalidate everything on each command-server run
Yuya Nishihara <yuya@tcha.org>
parents:
20567
diff
changeset
|
2046 subsequent operation to reread any outside changes.''' |
a42ea6d209e6
localrepo: add hook point to invalidate everything on each command-server run
Yuya Nishihara <yuya@tcha.org>
parents:
20567
diff
changeset
|
2047 # 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
|
2048 self.invalidate() |
a42ea6d209e6
localrepo: add hook point to invalidate everything on each command-server run
Yuya Nishihara <yuya@tcha.org>
parents:
20567
diff
changeset
|
2049 self.invalidatedirstate() |
a42ea6d209e6
localrepo: add hook point to invalidate everything on each command-server run
Yuya Nishihara <yuya@tcha.org>
parents:
20567
diff
changeset
|
2050 |
29920
e35a83cedde1
localrepo: make _refreshfilecachestats unfiltered method to refresh correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29918
diff
changeset
|
2051 @unfilteredmethod |
26251
5c0f5db65c6b
localrepo: refresh filecache stats only if transaction finished successfully
Yuya Nishihara <yuya@tcha.org>
parents:
26250
diff
changeset
|
2052 def _refreshfilecachestats(self, tr): |
26250
bc1f8a79b4e4
localrepo: move closure of lock release to class
Yuya Nishihara <yuya@tcha.org>
parents:
26155
diff
changeset
|
2053 """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
|
2054 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
|
2055 k = pycompat.sysstr(k) |
9dad46c23185
localrepo: consistently use native str when __dict__ is involved
Augie Fackler <augie@google.com>
parents:
35785
diff
changeset
|
2056 if k == r'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
|
2057 continue |
bc1f8a79b4e4
localrepo: move closure of lock release to class
Yuya Nishihara <yuya@tcha.org>
parents:
26155
diff
changeset
|
2058 ce.refresh() |
bc1f8a79b4e4
localrepo: move closure of lock release to class
Yuya Nishihara <yuya@tcha.org>
parents:
26155
diff
changeset
|
2059 |
26439
b50f5beadf3e
localrepo: allow creating inherited locks
Siddharth Agarwal <sid0@fb.com>
parents:
26409
diff
changeset
|
2060 def _lock(self, vfs, lockname, wait, releasefn, acquirefn, desc, |
26499
e72b62b154b0
localrepo: prevent wlock from being inherited when a transaction is running
Siddharth Agarwal <sid0@fb.com>
parents:
26489
diff
changeset
|
2061 inheritchecker=None, parentenvvar=None): |
26439
b50f5beadf3e
localrepo: allow creating inherited locks
Siddharth Agarwal <sid0@fb.com>
parents:
26409
diff
changeset
|
2062 parentlock = None |
26472
406a654b41cb
localrepo: add a note about parentenvvar
Siddharth Agarwal <sid0@fb.com>
parents:
26449
diff
changeset
|
2063 # the contents of parentenvvar are used by the underlying lock to |
406a654b41cb
localrepo: add a note about parentenvvar
Siddharth Agarwal <sid0@fb.com>
parents:
26449
diff
changeset
|
2064 # determine whether it can be inherited |
26439
b50f5beadf3e
localrepo: allow creating inherited locks
Siddharth Agarwal <sid0@fb.com>
parents:
26409
diff
changeset
|
2065 if parentenvvar is not None: |
30634
ad15646dc61c
py3: replace os.environ with encoding.environ (part 1 of 5)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30574
diff
changeset
|
2066 parentlock = encoding.environ.get(parentenvvar) |
35208
1b758105b5c7
lock: add a trylock method handling the timeout and messaging logic
Boris Feld <boris.feld@octobus.net>
parents:
35207
diff
changeset
|
2067 |
1b758105b5c7
lock: add a trylock method handling the timeout and messaging logic
Boris Feld <boris.feld@octobus.net>
parents:
35207
diff
changeset
|
2068 timeout = 0 |
35209
9153871d50e0
lock: allow to configure when the lock messages are displayed
Boris Feld <boris.feld@octobus.net>
parents:
35208
diff
changeset
|
2069 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
|
2070 if wait: |
1b758105b5c7
lock: add a trylock method handling the timeout and messaging logic
Boris Feld <boris.feld@octobus.net>
parents:
35207
diff
changeset
|
2071 timeout = self.ui.configint("ui", "timeout") |
35209
9153871d50e0
lock: allow to configure when the lock messages are displayed
Boris Feld <boris.feld@octobus.net>
parents:
35208
diff
changeset
|
2072 warntimeout = self.ui.configint("ui", "timeout.warn") |
38038
8c828beb7543
lock: add internal config to not replace signal handlers while locking
Yuya Nishihara <yuya@tcha.org>
parents:
37810
diff
changeset
|
2073 # internal config: ui.signal-safe-lock |
8c828beb7543
lock: add internal config to not replace signal handlers while locking
Yuya Nishihara <yuya@tcha.org>
parents:
37810
diff
changeset
|
2074 signalsafe = self.ui.configbool('ui', '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
|
2075 |
35209
9153871d50e0
lock: allow to configure when the lock messages are displayed
Boris Feld <boris.feld@octobus.net>
parents:
35208
diff
changeset
|
2076 l = lockmod.trylock(self.ui, vfs, lockname, timeout, warntimeout, |
35208
1b758105b5c7
lock: add a trylock method handling the timeout and messaging logic
Boris Feld <boris.feld@octobus.net>
parents:
35207
diff
changeset
|
2077 releasefn=releasefn, |
1b758105b5c7
lock: add a trylock method handling the timeout and messaging logic
Boris Feld <boris.feld@octobus.net>
parents:
35207
diff
changeset
|
2078 acquirefn=acquirefn, desc=desc, |
1b758105b5c7
lock: add a trylock method handling the timeout and messaging logic
Boris Feld <boris.feld@octobus.net>
parents:
35207
diff
changeset
|
2079 inheritchecker=inheritchecker, |
38038
8c828beb7543
lock: add internal config to not replace signal handlers while locking
Yuya Nishihara <yuya@tcha.org>
parents:
37810
diff
changeset
|
2080 parentlock=parentlock, |
8c828beb7543
lock: add internal config to not replace signal handlers while locking
Yuya Nishihara <yuya@tcha.org>
parents:
37810
diff
changeset
|
2081 signalsafe=signalsafe) |
1751
e9bf415a8ecb
localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1747
diff
changeset
|
2082 return l |
e9bf415a8ecb
localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1747
diff
changeset
|
2083 |
15587
809d5d30e377
localrepo: rename _postrelease to _afterlock
Matt Mackall <mpm@selenic.com>
parents:
15586
diff
changeset
|
2084 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
|
2085 """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
|
2086 |
24821
57f1dbc99631
afterlock: add the callback to the top level lock (issue4608)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24799
diff
changeset
|
2087 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
|
2088 (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
|
2089 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
|
2090 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
|
2091 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
|
2092 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
|
2093 break |
57f1dbc99631
afterlock: add the callback to the top level lock (issue4608)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24799
diff
changeset
|
2094 else: # no lock have been found. |
16680
d0e419b0f7de
tag: run commit hook when lock is released (issue3344)
Mads Kiilerich <mads@kiilerich.com>
parents:
16679
diff
changeset
|
2095 callback() |
15583
926a06f7a353
lock: add mechanism to register post release callback
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15486
diff
changeset
|
2096 |
4914 | 2097 def lock(self, wait=True): |
9309
cfdcb7a465af
localrepo: document the locking scheme a little better
Greg Ward <greg-hg@gerg.ca>
parents:
9152
diff
changeset
|
2098 '''Lock the repository store (.hg/store) and return a weak reference |
cfdcb7a465af
localrepo: document the locking scheme a little better
Greg Ward <greg-hg@gerg.ca>
parents:
9152
diff
changeset
|
2099 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
|
2100 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
|
2101 |
e0c810d0ab69
lock: update the docstring with order information
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24745
diff
changeset
|
2102 If both 'lock' and 'wlock' must be acquired, ensure you always acquires |
e0c810d0ab69
lock: update the docstring with order information
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24745
diff
changeset
|
2103 '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
|
2104 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
|
2105 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
|
2106 l.lock() |
a26d33749bd8
made repo locks recursive and deprecate refcounting based lock releasing
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
8072
diff
changeset
|
2107 return l |
4917
126f527b3ba3
Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents:
4916
diff
changeset
|
2108 |
26251
5c0f5db65c6b
localrepo: refresh filecache stats only if transaction finished successfully
Yuya Nishihara <yuya@tcha.org>
parents:
26250
diff
changeset
|
2109 l = self._lock(self.svfs, "lock", wait, None, |
13391
d00bbff8600e
fncachestore: defer updating the fncache file to a single file open
Adrian Buehlmann <adrian@cadifra.com>
parents:
13390
diff
changeset
|
2110 self.invalidate, _('repository %s') % self.origroot) |
4917
126f527b3ba3
Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents:
4916
diff
changeset
|
2111 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
|
2112 return l |
1751
e9bf415a8ecb
localrepo: refactor the locking functions
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1747
diff
changeset
|
2113 |
26499
e72b62b154b0
localrepo: prevent wlock from being inherited when a transaction is running
Siddharth Agarwal <sid0@fb.com>
parents:
26489
diff
changeset
|
2114 def _wlockchecktransaction(self): |
e72b62b154b0
localrepo: prevent wlock from being inherited when a transaction is running
Siddharth Agarwal <sid0@fb.com>
parents:
26489
diff
changeset
|
2115 if self.currenttransaction() is not None: |
e72b62b154b0
localrepo: prevent wlock from being inherited when a transaction is running
Siddharth Agarwal <sid0@fb.com>
parents:
26489
diff
changeset
|
2116 raise error.LockInheritanceContractViolation( |
e72b62b154b0
localrepo: prevent wlock from being inherited when a transaction is running
Siddharth Agarwal <sid0@fb.com>
parents:
26489
diff
changeset
|
2117 'wlock cannot be inherited in the middle of a transaction') |
e72b62b154b0
localrepo: prevent wlock from being inherited when a transaction is running
Siddharth Agarwal <sid0@fb.com>
parents:
26489
diff
changeset
|
2118 |
4914 | 2119 def wlock(self, wait=True): |
9309
cfdcb7a465af
localrepo: document the locking scheme a little better
Greg Ward <greg-hg@gerg.ca>
parents:
9152
diff
changeset
|
2120 '''Lock the non-store parts of the repository (everything under |
cfdcb7a465af
localrepo: document the locking scheme a little better
Greg Ward <greg-hg@gerg.ca>
parents:
9152
diff
changeset
|
2121 .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
|
2122 |
e0c810d0ab69
lock: update the docstring with order information
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24745
diff
changeset
|
2123 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
|
2124 |
e0c810d0ab69
lock: update the docstring with order information
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24745
diff
changeset
|
2125 If both 'lock' and 'wlock' must be acquired, ensure you always acquires |
e0c810d0ab69
lock: update the docstring with order information
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24745
diff
changeset
|
2126 'wlock' first to avoid a dead-lock hazard.''' |
24744
bedefc611f25
wlock: only issue devel warning when actually acquiring the lock
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24740
diff
changeset
|
2127 l = self._wlockref and self._wlockref() |
bedefc611f25
wlock: only issue devel warning when actually acquiring the lock
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24740
diff
changeset
|
2128 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
|
2129 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
|
2130 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
|
2131 |
26781
1aee2ab0f902
spelling: trivial spell checking
Mads Kiilerich <madski@unity3d.com>
parents:
26767
diff
changeset
|
2132 # 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
|
2133 # acquisition would not cause dead-lock as they would just fail. |
25290
8f88f768e24c
devel: rename 'all' to 'all-warnings' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25274
diff
changeset
|
2134 if wait and (self.ui.configbool('devel', 'all-warnings') |
24750
aaf835407bf2
wlock: do not warn for non-wait locking
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24748
diff
changeset
|
2135 or self.ui.configbool('devel', 'check-locks')): |
29705
41689e293994
develwarn: use the lock helper in local repo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29417
diff
changeset
|
2136 if self._currentlock(self._lockref) is not None: |
25629
52e5f68d8363
devel-warn: move the develwarn function as a method of the ui object
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25625
diff
changeset
|
2137 self.ui.develwarn('"wlock" acquired after "lock"') |
1531
2ba8bf7defda
add localrepo.wlock for protecting the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1516
diff
changeset
|
2138 |
14930
372d9d8b1da4
localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents:
14929
diff
changeset
|
2139 def unlock(): |
22404
12bc7f06fc41
dirstate: add begin/endparentchange to dirstate
Durham Goode <durham@fb.com>
parents:
22362
diff
changeset
|
2140 if self.dirstate.pendingparentchange(): |
12bc7f06fc41
dirstate: add begin/endparentchange to dirstate
Durham Goode <durham@fb.com>
parents:
22362
diff
changeset
|
2141 self.dirstate.invalidate() |
12bc7f06fc41
dirstate: add begin/endparentchange to dirstate
Durham Goode <durham@fb.com>
parents:
22362
diff
changeset
|
2142 else: |
26748
5ba0a99ff27f
dirstate: make dirstate.write() callers pass transaction object to it
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
26741
diff
changeset
|
2143 self.dirstate.write(None) |
22404
12bc7f06fc41
dirstate: add begin/endparentchange to dirstate
Durham Goode <durham@fb.com>
parents:
22362
diff
changeset
|
2144 |
18318
948f495fb230
localrepo: drop unnecessary check on wlock unlock
Idan Kamara <idankk86@gmail.com>
parents:
18314
diff
changeset
|
2145 self._filecache['dirstate'].refresh() |
14930
372d9d8b1da4
localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents:
14929
diff
changeset
|
2146 |
20091
abfe6a8e619b
lock: take both vfs and lock file path relative to vfs to access via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20088
diff
changeset
|
2147 l = self._lock(self.vfs, "wlock", wait, unlock, |
14930
372d9d8b1da4
localrepo: decorate dirstate() with filecache
Idan Kamara <idankk86@gmail.com>
parents:
14929
diff
changeset
|
2148 self.invalidatedirstate, _('working directory of %s') % |
26499
e72b62b154b0
localrepo: prevent wlock from being inherited when a transaction is running
Siddharth Agarwal <sid0@fb.com>
parents:
26489
diff
changeset
|
2149 self.origroot, |
e72b62b154b0
localrepo: prevent wlock from being inherited when a transaction is running
Siddharth Agarwal <sid0@fb.com>
parents:
26489
diff
changeset
|
2150 inheritchecker=self._wlockchecktransaction, |
e72b62b154b0
localrepo: prevent wlock from being inherited when a transaction is running
Siddharth Agarwal <sid0@fb.com>
parents:
26489
diff
changeset
|
2151 parentenvvar='HG_WLOCK_LOCKER') |
4917
126f527b3ba3
Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents:
4916
diff
changeset
|
2152 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
|
2153 return l |
1531
2ba8bf7defda
add localrepo.wlock for protecting the dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1516
diff
changeset
|
2154 |
26488
df2dc5141721
localrepo: add a way to get the current lock if it's held
Siddharth Agarwal <sid0@fb.com>
parents:
26475
diff
changeset
|
2155 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
|
2156 """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
|
2157 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
|
2158 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
|
2159 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
|
2160 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
|
2161 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
|
2162 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
|
2163 |
26489
2a3fc0272e3f
localrepo: add a way to get the current wlock if it's held
Siddharth Agarwal <sid0@fb.com>
parents:
26488
diff
changeset
|
2164 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
|
2165 """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
|
2166 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
|
2167 |
8401
ca7dc47eecc6
filecommit: swallow some bits from _commitctx, add _
Matt Mackall <mpm@selenic.com>
parents:
8400
diff
changeset
|
2168 def _filecommit(self, fctx, manifest1, manifest2, linkrev, tr, changelist): |
3292
764688cf51e5
merge: remember rename copies and parents properly on commit
Matt Mackall <mpm@selenic.com>
parents:
3241
diff
changeset
|
2169 """ |
3294
a2d93b186a0e
commit: unify file-level commit code
Matt Mackall <mpm@selenic.com>
parents:
3293
diff
changeset
|
2170 commit an individual file as part of a larger transaction |
a2d93b186a0e
commit: unify file-level commit code
Matt Mackall <mpm@selenic.com>
parents:
3293
diff
changeset
|
2171 """ |
3292
764688cf51e5
merge: remember rename copies and parents properly on commit
Matt Mackall <mpm@selenic.com>
parents:
3241
diff
changeset
|
2172 |
8244
99d7e2db8da8
localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents:
8239
diff
changeset
|
2173 fname = fctx.path() |
99d7e2db8da8
localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents:
8239
diff
changeset
|
2174 fparent1 = manifest1.get(fname, nullid) |
22492
d5261db0011f
commit: catch changed exec bit on files from p1 (issue4382)
Matt Mackall <mpm@selenic.com>
parents:
21866
diff
changeset
|
2175 fparent2 = manifest2.get(fname, nullid) |
24394
03163826b4e6
localrepo: reuse commit of parent filectx entries without rehashing
Mads Kiilerich <madski@unity3d.com>
parents:
24388
diff
changeset
|
2176 if isinstance(fctx, context.filectx): |
03163826b4e6
localrepo: reuse commit of parent filectx entries without rehashing
Mads Kiilerich <madski@unity3d.com>
parents:
24388
diff
changeset
|
2177 node = fctx.filenode() |
03163826b4e6
localrepo: reuse commit of parent filectx entries without rehashing
Mads Kiilerich <madski@unity3d.com>
parents:
24388
diff
changeset
|
2178 if node in [fparent1, fparent2]: |
03163826b4e6
localrepo: reuse commit of parent filectx entries without rehashing
Mads Kiilerich <madski@unity3d.com>
parents:
24388
diff
changeset
|
2179 self.ui.debug('reusing %s filelog entry\n' % fname) |
29181
dae38633eba8
localrepo: prevent executable-bit only changes from being lost on amend
Mateusz Kwapich <mitrandir@fb.com>
parents:
28883
diff
changeset
|
2180 if manifest1.flags(fname) != fctx.flags(): |
dae38633eba8
localrepo: prevent executable-bit only changes from being lost on amend
Mateusz Kwapich <mitrandir@fb.com>
parents:
28883
diff
changeset
|
2181 changelist.append(fname) |
24394
03163826b4e6
localrepo: reuse commit of parent filectx entries without rehashing
Mads Kiilerich <madski@unity3d.com>
parents:
24388
diff
changeset
|
2182 return node |
1716
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
2183 |
24394
03163826b4e6
localrepo: reuse commit of parent filectx entries without rehashing
Mads Kiilerich <madski@unity3d.com>
parents:
24388
diff
changeset
|
2184 flog = self.file(fname) |
3292
764688cf51e5
merge: remember rename copies and parents properly on commit
Matt Mackall <mpm@selenic.com>
parents:
3241
diff
changeset
|
2185 meta = {} |
8244
99d7e2db8da8
localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents:
8239
diff
changeset
|
2186 copy = fctx.renamed() |
99d7e2db8da8
localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents:
8239
diff
changeset
|
2187 if copy and copy[0] != fname: |
4058
e7282dede8cd
filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3923
diff
changeset
|
2188 # Mark the new revision of this file as a copy of another |
4516
96d8a56d4ef9
Removed trailing whitespace and tabs from python files
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4510
diff
changeset
|
2189 # file. This copy data will effectively act as a parent |
96d8a56d4ef9
Removed trailing whitespace and tabs from python files
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4510
diff
changeset
|
2190 # of this new revision. If this is a merge, the first |
4058
e7282dede8cd
filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3923
diff
changeset
|
2191 # parent will be the nullid (meaning "look up the copy data") |
e7282dede8cd
filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3923
diff
changeset
|
2192 # and the second one will be the other parent. For example: |
e7282dede8cd
filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3923
diff
changeset
|
2193 # |
e7282dede8cd
filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3923
diff
changeset
|
2194 # 0 --- 1 --- 3 rev1 changes file foo |
e7282dede8cd
filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3923
diff
changeset
|
2195 # \ / rev2 renames foo to bar and changes it |
e7282dede8cd
filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3923
diff
changeset
|
2196 # \- 2 -/ rev3 should have bar with all changes and |
e7282dede8cd
filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3923
diff
changeset
|
2197 # should record that bar descends from |
e7282dede8cd
filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3923
diff
changeset
|
2198 # bar in rev2 and foo in rev1 |
e7282dede8cd
filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3923
diff
changeset
|
2199 # |
e7282dede8cd
filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3923
diff
changeset
|
2200 # this allows this merge to succeed: |
e7282dede8cd
filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3923
diff
changeset
|
2201 # |
e7282dede8cd
filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3923
diff
changeset
|
2202 # 0 --- 1 --- 3 rev4 reverts the content change from rev2 |
e7282dede8cd
filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3923
diff
changeset
|
2203 # \ / merging rev3 and rev4 should use bar@rev2 |
e7282dede8cd
filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3923
diff
changeset
|
2204 # \- 2 --- 4 as the merge base |
e7282dede8cd
filecommit: don't forget the local parent on a merge with a local rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3923
diff
changeset
|
2205 # |
6874
8dc21876261e
commit: simplify file copy logic
Matt Mackall <mpm@selenic.com>
parents:
6680
diff
changeset
|
2206 |
8244
99d7e2db8da8
localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents:
8239
diff
changeset
|
2207 cfname = copy[0] |
99d7e2db8da8
localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents:
8239
diff
changeset
|
2208 crev = manifest1.get(cfname) |
99d7e2db8da8
localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents:
8239
diff
changeset
|
2209 newfparent = fparent2 |
6874
8dc21876261e
commit: simplify file copy logic
Matt Mackall <mpm@selenic.com>
parents:
6680
diff
changeset
|
2210 |
8dc21876261e
commit: simplify file copy logic
Matt Mackall <mpm@selenic.com>
parents:
6680
diff
changeset
|
2211 if manifest2: # branch merge |
8244
99d7e2db8da8
localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents:
8239
diff
changeset
|
2212 if fparent2 == nullid or crev is None: # copied on remote side |
99d7e2db8da8
localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents:
8239
diff
changeset
|
2213 if cfname in manifest2: |
99d7e2db8da8
localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents:
8239
diff
changeset
|
2214 crev = manifest2[cfname] |
99d7e2db8da8
localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents:
8239
diff
changeset
|
2215 newfparent = fparent1 |
6874
8dc21876261e
commit: simplify file copy logic
Matt Mackall <mpm@selenic.com>
parents:
6680
diff
changeset
|
2216 |
23929
a43fdf33a6be
commit: remove reverse search for copy source when not in parent (issue4476)
Ryan McElroy <rmcelroy@fb.com>
parents:
23917
diff
changeset
|
2217 # Here, we used to search backwards through history to try to find |
a43fdf33a6be
commit: remove reverse search for copy source when not in parent (issue4476)
Ryan McElroy <rmcelroy@fb.com>
parents:
23917
diff
changeset
|
2218 # where the file copy came from if the source of a copy was not in |
24180
d8e0c591781c
spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents:
24114
diff
changeset
|
2219 # the parent directory. However, this doesn't actually make sense to |
23929
a43fdf33a6be
commit: remove reverse search for copy source when not in parent (issue4476)
Ryan McElroy <rmcelroy@fb.com>
parents:
23917
diff
changeset
|
2220 # do (what does a copy from something not in your working copy even |
a43fdf33a6be
commit: remove reverse search for copy source when not in parent (issue4476)
Ryan McElroy <rmcelroy@fb.com>
parents:
23917
diff
changeset
|
2221 # mean?) and it causes bugs (eg, issue4476). Instead, we will warn |
a43fdf33a6be
commit: remove reverse search for copy source when not in parent (issue4476)
Ryan McElroy <rmcelroy@fb.com>
parents:
23917
diff
changeset
|
2222 # the user that copy information was dropped, so if they didn't |
a43fdf33a6be
commit: remove reverse search for copy source when not in parent (issue4476)
Ryan McElroy <rmcelroy@fb.com>
parents:
23917
diff
changeset
|
2223 # expect this outcome it can be fixed, but this is the correct |
a43fdf33a6be
commit: remove reverse search for copy source when not in parent (issue4476)
Ryan McElroy <rmcelroy@fb.com>
parents:
23917
diff
changeset
|
2224 # behavior in this circumstance. |
6875 | 2225 |
13000
417f3c27983b
commit: search both parents for missing copy revision (issue2484)
Matt Mackall <mpm@selenic.com>
parents:
12899
diff
changeset
|
2226 if crev: |
417f3c27983b
commit: search both parents for missing copy revision (issue2484)
Matt Mackall <mpm@selenic.com>
parents:
12899
diff
changeset
|
2227 self.ui.debug(" %s: copy %s:%s\n" % (fname, cfname, hex(crev))) |
417f3c27983b
commit: search both parents for missing copy revision (issue2484)
Matt Mackall <mpm@selenic.com>
parents:
12899
diff
changeset
|
2228 meta["copy"] = cfname |
417f3c27983b
commit: search both parents for missing copy revision (issue2484)
Matt Mackall <mpm@selenic.com>
parents:
12899
diff
changeset
|
2229 meta["copyrev"] = hex(crev) |
417f3c27983b
commit: search both parents for missing copy revision (issue2484)
Matt Mackall <mpm@selenic.com>
parents:
12899
diff
changeset
|
2230 fparent1, fparent2 = nullid, newfparent |
417f3c27983b
commit: search both parents for missing copy revision (issue2484)
Matt Mackall <mpm@selenic.com>
parents:
12899
diff
changeset
|
2231 else: |
417f3c27983b
commit: search both parents for missing copy revision (issue2484)
Matt Mackall <mpm@selenic.com>
parents:
12899
diff
changeset
|
2232 self.ui.warn(_("warning: can't find ancestor for '%s' " |
417f3c27983b
commit: search both parents for missing copy revision (issue2484)
Matt Mackall <mpm@selenic.com>
parents:
12899
diff
changeset
|
2233 "copied from '%s'!\n") % (fname, cfname)) |
417f3c27983b
commit: search both parents for missing copy revision (issue2484)
Matt Mackall <mpm@selenic.com>
parents:
12899
diff
changeset
|
2234 |
20556
db0740a487ab
localrepo: commit: avoid calling expensive ancestor function when p1 is nullrev
Mads Kiilerich <madski@unity3d.com>
parents:
20469
diff
changeset
|
2235 elif fparent1 == nullid: |
db0740a487ab
localrepo: commit: avoid calling expensive ancestor function when p1 is nullrev
Mads Kiilerich <madski@unity3d.com>
parents:
20469
diff
changeset
|
2236 fparent1, fparent2 = fparent2, nullid |
8244
99d7e2db8da8
localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents:
8239
diff
changeset
|
2237 elif fparent2 != nullid: |
1716
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
2238 # is one parent an ancestor of the other? |
21106
53433d8f1faa
localrepo: use commonancestorsheads for checking linear heritage in file commit
Mads Kiilerich <madski@unity3d.com>
parents:
21071
diff
changeset
|
2239 fparentancestors = flog.commonancestorsheads(fparent1, fparent2) |
20987
298c9f346dde
commit: use revlog.commonancestors instead of .ancestor
Mads Kiilerich <madski@unity3d.com>
parents:
20975
diff
changeset
|
2240 if fparent1 in fparentancestors: |
8244
99d7e2db8da8
localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents:
8239
diff
changeset
|
2241 fparent1, fparent2 = fparent2, nullid |
20987
298c9f346dde
commit: use revlog.commonancestors instead of .ancestor
Mads Kiilerich <madski@unity3d.com>
parents:
20975
diff
changeset
|
2242 elif fparent2 in fparentancestors: |
8244
99d7e2db8da8
localrepo: Refactor var names in filecommit to improve readability.
Martijn Pieters <mj@zopatista.com>
parents:
8239
diff
changeset
|
2243 fparent2 = nullid |
1716
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
2244 |
8401
ca7dc47eecc6
filecommit: swallow some bits from _commitctx, add _
Matt Mackall <mpm@selenic.com>
parents:
8400
diff
changeset
|
2245 # is the file changed? |
24394
03163826b4e6
localrepo: reuse commit of parent filectx entries without rehashing
Mads Kiilerich <madski@unity3d.com>
parents:
24388
diff
changeset
|
2246 text = fctx.data() |
8401
ca7dc47eecc6
filecommit: swallow some bits from _commitctx, add _
Matt Mackall <mpm@selenic.com>
parents:
8400
diff
changeset
|
2247 if fparent2 != nullid or flog.cmp(fparent1, text) or meta: |
ca7dc47eecc6
filecommit: swallow some bits from _commitctx, add _
Matt Mackall <mpm@selenic.com>
parents:
8400
diff
changeset
|
2248 changelist.append(fname) |
ca7dc47eecc6
filecommit: swallow some bits from _commitctx, add _
Matt Mackall <mpm@selenic.com>
parents:
8400
diff
changeset
|
2249 return flog.add(text, meta, tr, linkrev, fparent1, fparent2) |
ca7dc47eecc6
filecommit: swallow some bits from _commitctx, add _
Matt Mackall <mpm@selenic.com>
parents:
8400
diff
changeset
|
2250 # are just the flags changed during merge? |
22492
d5261db0011f
commit: catch changed exec bit on files from p1 (issue4382)
Matt Mackall <mpm@selenic.com>
parents:
21866
diff
changeset
|
2251 elif fname in manifest1 and manifest1.flags(fname) != fctx.flags(): |
8401
ca7dc47eecc6
filecommit: swallow some bits from _commitctx, add _
Matt Mackall <mpm@selenic.com>
parents:
8400
diff
changeset
|
2252 changelist.append(fname) |
ca7dc47eecc6
filecommit: swallow some bits from _commitctx, add _
Matt Mackall <mpm@selenic.com>
parents:
8400
diff
changeset
|
2253 |
ca7dc47eecc6
filecommit: swallow some bits from _commitctx, add _
Matt Mackall <mpm@selenic.com>
parents:
8400
diff
changeset
|
2254 return fparent1 |
1716
ef8cd889a78b
Refactor excessive merge detection, add test
Matt Mackall <mpm@selenic.com>
parents:
1713
diff
changeset
|
2255 |
28813
d77b790bd8d6
localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents:
28198
diff
changeset
|
2256 def checkcommitpatterns(self, wctx, vdirs, match, status, fail): |
30332
318a24b52eeb
spelling: fixes of non-dictionary words
Mads Kiilerich <madski@unity3d.com>
parents:
30272
diff
changeset
|
2257 """check for commit arguments that aren't committable""" |
28814
1f65f291a5b7
localrepo: drop force check from checkcommitpatterns
timeless <timeless@mozdev.org>
parents:
28813
diff
changeset
|
2258 if match.isexact() or match.prefix(): |
28813
d77b790bd8d6
localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents:
28198
diff
changeset
|
2259 matched = set(status.modified + status.added + status.removed) |
d77b790bd8d6
localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents:
28198
diff
changeset
|
2260 |
d77b790bd8d6
localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents:
28198
diff
changeset
|
2261 for f in match.files(): |
d77b790bd8d6
localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents:
28198
diff
changeset
|
2262 f = self.dirstate.normalize(f) |
d77b790bd8d6
localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents:
28198
diff
changeset
|
2263 if f == '.' or f in matched or f in wctx.substate: |
d77b790bd8d6
localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents:
28198
diff
changeset
|
2264 continue |
d77b790bd8d6
localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents:
28198
diff
changeset
|
2265 if f in status.deleted: |
d77b790bd8d6
localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents:
28198
diff
changeset
|
2266 fail(f, _('file not found!')) |
d77b790bd8d6
localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents:
28198
diff
changeset
|
2267 if f in vdirs: # visited directory |
d77b790bd8d6
localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents:
28198
diff
changeset
|
2268 d = f + '/' |
d77b790bd8d6
localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents:
28198
diff
changeset
|
2269 for mf in matched: |
d77b790bd8d6
localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents:
28198
diff
changeset
|
2270 if mf.startswith(d): |
d77b790bd8d6
localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents:
28198
diff
changeset
|
2271 break |
d77b790bd8d6
localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents:
28198
diff
changeset
|
2272 else: |
d77b790bd8d6
localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents:
28198
diff
changeset
|
2273 fail(f, _("no match under directory!")) |
d77b790bd8d6
localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents:
28198
diff
changeset
|
2274 elif f not in self.dirstate: |
d77b790bd8d6
localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents:
28198
diff
changeset
|
2275 fail(f, _("file not tracked!")) |
d77b790bd8d6
localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents:
28198
diff
changeset
|
2276 |
18016
2a393df0f5cc
clfilter: rename `unfilteredmeth` to `unfilteredmethod`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18014
diff
changeset
|
2277 @unfilteredmethod |
8706
25e9c71b89de
commit: drop the now-unused files parameter
Matt Mackall <mpm@selenic.com>
parents:
8705
diff
changeset
|
2278 def commit(self, text="", user=None, date=None, match=None, force=False, |
26322
2cd19782d2d4
commit: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26321
diff
changeset
|
2279 editor=False, extra=None): |
8515
865e08a7d6b0
localrepo: update commit*() docstrings
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8503
diff
changeset
|
2280 """Add a new revision to current repository. |
865e08a7d6b0
localrepo: update commit*() docstrings
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8503
diff
changeset
|
2281 |
8706
25e9c71b89de
commit: drop the now-unused files parameter
Matt Mackall <mpm@selenic.com>
parents:
8705
diff
changeset
|
2282 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
|
2283 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
|
2284 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
|
2285 """ |
26322
2cd19782d2d4
commit: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26321
diff
changeset
|
2286 if extra is None: |
2cd19782d2d4
commit: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26321
diff
changeset
|
2287 extra = {} |
8709
b9e0ddb04c5c
commit: move explicit file checking into repo.commit
Matt Mackall <mpm@selenic.com>
parents:
8707
diff
changeset
|
2288 |
8715
8c667f4c482e
commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents:
8712
diff
changeset
|
2289 def fail(f, msg): |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26577
diff
changeset
|
2290 raise error.Abort('%s: %s' % (f, msg)) |
8715
8c667f4c482e
commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents:
8712
diff
changeset
|
2291 |
8c667f4c482e
commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents:
8712
diff
changeset
|
2292 if not match: |
10651
5f091fc1bab7
style: use consistent variable names (*mod) with imports which would shadow
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10547
diff
changeset
|
2293 match = matchmod.always(self.root, '') |
8715
8c667f4c482e
commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents:
8712
diff
changeset
|
2294 |
8c667f4c482e
commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents:
8712
diff
changeset
|
2295 if not force: |
8c667f4c482e
commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents:
8712
diff
changeset
|
2296 vdirs = [] |
19138
e579687cb5d8
localrepo.commit: hook into match.explicitdir
Siddharth Agarwal <sid0@fb.com>
parents:
19097
diff
changeset
|
2297 match.explicitdir = vdirs.append |
8715
8c667f4c482e
commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents:
8712
diff
changeset
|
2298 match.bad = fail |
8c667f4c482e
commit: move some setup outside the lock
Matt Mackall <mpm@selenic.com>
parents:
8712
diff
changeset
|
2299 |
26998
4414d500604f
localrepo: put bookmark move following commit in one transaction
Laurent Charignon <lcharignon@fb.com>
parents:
26996
diff
changeset
|
2300 wlock = lock = tr = None |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4914
diff
changeset
|
2301 try: |
26998
4414d500604f
localrepo: put bookmark move following commit in one transaction
Laurent Charignon <lcharignon@fb.com>
parents:
26996
diff
changeset
|
2302 wlock = self.wlock() |
27291
a18328aad48c
commit: make commit acquire store lock before processing for consistency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
27278
diff
changeset
|
2303 lock = self.lock() # for recent changelog (see issue4368) |
a18328aad48c
commit: make commit acquire store lock before processing for consistency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
27278
diff
changeset
|
2304 |
8813
db3c1ab0e632
commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents:
8799
diff
changeset
|
2305 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
|
2306 merge = len(wctx.parents()) > 1 |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
2307 |
32312
0d6b3572ad92
match: remove ispartial()
Martin von Zweigbergk <martinvonz@google.com>
parents:
32292
diff
changeset
|
2308 if not force and merge and not match.always(): |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26577
diff
changeset
|
2309 raise error.Abort(_('cannot partially commit a merge ' |
8397
613ac2856535
remove deprecated rawcommit
Matt Mackall <mpm@selenic.com>
parents:
8395
diff
changeset
|
2310 '(do not specify files or patterns)')) |
6706
716a1296e182
localrepo: replace dirstate by workingfilectx in filecommit()
Patrick Mezard <pmezard@gmail.com>
parents:
6705
diff
changeset
|
2311 |
22928
5e5d297ccbd0
localrepo: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22910
diff
changeset
|
2312 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
|
2313 if force: |
22928
5e5d297ccbd0
localrepo: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22910
diff
changeset
|
2314 status.modified.extend(status.clean) # mq may commit clean files |
3621
7d3d603e7df9
localrepo: factor commit and rawcommit
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3620
diff
changeset
|
2315 |
8813
db3c1ab0e632
commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents:
8799
diff
changeset
|
2316 # check subrepos |
36009
55e8efa2451a
subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents:
35896
diff
changeset
|
2317 subs, commitsubs, newstate = subrepoutil.precommit( |
35025
5c6b96b832c2
subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents:
34881
diff
changeset
|
2318 self.ui, wctx, status, match, force=force) |
8813
db3c1ab0e632
commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents:
8799
diff
changeset
|
2319 |
8709
b9e0ddb04c5c
commit: move explicit file checking into repo.commit
Matt Mackall <mpm@selenic.com>
parents:
8707
diff
changeset
|
2320 # make sure all explicit patterns are matched |
28813
d77b790bd8d6
localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents:
28198
diff
changeset
|
2321 if not force: |
d77b790bd8d6
localrepo: refactor commit argument check as checkcommitpatterns
timeless <timeless@mozdev.org>
parents:
28198
diff
changeset
|
2322 self.checkcommitpatterns(wctx, vdirs, match, status, fail) |
8709
b9e0ddb04c5c
commit: move explicit file checking into repo.commit
Matt Mackall <mpm@selenic.com>
parents:
8707
diff
changeset
|
2323 |
23710
745e3b485632
context: add workingcommitctx for exact context to be committed
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23667
diff
changeset
|
2324 cctx = context.workingcommitctx(self, status, |
745e3b485632
context: add workingcommitctx for exact context to be committed
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23667
diff
changeset
|
2325 text, user, date, extra) |
18659
b946470efed9
localrepo: create context used for actual commit earlier
David Schleimer <dschleimer@fb.com>
parents:
18644
diff
changeset
|
2326 |
25840
25897d778738
commit: mark internal-only option
Matt Mackall <mpm@selenic.com>
parents:
25839
diff
changeset
|
2327 # internal config: ui.allowemptycommit |
25021
9a74b9919581
commit: no longer allow empty commit with the 'force' argument (API)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25018
diff
changeset
|
2328 allowemptycommit = (wctx.branch() != wctx.p1().branch() |
25018
93e015a3d1ea
commit: add ui.allowemptycommit config option
Durham Goode <durham@fb.com>
parents:
25017
diff
changeset
|
2329 or extra.get('close') or merge or cctx.files() |
93e015a3d1ea
commit: add ui.allowemptycommit config option
Durham Goode <durham@fb.com>
parents:
25017
diff
changeset
|
2330 or self.ui.configbool('ui', 'allowemptycommit')) |
25017
4e857213d2d1
commit: move empty commit condition to a new line
Durham Goode <durham@fb.com>
parents:
24992
diff
changeset
|
2331 if not allowemptycommit: |
8404
a2bc39ade36b
commit: move 'nothing changed' test into commit()
Matt Mackall <mpm@selenic.com>
parents:
8403
diff
changeset
|
2332 return None |
a2bc39ade36b
commit: move 'nothing changed' test into commit()
Matt Mackall <mpm@selenic.com>
parents:
8403
diff
changeset
|
2333 |
18660
7e6946ed5756
localrepo: use workingctx for validation in commit
David Schleimer <dschleimer@fb.com>
parents:
18659
diff
changeset
|
2334 if merge and cctx.deleted(): |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26577
diff
changeset
|
2335 raise error.Abort(_("cannot commit merge with missing files")) |
16536
63c817ea4a70
commit: abort on merge with missing files
Patrick Mezard <patrick@mezard.eu>
parents:
16456
diff
changeset
|
2336 |
26996
bf3eec62212f
localrepo.commit: switch to mergestate.read()
Siddharth Agarwal <sid0@fb.com>
parents:
26989
diff
changeset
|
2337 ms = mergemod.mergestate.read(self) |
30496
a90867a22daf
localrepo: refer to checkunresolved by its new name
Augie Fackler <augie@google.com>
parents:
30492
diff
changeset
|
2338 mergeutil.checkunresolved(ms) |
8496
a21605de1509
commit: move editor outside transaction
Matt Mackall <mpm@selenic.com>
parents:
8481
diff
changeset
|
2339 |
a21605de1509
commit: move editor outside transaction
Matt Mackall <mpm@selenic.com>
parents:
8481
diff
changeset
|
2340 if editor: |
8994
4a1187d3cb00
commit: report modified subrepos in commit editor
Matt Mackall <mpm@selenic.com>
parents:
8954
diff
changeset
|
2341 cctx._text = editor(self, cctx, subs) |
9935
48b81d9bca8d
commit: if relevant, tell user their commit message was saved.
Greg Ward <greg-hg@gerg.ca>
parents:
9934
diff
changeset
|
2342 edited = (text != cctx._text) |
8813
db3c1ab0e632
commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents:
8799
diff
changeset
|
2343 |
20765
f042d4b263f4
localrepo: save manually edited commit message as soon as possible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20332
diff
changeset
|
2344 # 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
|
2345 # (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
|
2346 # 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
|
2347 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
|
2348 |
16073
b254f827b7a6
subrepo: rewrite handling of subrepo state at commit (issue2403)
Matt Mackall <mpm@selenic.com>
parents:
16030
diff
changeset
|
2349 # 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
|
2350 if subs: |
b254f827b7a6
subrepo: rewrite handling of subrepo state at commit (issue2403)
Matt Mackall <mpm@selenic.com>
parents:
16030
diff
changeset
|
2351 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
|
2352 sub = wctx.sub(s) |
4a9bee613737
subrepo: print paths relative to upper repo root for push/pull/commit
Edouard Gomez <ed.gomez@free.fr>
parents:
11063
diff
changeset
|
2353 self.ui.status(_('committing subrepository %s\n') % |
36009
55e8efa2451a
subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents:
35896
diff
changeset
|
2354 subrepoutil.subrelpath(sub)) |
11112
4a9bee613737
subrepo: print paths relative to upper repo root for push/pull/commit
Edouard Gomez <ed.gomez@free.fr>
parents:
11063
diff
changeset
|
2355 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
|
2356 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
|
2357 subrepoutil.writestate(self, newstate) |
8813
db3c1ab0e632
commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents:
8799
diff
changeset
|
2358 |
10970
3213e8947975
localrepo.commit: use explicit variables, avoid creating new contexts
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10969
diff
changeset
|
2359 p1, p2 = self.dirstate.parents() |
3213e8947975
localrepo.commit: use explicit variables, avoid creating new contexts
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10969
diff
changeset
|
2360 hookp1, hookp2 = hex(p1), (p2 != nullid and hex(p2) or '') |
9935
48b81d9bca8d
commit: if relevant, tell user their commit message was saved.
Greg Ward <greg-hg@gerg.ca>
parents:
9934
diff
changeset
|
2361 try: |
16683 | 2362 self.hook("precommit", throw=True, parent1=hookp1, |
2363 parent2=hookp2) | |
26998
4414d500604f
localrepo: put bookmark move following commit in one transaction
Laurent Charignon <lcharignon@fb.com>
parents:
26996
diff
changeset
|
2364 tr = self.transaction('commit') |
9935
48b81d9bca8d
commit: if relevant, tell user their commit message was saved.
Greg Ward <greg-hg@gerg.ca>
parents:
9934
diff
changeset
|
2365 ret = self.commitctx(cctx, True) |
16705
c2d9ef43ff6c
check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents:
16699
diff
changeset
|
2366 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
|
2367 if edited: |
48b81d9bca8d
commit: if relevant, tell user their commit message was saved.
Greg Ward <greg-hg@gerg.ca>
parents:
9934
diff
changeset
|
2368 self.ui.write( |
48b81d9bca8d
commit: if relevant, tell user their commit message was saved.
Greg Ward <greg-hg@gerg.ca>
parents:
9934
diff
changeset
|
2369 _('note: commit message saved in %s\n') % msgfn) |
48b81d9bca8d
commit: if relevant, tell user their commit message was saved.
Greg Ward <greg-hg@gerg.ca>
parents:
9934
diff
changeset
|
2370 raise |
13357
b67867940bd1
bookmarks: move commit action into core
Matt Mackall <mpm@selenic.com>
parents:
13356
diff
changeset
|
2371 # update bookmarks, dirstate and mergestate |
16706
a270ec977ba6
bookmarks: delete divergent bookmarks on merge
David Soria Parra <dsp@php.net>
parents:
16705
diff
changeset
|
2372 bookmarks.update(self, [p1, p2], ret) |
18661
4fb92f14a97a
commit: factor out post-commit cleanup into workingctx
David Schleimer <dschleimer@fb.com>
parents:
18660
diff
changeset
|
2373 cctx.markcommitted(ret) |
8503
90f86a5330bb
commit: tidy up mergestate slightly
Matt Mackall <mpm@selenic.com>
parents:
8502
diff
changeset
|
2374 ms.reset() |
26998
4414d500604f
localrepo: put bookmark move following commit in one transaction
Laurent Charignon <lcharignon@fb.com>
parents:
26996
diff
changeset
|
2375 tr.close() |
4414d500604f
localrepo: put bookmark move following commit in one transaction
Laurent Charignon <lcharignon@fb.com>
parents:
26996
diff
changeset
|
2376 |
6710
0aa91f69a4c4
localrepo: extract _commitctx() from commit()
Patrick Mezard <pmezard@gmail.com>
parents:
6709
diff
changeset
|
2377 finally: |
26998
4414d500604f
localrepo: put bookmark move following commit in one transaction
Laurent Charignon <lcharignon@fb.com>
parents:
26996
diff
changeset
|
2378 lockmod.release(tr, lock, wlock) |
6710
0aa91f69a4c4
localrepo: extract _commitctx() from commit()
Patrick Mezard <pmezard@gmail.com>
parents:
6709
diff
changeset
|
2379 |
16680
d0e419b0f7de
tag: run commit hook when lock is released (issue3344)
Mads Kiilerich <mads@kiilerich.com>
parents:
16679
diff
changeset
|
2380 def commithook(node=hex(ret), parent1=hookp1, parent2=hookp2): |
23129
eb315418224c
hook: protect commit hooks against stripping of temporary commit (issue4422)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23126
diff
changeset
|
2381 # 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
|
2382 # 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
|
2383 if self.changelog.hasnode(ret): |
23129
eb315418224c
hook: protect commit hooks against stripping of temporary commit (issue4422)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23126
diff
changeset
|
2384 self.hook("commit", node=node, parent1=parent1, |
eb315418224c
hook: protect commit hooks against stripping of temporary commit (issue4422)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23126
diff
changeset
|
2385 parent2=parent2) |
16680
d0e419b0f7de
tag: run commit hook when lock is released (issue3344)
Mads Kiilerich <mads@kiilerich.com>
parents:
16679
diff
changeset
|
2386 self._afterlock(commithook) |
10492
0e64d814d7d0
run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents:
10435
diff
changeset
|
2387 return ret |
0e64d814d7d0
run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents:
10435
diff
changeset
|
2388 |
18016
2a393df0f5cc
clfilter: rename `unfilteredmeth` to `unfilteredmethod`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18014
diff
changeset
|
2389 @unfilteredmethod |
8496
a21605de1509
commit: move editor outside transaction
Matt Mackall <mpm@selenic.com>
parents:
8481
diff
changeset
|
2390 def commitctx(self, ctx, error=False): |
7077
ccbd39cad3c3
context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents:
7072
diff
changeset
|
2391 """Add a new revision to current repository. |
8410
1d11d985c179
commit: combine _commitctx and commitctx, drop unused force argument
Matt Mackall <mpm@selenic.com>
parents:
8407
diff
changeset
|
2392 Revision information is passed via the context argument. |
39111
46da52f4b820
commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents:
39109
diff
changeset
|
2393 |
46da52f4b820
commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents:
39109
diff
changeset
|
2394 ctx.files() should list all files involved in this commit, i.e. |
46da52f4b820
commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents:
39109
diff
changeset
|
2395 modified/added/removed files. On merge, it may be wider than the |
46da52f4b820
commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents:
39109
diff
changeset
|
2396 ctx.files() to be committed, since any file nodes derived directly |
46da52f4b820
commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents:
39109
diff
changeset
|
2397 from p1 or p2 are excluded from the committed ctx.files(). |
7077
ccbd39cad3c3
context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents:
7072
diff
changeset
|
2398 """ |
6715
a3c41abfa828
context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents:
6712
diff
changeset
|
2399 |
22908
71570f310417
commit: remove dead initialization of 'lock'
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22907
diff
changeset
|
2400 tr = None |
8414
2348ce25849b
commitctx: use contexts more fully
Matt Mackall <mpm@selenic.com>
parents:
8412
diff
changeset
|
2401 p1, p2 = ctx.p1(), ctx.p2() |
8412
2bf4f380f6ab
commitctx: eliminate some variables
Matt Mackall <mpm@selenic.com>
parents:
8411
diff
changeset
|
2402 user = ctx.user() |
990 | 2403 |
8411
4d5916358abd
commit: move lots of commitctx outside of the repo lock
Matt Mackall <mpm@selenic.com>
parents:
8410
diff
changeset
|
2404 lock = self.lock() |
4d5916358abd
commit: move lots of commitctx outside of the repo lock
Matt Mackall <mpm@selenic.com>
parents:
8410
diff
changeset
|
2405 try: |
10881
a685011ed38e
localrepo: add desc parameter to transaction
Steve Borho <steve@borho.org>
parents:
10877
diff
changeset
|
2406 tr = self.transaction("commit") |
4970
30d4d8985dd8
transactions: avoid late tear-down (issue641)
Matt Mackall <mpm@selenic.com>
parents:
4917
diff
changeset
|
2407 trp = weakref.proxy(tr) |
151 | 2408 |
30566
46d2c8b23c33
localrepo: make it possible to reuse manifest when commiting context
Mateusz Kwapich <mitrandir@fb.com>
parents:
30496
diff
changeset
|
2409 if ctx.manifestnode(): |
46d2c8b23c33
localrepo: make it possible to reuse manifest when commiting context
Mateusz Kwapich <mitrandir@fb.com>
parents:
30496
diff
changeset
|
2410 # reuse an existing manifest revision |
39109
a915db9a5e77
commit: add debug message regarding manifest reuse
Yuya Nishihara <yuya@tcha.org>
parents:
38986
diff
changeset
|
2411 self.ui.debug('reusing known manifest\n') |
30566
46d2c8b23c33
localrepo: make it possible to reuse manifest when commiting context
Mateusz Kwapich <mitrandir@fb.com>
parents:
30496
diff
changeset
|
2412 mn = ctx.manifestnode() |
46d2c8b23c33
localrepo: make it possible to reuse manifest when commiting context
Mateusz Kwapich <mitrandir@fb.com>
parents:
30496
diff
changeset
|
2413 files = ctx.files() |
46d2c8b23c33
localrepo: make it possible to reuse manifest when commiting context
Mateusz Kwapich <mitrandir@fb.com>
parents:
30496
diff
changeset
|
2414 elif ctx.files(): |
30345
fa54f7ade491
manifest: remove manifest.add and add memmfctx.write
Durham Goode <durham@fb.com>
parents:
30332
diff
changeset
|
2415 m1ctx = p1.manifestctx() |
fa54f7ade491
manifest: remove manifest.add and add memmfctx.write
Durham Goode <durham@fb.com>
parents:
30332
diff
changeset
|
2416 m2ctx = p2.manifestctx() |
fa54f7ade491
manifest: remove manifest.add and add memmfctx.write
Durham Goode <durham@fb.com>
parents:
30332
diff
changeset
|
2417 mctx = m1ctx.copy() |
fa54f7ade491
manifest: remove manifest.add and add memmfctx.write
Durham Goode <durham@fb.com>
parents:
30332
diff
changeset
|
2418 |
fa54f7ade491
manifest: remove manifest.add and add memmfctx.write
Durham Goode <durham@fb.com>
parents:
30332
diff
changeset
|
2419 m = mctx.read() |
fa54f7ade491
manifest: remove manifest.add and add memmfctx.write
Durham Goode <durham@fb.com>
parents:
30332
diff
changeset
|
2420 m1 = m1ctx.read() |
fa54f7ade491
manifest: remove manifest.add and add memmfctx.write
Durham Goode <durham@fb.com>
parents:
30332
diff
changeset
|
2421 m2 = m2ctx.read() |
14162
301725c3df9a
localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14155
diff
changeset
|
2422 |
301725c3df9a
localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14155
diff
changeset
|
2423 # check in files |
22910
4f2a5c7cdf78
commit: update file nodeid and flags in the same place
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22909
diff
changeset
|
2424 added = [] |
14162
301725c3df9a
localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14155
diff
changeset
|
2425 changed = [] |
22907
a337f4b9b99d
commit: reduce scope of 'removed' variable
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22852
diff
changeset
|
2426 removed = list(ctx.removed()) |
14162
301725c3df9a
localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14155
diff
changeset
|
2427 linkrev = len(self) |
23749
a387b0390082
localrepo: show headline notes in commitctx before showing filenames
Mads Kiilerich <madski@unity3d.com>
parents:
23714
diff
changeset
|
2428 self.ui.note(_("committing files:\n")) |
14162
301725c3df9a
localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14155
diff
changeset
|
2429 for f in sorted(ctx.modified() + ctx.added()): |
301725c3df9a
localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14155
diff
changeset
|
2430 self.ui.note(f + "\n") |
301725c3df9a
localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14155
diff
changeset
|
2431 try: |
301725c3df9a
localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14155
diff
changeset
|
2432 fctx = ctx[f] |
22296
650b5b6e75ed
convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents:
22201
diff
changeset
|
2433 if fctx is None: |
650b5b6e75ed
convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents:
22201
diff
changeset
|
2434 removed.append(f) |
650b5b6e75ed
convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents:
22201
diff
changeset
|
2435 else: |
22910
4f2a5c7cdf78
commit: update file nodeid and flags in the same place
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22909
diff
changeset
|
2436 added.append(f) |
4f2a5c7cdf78
commit: update file nodeid and flags in the same place
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22909
diff
changeset
|
2437 m[f] = self._filecommit(fctx, m1, m2, linkrev, |
4f2a5c7cdf78
commit: update file nodeid and flags in the same place
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22909
diff
changeset
|
2438 trp, changed) |
22942
03602f76deee
manifest: rename ambiguously-named set to setflag
Augie Fackler <raf@durin42.com>
parents:
22928
diff
changeset
|
2439 m.setflag(f, fctx.flags()) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25629
diff
changeset
|
2440 except OSError as inst: |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4914
diff
changeset
|
2441 self.ui.warn(_("trouble committing %s!\n") % f) |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4914
diff
changeset
|
2442 raise |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25629
diff
changeset
|
2443 except IOError as inst: |
14162
301725c3df9a
localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14155
diff
changeset
|
2444 errcode = getattr(inst, 'errno', errno.ENOENT) |
301725c3df9a
localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14155
diff
changeset
|
2445 if error or errcode and errcode != errno.ENOENT: |
301725c3df9a
localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14155
diff
changeset
|
2446 self.ui.warn(_("trouble committing %s!\n") % f) |
22296
650b5b6e75ed
convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents:
22201
diff
changeset
|
2447 raise |
220 | 2448 |
14162
301725c3df9a
localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14155
diff
changeset
|
2449 # update manifest |
301725c3df9a
localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14155
diff
changeset
|
2450 removed = [f for f in sorted(removed) if f in m1 or f in m2] |
22909
4545c5b53013
commit: use separate variable for p1 manifest and new manifest
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22908
diff
changeset
|
2451 drop = [f for f in removed if f in m] |
14162
301725c3df9a
localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14155
diff
changeset
|
2452 for f in drop: |
22909
4545c5b53013
commit: use separate variable for p1 manifest and new manifest
Martin von Zweigbergk <martinvonz@gmail.com>
parents:
22908
diff
changeset
|
2453 del m[f] |
14162
301725c3df9a
localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14155
diff
changeset
|
2454 files = changed + removed |
39111
46da52f4b820
commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents:
39109
diff
changeset
|
2455 md = None |
46da52f4b820
commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents:
39109
diff
changeset
|
2456 if not files: |
46da52f4b820
commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents:
39109
diff
changeset
|
2457 # if no "files" actually changed in terms of the changelog, |
46da52f4b820
commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents:
39109
diff
changeset
|
2458 # try hard to detect unmodified manifest entry so that the |
46da52f4b820
commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents:
39109
diff
changeset
|
2459 # exact same commit can be reproduced later on convert. |
46da52f4b820
commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents:
39109
diff
changeset
|
2460 md = m1.diff(m, scmutil.matchfiles(self, ctx.files())) |
46da52f4b820
commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents:
39109
diff
changeset
|
2461 if not files and md: |
46da52f4b820
commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents:
39109
diff
changeset
|
2462 self.ui.debug('not reusing manifest (no file change in ' |
46da52f4b820
commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents:
39109
diff
changeset
|
2463 'changelog, but manifest differs)\n') |
46da52f4b820
commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents:
39109
diff
changeset
|
2464 if files or md: |
46da52f4b820
commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents:
39109
diff
changeset
|
2465 self.ui.note(_("committing manifest\n")) |
39668
24870f1be088
narrow: when writing treemanifests, skip inspecting directories outside narrow
spectral <spectral@google.com>
parents:
39606
diff
changeset
|
2466 # we're using narrowmatch here since it's already applied at |
24870f1be088
narrow: when writing treemanifests, skip inspecting directories outside narrow
spectral <spectral@google.com>
parents:
39606
diff
changeset
|
2467 # other stages (such as dirstate.walk), so we're already |
24870f1be088
narrow: when writing treemanifests, skip inspecting directories outside narrow
spectral <spectral@google.com>
parents:
39606
diff
changeset
|
2468 # ignoring things outside of narrowspec in most cases. The |
24870f1be088
narrow: when writing treemanifests, skip inspecting directories outside narrow
spectral <spectral@google.com>
parents:
39606
diff
changeset
|
2469 # one case where we might have files outside the narrowspec |
24870f1be088
narrow: when writing treemanifests, skip inspecting directories outside narrow
spectral <spectral@google.com>
parents:
39606
diff
changeset
|
2470 # at this point is merges, and we already error out in the |
24870f1be088
narrow: when writing treemanifests, skip inspecting directories outside narrow
spectral <spectral@google.com>
parents:
39606
diff
changeset
|
2471 # case where the merge has files outside of the narrowspec, |
24870f1be088
narrow: when writing treemanifests, skip inspecting directories outside narrow
spectral <spectral@google.com>
parents:
39606
diff
changeset
|
2472 # so this is safe. |
39111
46da52f4b820
commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents:
39109
diff
changeset
|
2473 mn = mctx.write(trp, linkrev, |
46da52f4b820
commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents:
39109
diff
changeset
|
2474 p1.manifestnode(), p2.manifestnode(), |
39668
24870f1be088
narrow: when writing treemanifests, skip inspecting directories outside narrow
spectral <spectral@google.com>
parents:
39606
diff
changeset
|
2475 added, drop, match=self.narrowmatch()) |
39111
46da52f4b820
commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents:
39109
diff
changeset
|
2476 else: |
46da52f4b820
commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents:
39109
diff
changeset
|
2477 self.ui.debug('reusing manifest form p1 (listed files ' |
46da52f4b820
commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents:
39109
diff
changeset
|
2478 'actually unchanged)\n') |
46da52f4b820
commit: try hard to reuse p1 manifest if nothing changed
Yuya Nishihara <yuya@tcha.org>
parents:
39109
diff
changeset
|
2479 mn = p1.manifestnode() |
14162
301725c3df9a
localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14155
diff
changeset
|
2480 else: |
39109
a915db9a5e77
commit: add debug message regarding manifest reuse
Yuya Nishihara <yuya@tcha.org>
parents:
38986
diff
changeset
|
2481 self.ui.debug('reusing manifest from p1 (no file change)\n') |
14162
301725c3df9a
localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14155
diff
changeset
|
2482 mn = p1.manifestnode() |
301725c3df9a
localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14155
diff
changeset
|
2483 files = [] |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
2484 |
8499
fb9b83df45f3
commit: move description trimming into changelog
Matt Mackall <mpm@selenic.com>
parents:
8498
diff
changeset
|
2485 # update changelog |
23749
a387b0390082
localrepo: show headline notes in commitctx before showing filenames
Mads Kiilerich <madski@unity3d.com>
parents:
23714
diff
changeset
|
2486 self.ui.note(_("committing changelog\n")) |
23203
3872d563e01a
changelog: handle writepending in the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23129
diff
changeset
|
2487 self.changelog.delayupdate(tr) |
14162
301725c3df9a
localrepo: reuse parent manifest in commitctx if no files have changed
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14155
diff
changeset
|
2488 n = self.changelog.add(mn, files, ctx.description(), |
8499
fb9b83df45f3
commit: move description trimming into changelog
Matt Mackall <mpm@selenic.com>
parents:
8498
diff
changeset
|
2489 trp, p1.node(), p2.node(), |
8412
2bf4f380f6ab
commitctx: eliminate some variables
Matt Mackall <mpm@selenic.com>
parents:
8411
diff
changeset
|
2490 user, ctx.date(), ctx.extra().copy()) |
10492
0e64d814d7d0
run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents:
10435
diff
changeset
|
2491 xp1, xp2 = p1.hex(), p2 and p2.hex() or '' |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4914
diff
changeset
|
2492 self.hook('pretxncommit', throw=True, node=hex(n), parent1=xp1, |
26751
520defbc0335
hook: centralize passing HG_PENDING to external hook process
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
26748
diff
changeset
|
2493 parent2=xp2) |
15706
ebaefd8c6028
Add a phases.new-commit option to control minimal phase of new commit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15659
diff
changeset
|
2494 # set the new commit is proper phase |
36009
55e8efa2451a
subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents:
35896
diff
changeset
|
2495 targetphase = subrepoutil.newcommitphase(self.ui, ctx) |
15706
ebaefd8c6028
Add a phases.new-commit option to control minimal phase of new commit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15659
diff
changeset
|
2496 if targetphase: |
ebaefd8c6028
Add a phases.new-commit option to control minimal phase of new commit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15659
diff
changeset
|
2497 # retract boundary do not alter parent changeset. |
ebaefd8c6028
Add a phases.new-commit option to control minimal phase of new commit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15659
diff
changeset
|
2498 # if a parent have higher the resulting phase will |
ebaefd8c6028
Add a phases.new-commit option to control minimal phase of new commit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15659
diff
changeset
|
2499 # be compliant anyway |
ebaefd8c6028
Add a phases.new-commit option to control minimal phase of new commit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15659
diff
changeset
|
2500 # |
ebaefd8c6028
Add a phases.new-commit option to control minimal phase of new commit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15659
diff
changeset
|
2501 # if minimal phase was 0 we don't need to retract anything |
33454
3c20d7ef42e1
localrepo: use the 'registernew' function to set the phase of new commit
Boris Feld <boris.feld@octobus.net>
parents:
33451
diff
changeset
|
2502 phases.registernew(self, tr, targetphase, [n]) |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4914
diff
changeset
|
2503 tr.close() |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4914
diff
changeset
|
2504 return n |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4914
diff
changeset
|
2505 finally: |
11230
5116a077c3da
make transactions work on non-refcounted python implementations
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
11228
diff
changeset
|
2506 if tr: |
5116a077c3da
make transactions work on non-refcounted python implementations
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
11228
diff
changeset
|
2507 tr.release() |
8405
7cbf8fcd2453
commit: push repo lock down into _commitctx
Matt Mackall <mpm@selenic.com>
parents:
8404
diff
changeset
|
2508 lock.release() |
660
2c83350784c3
Move commit hook after commit completes
Matt Mackall <mpm@selenic.com>
parents:
659
diff
changeset
|
2509 |
18016
2a393df0f5cc
clfilter: rename `unfilteredmeth` to `unfilteredmethod`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18014
diff
changeset
|
2510 @unfilteredmethod |
18310
4499ba5ac35c
localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents:
18309
diff
changeset
|
2511 def destroying(self): |
4499ba5ac35c
localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents:
18309
diff
changeset
|
2512 '''Inform the repository that nodes are about to be destroyed. |
4499ba5ac35c
localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents:
18309
diff
changeset
|
2513 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
|
2514 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
|
2515 |
4499ba5ac35c
localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents:
18309
diff
changeset
|
2516 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
|
2517 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
|
2518 destroyed is imminent, the repo will be invalidated causing those |
4499ba5ac35c
localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents:
18309
diff
changeset
|
2519 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
|
2520 completely. |
4499ba5ac35c
localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents:
18309
diff
changeset
|
2521 ''' |
18312
7331ee72f99c
localrepo: write the phasecache when destroying nodes
Idan Kamara <idankk86@gmail.com>
parents:
18311
diff
changeset
|
2522 # 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
|
2523 # 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
|
2524 # causing those changes to disappear. |
7331ee72f99c
localrepo: write the phasecache when destroying nodes
Idan Kamara <idankk86@gmail.com>
parents:
18311
diff
changeset
|
2525 if '_phasecache' in vars(self): |
7331ee72f99c
localrepo: write the phasecache when destroying nodes
Idan Kamara <idankk86@gmail.com>
parents:
18311
diff
changeset
|
2526 self._phasecache.write() |
7331ee72f99c
localrepo: write the phasecache when destroying nodes
Idan Kamara <idankk86@gmail.com>
parents:
18311
diff
changeset
|
2527 |
18310
4499ba5ac35c
localrepo: introduce destroying function
Idan Kamara <idankk86@gmail.com>
parents:
18309
diff
changeset
|
2528 @unfilteredmethod |
18395
904b7109938e
destroyed: drop complex branchcache rebuilt logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18394
diff
changeset
|
2529 def destroyed(self): |
9150
09a1ee498756
localrepo: add destroyed() method for strip/rollback to use (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
2530 '''Inform the repository that nodes have been destroyed. |
09a1ee498756
localrepo: add destroyed() method for strip/rollback to use (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9149
diff
changeset
|
2531 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
|
2532 place for anything that has to be done after destroying history. |
c8eda7bbdcab
strip: incrementally update the branchheads cache after a strip
Joshua Redstone <joshua.redstone@fb.com>
parents:
17012
diff
changeset
|
2533 ''' |
18221
082d6929fd4d
localrepo: filter unknown nodes from the phasecache on destroyed
Idan Kamara <idankk86@gmail.com>
parents:
18219
diff
changeset
|
2534 # When one tries to: |
082d6929fd4d
localrepo: filter unknown nodes from the phasecache on destroyed
Idan Kamara <idankk86@gmail.com>
parents:
18219
diff
changeset
|
2535 # 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
|
2536 # 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
|
2537 # |
082d6929fd4d
localrepo: filter unknown nodes from the phasecache on destroyed
Idan Kamara <idankk86@gmail.com>
parents:
18219
diff
changeset
|
2538 # 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
|
2539 # 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
|
2540 # 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
|
2541 # 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
|
2542 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
|
2543 self._phasecache.write() |
18221
082d6929fd4d
localrepo: filter unknown nodes from the phasecache on destroyed
Idan Kamara <idankk86@gmail.com>
parents:
18219
diff
changeset
|
2544 |
32264
a72caf0af38e
caches: call 'repo.updatecache()' in 'repo.destroyed()'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
32263
diff
changeset
|
2545 # 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
|
2546 self.updatecaches() |
18223
6d6d0248530b
destroyed: filter unknown before computing branchcache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18222
diff
changeset
|
2547 |
9151
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9150
diff
changeset
|
2548 # 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
|
2549 # 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
|
2550 # 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
|
2551 # guarantees that "cachetip == currenttip" (comparing both rev |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9150
diff
changeset
|
2552 # 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
|
2553 |
f528d1a93491
tags: implement persistent tag caching (issue548).
Greg Ward <greg-hg@gerg.ca>
parents:
9150
diff
changeset
|
2554 # 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
|
2555 # 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
|
2556 # 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
|
2557 # 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
|
2558 self.invalidate() |
17324
9f94358f9f93
localrepo: clear the filecache on _rollback() and destroyed()
Idan Kamara <idankk86@gmail.com>
parents:
17306
diff
changeset
|
2559 |
6769 | 2560 def status(self, node1='.', node2=None, match=None, |
12166
441a74b8def1
status: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents:
12162
diff
changeset
|
2561 ignored=False, clean=False, unknown=False, |
441a74b8def1
status: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents:
12162
diff
changeset
|
2562 listsubrepos=False): |
21596
83bbfb23cb24
localrepo: replace status method with a shim
Sean Farley <sean.michael.farley@gmail.com>
parents:
21591
diff
changeset
|
2563 '''a convenience method that calls node1.status(node2)''' |
83bbfb23cb24
localrepo: replace status method with a shim
Sean Farley <sean.michael.farley@gmail.com>
parents:
21591
diff
changeset
|
2564 return self[node1].status(node2, match, ignored, clean, unknown, |
83bbfb23cb24
localrepo: replace status method with a shim
Sean Farley <sean.michael.farley@gmail.com>
parents:
21591
diff
changeset
|
2565 listsubrepos) |
2661
5c10b7ed3411
status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2621
diff
changeset
|
2566 |
32814
2083d1643d69
workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents:
32730
diff
changeset
|
2567 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
|
2568 """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
|
2569 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
|
2570 |
2083d1643d69
workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents:
32730
diff
changeset
|
2571 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
|
2572 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
|
2573 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
|
2574 |
2083d1643d69
workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents:
32730
diff
changeset
|
2575 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
|
2576 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
|
2577 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
|
2578 |
2083d1643d69
workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents:
32730
diff
changeset
|
2579 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
|
2580 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
|
2581 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
|
2582 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
|
2583 """ |
2083d1643d69
workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents:
32730
diff
changeset
|
2584 |
2083d1643d69
workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents:
32730
diff
changeset
|
2585 # 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
|
2586 # 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
|
2587 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
|
2588 |
2083d1643d69
workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents:
32730
diff
changeset
|
2589 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
|
2590 """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
|
2591 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
|
2592 |
2083d1643d69
workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents:
32730
diff
changeset
|
2593 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
|
2594 """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
|
2595 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
|
2596 |
8796
2bcef677a6c3
localrepo: remove 'closed' argument to heads(...) function
John Mulligan <phlogistonjohn@asynchrono.us>
parents:
8731
diff
changeset
|
2597 def heads(self, start=None): |
30875
1791be8a95c5
localrepo: avoid unnecessary conversion from node to rev
Stanislau Hlebik <stash@fb.com>
parents:
30818
diff
changeset
|
2598 if start is None: |
30905
6037caa6a2f3
localrepo: cache self.changelog in local variable
Stanislau Hlebik <stash@fb.com>
parents:
30875
diff
changeset
|
2599 cl = self.changelog |
30906
72f25e17af9d
localrepo: avoid unnecessary sorting
Stanislau Hlebik <stash@fb.com>
parents:
30905
diff
changeset
|
2600 headrevs = reversed(cl.headrevs()) |
30905
6037caa6a2f3
localrepo: cache self.changelog in local variable
Stanislau Hlebik <stash@fb.com>
parents:
30875
diff
changeset
|
2601 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
|
2602 |
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
|
2603 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
|
2604 # 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
|
2605 return sorted(heads, key=self.changelog.rev, reverse=True) |
222 | 2606 |
8694
ca8d05e1f1d1
localrepo: set heads and branchheads to be closed=False by default
John Mulligan <phlogistonjohn@asynchrono.us>
parents:
8680
diff
changeset
|
2607 def branchheads(self, branch=None, start=None, closed=False): |
9475
c295a82a020b
localrepo: fix bugs in branchheads and add docstring
Sune Foldager <cryo@cyanite.org>
parents:
9423
diff
changeset
|
2608 '''return a (possibly filtered) list of heads for the given branch |
c295a82a020b
localrepo: fix bugs in branchheads and add docstring
Sune Foldager <cryo@cyanite.org>
parents:
9423
diff
changeset
|
2609 |
c295a82a020b
localrepo: fix bugs in branchheads and add docstring
Sune Foldager <cryo@cyanite.org>
parents:
9423
diff
changeset
|
2610 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
|
2611 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
|
2612 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
|
2613 If closed is True, return heads that are marked as closed as well. |
c295a82a020b
localrepo: fix bugs in branchheads and add docstring
Sune Foldager <cryo@cyanite.org>
parents:
9423
diff
changeset
|
2614 ''' |
6747
f6c00b17387c
use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents:
6743
diff
changeset
|
2615 if branch is None: |
f6c00b17387c
use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents:
6743
diff
changeset
|
2616 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
|
2617 branches = self.branchmap() |
4648
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
2618 if branch not in branches: |
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
2619 return [] |
7654
816b708f23af
store all heads of a branch in the branch cache
John Mulligan <phlogistonjohn@asynchrono.us>
parents:
7644
diff
changeset
|
2620 # 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
|
2621 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
|
2622 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
|
2623 # 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
|
2624 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
|
2625 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
|
2626 return bheads |
4648
8e503fa54d2d
Add option to heads to show only heads for current branch.
Eric Hopper <hopper@omnifarious.org>
parents:
4635
diff
changeset
|
2627 |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
2628 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
|
2629 if not nodes: |
83238c1db6de
Cleanup of indentation, spacing, newlines, strings and line length
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1597
diff
changeset
|
2630 nodes = [self.changelog.tip()] |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
2631 b = [] |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
2632 for n in nodes: |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
2633 t = n |
14494
1ffeeb91c55d
check-code: flag 0/1 used as constant Boolean expression
Martin Geisler <mg@lazybytes.net>
parents:
14482
diff
changeset
|
2634 while True: |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
2635 p = self.changelog.parents(n) |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
2636 if p[1] != nullid or p[0] == nullid: |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
2637 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
|
2638 break |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
2639 n = p[0] |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
2640 return b |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
2641 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
2642 def between(self, pairs): |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
2643 r = [] |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
2644 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
2645 for top, bottom in pairs: |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
2646 n, l, i = top, [], 0 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
2647 f = 1 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
2648 |
7708
a32847fa0df0
wire protocol: avoid infinite loop (issue1483)
Matt Mackall <mpm@selenic.com>
parents:
7564
diff
changeset
|
2649 while n != bottom and n != nullid: |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
2650 p = self.changelog.parents(n)[0] |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
2651 if i == f: |
575 | 2652 l.append(n) |
56
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
2653 f = f * 2 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
2654 n = p |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
2655 i += 1 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
2656 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
2657 r.append(l) |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
2658 |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
2659 return r |
ad2ea1185f04
Add getchangegroup code to efficiently calculate and request a changegroup
mpm@selenic.com
parents:
55
diff
changeset
|
2660 |
20924
e10000369b47
push: pass a `pushoperation` object to localrepo.checkpush
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
20884
diff
changeset
|
2661 def checkpush(self, pushop): |
13327
dc11e30b48a3
mq: factor out push conditions checks
Patrick Mezard <pmezard@gmail.com>
parents:
13272
diff
changeset
|
2662 """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
|
2663 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
|
2664 command. |
dc11e30b48a3
mq: factor out push conditions checks
Patrick Mezard <pmezard@gmail.com>
parents:
13272
diff
changeset
|
2665 """ |
dc11e30b48a3
mq: factor out push conditions checks
Patrick Mezard <pmezard@gmail.com>
parents:
13272
diff
changeset
|
2666 |
21043
6c383c871fdb
localrepo: introduce "prepushoutgoinghooks" to extend outgoing check easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20987
diff
changeset
|
2667 @unfilteredpropertycache |
6c383c871fdb
localrepo: introduce "prepushoutgoinghooks" to extend outgoing check easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20987
diff
changeset
|
2668 def prepushoutgoinghooks(self): |
28876
79b8f052ee51
localrepo: refactor prepushoutgoinghook to take a pushop
Mads Kiilerich <madski@unity3d.com>
parents:
28814
diff
changeset
|
2669 """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
|
2670 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
|
2671 """ |
6c383c871fdb
localrepo: introduce "prepushoutgoinghooks" to extend outgoing check easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20987
diff
changeset
|
2672 return util.hooks() |
6c383c871fdb
localrepo: introduce "prepushoutgoinghooks" to extend outgoing check easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20987
diff
changeset
|
2673 |
11368
b9eb005c54ad
pushkey: add localrepo support
Matt Mackall <mpm@selenic.com>
parents:
11303
diff
changeset
|
2674 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
|
2675 try: |
24824
0325c0da05df
pushkey: use hook arguments from transaction when one exists
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24821
diff
changeset
|
2676 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
|
2677 hookargs = {} |
0325c0da05df
pushkey: use hook arguments from transaction when one exists
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24821
diff
changeset
|
2678 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
|
2679 hookargs.update(tr.hookargs) |
36400
7b86aa31b004
py3: fix handling of keyword arguments at more places
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36373
diff
changeset
|
2680 hookargs = pycompat.strkwargs(hookargs) |
7b86aa31b004
py3: fix handling of keyword arguments at more places
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36373
diff
changeset
|
2681 hookargs[r'namespace'] = namespace |
7b86aa31b004
py3: fix handling of keyword arguments at more places
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36373
diff
changeset
|
2682 hookargs[r'key'] = key |
7b86aa31b004
py3: fix handling of keyword arguments at more places
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36373
diff
changeset
|
2683 hookargs[r'old'] = old |
7b86aa31b004
py3: fix handling of keyword arguments at more places
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36373
diff
changeset
|
2684 hookargs[r'new'] = new |
24824
0325c0da05df
pushkey: use hook arguments from transaction when one exists
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24821
diff
changeset
|
2685 self.hook('prepushkey', throw=True, **hookargs) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25629
diff
changeset
|
2686 except error.HookAbort as exc: |
23416
53a65929ef1f
pushkey: gracefully handle prepushkey hook failure (issue4455)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23129
diff
changeset
|
2687 self.ui.write_err(_("pushkey-abort: %s\n") % exc) |
53a65929ef1f
pushkey: gracefully handle prepushkey hook failure (issue4455)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23129
diff
changeset
|
2688 if exc.hint: |
53a65929ef1f
pushkey: gracefully handle prepushkey hook failure (issue4455)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23129
diff
changeset
|
2689 self.ui.write_err(_("(%s)\n") % exc.hint) |
53a65929ef1f
pushkey: gracefully handle prepushkey hook failure (issue4455)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23129
diff
changeset
|
2690 return False |
17293
d3f84ccc5495
pushkey: add more verbose debug output regarding pushkey
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17252
diff
changeset
|
2691 self.ui.debug('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
|
2692 ret = pushkey.push(self, namespace, key, old, new) |
23648
915ac9403e13
pushkey: run hook after the lock release
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23630
diff
changeset
|
2693 def runhook(): |
915ac9403e13
pushkey: run hook after the lock release
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23630
diff
changeset
|
2694 self.hook('pushkey', namespace=namespace, key=key, old=old, new=new, |
915ac9403e13
pushkey: run hook after the lock release
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23630
diff
changeset
|
2695 ret=ret) |
915ac9403e13
pushkey: run hook after the lock release
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23630
diff
changeset
|
2696 self._afterlock(runhook) |
14102
7f45b1911893
pushkey: add hooks for pushkey/listkeys
Brodie Rao <brodie@bitheap.org>
parents:
14076
diff
changeset
|
2697 return ret |
11368
b9eb005c54ad
pushkey: add localrepo support
Matt Mackall <mpm@selenic.com>
parents:
11303
diff
changeset
|
2698 |
b9eb005c54ad
pushkey: add localrepo support
Matt Mackall <mpm@selenic.com>
parents:
11303
diff
changeset
|
2699 def listkeys(self, namespace): |
14102
7f45b1911893
pushkey: add hooks for pushkey/listkeys
Brodie Rao <brodie@bitheap.org>
parents:
14076
diff
changeset
|
2700 self.hook('prelistkeys', throw=True, namespace=namespace) |
17293
d3f84ccc5495
pushkey: add more verbose debug output regarding pushkey
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17252
diff
changeset
|
2701 self.ui.debug('listing keys for "%s"\n' % namespace) |
14102
7f45b1911893
pushkey: add hooks for pushkey/listkeys
Brodie Rao <brodie@bitheap.org>
parents:
14076
diff
changeset
|
2702 values = pushkey.list(self, namespace) |
7f45b1911893
pushkey: add hooks for pushkey/listkeys
Brodie Rao <brodie@bitheap.org>
parents:
14076
diff
changeset
|
2703 self.hook('listkeys', namespace=namespace, values=values) |
7f45b1911893
pushkey: add hooks for pushkey/listkeys
Brodie Rao <brodie@bitheap.org>
parents:
14076
diff
changeset
|
2704 return values |
11368
b9eb005c54ad
pushkey: add localrepo support
Matt Mackall <mpm@selenic.com>
parents:
11303
diff
changeset
|
2705 |
14048
58e58406ed19
wireproto: add test for new optional arg missing on server
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14036
diff
changeset
|
2706 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
|
2707 '''used to test argument passing over the wire''' |
36554
06f59bdde626
py3: use pycompat.bytestr() to convert None to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36471
diff
changeset
|
2708 return "%s %s %s %s %s" % (one, two, pycompat.bytestr(three), |
06f59bdde626
py3: use pycompat.bytestr() to convert None to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36471
diff
changeset
|
2709 pycompat.bytestr(four), |
06f59bdde626
py3: use pycompat.bytestr() to convert None to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36471
diff
changeset
|
2710 pycompat.bytestr(five)) |
11368
b9eb005c54ad
pushkey: add localrepo support
Matt Mackall <mpm@selenic.com>
parents:
11303
diff
changeset
|
2711 |
14529
e7a1814854b9
localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents:
14522
diff
changeset
|
2712 def savecommitmessage(self, text): |
23852
99e125626352
localrepo: remove all internal uses of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
23775
diff
changeset
|
2713 fp = self.vfs('last-message.txt', 'wb') |
14529
e7a1814854b9
localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents:
14522
diff
changeset
|
2714 try: |
e7a1814854b9
localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents:
14522
diff
changeset
|
2715 fp.write(text) |
e7a1814854b9
localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents:
14522
diff
changeset
|
2716 finally: |
e7a1814854b9
localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents:
14522
diff
changeset
|
2717 fp.close() |
18054
b35e3364f94a
check-code: there must also be whitespace between ')' and operator
Mads Kiilerich <madski@unity3d.com>
parents:
18044
diff
changeset
|
2718 return self.pathto(fp.name[len(self.root) + 1:]) |
14529
e7a1814854b9
localrepo: add savecommitmessage() to write last-message.txt
Patrick Mezard <pmezard@gmail.com>
parents:
14522
diff
changeset
|
2719 |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
2720 # 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
|
2721 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
|
2722 renamefiles = [tuple(t) for t in files] |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
2723 def a(): |
18952
8086b530e2ac
localrepo: use "vfs.rename()" instead of "util.rename()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
18951
diff
changeset
|
2724 for vfs, src, dest in renamefiles: |
31550 | 2725 # if src and dest refer to a same file, vfs.rename is a no-op, |
2726 # leaving both src and dest on disk. delete dest to make sure | |
2727 # the rename couldn't be such a no-op. | |
2728 vfs.tryunlink(dest) | |
31209
dd2364f5180a
localrepo: handle rename with hardlinks properly
Jun Wu <quark@fb.com>
parents:
31148
diff
changeset
|
2729 try: |
18952
8086b530e2ac
localrepo: use "vfs.rename()" instead of "util.rename()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
18951
diff
changeset
|
2730 vfs.rename(src, dest) |
16441
9dd10a574af2
localrepo: do not complain about missing journal files
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
16426
diff
changeset
|
2731 except OSError: # journal file does not yet exist |
9dd10a574af2
localrepo: do not complain about missing journal files
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
16426
diff
changeset
|
2732 pass |
1806
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
2733 return a |
a2c69737e65e
Automatic nesting into running transactions in the same repository.
mason@suse.com
parents:
1802
diff
changeset
|
2734 |
14266
89e7d35e0ef0
fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents:
13957
diff
changeset
|
2735 def undoname(fn): |
89e7d35e0ef0
fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents:
13957
diff
changeset
|
2736 base, name = os.path.split(fn) |
89e7d35e0ef0
fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents:
13957
diff
changeset
|
2737 assert name.startswith('journal') |
89e7d35e0ef0
fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents:
13957
diff
changeset
|
2738 return os.path.join(base, name.replace('journal', 'undo', 1)) |
89e7d35e0ef0
fix bookmarks rollback behavior
Alexander Solovyov <alexander@solovyov.net>
parents:
13957
diff
changeset
|
2739 |
39549
089fc0db0954
hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39548
diff
changeset
|
2740 def instance(ui, path, create, intents=None, createopts=None): |
39591
76b58f240821
localrepo: use urllocalpath() for path to create repo too
Martin von Zweigbergk <martinvonz@google.com>
parents:
39590
diff
changeset
|
2741 localpath = util.urllocalpath(path) |
39548
7ce9dea3a14a
localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39546
diff
changeset
|
2742 if create: |
39591
76b58f240821
localrepo: use urllocalpath() for path to create repo too
Martin von Zweigbergk <martinvonz@google.com>
parents:
39590
diff
changeset
|
2743 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
|
2744 |
39687
bfeab472e3c0
localrepo: create new function for instantiating a local repo object
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39668
diff
changeset
|
2745 return makelocalrepository(ui, localpath, intents=intents) |
3223
53e843840349
Whitespace/Tab cleanup
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3164
diff
changeset
|
2746 |
2740
386f04d6ecb3
clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2673
diff
changeset
|
2747 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
|
2748 return True |
28164
ad11edefa7c4
localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28163
diff
changeset
|
2749 |
39549
089fc0db0954
hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39548
diff
changeset
|
2750 def newreporequirements(ui, createopts=None): |
28164
ad11edefa7c4
localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28163
diff
changeset
|
2751 """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
|
2752 |
ad11edefa7c4
localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28163
diff
changeset
|
2753 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
|
2754 new repositories. |
ad11edefa7c4
localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28163
diff
changeset
|
2755 """ |
39549
089fc0db0954
hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39548
diff
changeset
|
2756 createopts = createopts or {} |
089fc0db0954
hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39548
diff
changeset
|
2757 |
39848
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2758 # 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
|
2759 # its requirements. |
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2760 if 'sharedrepo' in createopts: |
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2761 requirements = set(createopts['sharedrepo'].requirements) |
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2762 if createopts.get('sharedrelative'): |
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2763 requirements.add('relshared') |
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2764 else: |
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2765 requirements.add('shared') |
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2766 |
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2767 return requirements |
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2768 |
32291
bd872f64a8ba
cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents:
32267
diff
changeset
|
2769 requirements = {'revlogv1'} |
33247
4d5d493ea54a
configitems: register the 'format.usestore' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33245
diff
changeset
|
2770 if ui.configbool('format', 'usestore'): |
28164
ad11edefa7c4
localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28163
diff
changeset
|
2771 requirements.add('store') |
33245
28e8983d9ed7
configitems: register the 'format.usefncache' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33237
diff
changeset
|
2772 if ui.configbool('format', 'usefncache'): |
28164
ad11edefa7c4
localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28163
diff
changeset
|
2773 requirements.add('fncache') |
33237
7043e67cc9b2
configitems: register the 'format.dotencode' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33235
diff
changeset
|
2774 if ui.configbool('format', 'dotencode'): |
28164
ad11edefa7c4
localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28163
diff
changeset
|
2775 requirements.add('dotencode') |
ad11edefa7c4
localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28163
diff
changeset
|
2776 |
33499
0407a51b9d8c
codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents:
33454
diff
changeset
|
2777 compengine = ui.config('experimental', 'format.compression') |
30818
4c0a5a256ae8
localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30634
diff
changeset
|
2778 if compengine not in util.compengines: |
4c0a5a256ae8
localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30634
diff
changeset
|
2779 raise error.Abort(_('compression engine %s defined by ' |
4c0a5a256ae8
localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30634
diff
changeset
|
2780 'experimental.format.compression not available') % |
4c0a5a256ae8
localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30634
diff
changeset
|
2781 compengine, |
4c0a5a256ae8
localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30634
diff
changeset
|
2782 hint=_('run "hg debuginstall" to list available ' |
4c0a5a256ae8
localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30634
diff
changeset
|
2783 'compression engines')) |
4c0a5a256ae8
localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30634
diff
changeset
|
2784 |
4c0a5a256ae8
localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30634
diff
changeset
|
2785 # zlib is the historical default and doesn't need an explicit requirement. |
4c0a5a256ae8
localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30634
diff
changeset
|
2786 if compengine != 'zlib': |
4c0a5a256ae8
localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30634
diff
changeset
|
2787 requirements.add('exp-compression-%s' % compengine) |
4c0a5a256ae8
localrepo: experimental support for non-zlib revlog compression
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30634
diff
changeset
|
2788 |
28164
ad11edefa7c4
localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28163
diff
changeset
|
2789 if scmutil.gdinitconfig(ui): |
ad11edefa7c4
localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28163
diff
changeset
|
2790 requirements.add('generaldelta') |
33499
0407a51b9d8c
codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents:
33454
diff
changeset
|
2791 if ui.configbool('experimental', 'treemanifest'): |
28164
ad11edefa7c4
localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28163
diff
changeset
|
2792 requirements.add('treemanifest') |
38717
aa21a9ad46ea
sparse-revlog: new requirement enabled with format.sparse-revlog
Paul Morelle <paul.morelle@octobus.net>
parents:
38239
diff
changeset
|
2793 # experimental config: format.sparse-revlog |
aa21a9ad46ea
sparse-revlog: new requirement enabled with format.sparse-revlog
Paul Morelle <paul.morelle@octobus.net>
parents:
38239
diff
changeset
|
2794 if ui.configbool('format', 'sparse-revlog'): |
aa21a9ad46ea
sparse-revlog: new requirement enabled with format.sparse-revlog
Paul Morelle <paul.morelle@octobus.net>
parents:
38239
diff
changeset
|
2795 requirements.add(SPARSEREVLOG_REQUIREMENT) |
28164
ad11edefa7c4
localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28163
diff
changeset
|
2796 |
32697
19b9fc40cc51
revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32660
diff
changeset
|
2797 revlogv2 = ui.config('experimental', 'revlogv2') |
19b9fc40cc51
revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32660
diff
changeset
|
2798 if revlogv2 == 'enable-unstable-format-and-corrupt-my-data': |
19b9fc40cc51
revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32660
diff
changeset
|
2799 requirements.remove('revlogv1') |
19b9fc40cc51
revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32660
diff
changeset
|
2800 # generaldelta is implied by revlogv2. |
19b9fc40cc51
revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32660
diff
changeset
|
2801 requirements.discard('generaldelta') |
19b9fc40cc51
revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32660
diff
changeset
|
2802 requirements.add(REVLOGV2_REQUIREMENT) |
39298
7a9f15ed3b96
phases: add a repository requirement about internal phase
Boris Feld <boris.feld@octobus.net>
parents:
39111
diff
changeset
|
2803 # experimental config: format.internal-phase |
39546
41aa5dced975
localrepo: pass ui to newreporequirements() (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39506
diff
changeset
|
2804 if ui.configbool('format', 'internal-phase'): |
39298
7a9f15ed3b96
phases: add a repository requirement about internal phase
Boris Feld <boris.feld@octobus.net>
parents:
39111
diff
changeset
|
2805 requirements.add('internal-phase') |
32697
19b9fc40cc51
revlog: skeleton support for version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32660
diff
changeset
|
2806 |
39551
261f1e8dc300
localrepo: add requirement when narrow files creation option present
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39549
diff
changeset
|
2807 if createopts.get('narrowfiles'): |
261f1e8dc300
localrepo: add requirement when narrow files creation option present
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39549
diff
changeset
|
2808 requirements.add(repository.NARROW_REQUIREMENT) |
261f1e8dc300
localrepo: add requirement when narrow files creation option present
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39549
diff
changeset
|
2809 |
28164
ad11edefa7c4
localrepo: move new repo requirements into standalone function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28163
diff
changeset
|
2810 return requirements |
39548
7ce9dea3a14a
localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39546
diff
changeset
|
2811 |
39549
089fc0db0954
hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39548
diff
changeset
|
2812 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
|
2813 """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
|
2814 |
089fc0db0954
hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39548
diff
changeset
|
2815 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
|
2816 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
|
2817 |
089fc0db0954
hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39548
diff
changeset
|
2818 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
|
2819 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
|
2820 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
|
2821 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
|
2822 |
089fc0db0954
hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39548
diff
changeset
|
2823 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
|
2824 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
|
2825 """ |
39848
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2826 known = { |
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2827 'narrowfiles', |
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2828 'sharedrepo', |
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2829 'sharedrelative', |
39849
d3d4b4b5f725
localrepo: support writing shared file (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39848
diff
changeset
|
2830 'shareditems', |
39848
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2831 } |
39551
261f1e8dc300
localrepo: add requirement when narrow files creation option present
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39549
diff
changeset
|
2832 |
261f1e8dc300
localrepo: add requirement when narrow files creation option present
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39549
diff
changeset
|
2833 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
|
2834 |
39590
e471cb2852ea
localrepo: move check for existing repo into createrepository()
Martin von Zweigbergk <martinvonz@google.com>
parents:
39580
diff
changeset
|
2835 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
|
2836 """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
|
2837 |
39590
e471cb2852ea
localrepo: move check for existing repo into createrepository()
Martin von Zweigbergk <martinvonz@google.com>
parents:
39580
diff
changeset
|
2838 ``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
|
2839 ``createopts`` options for the new repository. |
39848
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2840 |
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2841 The following keys for ``createopts`` are recognized: |
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2842 |
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2843 narrowfiles |
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2844 Set up repository to support narrow file storage. |
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2845 sharedrepo |
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2846 Repository object from which storage should be shared. |
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2847 sharedrelative |
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2848 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
|
2849 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
|
2850 is stored as an absolute path. |
39849
d3d4b4b5f725
localrepo: support writing shared file (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39848
diff
changeset
|
2851 shareditems |
d3d4b4b5f725
localrepo: support writing shared file (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39848
diff
changeset
|
2852 Set of items to share to the new repository (in addition to storage). |
39548
7ce9dea3a14a
localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39546
diff
changeset
|
2853 """ |
39549
089fc0db0954
hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39548
diff
changeset
|
2854 createopts = createopts or {} |
089fc0db0954
hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39548
diff
changeset
|
2855 |
089fc0db0954
hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39548
diff
changeset
|
2856 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
|
2857 |
089fc0db0954
hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39548
diff
changeset
|
2858 if not isinstance(unknownopts, dict): |
089fc0db0954
hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39548
diff
changeset
|
2859 raise error.ProgrammingError('filterknowncreateopts() did not return ' |
089fc0db0954
hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39548
diff
changeset
|
2860 'a dict') |
089fc0db0954
hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39548
diff
changeset
|
2861 |
089fc0db0954
hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39548
diff
changeset
|
2862 if unknownopts: |
089fc0db0954
hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39548
diff
changeset
|
2863 raise error.Abort(_('unable to create repository because of unknown ' |
089fc0db0954
hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39548
diff
changeset
|
2864 'creation option: %s') % |
39846
d3e761f9ac0a
localrepo: add missing join()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39770
diff
changeset
|
2865 ', '.join(sorted(unknownopts)), |
39549
089fc0db0954
hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39548
diff
changeset
|
2866 hint=_('is a required extension not loaded?')) |
089fc0db0954
hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39548
diff
changeset
|
2867 |
089fc0db0954
hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39548
diff
changeset
|
2868 requirements = newreporequirements(ui, createopts=createopts) |
39548
7ce9dea3a14a
localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39546
diff
changeset
|
2869 |
39590
e471cb2852ea
localrepo: move check for existing repo into createrepository()
Martin von Zweigbergk <martinvonz@google.com>
parents:
39580
diff
changeset
|
2870 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
|
2871 |
7ce9dea3a14a
localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39546
diff
changeset
|
2872 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
|
2873 if hgvfs.exists(): |
e471cb2852ea
localrepo: move check for existing repo into createrepository()
Martin von Zweigbergk <martinvonz@google.com>
parents:
39580
diff
changeset
|
2874 raise error.RepoError(_('repository %s already exists') % path) |
e471cb2852ea
localrepo: move check for existing repo into createrepository()
Martin von Zweigbergk <martinvonz@google.com>
parents:
39580
diff
changeset
|
2875 |
39848
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2876 if 'sharedrepo' in createopts: |
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2877 sharedpath = createopts['sharedrepo'].sharedpath |
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2878 |
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2879 if createopts.get('sharedrelative'): |
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2880 try: |
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2881 sharedpath = os.path.relpath(sharedpath, hgvfs.base) |
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2882 except (IOError, ValueError) as e: |
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2883 # 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
|
2884 # on each path. |
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2885 raise error.Abort(_('cannot calculate relative path'), |
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2886 hint=stringutil.forcebytestr(e)) |
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2887 |
39847
b504ff813c4f
localrepo: validate directories before creating any
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39846
diff
changeset
|
2888 if not wdirvfs.exists(): |
b504ff813c4f
localrepo: validate directories before creating any
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39846
diff
changeset
|
2889 wdirvfs.makedirs() |
b504ff813c4f
localrepo: validate directories before creating any
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39846
diff
changeset
|
2890 |
39548
7ce9dea3a14a
localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39546
diff
changeset
|
2891 hgvfs.makedir(notindexed=True) |
7ce9dea3a14a
localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39546
diff
changeset
|
2892 |
39848
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2893 if b'store' in requirements and '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
|
2894 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
|
2895 |
7ce9dea3a14a
localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39546
diff
changeset
|
2896 # 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
|
2897 # 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
|
2898 # 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
|
2899 # 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
|
2900 # 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
|
2901 # |
7ce9dea3a14a
localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39546
diff
changeset
|
2902 # The revlog header has version 2, which won't be recognized by |
7ce9dea3a14a
localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39546
diff
changeset
|
2903 # such old clients. |
7ce9dea3a14a
localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39546
diff
changeset
|
2904 hgvfs.append(b'00changelog.i', |
7ce9dea3a14a
localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39546
diff
changeset
|
2905 b'\0\0\0\2 dummy changelog to prevent using the old repo ' |
7ce9dea3a14a
localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39546
diff
changeset
|
2906 b'layout') |
7ce9dea3a14a
localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39546
diff
changeset
|
2907 |
7ce9dea3a14a
localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39546
diff
changeset
|
2908 scmutil.writerequires(hgvfs, requirements) |
39606
c5e6c1ba1c79
hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39591
diff
changeset
|
2909 |
39848
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2910 # Write out file telling readers where to find the shared store. |
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2911 if 'sharedrepo' in createopts: |
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2912 hgvfs.write(b'sharedpath', sharedpath) |
4ece3cdfd907
localrepo: support shared repo creation
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39847
diff
changeset
|
2913 |
39849
d3d4b4b5f725
localrepo: support writing shared file (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39848
diff
changeset
|
2914 if createopts.get('shareditems'): |
d3d4b4b5f725
localrepo: support writing shared file (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39848
diff
changeset
|
2915 shared = b'\n'.join(sorted(createopts['shareditems'])) + b'\n' |
d3d4b4b5f725
localrepo: support writing shared file (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39848
diff
changeset
|
2916 hgvfs.write(b'shared', shared) |
d3d4b4b5f725
localrepo: support writing shared file (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39848
diff
changeset
|
2917 |
39606
c5e6c1ba1c79
hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39591
diff
changeset
|
2918 def poisonrepository(repo): |
c5e6c1ba1c79
hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39591
diff
changeset
|
2919 """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
|
2920 # 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
|
2921 repo.close() |
c5e6c1ba1c79
hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39591
diff
changeset
|
2922 |
c5e6c1ba1c79
hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39591
diff
changeset
|
2923 # 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
|
2924 # 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
|
2925 # |
c5e6c1ba1c79
hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39591
diff
changeset
|
2926 # 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
|
2927 # 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
|
2928 class poisonedrepository(object): |
c5e6c1ba1c79
hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39591
diff
changeset
|
2929 def __getattribute__(self, item): |
c5e6c1ba1c79
hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39591
diff
changeset
|
2930 if item == r'close': |
c5e6c1ba1c79
hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39591
diff
changeset
|
2931 return object.__getattribute__(self, item) |
c5e6c1ba1c79
hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39591
diff
changeset
|
2932 |
c5e6c1ba1c79
hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39591
diff
changeset
|
2933 raise error.ProgrammingError('repo instances should not be used ' |
c5e6c1ba1c79
hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39591
diff
changeset
|
2934 'after unshare') |
c5e6c1ba1c79
hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39591
diff
changeset
|
2935 |
c5e6c1ba1c79
hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39591
diff
changeset
|
2936 def close(self): |
c5e6c1ba1c79
hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39591
diff
changeset
|
2937 pass |
c5e6c1ba1c79
hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39591
diff
changeset
|
2938 |
c5e6c1ba1c79
hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39591
diff
changeset
|
2939 # 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
|
2940 # we operate at the lowest level possible. |
c5e6c1ba1c79
hg: don't reuse repo instance after unshare()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39591
diff
changeset
|
2941 object.__setattr__(repo, r'__class__', poisonedrepository) |