Mercurial > hg
annotate mercurial/branchmap.py @ 46924:ca0049946e9a
split: avoid strip if split is a no-op (identical to original)
Differential Revision: https://phab.mercurial-scm.org/D10389
author | Kyle Lippincott <spectral@google.com> |
---|---|
date | Mon, 12 Apr 2021 19:25:34 -0700 |
parents | d4ba4d51f85f |
children | d55b71393907 f38bf44e077f |
rev | line source |
---|---|
18116
bcee63733aad
branchmap: create a mercurial.branchmap module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
1 # branchmap.py - logic to computes, maintain and stores branchmap for local repo |
bcee63733aad
branchmap: create a mercurial.branchmap module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
2 # |
46819
d4ba4d51f85f
contributor: change mentions of mpm to olivia
Raphaël Gomès <rgomes@octobus.net>
parents:
46794
diff
changeset
|
3 # Copyright 2005-2007 Olivia Mackall <olivia@selenic.com> |
18116
bcee63733aad
branchmap: create a mercurial.branchmap module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
4 # |
bcee63733aad
branchmap: create a mercurial.branchmap module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
bcee63733aad
branchmap: create a mercurial.branchmap module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
6 # GNU General Public License version 2 or any later version. |
18117
526e7ec5c96e
branchmap: extract write logic from localrepo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18116
diff
changeset
|
7 |
25918
47f36e050c2e
branchmap: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
8 from __future__ import absolute_import |
47f36e050c2e
branchmap: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
9 |
47f36e050c2e
branchmap: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
10 import struct |
47f36e050c2e
branchmap: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
11 |
47f36e050c2e
branchmap: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
12 from .node import ( |
47f36e050c2e
branchmap: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
13 bin, |
47f36e050c2e
branchmap: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
14 hex, |
47f36e050c2e
branchmap: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
15 nullid, |
47f36e050c2e
branchmap: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
16 nullrev, |
47f36e050c2e
branchmap: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
17 ) |
47f36e050c2e
branchmap: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
18 from . import ( |
47f36e050c2e
branchmap: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
19 encoding, |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26460
diff
changeset
|
20 error, |
35831
a011e4140435
branchmap: make error messages consistent between Python 2 and 3
Augie Fackler <augie@google.com>
parents:
35495
diff
changeset
|
21 pycompat, |
25918
47f36e050c2e
branchmap: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
22 scmutil, |
30975
22fbca1d11ed
mercurial: switch to util.timer for all interval timings
Simon Farnsworth <simonfar@fb.com>
parents:
29746
diff
changeset
|
23 util, |
25918
47f36e050c2e
branchmap: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
24 ) |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36962
diff
changeset
|
25 from .utils import ( |
42138
caebe5e7f4bd
repoview: move subsettable in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42134
diff
changeset
|
26 repoviewutil, |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36962
diff
changeset
|
27 stringutil, |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36962
diff
changeset
|
28 ) |
25918
47f36e050c2e
branchmap: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
29 |
43773
7b14d649af1b
typing: consolidate "if not globals():" trick
Yuya Nishihara <yuya@tcha.org>
parents:
43688
diff
changeset
|
30 if pycompat.TYPE_CHECKING: |
43636
9c1eccdd7ed8
branchmap: annotate constructor type for branchcache
Augie Fackler <augie@google.com>
parents:
43634
diff
changeset
|
31 from typing import ( |
9c1eccdd7ed8
branchmap: annotate constructor type for branchcache
Augie Fackler <augie@google.com>
parents:
43634
diff
changeset
|
32 Any, |
9c1eccdd7ed8
branchmap: annotate constructor type for branchcache
Augie Fackler <augie@google.com>
parents:
43634
diff
changeset
|
33 Callable, |
9c1eccdd7ed8
branchmap: annotate constructor type for branchcache
Augie Fackler <augie@google.com>
parents:
43634
diff
changeset
|
34 Dict, |
9c1eccdd7ed8
branchmap: annotate constructor type for branchcache
Augie Fackler <augie@google.com>
parents:
43634
diff
changeset
|
35 Iterable, |
9c1eccdd7ed8
branchmap: annotate constructor type for branchcache
Augie Fackler <augie@google.com>
parents:
43634
diff
changeset
|
36 List, |
9c1eccdd7ed8
branchmap: annotate constructor type for branchcache
Augie Fackler <augie@google.com>
parents:
43634
diff
changeset
|
37 Optional, |
9c1eccdd7ed8
branchmap: annotate constructor type for branchcache
Augie Fackler <augie@google.com>
parents:
43634
diff
changeset
|
38 Set, |
9c1eccdd7ed8
branchmap: annotate constructor type for branchcache
Augie Fackler <augie@google.com>
parents:
43634
diff
changeset
|
39 Tuple, |
9c1eccdd7ed8
branchmap: annotate constructor type for branchcache
Augie Fackler <augie@google.com>
parents:
43634
diff
changeset
|
40 Union, |
9c1eccdd7ed8
branchmap: annotate constructor type for branchcache
Augie Fackler <augie@google.com>
parents:
43634
diff
changeset
|
41 ) |
46794 | 42 from . import localrepo |
43636
9c1eccdd7ed8
branchmap: annotate constructor type for branchcache
Augie Fackler <augie@google.com>
parents:
43634
diff
changeset
|
43 |
9c1eccdd7ed8
branchmap: annotate constructor type for branchcache
Augie Fackler <augie@google.com>
parents:
43634
diff
changeset
|
44 assert any( |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
44452
diff
changeset
|
45 ( |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
44452
diff
changeset
|
46 Any, |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
44452
diff
changeset
|
47 Callable, |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
44452
diff
changeset
|
48 Dict, |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
44452
diff
changeset
|
49 Iterable, |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
44452
diff
changeset
|
50 List, |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
44452
diff
changeset
|
51 Optional, |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
44452
diff
changeset
|
52 Set, |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
44452
diff
changeset
|
53 Tuple, |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
44452
diff
changeset
|
54 Union, |
46794 | 55 localrepo, |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
44452
diff
changeset
|
56 ) |
43636
9c1eccdd7ed8
branchmap: annotate constructor type for branchcache
Augie Fackler <augie@google.com>
parents:
43634
diff
changeset
|
57 ) |
9c1eccdd7ed8
branchmap: annotate constructor type for branchcache
Augie Fackler <augie@google.com>
parents:
43634
diff
changeset
|
58 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
59 subsettable = repoviewutil.subsettable |
42138
caebe5e7f4bd
repoview: move subsettable in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
42134
diff
changeset
|
60 |
25918
47f36e050c2e
branchmap: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25660
diff
changeset
|
61 calcsize = struct.calcsize |
31370
906be86990c4
rbc: use struct unpack_from and pack_into instead of unpack and pack
Mads Kiilerich <madski@unity3d.com>
parents:
31360
diff
changeset
|
62 pack_into = struct.pack_into |
906be86990c4
rbc: use struct unpack_from and pack_into instead of unpack and pack
Mads Kiilerich <madski@unity3d.com>
parents:
31360
diff
changeset
|
63 unpack_from = struct.unpack_from |
18117
526e7ec5c96e
branchmap: extract write logic from localrepo
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18116
diff
changeset
|
64 |
18118
e70ff1e599f4
branchmap: extract read logic from repo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18117
diff
changeset
|
65 |
41615
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
66 class BranchMapCache(object): |
41718
a87ca1d7e61d
branchmap: improve doc about BranchMapCache class
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41678
diff
changeset
|
67 """mapping of filtered views of repo with their branchcache""" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
68 |
41615
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
69 def __init__(self): |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
70 self._per_filter = {} |
41567
c795c462b1d6
branchmap: add some clarifications and clean up flow
Martijn Pieters <mj@octobus.net>
parents:
41566
diff
changeset
|
71 |
41615
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
72 def __getitem__(self, repo): |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
73 self.updatecache(repo) |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
74 return self._per_filter[repo.filtername] |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
75 |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
76 def updatecache(self, repo): |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
77 """Update the cache for the given filtered view on a repository""" |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
78 # This can trigger updates for the caches for subsets of the filtered |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
79 # view, e.g. when there is no cache for this filtered view or the cache |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
80 # is stale. |
18121
f8a13f061a8a
branchmap: extract updatebranchcache from repo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18120
diff
changeset
|
81 |
41615
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
82 cl = repo.changelog |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
83 filtername = repo.filtername |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
84 bcache = self._per_filter.get(filtername) |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
85 if bcache is None or not bcache.validfor(repo): |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
86 # cache object missing or cache object stale? Read from disk |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
87 bcache = branchcache.fromfile(repo) |
41567
c795c462b1d6
branchmap: add some clarifications and clean up flow
Martijn Pieters <mj@octobus.net>
parents:
41566
diff
changeset
|
88 |
41615
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
89 revs = [] |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
90 if bcache is None: |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
91 # no (fresh) cache available anymore, perhaps we can re-use |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
92 # the cache for a subset, then extend that to add info on missing |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
93 # revisions. |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
94 subsetname = subsettable.get(filtername) |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
95 if subsetname is not None: |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
96 subset = repo.filtered(subsetname) |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
97 bcache = self[subset].copy() |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
98 extrarevs = subset.changelog.filteredrevs - cl.filteredrevs |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
99 revs.extend(r for r in extrarevs if r <= bcache.tiprev) |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
100 else: |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
101 # nothing to fall back on, start empty. |
46780
6266d19556ad
node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46372
diff
changeset
|
102 bcache = branchcache(repo) |
24373
59cc09240afb
revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents:
24163
diff
changeset
|
103 |
41615
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
104 revs.extend(cl.revs(start=bcache.tiprev + 1)) |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
105 if revs: |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
106 bcache.update(repo, revs) |
18124
79db6d40bced
branchmap: store branchcache in a dedicated object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18121
diff
changeset
|
107 |
41615
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
108 assert bcache.validfor(repo), filtername |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
109 self._per_filter[repo.filtername] = bcache |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
110 |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
111 def replace(self, repo, remotebranchmap): |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
112 """Replace the branchmap cache for a repo with a branch mapping. |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
113 |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
114 This is likely only called during clone with a branch map from a |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
115 remote. |
26460
79ef867538ea
branchmap: move branch cache code out of streamclone.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25918
diff
changeset
|
116 |
41615
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
117 """ |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
118 cl = repo.changelog |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
119 clrev = cl.rev |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
120 clbranchinfo = cl.branchinfo |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
121 rbheads = [] |
43688
5cdc3c1292f6
branchmap: make "closed" a set from beginning instead of converting from list
Martin von Zweigbergk <martinvonz@google.com>
parents:
43636
diff
changeset
|
122 closed = set() |
43104
74802979dd9d
py3: define and use pycompat.itervalues()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43077
diff
changeset
|
123 for bheads in pycompat.itervalues(remotebranchmap): |
41615
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
124 rbheads += bheads |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
125 for h in bheads: |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
126 r = clrev(h) |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
127 b, c = clbranchinfo(r) |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
128 if c: |
43688
5cdc3c1292f6
branchmap: make "closed" a set from beginning instead of converting from list
Martin von Zweigbergk <martinvonz@google.com>
parents:
43636
diff
changeset
|
129 closed.add(h) |
26460
79ef867538ea
branchmap: move branch cache code out of streamclone.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25918
diff
changeset
|
130 |
41615
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
131 if rbheads: |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
132 rtiprev = max((int(clrev(node)) for node in rbheads)) |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
133 cache = branchcache( |
46780
6266d19556ad
node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46372
diff
changeset
|
134 repo, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
135 remotebranchmap, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
136 repo[rtiprev].node(), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
137 rtiprev, |
43688
5cdc3c1292f6
branchmap: make "closed" a set from beginning instead of converting from list
Martin von Zweigbergk <martinvonz@google.com>
parents:
43636
diff
changeset
|
138 closednodes=closed, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
139 ) |
26460
79ef867538ea
branchmap: move branch cache code out of streamclone.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25918
diff
changeset
|
140 |
41615
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
141 # Try to stick it as low as possible |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
142 # filter above served are unlikely to be fetch from a clone |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
143 for candidate in (b'base', b'immutable', b'served'): |
41615
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
144 rview = repo.filtered(candidate) |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
145 if cache.validfor(rview): |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
146 self._per_filter[candidate] = cache |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
147 cache.write(rview) |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
148 return |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
149 |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
150 def clear(self): |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
151 self._per_filter.clear() |
328ca3b9e545
branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents:
41567
diff
changeset
|
152 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
153 |
42120
2f8147521e59
branchcache: add functions to validate changelog nodes
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42113
diff
changeset
|
154 def _unknownnode(node): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
44452
diff
changeset
|
155 """raises ValueError when branchcache found a node which does not exists""" |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43499
diff
changeset
|
156 raise ValueError('node %s does not exist' % pycompat.sysstr(hex(node))) |
26460
79ef867538ea
branchmap: move branch cache code out of streamclone.py
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25918
diff
changeset
|
157 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
158 |
42602
c7d236b55a3e
py3: fix formatting of branchmap log messages with repo.filtername=None
Martin von Zweigbergk <martinvonz@google.com>
parents:
42214
diff
changeset
|
159 def _branchcachedesc(repo): |
c7d236b55a3e
py3: fix formatting of branchmap log messages with repo.filtername=None
Martin von Zweigbergk <martinvonz@google.com>
parents:
42214
diff
changeset
|
160 if repo.filtername is not None: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
161 return b'branch cache (%s)' % repo.filtername |
42602
c7d236b55a3e
py3: fix formatting of branchmap log messages with repo.filtername=None
Martin von Zweigbergk <martinvonz@google.com>
parents:
42214
diff
changeset
|
162 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
163 return b'branch cache' |
42602
c7d236b55a3e
py3: fix formatting of branchmap log messages with repo.filtername=None
Martin von Zweigbergk <martinvonz@google.com>
parents:
42214
diff
changeset
|
164 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
165 |
42001
624d6683c705
branchmap: remove the dict interface from the branchcache class (API)
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41839
diff
changeset
|
166 class branchcache(object): |
20181
b9515fb9e72a
branchmap: add documentation on the branchcache on-disk format
Brodie Rao <brodie@sf.io>
parents:
20032
diff
changeset
|
167 """A dict like object that hold branches heads cache. |
b9515fb9e72a
branchmap: add documentation on the branchcache on-disk format
Brodie Rao <brodie@sf.io>
parents:
20032
diff
changeset
|
168 |
b9515fb9e72a
branchmap: add documentation on the branchcache on-disk format
Brodie Rao <brodie@sf.io>
parents:
20032
diff
changeset
|
169 This cache is used to avoid costly computations to determine all the |
b9515fb9e72a
branchmap: add documentation on the branchcache on-disk format
Brodie Rao <brodie@sf.io>
parents:
20032
diff
changeset
|
170 branch heads of a repo. |
b9515fb9e72a
branchmap: add documentation on the branchcache on-disk format
Brodie Rao <brodie@sf.io>
parents:
20032
diff
changeset
|
171 |
b9515fb9e72a
branchmap: add documentation on the branchcache on-disk format
Brodie Rao <brodie@sf.io>
parents:
20032
diff
changeset
|
172 The cache is serialized on disk in the following format: |
b9515fb9e72a
branchmap: add documentation on the branchcache on-disk format
Brodie Rao <brodie@sf.io>
parents:
20032
diff
changeset
|
173 |
b9515fb9e72a
branchmap: add documentation on the branchcache on-disk format
Brodie Rao <brodie@sf.io>
parents:
20032
diff
changeset
|
174 <tip hex node> <tip rev number> [optional filtered repo hex hash] |
20185
7d4219512823
branchmap: cache open/closed branch head information
Brodie Rao <brodie@sf.io>
parents:
20181
diff
changeset
|
175 <branch head hex node> <open/closed state> <branch name> |
7d4219512823
branchmap: cache open/closed branch head information
Brodie Rao <brodie@sf.io>
parents:
20181
diff
changeset
|
176 <branch head hex node> <open/closed state> <branch name> |
20181
b9515fb9e72a
branchmap: add documentation on the branchcache on-disk format
Brodie Rao <brodie@sf.io>
parents:
20032
diff
changeset
|
177 ... |
b9515fb9e72a
branchmap: add documentation on the branchcache on-disk format
Brodie Rao <brodie@sf.io>
parents:
20032
diff
changeset
|
178 |
b9515fb9e72a
branchmap: add documentation on the branchcache on-disk format
Brodie Rao <brodie@sf.io>
parents:
20032
diff
changeset
|
179 The first line is used to check if the cache is still valid. If the |
b9515fb9e72a
branchmap: add documentation on the branchcache on-disk format
Brodie Rao <brodie@sf.io>
parents:
20032
diff
changeset
|
180 branch cache is for a filtered repo view, an optional third hash is |
b9515fb9e72a
branchmap: add documentation on the branchcache on-disk format
Brodie Rao <brodie@sf.io>
parents:
20032
diff
changeset
|
181 included that hashes the hashes of all filtered revisions. |
20185
7d4219512823
branchmap: cache open/closed branch head information
Brodie Rao <brodie@sf.io>
parents:
20181
diff
changeset
|
182 |
7d4219512823
branchmap: cache open/closed branch head information
Brodie Rao <brodie@sf.io>
parents:
20181
diff
changeset
|
183 The open/closed state is represented by a single letter 'o' or 'c'. |
7d4219512823
branchmap: cache open/closed branch head information
Brodie Rao <brodie@sf.io>
parents:
20181
diff
changeset
|
184 This field can be used to avoid changelog reads when determining if a |
7d4219512823
branchmap: cache open/closed branch head information
Brodie Rao <brodie@sf.io>
parents:
20181
diff
changeset
|
185 branch head closes a branch or not. |
20181
b9515fb9e72a
branchmap: add documentation on the branchcache on-disk format
Brodie Rao <brodie@sf.io>
parents:
20032
diff
changeset
|
186 """ |
41677
bfc49f1df615
branchmap: move __init__ up in branchcache class
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41615
diff
changeset
|
187 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
188 def __init__( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
189 self, |
46780
6266d19556ad
node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46372
diff
changeset
|
190 repo, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
191 entries=(), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
192 tipnode=nullid, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
193 tiprev=nullrev, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
194 filteredhash=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
195 closednodes=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
196 hasnode=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
197 ): |
46794 | 198 # type: (localrepo.localrepository, Union[Dict[bytes, List[bytes]], Iterable[Tuple[bytes, List[bytes]]]], bytes, int, Optional[bytes], Optional[Set[bytes]], Optional[Callable[[bytes], bool]]) -> None |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
44452
diff
changeset
|
199 """hasnode is a function which can be used to verify whether changelog |
42007
b5511845f9d5
branchcache: have a hasnode function to validate nodes
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42006
diff
changeset
|
200 has a given node or not. If it's not provided, we assume that every node |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
44452
diff
changeset
|
201 we have exists in changelog""" |
46780
6266d19556ad
node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46372
diff
changeset
|
202 self._repo = repo |
41677
bfc49f1df615
branchmap: move __init__ up in branchcache class
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41615
diff
changeset
|
203 self.tipnode = tipnode |
bfc49f1df615
branchmap: move __init__ up in branchcache class
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41615
diff
changeset
|
204 self.tiprev = tiprev |
bfc49f1df615
branchmap: move __init__ up in branchcache class
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41615
diff
changeset
|
205 self.filteredhash = filteredhash |
bfc49f1df615
branchmap: move __init__ up in branchcache class
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41615
diff
changeset
|
206 # closednodes is a set of nodes that close their branch. If the branch |
bfc49f1df615
branchmap: move __init__ up in branchcache class
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41615
diff
changeset
|
207 # cache has been updated, it may contain nodes that are no longer |
bfc49f1df615
branchmap: move __init__ up in branchcache class
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41615
diff
changeset
|
208 # heads. |
bfc49f1df615
branchmap: move __init__ up in branchcache class
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41615
diff
changeset
|
209 if closednodes is None: |
bfc49f1df615
branchmap: move __init__ up in branchcache class
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41615
diff
changeset
|
210 self._closednodes = set() |
bfc49f1df615
branchmap: move __init__ up in branchcache class
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41615
diff
changeset
|
211 else: |
43636
9c1eccdd7ed8
branchmap: annotate constructor type for branchcache
Augie Fackler <augie@google.com>
parents:
43634
diff
changeset
|
212 self._closednodes = closednodes |
42005
b137a6793c51
branchcache: make entries a private attribute
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42004
diff
changeset
|
213 self._entries = dict(entries) |
42006
111de135fc76
branchcache: add attributes to track which nodes are verified
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42005
diff
changeset
|
214 # whether closed nodes are verified or not |
111de135fc76
branchcache: add attributes to track which nodes are verified
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42005
diff
changeset
|
215 self._closedverified = False |
111de135fc76
branchcache: add attributes to track which nodes are verified
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42005
diff
changeset
|
216 # branches for which nodes are verified |
111de135fc76
branchcache: add attributes to track which nodes are verified
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42005
diff
changeset
|
217 self._verifiedbranches = set() |
42007
b5511845f9d5
branchcache: have a hasnode function to validate nodes
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42006
diff
changeset
|
218 self._hasnode = hasnode |
b5511845f9d5
branchcache: have a hasnode function to validate nodes
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42006
diff
changeset
|
219 if self._hasnode is None: |
b5511845f9d5
branchcache: have a hasnode function to validate nodes
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42006
diff
changeset
|
220 self._hasnode = lambda x: True |
42001
624d6683c705
branchmap: remove the dict interface from the branchcache class (API)
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41839
diff
changeset
|
221 |
42120
2f8147521e59
branchcache: add functions to validate changelog nodes
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42113
diff
changeset
|
222 def _verifyclosed(self): |
2f8147521e59
branchcache: add functions to validate changelog nodes
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42113
diff
changeset
|
223 """ verify the closed nodes we have """ |
2f8147521e59
branchcache: add functions to validate changelog nodes
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42113
diff
changeset
|
224 if self._closedverified: |
2f8147521e59
branchcache: add functions to validate changelog nodes
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42113
diff
changeset
|
225 return |
2f8147521e59
branchcache: add functions to validate changelog nodes
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42113
diff
changeset
|
226 for node in self._closednodes: |
2f8147521e59
branchcache: add functions to validate changelog nodes
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42113
diff
changeset
|
227 if not self._hasnode(node): |
2f8147521e59
branchcache: add functions to validate changelog nodes
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42113
diff
changeset
|
228 _unknownnode(node) |
2f8147521e59
branchcache: add functions to validate changelog nodes
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42113
diff
changeset
|
229 |
2f8147521e59
branchcache: add functions to validate changelog nodes
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42113
diff
changeset
|
230 self._closedverified = True |
2f8147521e59
branchcache: add functions to validate changelog nodes
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42113
diff
changeset
|
231 |
2f8147521e59
branchcache: add functions to validate changelog nodes
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42113
diff
changeset
|
232 def _verifybranch(self, branch): |
42132
d9dc0896e1d3
branchcache: fix the docstring of _verifybranch()
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42131
diff
changeset
|
233 """ verify head nodes for the given branch. """ |
42120
2f8147521e59
branchcache: add functions to validate changelog nodes
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42113
diff
changeset
|
234 if branch not in self._entries or branch in self._verifiedbranches: |
2f8147521e59
branchcache: add functions to validate changelog nodes
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42113
diff
changeset
|
235 return |
2f8147521e59
branchcache: add functions to validate changelog nodes
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42113
diff
changeset
|
236 for n in self._entries[branch]: |
2f8147521e59
branchcache: add functions to validate changelog nodes
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42113
diff
changeset
|
237 if not self._hasnode(n): |
2f8147521e59
branchcache: add functions to validate changelog nodes
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42113
diff
changeset
|
238 _unknownnode(n) |
2f8147521e59
branchcache: add functions to validate changelog nodes
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42113
diff
changeset
|
239 |
2f8147521e59
branchcache: add functions to validate changelog nodes
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42113
diff
changeset
|
240 self._verifiedbranches.add(branch) |
2f8147521e59
branchcache: add functions to validate changelog nodes
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42113
diff
changeset
|
241 |
2f8147521e59
branchcache: add functions to validate changelog nodes
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42113
diff
changeset
|
242 def _verifyall(self): |
2f8147521e59
branchcache: add functions to validate changelog nodes
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42113
diff
changeset
|
243 """ verifies nodes of all the branches """ |
42133
75e8e16ca107
branchcache: only iterate over branches which needs to be verified
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42132
diff
changeset
|
244 needverification = set(self._entries.keys()) - self._verifiedbranches |
75e8e16ca107
branchcache: only iterate over branches which needs to be verified
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42132
diff
changeset
|
245 for b in needverification: |
42120
2f8147521e59
branchcache: add functions to validate changelog nodes
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42113
diff
changeset
|
246 self._verifybranch(b) |
2f8147521e59
branchcache: add functions to validate changelog nodes
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42113
diff
changeset
|
247 |
42001
624d6683c705
branchmap: remove the dict interface from the branchcache class (API)
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41839
diff
changeset
|
248 def __iter__(self): |
42005
b137a6793c51
branchcache: make entries a private attribute
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42004
diff
changeset
|
249 return iter(self._entries) |
42001
624d6683c705
branchmap: remove the dict interface from the branchcache class (API)
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41839
diff
changeset
|
250 |
624d6683c705
branchmap: remove the dict interface from the branchcache class (API)
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41839
diff
changeset
|
251 def __setitem__(self, key, value): |
42005
b137a6793c51
branchcache: make entries a private attribute
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42004
diff
changeset
|
252 self._entries[key] = value |
42001
624d6683c705
branchmap: remove the dict interface from the branchcache class (API)
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41839
diff
changeset
|
253 |
624d6683c705
branchmap: remove the dict interface from the branchcache class (API)
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41839
diff
changeset
|
254 def __getitem__(self, key): |
42121
6578654916ae
branchcache: lazily validate nodes from the branchmap
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42120
diff
changeset
|
255 self._verifybranch(key) |
42005
b137a6793c51
branchcache: make entries a private attribute
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42004
diff
changeset
|
256 return self._entries[key] |
42001
624d6683c705
branchmap: remove the dict interface from the branchcache class (API)
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41839
diff
changeset
|
257 |
42113
f0def07fa82f
branchmap: implement __contains__()
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42112
diff
changeset
|
258 def __contains__(self, key): |
42121
6578654916ae
branchcache: lazily validate nodes from the branchmap
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42120
diff
changeset
|
259 self._verifybranch(key) |
42113
f0def07fa82f
branchmap: implement __contains__()
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42112
diff
changeset
|
260 return key in self._entries |
f0def07fa82f
branchmap: implement __contains__()
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42112
diff
changeset
|
261 |
42001
624d6683c705
branchmap: remove the dict interface from the branchcache class (API)
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41839
diff
changeset
|
262 def iteritems(self): |
43106
d783f945a701
py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43104
diff
changeset
|
263 for k, v in pycompat.iteritems(self._entries): |
42134
f0203c3406e7
branchcache: lazily validate nodes in iteritems()
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42133
diff
changeset
|
264 self._verifybranch(k) |
f0203c3406e7
branchcache: lazily validate nodes in iteritems()
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42133
diff
changeset
|
265 yield k, v |
42001
624d6683c705
branchmap: remove the dict interface from the branchcache class (API)
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41839
diff
changeset
|
266 |
42603
3018749a71bb
py3: source-transform only call-sites of iteritems(), not definitions
Martin von Zweigbergk <martinvonz@google.com>
parents:
42602
diff
changeset
|
267 items = iteritems |
3018749a71bb
py3: source-transform only call-sites of iteritems(), not definitions
Martin von Zweigbergk <martinvonz@google.com>
parents:
42602
diff
changeset
|
268 |
42004
0bd730fbcc2b
branchcache: introduce hasbranch()
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42003
diff
changeset
|
269 def hasbranch(self, label): |
0bd730fbcc2b
branchcache: introduce hasbranch()
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42003
diff
changeset
|
270 """ checks whether a branch of this name exists or not """ |
42121
6578654916ae
branchcache: lazily validate nodes from the branchmap
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42120
diff
changeset
|
271 self._verifybranch(label) |
42005
b137a6793c51
branchcache: make entries a private attribute
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42004
diff
changeset
|
272 return label in self._entries |
42004
0bd730fbcc2b
branchcache: introduce hasbranch()
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42003
diff
changeset
|
273 |
41565
bf7fb97aecf1
branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents:
41396
diff
changeset
|
274 @classmethod |
bf7fb97aecf1
branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents:
41396
diff
changeset
|
275 def fromfile(cls, repo): |
bf7fb97aecf1
branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents:
41396
diff
changeset
|
276 f = None |
bf7fb97aecf1
branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents:
41396
diff
changeset
|
277 try: |
bf7fb97aecf1
branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents:
41396
diff
changeset
|
278 f = repo.cachevfs(cls._filename(repo)) |
bf7fb97aecf1
branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents:
41396
diff
changeset
|
279 lineiter = iter(f) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
280 cachekey = next(lineiter).rstrip(b'\n').split(b" ", 2) |
41565
bf7fb97aecf1
branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents:
41396
diff
changeset
|
281 last, lrev = cachekey[:2] |
bf7fb97aecf1
branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents:
41396
diff
changeset
|
282 last, lrev = bin(last), int(lrev) |
bf7fb97aecf1
branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents:
41396
diff
changeset
|
283 filteredhash = None |
42007
b5511845f9d5
branchcache: have a hasnode function to validate nodes
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42006
diff
changeset
|
284 hasnode = repo.changelog.hasnode |
41565
bf7fb97aecf1
branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents:
41396
diff
changeset
|
285 if len(cachekey) > 2: |
bf7fb97aecf1
branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents:
41396
diff
changeset
|
286 filteredhash = bin(cachekey[2]) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
287 bcache = cls( |
46780
6266d19556ad
node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46372
diff
changeset
|
288 repo, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
289 tipnode=last, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
290 tiprev=lrev, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
291 filteredhash=filteredhash, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
292 hasnode=hasnode, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
293 ) |
41565
bf7fb97aecf1
branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents:
41396
diff
changeset
|
294 if not bcache.validfor(repo): |
bf7fb97aecf1
branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents:
41396
diff
changeset
|
295 # invalidate the cache |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43499
diff
changeset
|
296 raise ValueError('tip differs') |
41808
8ad46ac6728e
branchmap: prevent reading the file twice through different iterators
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41797
diff
changeset
|
297 bcache.load(repo, lineiter) |
41565
bf7fb97aecf1
branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents:
41396
diff
changeset
|
298 except (IOError, OSError): |
bf7fb97aecf1
branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents:
41396
diff
changeset
|
299 return None |
bf7fb97aecf1
branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents:
41396
diff
changeset
|
300 |
bf7fb97aecf1
branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents:
41396
diff
changeset
|
301 except Exception as inst: |
bf7fb97aecf1
branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents:
41396
diff
changeset
|
302 if repo.ui.debugflag: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
303 msg = b'invalid %s: %s\n' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
304 repo.ui.debug( |
43499
1a47fe4bc154
branchmap: pytype is confused about bytestr
Augie Fackler <augie@google.com>
parents:
43106
diff
changeset
|
305 msg |
1a47fe4bc154
branchmap: pytype is confused about bytestr
Augie Fackler <augie@google.com>
parents:
43106
diff
changeset
|
306 % ( |
1a47fe4bc154
branchmap: pytype is confused about bytestr
Augie Fackler <augie@google.com>
parents:
43106
diff
changeset
|
307 _branchcachedesc(repo), |
46685
799973a44c82
branchmap: force Exception to bytes before logging
Matt Harbison <matt_harbison@yahoo.com>
parents:
46254
diff
changeset
|
308 stringutil.forcebytestr(inst), |
43499
1a47fe4bc154
branchmap: pytype is confused about bytestr
Augie Fackler <augie@google.com>
parents:
43106
diff
changeset
|
309 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
310 ) |
41565
bf7fb97aecf1
branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents:
41396
diff
changeset
|
311 bcache = None |
bf7fb97aecf1
branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents:
41396
diff
changeset
|
312 |
bf7fb97aecf1
branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents:
41396
diff
changeset
|
313 finally: |
bf7fb97aecf1
branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents:
41396
diff
changeset
|
314 if f: |
bf7fb97aecf1
branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents:
41396
diff
changeset
|
315 f.close() |
bf7fb97aecf1
branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents:
41396
diff
changeset
|
316 |
bf7fb97aecf1
branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents:
41396
diff
changeset
|
317 return bcache |
bf7fb97aecf1
branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents:
41396
diff
changeset
|
318 |
41808
8ad46ac6728e
branchmap: prevent reading the file twice through different iterators
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41797
diff
changeset
|
319 def load(self, repo, lineiter): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
44452
diff
changeset
|
320 """fully loads the branchcache by reading from the file using the line |
41808
8ad46ac6728e
branchmap: prevent reading the file twice through different iterators
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41797
diff
changeset
|
321 iterator passed""" |
41797
68bbcc70e274
branchcache: move loading of branch names and nodes into it's own function
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41759
diff
changeset
|
322 for line in lineiter: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
323 line = line.rstrip(b'\n') |
41797
68bbcc70e274
branchcache: move loading of branch names and nodes into it's own function
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41759
diff
changeset
|
324 if not line: |
68bbcc70e274
branchcache: move loading of branch names and nodes into it's own function
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41759
diff
changeset
|
325 continue |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
326 node, state, label = line.split(b" ", 2) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
327 if state not in b'oc': |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43499
diff
changeset
|
328 raise ValueError('invalid branch state') |
41797
68bbcc70e274
branchcache: move loading of branch names and nodes into it's own function
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41759
diff
changeset
|
329 label = encoding.tolocal(label.strip()) |
68bbcc70e274
branchcache: move loading of branch names and nodes into it's own function
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41759
diff
changeset
|
330 node = bin(node) |
42005
b137a6793c51
branchcache: make entries a private attribute
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42004
diff
changeset
|
331 self._entries.setdefault(label, []).append(node) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
332 if state == b'c': |
41797
68bbcc70e274
branchcache: move loading of branch names and nodes into it's own function
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41759
diff
changeset
|
333 self._closednodes.add(node) |
68bbcc70e274
branchcache: move loading of branch names and nodes into it's own function
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41759
diff
changeset
|
334 |
41565
bf7fb97aecf1
branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents:
41396
diff
changeset
|
335 @staticmethod |
bf7fb97aecf1
branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents:
41396
diff
changeset
|
336 def _filename(repo): |
bf7fb97aecf1
branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents:
41396
diff
changeset
|
337 """name of a branchcache file for a given repo or repoview""" |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
338 filename = b"branch2" |
41565
bf7fb97aecf1
branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents:
41396
diff
changeset
|
339 if repo.filtername: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
340 filename = b'%s-%s' % (filename, repo.filtername) |
41565
bf7fb97aecf1
branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents:
41396
diff
changeset
|
341 return filename |
18124
79db6d40bced
branchmap: store branchcache in a dedicated object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18121
diff
changeset
|
342 |
18132
db25bf1dc828
branchmap: move validity logic in the object itself
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18131
diff
changeset
|
343 def validfor(self, repo): |
18644
3e92772d5383
spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents:
18451
diff
changeset
|
344 """Is the cache content valid regarding a repo |
18132
db25bf1dc828
branchmap: move validity logic in the object itself
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18131
diff
changeset
|
345 |
18644
3e92772d5383
spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents:
18451
diff
changeset
|
346 - False when cached tipnode is unknown or if we detect a strip. |
18132
db25bf1dc828
branchmap: move validity logic in the object itself
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18131
diff
changeset
|
347 - True when cache is up to date or a subset of current repo.""" |
db25bf1dc828
branchmap: move validity logic in the object itself
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18131
diff
changeset
|
348 try: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
349 return (self.tipnode == repo.changelog.node(self.tiprev)) and ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
350 self.filteredhash == scmutil.filteredhash(repo, self.tiprev) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
351 ) |
18132
db25bf1dc828
branchmap: move validity logic in the object itself
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18131
diff
changeset
|
352 except IndexError: |
db25bf1dc828
branchmap: move validity logic in the object itself
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18131
diff
changeset
|
353 return False |
db25bf1dc828
branchmap: move validity logic in the object itself
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18131
diff
changeset
|
354 |
20186
f5b461a4bc55
branchmap: introduce branchtip() method
Brodie Rao <brodie@sf.io>
parents:
20185
diff
changeset
|
355 def _branchtip(self, heads): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
44452
diff
changeset
|
356 """Return tuple with last open head in heads and false, |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
44452
diff
changeset
|
357 otherwise return last closed head and true.""" |
20186
f5b461a4bc55
branchmap: introduce branchtip() method
Brodie Rao <brodie@sf.io>
parents:
20185
diff
changeset
|
358 tip = heads[-1] |
f5b461a4bc55
branchmap: introduce branchtip() method
Brodie Rao <brodie@sf.io>
parents:
20185
diff
changeset
|
359 closed = True |
f5b461a4bc55
branchmap: introduce branchtip() method
Brodie Rao <brodie@sf.io>
parents:
20185
diff
changeset
|
360 for h in reversed(heads): |
f5b461a4bc55
branchmap: introduce branchtip() method
Brodie Rao <brodie@sf.io>
parents:
20185
diff
changeset
|
361 if h not in self._closednodes: |
f5b461a4bc55
branchmap: introduce branchtip() method
Brodie Rao <brodie@sf.io>
parents:
20185
diff
changeset
|
362 tip = h |
f5b461a4bc55
branchmap: introduce branchtip() method
Brodie Rao <brodie@sf.io>
parents:
20185
diff
changeset
|
363 closed = False |
f5b461a4bc55
branchmap: introduce branchtip() method
Brodie Rao <brodie@sf.io>
parents:
20185
diff
changeset
|
364 break |
f5b461a4bc55
branchmap: introduce branchtip() method
Brodie Rao <brodie@sf.io>
parents:
20185
diff
changeset
|
365 return tip, closed |
f5b461a4bc55
branchmap: introduce branchtip() method
Brodie Rao <brodie@sf.io>
parents:
20185
diff
changeset
|
366 |
f5b461a4bc55
branchmap: introduce branchtip() method
Brodie Rao <brodie@sf.io>
parents:
20185
diff
changeset
|
367 def branchtip(self, branch): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
44452
diff
changeset
|
368 """Return the tipmost open head on branch head, otherwise return the |
20245
4edd179fefb8
help: branch names primarily denote the tipmost unclosed branch head
Mads Kiilerich <madski@unity3d.com>
parents:
20190
diff
changeset
|
369 tipmost closed head on branch. |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
44452
diff
changeset
|
370 Raise KeyError for unknown branch.""" |
20186
f5b461a4bc55
branchmap: introduce branchtip() method
Brodie Rao <brodie@sf.io>
parents:
20185
diff
changeset
|
371 return self._branchtip(self[branch])[0] |
f5b461a4bc55
branchmap: introduce branchtip() method
Brodie Rao <brodie@sf.io>
parents:
20185
diff
changeset
|
372 |
34074
abf91c4f9608
branches: correctly show inactive multiheaded branches
the31k <the31k@thethirty.one>
parents:
33663
diff
changeset
|
373 def iteropen(self, nodes): |
abf91c4f9608
branches: correctly show inactive multiheaded branches
the31k <the31k@thethirty.one>
parents:
33663
diff
changeset
|
374 return (n for n in nodes if n not in self._closednodes) |
abf91c4f9608
branches: correctly show inactive multiheaded branches
the31k <the31k@thethirty.one>
parents:
33663
diff
changeset
|
375 |
20188
3a3727829607
branchmap: introduce branchheads() method
Brodie Rao <brodie@sf.io>
parents:
20186
diff
changeset
|
376 def branchheads(self, branch, closed=False): |
42121
6578654916ae
branchcache: lazily validate nodes from the branchmap
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42120
diff
changeset
|
377 self._verifybranch(branch) |
42112
29c22496dd97
branchmap: prevent using __getitem__() in branchheads()
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42111
diff
changeset
|
378 heads = self._entries[branch] |
20188
3a3727829607
branchmap: introduce branchheads() method
Brodie Rao <brodie@sf.io>
parents:
20186
diff
changeset
|
379 if not closed: |
34074
abf91c4f9608
branches: correctly show inactive multiheaded branches
the31k <the31k@thethirty.one>
parents:
33663
diff
changeset
|
380 heads = list(self.iteropen(heads)) |
20188
3a3727829607
branchmap: introduce branchheads() method
Brodie Rao <brodie@sf.io>
parents:
20186
diff
changeset
|
381 return heads |
3a3727829607
branchmap: introduce branchheads() method
Brodie Rao <brodie@sf.io>
parents:
20186
diff
changeset
|
382 |
20190
d5d25e541637
branchmap: introduce iterbranches() method
Brodie Rao <brodie@sf.io>
parents:
20188
diff
changeset
|
383 def iterbranches(self): |
43106
d783f945a701
py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43104
diff
changeset
|
384 for bn, heads in pycompat.iteritems(self): |
20190
d5d25e541637
branchmap: introduce iterbranches() method
Brodie Rao <brodie@sf.io>
parents:
20188
diff
changeset
|
385 yield (bn, heads) + self._branchtip(heads) |
d5d25e541637
branchmap: introduce iterbranches() method
Brodie Rao <brodie@sf.io>
parents:
20188
diff
changeset
|
386 |
42002
662ffdde5adf
branchcache: rename itervalues() to iterheads()
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42001
diff
changeset
|
387 def iterheads(self): |
662ffdde5adf
branchcache: rename itervalues() to iterheads()
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42001
diff
changeset
|
388 """ returns all the heads """ |
42121
6578654916ae
branchcache: lazily validate nodes from the branchmap
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42120
diff
changeset
|
389 self._verifyall() |
43104
74802979dd9d
py3: define and use pycompat.itervalues()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43077
diff
changeset
|
390 return pycompat.itervalues(self._entries) |
42002
662ffdde5adf
branchcache: rename itervalues() to iterheads()
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42001
diff
changeset
|
391 |
18232
dd0b636b0b65
branchmap: add a copy method
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18218
diff
changeset
|
392 def copy(self): |
dd0b636b0b65
branchmap: add a copy method
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18218
diff
changeset
|
393 """return an deep copy of the branchcache object""" |
42111
f0fa0fc4900a
branchmap: dynamically resolve type of branchcache class
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42007
diff
changeset
|
394 return type(self)( |
46780
6266d19556ad
node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46372
diff
changeset
|
395 self._repo, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
396 self._entries, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
397 self.tipnode, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
398 self.tiprev, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
399 self.filteredhash, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
400 self._closednodes, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
401 ) |
18132
db25bf1dc828
branchmap: move validity logic in the object itself
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18131
diff
changeset
|
402 |
18128
f0d56efaa35a
branchmap: make write a method on the branchmap object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18127
diff
changeset
|
403 def write(self, repo): |
f0d56efaa35a
branchmap: make write a method on the branchmap object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18127
diff
changeset
|
404 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
405 f = repo.cachevfs(self._filename(repo), b"w", atomictemp=True) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
406 cachekey = [hex(self.tipnode), b'%d' % self.tiprev] |
18184
8d48af68e2ae
branchmap: read and write key part related to filtered revision
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18168
diff
changeset
|
407 if self.filteredhash is not None: |
8d48af68e2ae
branchmap: read and write key part related to filtered revision
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18168
diff
changeset
|
408 cachekey.append(hex(self.filteredhash)) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
409 f.write(b" ".join(cachekey) + b'\n') |
21031
05cfcecb3aef
branchmap: log events related to branch cache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20264
diff
changeset
|
410 nodecount = 0 |
43106
d783f945a701
py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43104
diff
changeset
|
411 for label, nodes in sorted(pycompat.iteritems(self._entries)): |
41678
9d0d8793e847
branchmap: decode a label only once
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41677
diff
changeset
|
412 label = encoding.fromlocal(label) |
18128
f0d56efaa35a
branchmap: make write a method on the branchmap object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18127
diff
changeset
|
413 for node in nodes: |
21031
05cfcecb3aef
branchmap: log events related to branch cache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20264
diff
changeset
|
414 nodecount += 1 |
20185
7d4219512823
branchmap: cache open/closed branch head information
Brodie Rao <brodie@sf.io>
parents:
20181
diff
changeset
|
415 if node in self._closednodes: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
416 state = b'c' |
20185
7d4219512823
branchmap: cache open/closed branch head information
Brodie Rao <brodie@sf.io>
parents:
20181
diff
changeset
|
417 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
418 state = b'o' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
419 f.write(b"%s %s %s\n" % (hex(node), state, label)) |
18128
f0d56efaa35a
branchmap: make write a method on the branchmap object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18127
diff
changeset
|
420 f.close() |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
421 repo.ui.log( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
422 b'branchcache', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
423 b'wrote %s with %d labels and %d nodes\n', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
424 _branchcachedesc(repo), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
425 len(self._entries), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
426 nodecount, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
427 ) |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26460
diff
changeset
|
428 except (IOError, OSError, error.Abort) as inst: |
34370
d0db41af73c0
branchmap: remove superfluous pass statements
Augie Fackler <augie@google.com>
parents:
34074
diff
changeset
|
429 # Abort may be raised by read only opener, so log and continue |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
430 repo.ui.debug( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
431 b"couldn't write branch cache: %s\n" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
432 % stringutil.forcebytestr(inst) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
433 ) |
18131
f0eeb9b3444a
branchmap: make update a method
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18130
diff
changeset
|
434 |
18305
2502a15e033d
branchmap: pass revision insteads of changectx to the update function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18234
diff
changeset
|
435 def update(self, repo, revgen): |
18131
f0eeb9b3444a
branchmap: make update a method
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18130
diff
changeset
|
436 """Given a branchhead cache, self, that may have extra nodes or be |
20263
ea4996754d91
branchmap: simplify update code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20262
diff
changeset
|
437 missing heads, and a generator of nodes that are strictly a superset of |
18131
f0eeb9b3444a
branchmap: make update a method
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18130
diff
changeset
|
438 heads missing, this function updates self to be correct. |
f0eeb9b3444a
branchmap: make update a method
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18130
diff
changeset
|
439 """ |
30975
22fbca1d11ed
mercurial: switch to util.timer for all interval timings
Simon Farnsworth <simonfar@fb.com>
parents:
29746
diff
changeset
|
440 starttime = util.timer() |
18131
f0eeb9b3444a
branchmap: make update a method
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18130
diff
changeset
|
441 cl = repo.changelog |
f0eeb9b3444a
branchmap: make update a method
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18130
diff
changeset
|
442 # collect new branch entries |
f0eeb9b3444a
branchmap: make update a method
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18130
diff
changeset
|
443 newbranches = {} |
24373
59cc09240afb
revbranchcache: move out of branchmap onto localrepo
Durham Goode <durham@fb.com>
parents:
24163
diff
changeset
|
444 getbranchinfo = repo.revbranchcache().branchinfo |
18307
0eed2546118a
branchmap: Save changectx creation during update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18305
diff
changeset
|
445 for r in revgen: |
40425
5e5c8f2a1eb5
branchmap: do not specify changelog as an argument
Yuya Nishihara <yuya@tcha.org>
parents:
40375
diff
changeset
|
446 branch, closesbranch = getbranchinfo(r) |
20262
cf450ee3f8f7
branchmap: stop useless rev -> node -> rev round trip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20261
diff
changeset
|
447 newbranches.setdefault(branch, []).append(r) |
20185
7d4219512823
branchmap: cache open/closed branch head information
Brodie Rao <brodie@sf.io>
parents:
20181
diff
changeset
|
448 if closesbranch: |
20262
cf450ee3f8f7
branchmap: stop useless rev -> node -> rev round trip
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20261
diff
changeset
|
449 self._closednodes.add(cl.node(r)) |
22357
9c3c3dc14a65
branchmap: pre-filter topological heads before ancestors based filtering
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22356
diff
changeset
|
450 |
42214
9893d7aa7420
branchcache: store the maximum tip in a variable inside for loop
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42190
diff
changeset
|
451 # new tip revision which we found after iterating items from new |
9893d7aa7420
branchcache: store the maximum tip in a variable inside for loop
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42190
diff
changeset
|
452 # branches |
9893d7aa7420
branchcache: store the maximum tip in a variable inside for loop
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42190
diff
changeset
|
453 ntiprev = self.tiprev |
9893d7aa7420
branchcache: store the maximum tip in a variable inside for loop
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42190
diff
changeset
|
454 |
46254
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
455 # Delay fetching the topological heads until they are needed. |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
456 # A repository without non-continous branches can skip this part. |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
457 topoheads = None |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
458 |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
459 # If a changeset is visible, its parents must be visible too, so |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
460 # use the faster unfiltered parent accessor. |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
461 parentrevs = repo.unfiltered().changelog.parentrevs |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
462 |
43106
d783f945a701
py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43104
diff
changeset
|
463 for branch, newheadrevs in pycompat.iteritems(newbranches): |
46254
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
464 # For every branch, compute the new branchheads. |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
465 # A branchhead is a revision such that no descendant is on |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
466 # the same branch. |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
467 # |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
468 # The branchheads are computed iteratively in revision order. |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
469 # This ensures topological order, i.e. parents are processed |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
470 # before their children. Ancestors are inclusive here, i.e. |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
471 # any revision is an ancestor of itself. |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
472 # |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
473 # Core observations: |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
474 # - The current revision is always a branchhead for the |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
475 # repository up to that point. |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
476 # - It is the first revision of the branch if and only if |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
477 # there was no branchhead before. In that case, it is the |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
478 # only branchhead as there are no possible ancestors on |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
479 # the same branch. |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
480 # - If a parent is on the same branch, a branchhead can |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
481 # only be an ancestor of that parent, if it is parent |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
482 # itself. Otherwise it would have been removed as ancestor |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
483 # of that parent before. |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
484 # - Therefore, if all parents are on the same branch, they |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
485 # can just be removed from the branchhead set. |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
486 # - If one parent is on the same branch and the other is not |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
487 # and there was exactly one branchhead known, the existing |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
488 # branchhead can only be an ancestor if it is the parent. |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
489 # Otherwise it would have been removed as ancestor of |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
490 # the parent before. The other parent therefore can't have |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
491 # a branchhead as ancestor. |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
492 # - In all other cases, the parents on different branches |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
493 # could have a branchhead as ancestor. Those parents are |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
494 # kept in the "uncertain" set. If all branchheads are also |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
495 # topological heads, they can't have descendants and further |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
496 # checks can be skipped. Otherwise, the ancestors of the |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
497 # "uncertain" set are removed from branchheads. |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
498 # This computation is heavy and avoided if at all possible. |
42005
b137a6793c51
branchcache: make entries a private attribute
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42004
diff
changeset
|
499 bheads = self._entries.setdefault(branch, []) |
44452
9d2b2df2c2ba
cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents:
44306
diff
changeset
|
500 bheadset = {cl.rev(node) for node in bheads} |
46254
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
501 uncertain = set() |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
502 for newrev in sorted(newheadrevs): |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
503 if not bheadset: |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
504 bheadset.add(newrev) |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
505 continue |
18131
f0eeb9b3444a
branchmap: make update a method
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18130
diff
changeset
|
506 |
46254
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
507 parents = [p for p in parentrevs(newrev) if p != nullrev] |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
508 samebranch = set() |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
509 otherbranch = set() |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
510 for p in parents: |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
511 if p in bheadset or getbranchinfo(p)[0] == branch: |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
512 samebranch.add(p) |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
513 else: |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
514 otherbranch.add(p) |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
515 if otherbranch and not (len(bheadset) == len(samebranch) == 1): |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
516 uncertain.update(otherbranch) |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
517 bheadset.difference_update(samebranch) |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
518 bheadset.add(newrev) |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
519 |
22357
9c3c3dc14a65
branchmap: pre-filter topological heads before ancestors based filtering
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22356
diff
changeset
|
520 if uncertain: |
46254
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
521 if topoheads is None: |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
522 topoheads = set(cl.headrevs()) |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
523 if bheadset - topoheads: |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
524 floorrev = min(bheadset) |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
525 ancestors = set(cl.ancestors(newheadrevs, floorrev)) |
c4b792fa109e
branchmap: avoid ancestor computations in absence of non-continous branches
Joerg Sonnenberger <joerg@bec.de>
parents:
45942
diff
changeset
|
526 bheadset -= ancestors |
20264
d9e1c167943b
branchmap: use set for update code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20263
diff
changeset
|
527 bheadrevs = sorted(bheadset) |
18131
f0eeb9b3444a
branchmap: make update a method
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18130
diff
changeset
|
528 self[branch] = [cl.node(rev) for rev in bheadrevs] |
20263
ea4996754d91
branchmap: simplify update code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20262
diff
changeset
|
529 tiprev = bheadrevs[-1] |
42214
9893d7aa7420
branchcache: store the maximum tip in a variable inside for loop
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42190
diff
changeset
|
530 if tiprev > ntiprev: |
9893d7aa7420
branchcache: store the maximum tip in a variable inside for loop
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42190
diff
changeset
|
531 ntiprev = tiprev |
9893d7aa7420
branchcache: store the maximum tip in a variable inside for loop
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42190
diff
changeset
|
532 |
9893d7aa7420
branchcache: store the maximum tip in a variable inside for loop
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42190
diff
changeset
|
533 if ntiprev > self.tiprev: |
9893d7aa7420
branchcache: store the maximum tip in a variable inside for loop
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42190
diff
changeset
|
534 self.tiprev = ntiprev |
9893d7aa7420
branchcache: store the maximum tip in a variable inside for loop
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42190
diff
changeset
|
535 self.tipnode = cl.node(ntiprev) |
18131
f0eeb9b3444a
branchmap: make update a method
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18130
diff
changeset
|
536 |
19838
23386881abeb
branchmap: remove the droppednodes logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19837
diff
changeset
|
537 if not self.validfor(repo): |
18131
f0eeb9b3444a
branchmap: make update a method
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18130
diff
changeset
|
538 # cache key are not valid anymore |
f0eeb9b3444a
branchmap: make update a method
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18130
diff
changeset
|
539 self.tipnode = nullid |
f0eeb9b3444a
branchmap: make update a method
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18130
diff
changeset
|
540 self.tiprev = nullrev |
42002
662ffdde5adf
branchcache: rename itervalues() to iterheads()
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42001
diff
changeset
|
541 for heads in self.iterheads(): |
18131
f0eeb9b3444a
branchmap: make update a method
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18130
diff
changeset
|
542 tiprev = max(cl.rev(node) for node in heads) |
f0eeb9b3444a
branchmap: make update a method
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18130
diff
changeset
|
543 if tiprev > self.tiprev: |
f0eeb9b3444a
branchmap: make update a method
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18130
diff
changeset
|
544 self.tipnode = cl.node(tiprev) |
f0eeb9b3444a
branchmap: make update a method
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18130
diff
changeset
|
545 self.tiprev = tiprev |
24723
467a33142425
repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24378
diff
changeset
|
546 self.filteredhash = scmutil.filteredhash(repo, self.tiprev) |
21031
05cfcecb3aef
branchmap: log events related to branch cache
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20264
diff
changeset
|
547 |
30975
22fbca1d11ed
mercurial: switch to util.timer for all interval timings
Simon Farnsworth <simonfar@fb.com>
parents:
29746
diff
changeset
|
548 duration = util.timer() - starttime |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
549 repo.ui.log( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
550 b'branchcache', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
551 b'updated %s in %.4f seconds\n', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
552 _branchcachedesc(repo), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
553 duration, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
554 ) |
23785
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
555 |
41566
eb7ce452e0fb
branchmap: updating triggers a write
Martijn Pieters <mj@octobus.net>
parents:
41565
diff
changeset
|
556 self.write(repo) |
eb7ce452e0fb
branchmap: updating triggers a write
Martijn Pieters <mj@octobus.net>
parents:
41565
diff
changeset
|
557 |
eb7ce452e0fb
branchmap: updating triggers a write
Martijn Pieters <mj@octobus.net>
parents:
41565
diff
changeset
|
558 |
eb7ce452e0fb
branchmap: updating triggers a write
Martijn Pieters <mj@octobus.net>
parents:
41565
diff
changeset
|
559 class remotebranchcache(branchcache): |
eb7ce452e0fb
branchmap: updating triggers a write
Martijn Pieters <mj@octobus.net>
parents:
41565
diff
changeset
|
560 """Branchmap info for a remote connection, should not write locally""" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
561 |
41566
eb7ce452e0fb
branchmap: updating triggers a write
Martijn Pieters <mj@octobus.net>
parents:
41565
diff
changeset
|
562 def write(self, repo): |
eb7ce452e0fb
branchmap: updating triggers a write
Martijn Pieters <mj@octobus.net>
parents:
41565
diff
changeset
|
563 pass |
eb7ce452e0fb
branchmap: updating triggers a write
Martijn Pieters <mj@octobus.net>
parents:
41565
diff
changeset
|
564 |
eb7ce452e0fb
branchmap: updating triggers a write
Martijn Pieters <mj@octobus.net>
parents:
41565
diff
changeset
|
565 |
23785
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
566 # Revision branch info cache |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
567 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
568 _rbcversion = b'-v1' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
569 _rbcnames = b'rbc-names' + _rbcversion |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
570 _rbcrevs = b'rbc-revs' + _rbcversion |
23785
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
571 # [4 byte hash prefix][4 byte branch name number with sign bit indicating open] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
572 _rbcrecfmt = b'>4sI' |
23785
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
573 _rbcrecsize = calcsize(_rbcrecfmt) |
46360
1726a53a8494
reverse-branch-cache: switch to doubling allocating scheme
Joerg Sonnenberger <joerg@bec.de>
parents:
46254
diff
changeset
|
574 _rbcmininc = 64 * _rbcrecsize |
23785
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
575 _rbcnodelen = 4 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
576 _rbcbranchidxmask = 0x7FFFFFFF |
23785
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
577 _rbccloseflag = 0x80000000 |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
578 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
579 |
23785
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
580 class revbranchcache(object): |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
581 """Persistent cache, mapping from revision number to branch name and close. |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
582 This is a low level cache, independent of filtering. |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
583 |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
584 Branch names are stored in rbc-names in internal encoding separated by 0. |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
585 rbc-names is append-only, and each branch name is only stored once and will |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
586 thus have a unique index. |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
587 |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
588 The branch info for each revision is stored in rbc-revs as constant size |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
589 records. The whole file is read into memory, but it is only 'parsed' on |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
590 demand. The file is usually append-only but will be truncated if repo |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
591 modification is detected. |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
592 The record for each revision contains the first 4 bytes of the |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
593 corresponding node hash, and the record is only used if it still matches. |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
594 Even a completely trashed rbc-revs fill thus still give the right result |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
595 while converging towards full recovery ... assuming no incorrectly matching |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
596 node hashes. |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
597 The record also contains 4 bytes where 31 bits contains the index of the |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
598 branch and the last bit indicate that it is a branch close commit. |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
599 The usage pattern for rbc-revs is thus somewhat similar to 00changelog.i |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
600 and will grow with it but be 1/8th of its size. |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
601 """ |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
602 |
24159
5b4ed033390b
revisionbranchcache: fall back to slow path if starting readonly (issue4531)
Mads Kiilerich <madski@unity3d.com>
parents:
23877
diff
changeset
|
603 def __init__(self, repo, readonly=True): |
23785
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
604 assert repo.filtername is None |
24374
77fd1fb538cd
revbranchcache: store repo on the object
Durham Goode <durham@fb.com>
parents:
24373
diff
changeset
|
605 self._repo = repo |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
606 self._names = [] # branch names in local encoding with static index |
31346
2a18e9e6ca43
py3: use bytearray() instead of array('c', ...) constructions
Augie Fackler <augie@google.com>
parents:
30975
diff
changeset
|
607 self._rbcrevs = bytearray() |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
608 self._rbcsnameslen = 0 # length of names read at _rbcsnameslen |
23785
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
609 try: |
33535
755e6532e81d
cachevfs: migration the revbranchcache to 'cachevfs'
Boris Feld <boris.feld@octobus.net>
parents:
33534
diff
changeset
|
610 bndata = repo.cachevfs.read(_rbcnames) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
611 self._rbcsnameslen = len(bndata) # for verification before writing |
31371
7dd2f51f38ac
rbc: empty (and invalid) rbc-names file should give an empty name list
Mads Kiilerich <mads@kiilerich.com>
parents:
31370
diff
changeset
|
612 if bndata: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
613 self._names = [ |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
614 encoding.tolocal(bn) for bn in bndata.split(b'\0') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
615 ] |
29423
d2c6f3a948fa
branchmap: remove unused exception variable
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28558
diff
changeset
|
616 except (IOError, OSError): |
24159
5b4ed033390b
revisionbranchcache: fall back to slow path if starting readonly (issue4531)
Mads Kiilerich <madski@unity3d.com>
parents:
23877
diff
changeset
|
617 if readonly: |
5b4ed033390b
revisionbranchcache: fall back to slow path if starting readonly (issue4531)
Mads Kiilerich <madski@unity3d.com>
parents:
23877
diff
changeset
|
618 # don't try to use cache - fall back to the slow path |
5b4ed033390b
revisionbranchcache: fall back to slow path if starting readonly (issue4531)
Mads Kiilerich <madski@unity3d.com>
parents:
23877
diff
changeset
|
619 self.branchinfo = self._branchinfo |
5b4ed033390b
revisionbranchcache: fall back to slow path if starting readonly (issue4531)
Mads Kiilerich <madski@unity3d.com>
parents:
23877
diff
changeset
|
620 |
23785
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
621 if self._names: |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
622 try: |
33535
755e6532e81d
cachevfs: migration the revbranchcache to 'cachevfs'
Boris Feld <boris.feld@octobus.net>
parents:
33534
diff
changeset
|
623 data = repo.cachevfs.read(_rbcrevs) |
31346
2a18e9e6ca43
py3: use bytearray() instead of array('c', ...) constructions
Augie Fackler <augie@google.com>
parents:
30975
diff
changeset
|
624 self._rbcrevs[:] = data |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25266
diff
changeset
|
625 except (IOError, OSError) as inst: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
626 repo.ui.debug( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
627 b"couldn't read revision branch cache: %s\n" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
628 % stringutil.forcebytestr(inst) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
629 ) |
23785
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
630 # remember number of good records on disk |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
631 self._rbcrevslen = min( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
632 len(self._rbcrevs) // _rbcrecsize, len(repo.changelog) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
633 ) |
23785
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
634 if self._rbcrevslen == 0: |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
635 self._names = [] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
636 self._rbcnamescount = len(self._names) # number of names read at |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
637 # _rbcsnameslen |
23785
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
638 |
28558
bcd106d456c4
cache: rebuild branch cache from scratch when inconsistencies are detected
Mads Kiilerich <madski@unity3d.com>
parents:
28557
diff
changeset
|
639 def _clear(self): |
bcd106d456c4
cache: rebuild branch cache from scratch when inconsistencies are detected
Mads Kiilerich <madski@unity3d.com>
parents:
28557
diff
changeset
|
640 self._rbcsnameslen = 0 |
bcd106d456c4
cache: rebuild branch cache from scratch when inconsistencies are detected
Mads Kiilerich <madski@unity3d.com>
parents:
28557
diff
changeset
|
641 del self._names[:] |
bcd106d456c4
cache: rebuild branch cache from scratch when inconsistencies are detected
Mads Kiilerich <madski@unity3d.com>
parents:
28557
diff
changeset
|
642 self._rbcnamescount = 0 |
bcd106d456c4
cache: rebuild branch cache from scratch when inconsistencies are detected
Mads Kiilerich <madski@unity3d.com>
parents:
28557
diff
changeset
|
643 self._rbcrevslen = len(self._repo.changelog) |
31346
2a18e9e6ca43
py3: use bytearray() instead of array('c', ...) constructions
Augie Fackler <augie@google.com>
parents:
30975
diff
changeset
|
644 self._rbcrevs = bytearray(self._rbcrevslen * _rbcrecsize) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
645 util.clearcachedproperty(self, b'_namesreverse') |
40710
50a64c321c1e
branchmap: build the revbranchcache._namesreverse() only when required
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
40425
diff
changeset
|
646 |
50a64c321c1e
branchmap: build the revbranchcache._namesreverse() only when required
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
40425
diff
changeset
|
647 @util.propertycache |
50a64c321c1e
branchmap: build the revbranchcache._namesreverse() only when required
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
40425
diff
changeset
|
648 def _namesreverse(self): |
44452
9d2b2df2c2ba
cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents:
44306
diff
changeset
|
649 return {b: r for r, b in enumerate(self._names)} |
28558
bcd106d456c4
cache: rebuild branch cache from scratch when inconsistencies are detected
Mads Kiilerich <madski@unity3d.com>
parents:
28557
diff
changeset
|
650 |
40425
5e5c8f2a1eb5
branchmap: do not specify changelog as an argument
Yuya Nishihara <yuya@tcha.org>
parents:
40375
diff
changeset
|
651 def branchinfo(self, rev): |
23785
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
652 """Return branch name and close flag for rev, using and updating |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
653 persistent cache.""" |
40425
5e5c8f2a1eb5
branchmap: do not specify changelog as an argument
Yuya Nishihara <yuya@tcha.org>
parents:
40375
diff
changeset
|
654 changelog = self._repo.changelog |
23785
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
655 rbcrevidx = rev * _rbcrecsize |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
656 |
25266
38117278f295
revbranchcache: return uncached branchinfo for nullrev (issue4683)
Yuya Nishihara <yuya@tcha.org>
parents:
24728
diff
changeset
|
657 # avoid negative index, changelog.read(nullrev) is fast without cache |
38117278f295
revbranchcache: return uncached branchinfo for nullrev (issue4683)
Yuya Nishihara <yuya@tcha.org>
parents:
24728
diff
changeset
|
658 if rev == nullrev: |
38117278f295
revbranchcache: return uncached branchinfo for nullrev (issue4683)
Yuya Nishihara <yuya@tcha.org>
parents:
24728
diff
changeset
|
659 return changelog.branchinfo(rev) |
38117278f295
revbranchcache: return uncached branchinfo for nullrev (issue4683)
Yuya Nishihara <yuya@tcha.org>
parents:
24728
diff
changeset
|
660 |
29604
db0095c83344
rbc: fix invalid rbc-revs entries caused by missing cache growth
Mads Kiilerich <madski@unity3d.com>
parents:
29423
diff
changeset
|
661 # if requested rev isn't allocated, grow and cache the rev info |
23785
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
662 if len(self._rbcrevs) < rbcrevidx + _rbcrecsize: |
40425
5e5c8f2a1eb5
branchmap: do not specify changelog as an argument
Yuya Nishihara <yuya@tcha.org>
parents:
40375
diff
changeset
|
663 return self._branchinfo(rev) |
23785
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
664 |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
665 # fast path: extract data from cache, use it if node is matching |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
666 reponode = changelog.node(rev)[:_rbcnodelen] |
33663
1814ca418b30
branchmap: revert c34532365b38 for Python 2.7 compatibility
Mike Hommey <mh@glandium.org>
parents:
33535
diff
changeset
|
667 cachenode, branchidx = unpack_from( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
668 _rbcrecfmt, util.buffer(self._rbcrevs), rbcrevidx |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
669 ) |
23785
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
670 close = bool(branchidx & _rbccloseflag) |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
671 if close: |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
672 branchidx &= _rbcbranchidxmask |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
673 if cachenode == b'\0\0\0\0': |
24376
203a078da052
revbranchcache: populate cache incrementally
Durham Goode <durham@fb.com>
parents:
24375
diff
changeset
|
674 pass |
203a078da052
revbranchcache: populate cache incrementally
Durham Goode <durham@fb.com>
parents:
24375
diff
changeset
|
675 elif cachenode == reponode: |
29615
a2a380e2750f
rbc: fix superfluous rebuilding from scratch - don't abuse self._rbcnamescount
Mads Kiilerich <madski@unity3d.com>
parents:
29604
diff
changeset
|
676 try: |
28558
bcd106d456c4
cache: rebuild branch cache from scratch when inconsistencies are detected
Mads Kiilerich <madski@unity3d.com>
parents:
28557
diff
changeset
|
677 return self._names[branchidx], close |
29615
a2a380e2750f
rbc: fix superfluous rebuilding from scratch - don't abuse self._rbcnamescount
Mads Kiilerich <madski@unity3d.com>
parents:
29604
diff
changeset
|
678 except IndexError: |
a2a380e2750f
rbc: fix superfluous rebuilding from scratch - don't abuse self._rbcnamescount
Mads Kiilerich <madski@unity3d.com>
parents:
29604
diff
changeset
|
679 # recover from invalid reference to unknown branch |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
680 self._repo.ui.debug( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
681 b"referenced branch names not found" |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
682 b" - rebuilding revision branch cache from scratch\n" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
683 ) |
29615
a2a380e2750f
rbc: fix superfluous rebuilding from scratch - don't abuse self._rbcnamescount
Mads Kiilerich <madski@unity3d.com>
parents:
29604
diff
changeset
|
684 self._clear() |
24376
203a078da052
revbranchcache: populate cache incrementally
Durham Goode <durham@fb.com>
parents:
24375
diff
changeset
|
685 else: |
203a078da052
revbranchcache: populate cache incrementally
Durham Goode <durham@fb.com>
parents:
24375
diff
changeset
|
686 # rev/node map has changed, invalidate the cache from here up |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
687 self._repo.ui.debug( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
688 b"history modification detected - truncating " |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
689 b"revision branch cache to revision %d\n" % rev |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
690 ) |
24376
203a078da052
revbranchcache: populate cache incrementally
Durham Goode <durham@fb.com>
parents:
24375
diff
changeset
|
691 truncate = rbcrevidx + _rbcrecsize |
203a078da052
revbranchcache: populate cache incrementally
Durham Goode <durham@fb.com>
parents:
24375
diff
changeset
|
692 del self._rbcrevs[truncate:] |
203a078da052
revbranchcache: populate cache incrementally
Durham Goode <durham@fb.com>
parents:
24375
diff
changeset
|
693 self._rbcrevslen = min(self._rbcrevslen, truncate) |
203a078da052
revbranchcache: populate cache incrementally
Durham Goode <durham@fb.com>
parents:
24375
diff
changeset
|
694 |
23785
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
695 # fall back to slow path and make sure it will be written to disk |
40425
5e5c8f2a1eb5
branchmap: do not specify changelog as an argument
Yuya Nishihara <yuya@tcha.org>
parents:
40375
diff
changeset
|
696 return self._branchinfo(rev) |
23785
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
697 |
40425
5e5c8f2a1eb5
branchmap: do not specify changelog as an argument
Yuya Nishihara <yuya@tcha.org>
parents:
40375
diff
changeset
|
698 def _branchinfo(self, rev): |
23785
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
699 """Retrieve branch info from changelog and update _rbcrevs""" |
40425
5e5c8f2a1eb5
branchmap: do not specify changelog as an argument
Yuya Nishihara <yuya@tcha.org>
parents:
40375
diff
changeset
|
700 changelog = self._repo.changelog |
23785
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
701 b, close = changelog.branchinfo(rev) |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
702 if b in self._namesreverse: |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
703 branchidx = self._namesreverse[b] |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
704 else: |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
705 branchidx = len(self._names) |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
706 self._names.append(b) |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
707 self._namesreverse[b] = branchidx |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
708 reponode = changelog.node(rev) |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
709 if close: |
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
710 branchidx |= _rbccloseflag |
40425
5e5c8f2a1eb5
branchmap: do not specify changelog as an argument
Yuya Nishihara <yuya@tcha.org>
parents:
40375
diff
changeset
|
711 self._setcachedata(rev, reponode, branchidx) |
24375
fe255b2525d5
revbranchcache: move entry writing to a separate function
Durham Goode <durham@fb.com>
parents:
24374
diff
changeset
|
712 return b, close |
fe255b2525d5
revbranchcache: move entry writing to a separate function
Durham Goode <durham@fb.com>
parents:
24374
diff
changeset
|
713 |
46372
3e91d9978bec
branchmap: update rev-branch-cache incrementally
Joerg Sonnenberger <joerg@bec.de>
parents:
46360
diff
changeset
|
714 def setdata(self, rev, changelogrevision): |
36962
95f4f1bfb650
revbranchcache: add a public function to update the data
Boris Feld <boris.feld@octobus.net>
parents:
36474
diff
changeset
|
715 """add new data information to the cache""" |
46372
3e91d9978bec
branchmap: update rev-branch-cache incrementally
Joerg Sonnenberger <joerg@bec.de>
parents:
46360
diff
changeset
|
716 branch, close = changelogrevision.branchinfo |
3e91d9978bec
branchmap: update rev-branch-cache incrementally
Joerg Sonnenberger <joerg@bec.de>
parents:
46360
diff
changeset
|
717 |
36962
95f4f1bfb650
revbranchcache: add a public function to update the data
Boris Feld <boris.feld@octobus.net>
parents:
36474
diff
changeset
|
718 if branch in self._namesreverse: |
95f4f1bfb650
revbranchcache: add a public function to update the data
Boris Feld <boris.feld@octobus.net>
parents:
36474
diff
changeset
|
719 branchidx = self._namesreverse[branch] |
95f4f1bfb650
revbranchcache: add a public function to update the data
Boris Feld <boris.feld@octobus.net>
parents:
36474
diff
changeset
|
720 else: |
95f4f1bfb650
revbranchcache: add a public function to update the data
Boris Feld <boris.feld@octobus.net>
parents:
36474
diff
changeset
|
721 branchidx = len(self._names) |
95f4f1bfb650
revbranchcache: add a public function to update the data
Boris Feld <boris.feld@octobus.net>
parents:
36474
diff
changeset
|
722 self._names.append(branch) |
95f4f1bfb650
revbranchcache: add a public function to update the data
Boris Feld <boris.feld@octobus.net>
parents:
36474
diff
changeset
|
723 self._namesreverse[branch] = branchidx |
95f4f1bfb650
revbranchcache: add a public function to update the data
Boris Feld <boris.feld@octobus.net>
parents:
36474
diff
changeset
|
724 if close: |
95f4f1bfb650
revbranchcache: add a public function to update the data
Boris Feld <boris.feld@octobus.net>
parents:
36474
diff
changeset
|
725 branchidx |= _rbccloseflag |
46372
3e91d9978bec
branchmap: update rev-branch-cache incrementally
Joerg Sonnenberger <joerg@bec.de>
parents:
46360
diff
changeset
|
726 self._setcachedata(rev, self._repo.changelog.node(rev), branchidx) |
36962
95f4f1bfb650
revbranchcache: add a public function to update the data
Boris Feld <boris.feld@octobus.net>
parents:
36474
diff
changeset
|
727 # If no cache data were readable (non exists, bad permission, etc) |
95f4f1bfb650
revbranchcache: add a public function to update the data
Boris Feld <boris.feld@octobus.net>
parents:
36474
diff
changeset
|
728 # the cache was bypassing itself by setting: |
95f4f1bfb650
revbranchcache: add a public function to update the data
Boris Feld <boris.feld@octobus.net>
parents:
36474
diff
changeset
|
729 # |
95f4f1bfb650
revbranchcache: add a public function to update the data
Boris Feld <boris.feld@octobus.net>
parents:
36474
diff
changeset
|
730 # self.branchinfo = self._branchinfo |
95f4f1bfb650
revbranchcache: add a public function to update the data
Boris Feld <boris.feld@octobus.net>
parents:
36474
diff
changeset
|
731 # |
95f4f1bfb650
revbranchcache: add a public function to update the data
Boris Feld <boris.feld@octobus.net>
parents:
36474
diff
changeset
|
732 # Since we now have data in the cache, we need to drop this bypassing. |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43499
diff
changeset
|
733 if 'branchinfo' in vars(self): |
36962
95f4f1bfb650
revbranchcache: add a public function to update the data
Boris Feld <boris.feld@octobus.net>
parents:
36474
diff
changeset
|
734 del self.branchinfo |
95f4f1bfb650
revbranchcache: add a public function to update the data
Boris Feld <boris.feld@octobus.net>
parents:
36474
diff
changeset
|
735 |
40425
5e5c8f2a1eb5
branchmap: do not specify changelog as an argument
Yuya Nishihara <yuya@tcha.org>
parents:
40375
diff
changeset
|
736 def _setcachedata(self, rev, node, branchidx): |
24375
fe255b2525d5
revbranchcache: move entry writing to a separate function
Durham Goode <durham@fb.com>
parents:
24374
diff
changeset
|
737 """Writes the node's branch data to the in-memory cache data.""" |
31454
a5bad127128d
branchmap: handle nullrev in setcachedata
Durham Goode <durham@fb.com>
parents:
31381
diff
changeset
|
738 if rev == nullrev: |
a5bad127128d
branchmap: handle nullrev in setcachedata
Durham Goode <durham@fb.com>
parents:
31381
diff
changeset
|
739 return |
23785
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
740 rbcrevidx = rev * _rbcrecsize |
46360
1726a53a8494
reverse-branch-cache: switch to doubling allocating scheme
Joerg Sonnenberger <joerg@bec.de>
parents:
46254
diff
changeset
|
741 requiredsize = rbcrevidx + _rbcrecsize |
1726a53a8494
reverse-branch-cache: switch to doubling allocating scheme
Joerg Sonnenberger <joerg@bec.de>
parents:
46254
diff
changeset
|
742 rbccur = len(self._rbcrevs) |
1726a53a8494
reverse-branch-cache: switch to doubling allocating scheme
Joerg Sonnenberger <joerg@bec.de>
parents:
46254
diff
changeset
|
743 if rbccur < requiredsize: |
1726a53a8494
reverse-branch-cache: switch to doubling allocating scheme
Joerg Sonnenberger <joerg@bec.de>
parents:
46254
diff
changeset
|
744 # bytearray doesn't allocate extra space at least in Python 3.7. |
1726a53a8494
reverse-branch-cache: switch to doubling allocating scheme
Joerg Sonnenberger <joerg@bec.de>
parents:
46254
diff
changeset
|
745 # When multiple changesets are added in a row, precise resize would |
1726a53a8494
reverse-branch-cache: switch to doubling allocating scheme
Joerg Sonnenberger <joerg@bec.de>
parents:
46254
diff
changeset
|
746 # result in quadratic complexity. Overallocate to compensate by |
1726a53a8494
reverse-branch-cache: switch to doubling allocating scheme
Joerg Sonnenberger <joerg@bec.de>
parents:
46254
diff
changeset
|
747 # use the classic doubling technique for dynamic arrays instead. |
1726a53a8494
reverse-branch-cache: switch to doubling allocating scheme
Joerg Sonnenberger <joerg@bec.de>
parents:
46254
diff
changeset
|
748 # If there was a gap in the map before, less space will be reserved. |
1726a53a8494
reverse-branch-cache: switch to doubling allocating scheme
Joerg Sonnenberger <joerg@bec.de>
parents:
46254
diff
changeset
|
749 self._rbcrevs.extend(b'\0' * max(_rbcmininc, requiredsize)) |
31370
906be86990c4
rbc: use struct unpack_from and pack_into instead of unpack and pack
Mads Kiilerich <madski@unity3d.com>
parents:
31360
diff
changeset
|
750 pack_into(_rbcrecfmt, self._rbcrevs, rbcrevidx, node, branchidx) |
24376
203a078da052
revbranchcache: populate cache incrementally
Durham Goode <durham@fb.com>
parents:
24375
diff
changeset
|
751 self._rbcrevslen = min(self._rbcrevslen, rev) |
23785
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
752 |
24377
656f93ce66d5
revbranchcache: move cache writing to the transaction finalizer
Durham Goode <durham@fb.com>
parents:
24376
diff
changeset
|
753 tr = self._repo.currenttransaction() |
656f93ce66d5
revbranchcache: move cache writing to the transaction finalizer
Durham Goode <durham@fb.com>
parents:
24376
diff
changeset
|
754 if tr: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
755 tr.addfinalize(b'write-revbranchcache', self.write) |
24377
656f93ce66d5
revbranchcache: move cache writing to the transaction finalizer
Durham Goode <durham@fb.com>
parents:
24376
diff
changeset
|
756 |
656f93ce66d5
revbranchcache: move cache writing to the transaction finalizer
Durham Goode <durham@fb.com>
parents:
24376
diff
changeset
|
757 def write(self, tr=None): |
23785
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
758 """Save branch cache if it is dirty.""" |
24374
77fd1fb538cd
revbranchcache: store repo on the object
Durham Goode <durham@fb.com>
parents:
24373
diff
changeset
|
759 repo = self._repo |
29744
0d588332ad2c
branchmap: acquires lock before writting the rev branch cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29743
diff
changeset
|
760 wlock = None |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
761 step = b'' |
29744
0d588332ad2c
branchmap: acquires lock before writting the rev branch cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29743
diff
changeset
|
762 try: |
42184
09fd338522fa
revbranchcache: factor logic to write names and revs in separate functions
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42138
diff
changeset
|
763 # write the new names |
29743
9f3c49ee4486
branchmap: preparatory indent of indent the branch rev writing code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29615
diff
changeset
|
764 if self._rbcnamescount < len(self._names): |
29744
0d588332ad2c
branchmap: acquires lock before writting the rev branch cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29743
diff
changeset
|
765 wlock = repo.wlock(wait=False) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
766 step = b' names' |
42184
09fd338522fa
revbranchcache: factor logic to write names and revs in separate functions
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42138
diff
changeset
|
767 self._writenames(repo) |
23785
cb99bacb9b4e
branchcache: introduce revbranchcache for caching of revision branch names
Mads Kiilerich <madski@unity3d.com>
parents:
22357
diff
changeset
|
768 |
42184
09fd338522fa
revbranchcache: factor logic to write names and revs in separate functions
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42138
diff
changeset
|
769 # write the new revs |
29743
9f3c49ee4486
branchmap: preparatory indent of indent the branch rev writing code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29615
diff
changeset
|
770 start = self._rbcrevslen * _rbcrecsize |
9f3c49ee4486
branchmap: preparatory indent of indent the branch rev writing code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29615
diff
changeset
|
771 if start != len(self._rbcrevs): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
772 step = b'' |
29744
0d588332ad2c
branchmap: acquires lock before writting the rev branch cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29743
diff
changeset
|
773 if wlock is None: |
0d588332ad2c
branchmap: acquires lock before writting the rev branch cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29743
diff
changeset
|
774 wlock = repo.wlock(wait=False) |
42184
09fd338522fa
revbranchcache: factor logic to write names and revs in separate functions
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42138
diff
changeset
|
775 self._writerevs(repo, start) |
09fd338522fa
revbranchcache: factor logic to write names and revs in separate functions
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42138
diff
changeset
|
776 |
29745
3b184adfb5be
branchmap: simplify error handlind when writing rev branch cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29744
diff
changeset
|
777 except (IOError, OSError, error.Abort, error.LockError) as inst: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
778 repo.ui.debug( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
779 b"couldn't write revision branch cache%s: %s\n" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
780 % (step, stringutil.forcebytestr(inst)) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
781 ) |
29744
0d588332ad2c
branchmap: acquires lock before writting the rev branch cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29743
diff
changeset
|
782 finally: |
0d588332ad2c
branchmap: acquires lock before writting the rev branch cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29743
diff
changeset
|
783 if wlock is not None: |
0d588332ad2c
branchmap: acquires lock before writting the rev branch cache
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29743
diff
changeset
|
784 wlock.release() |
42184
09fd338522fa
revbranchcache: factor logic to write names and revs in separate functions
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42138
diff
changeset
|
785 |
09fd338522fa
revbranchcache: factor logic to write names and revs in separate functions
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42138
diff
changeset
|
786 def _writenames(self, repo): |
09fd338522fa
revbranchcache: factor logic to write names and revs in separate functions
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42138
diff
changeset
|
787 """ write the new branch names to revbranchcache """ |
09fd338522fa
revbranchcache: factor logic to write names and revs in separate functions
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42138
diff
changeset
|
788 if self._rbcnamescount != 0: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
789 f = repo.cachevfs.open(_rbcnames, b'ab') |
42184
09fd338522fa
revbranchcache: factor logic to write names and revs in separate functions
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42138
diff
changeset
|
790 if f.tell() == self._rbcsnameslen: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
791 f.write(b'\0') |
42184
09fd338522fa
revbranchcache: factor logic to write names and revs in separate functions
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42138
diff
changeset
|
792 else: |
09fd338522fa
revbranchcache: factor logic to write names and revs in separate functions
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42138
diff
changeset
|
793 f.close() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
794 repo.ui.debug(b"%s changed - rewriting it\n" % _rbcnames) |
42184
09fd338522fa
revbranchcache: factor logic to write names and revs in separate functions
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42138
diff
changeset
|
795 self._rbcnamescount = 0 |
09fd338522fa
revbranchcache: factor logic to write names and revs in separate functions
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42138
diff
changeset
|
796 self._rbcrevslen = 0 |
09fd338522fa
revbranchcache: factor logic to write names and revs in separate functions
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42138
diff
changeset
|
797 if self._rbcnamescount == 0: |
09fd338522fa
revbranchcache: factor logic to write names and revs in separate functions
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42138
diff
changeset
|
798 # before rewriting names, make sure references are removed |
09fd338522fa
revbranchcache: factor logic to write names and revs in separate functions
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42138
diff
changeset
|
799 repo.cachevfs.unlinkpath(_rbcrevs, ignoremissing=True) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
800 f = repo.cachevfs.open(_rbcnames, b'wb') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
801 f.write( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
802 b'\0'.join( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
803 encoding.fromlocal(b) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
804 for b in self._names[self._rbcnamescount :] |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
805 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
42603
diff
changeset
|
806 ) |
42184
09fd338522fa
revbranchcache: factor logic to write names and revs in separate functions
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42138
diff
changeset
|
807 self._rbcsnameslen = f.tell() |
09fd338522fa
revbranchcache: factor logic to write names and revs in separate functions
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42138
diff
changeset
|
808 f.close() |
09fd338522fa
revbranchcache: factor logic to write names and revs in separate functions
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42138
diff
changeset
|
809 self._rbcnamescount = len(self._names) |
09fd338522fa
revbranchcache: factor logic to write names and revs in separate functions
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42138
diff
changeset
|
810 |
09fd338522fa
revbranchcache: factor logic to write names and revs in separate functions
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42138
diff
changeset
|
811 def _writerevs(self, repo, start): |
09fd338522fa
revbranchcache: factor logic to write names and revs in separate functions
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42138
diff
changeset
|
812 """ write the new revs to revbranchcache """ |
42185
ececa45c80d8
revbranchcache: use context manager in _writerevs() to write to file
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42184
diff
changeset
|
813 revs = min(len(repo.changelog), len(self._rbcrevs) // _rbcrecsize) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
814 with repo.cachevfs.open(_rbcrevs, b'ab') as f: |
42184
09fd338522fa
revbranchcache: factor logic to write names and revs in separate functions
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42138
diff
changeset
|
815 if f.tell() != start: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
816 repo.ui.debug( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
817 b"truncating cache/%s to %d\n" % (_rbcrevs, start) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
818 ) |
42184
09fd338522fa
revbranchcache: factor logic to write names and revs in separate functions
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42138
diff
changeset
|
819 f.seek(start) |
42185
ececa45c80d8
revbranchcache: use context manager in _writerevs() to write to file
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42184
diff
changeset
|
820 if f.tell() != start: |
ececa45c80d8
revbranchcache: use context manager in _writerevs() to write to file
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42184
diff
changeset
|
821 start = 0 |
ececa45c80d8
revbranchcache: use context manager in _writerevs() to write to file
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42184
diff
changeset
|
822 f.seek(start) |
ececa45c80d8
revbranchcache: use context manager in _writerevs() to write to file
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42184
diff
changeset
|
823 f.truncate() |
ececa45c80d8
revbranchcache: use context manager in _writerevs() to write to file
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42184
diff
changeset
|
824 end = revs * _rbcrecsize |
ececa45c80d8
revbranchcache: use context manager in _writerevs() to write to file
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42184
diff
changeset
|
825 f.write(self._rbcrevs[start:end]) |
42184
09fd338522fa
revbranchcache: factor logic to write names and revs in separate functions
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
42138
diff
changeset
|
826 self._rbcrevslen = revs |