author | Pierre-Yves David <pierre-yves.david@octobus.net> |
Tue, 22 Jan 2019 12:54:44 -0500 | |
branch | mercurial-4.6 |
changeset 4360 | 522abf1d70b7 |
parent 4341 | d1aab9d82f5b |
child 4488 | 6c0992ce05f7 |
permissions | -rw-r--r-- |
3403
73920cb25af3
stablerange: add missing licence and copyright header
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3366
diff
changeset
|
1 |
# Code dedicated to the cache of 'max(merge()) and ::X' |
73920cb25af3
stablerange: add missing licence and copyright header
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3366
diff
changeset
|
2 |
# |
73920cb25af3
stablerange: add missing licence and copyright header
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3366
diff
changeset
|
3 |
# These stable ranges are use for obsolescence markers discovery |
73920cb25af3
stablerange: add missing licence and copyright header
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3366
diff
changeset
|
4 |
# |
73920cb25af3
stablerange: add missing licence and copyright header
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3366
diff
changeset
|
5 |
# Copyright 2017 Pierre-Yves David <pierre-yves.david@ens-lyon.org> |
73920cb25af3
stablerange: add missing licence and copyright header
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3366
diff
changeset
|
6 |
# |
73920cb25af3
stablerange: add missing licence and copyright header
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3366
diff
changeset
|
7 |
# This software may be used and distributed according to the terms of the |
73920cb25af3
stablerange: add missing licence and copyright header
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3366
diff
changeset
|
8 |
# GNU General Public License version 2 or any later version. |
73920cb25af3
stablerange: add missing licence and copyright header
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3366
diff
changeset
|
9 |
|
3236
7c78b0c482a1
depth: basic debugdepth implementation and test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
10 |
from __future__ import absolute_import |
7c78b0c482a1
depth: basic debugdepth implementation and test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
11 |
|
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
12 |
import array |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
13 |
|
3236
7c78b0c482a1
depth: basic debugdepth implementation and test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
14 |
from mercurial import ( |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
15 |
localrepo, |
3332
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
16 |
node as nodemod, |
3236
7c78b0c482a1
depth: basic debugdepth implementation and test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
17 |
) |
7c78b0c482a1
depth: basic debugdepth implementation and test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
18 |
|
7c78b0c482a1
depth: basic debugdepth implementation and test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
19 |
from . import ( |
3408
f4ea9652661d
cachevfs: use a compatibility later for all access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3403
diff
changeset
|
20 |
compat, |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
21 |
error, |
3236
7c78b0c482a1
depth: basic debugdepth implementation and test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
22 |
exthelper, |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
23 |
genericcaches, |
3310
87cb2635352b
depthcache: use parents filter in depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3299
diff
changeset
|
24 |
utility, |
3236
7c78b0c482a1
depth: basic debugdepth implementation and test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
25 |
) |
7c78b0c482a1
depth: basic debugdepth implementation and test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
26 |
|
3310
87cb2635352b
depthcache: use parents filter in depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3299
diff
changeset
|
27 |
filterparents = utility.filterparents |
87cb2635352b
depthcache: use parents filter in depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3299
diff
changeset
|
28 |
|
3236
7c78b0c482a1
depth: basic debugdepth implementation and test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
29 |
eh = exthelper.exthelper() |
7c78b0c482a1
depth: basic debugdepth implementation and test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
30 |
|
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
31 |
@eh.reposetup |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
32 |
def setupcache(ui, repo): |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
33 |
|
3332
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
34 |
class firstmergecacherepo(repo.__class__): |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
35 |
|
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
36 |
@localrepo.unfilteredpropertycache |
3332
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
37 |
def firstmergecache(self): |
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
38 |
cache = firstmergecache() |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
39 |
cache.update(self) |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
40 |
return cache |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
41 |
|
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
42 |
@localrepo.unfilteredmethod |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
43 |
def destroyed(self): |
3332
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
44 |
if 'firstmergecach' in vars(self): |
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
45 |
self.firstmergecache.clear() |
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
46 |
super(firstmergecacherepo, self).destroyed() |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
47 |
|
3968
37178a2d3557
compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3504
diff
changeset
|
48 |
@localrepo.unfilteredmethod |
37178a2d3557
compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3504
diff
changeset
|
49 |
def updatecaches(self, tr=None, **kwargs): |
37178a2d3557
compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3504
diff
changeset
|
50 |
if utility.shouldwarmcache(self, tr): |
37178a2d3557
compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3504
diff
changeset
|
51 |
self.firstmergecache.update(self) |
37178a2d3557
compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3504
diff
changeset
|
52 |
self.firstmergecache.save(self) |
37178a2d3557
compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3504
diff
changeset
|
53 |
super(firstmergecacherepo, self).updatecaches(tr, **kwargs) |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
54 |
|
3332
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
55 |
repo.__class__ = firstmergecacherepo |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
56 |
|
3332
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
57 |
class firstmergecache(genericcaches.changelogsourcebase): |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
58 |
|
3332
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
59 |
_filepath = 'evoext-firstmerge-00' |
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
60 |
_cachename = 'evo-ext-firstmerge' |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
61 |
|
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
62 |
def __init__(self): |
3332
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
63 |
super(firstmergecache, self).__init__() |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
64 |
self._data = array.array('l') |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
65 |
|
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
66 |
def get(self, rev): |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
67 |
if len(self._data) <= rev: |
3332
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
68 |
raise error.ProgrammingError('firstmergecache must be warmed before use') |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
69 |
return self._data[rev] |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
70 |
|
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
71 |
def _updatefrom(self, repo, data): |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
72 |
"""compute the rev of one revision, assert previous revision has an hot cache |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
73 |
""" |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
74 |
cl = repo.unfiltered().changelog |
3241
0d2c095aeb2a
depthcache: issue a progress bar when loading the depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3240
diff
changeset
|
75 |
total = len(data) |
0d2c095aeb2a
depthcache: issue a progress bar when loading the depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3240
diff
changeset
|
76 |
|
0d2c095aeb2a
depthcache: issue a progress bar when loading the depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3240
diff
changeset
|
77 |
def progress(pos, rev): |
4341
d1aab9d82f5b
evolve: adapt for deprecated ui.progress()
Martin von Zweigbergk <martinvonz@google.com>
parents:
4109
diff
changeset
|
78 |
compat.progress(repo.ui, 'updating firstmerge cache', |
d1aab9d82f5b
evolve: adapt for deprecated ui.progress()
Martin von Zweigbergk <martinvonz@google.com>
parents:
4109
diff
changeset
|
79 |
pos, 'rev %s' % rev, unit='revision', total=total) |
3241
0d2c095aeb2a
depthcache: issue a progress bar when loading the depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3240
diff
changeset
|
80 |
progress(0, '') |
0d2c095aeb2a
depthcache: issue a progress bar when loading the depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3240
diff
changeset
|
81 |
for idx, rev in enumerate(data, 1): |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
82 |
assert rev == len(self._data), (rev, len(self._data)) |
3332
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
83 |
self._data.append(self._firstmerge(cl, rev)) |
3241
0d2c095aeb2a
depthcache: issue a progress bar when loading the depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3240
diff
changeset
|
84 |
if not (idx % 10000): # progress as a too high performance impact |
0d2c095aeb2a
depthcache: issue a progress bar when loading the depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3240
diff
changeset
|
85 |
progress(idx, rev) |
0d2c095aeb2a
depthcache: issue a progress bar when loading the depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3240
diff
changeset
|
86 |
progress(None, '') |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
87 |
|
3332
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
88 |
def _firstmerge(self, changelog, rev): |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
89 |
cl = changelog |
3310
87cb2635352b
depthcache: use parents filter in depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3299
diff
changeset
|
90 |
ps = filterparents(cl.parentrevs(rev)) |
87cb2635352b
depthcache: use parents filter in depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3299
diff
changeset
|
91 |
if not ps: |
3332
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
92 |
return nodemod.nullrev |
3310
87cb2635352b
depthcache: use parents filter in depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3299
diff
changeset
|
93 |
elif len(ps) == 1: |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
94 |
# linear commit case |
3332
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
95 |
return self.get(ps[0]) |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
96 |
else: |
3332
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
97 |
return rev |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
98 |
|
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
99 |
# cache internal logic |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
100 |
|
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
101 |
def clear(self, reset=False): |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
102 |
"""invalidate the cache content |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
103 |
|
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
104 |
if 'reset' is passed, we detected a strip and the cache will have to be |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
105 |
recomputed. |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
106 |
|
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
107 |
Subclasses MUST overide this method to actually affect the cache data. |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
108 |
""" |
3332
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
109 |
super(firstmergecache, self).clear() |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
110 |
self._data = array.array('l') |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
111 |
|
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
112 |
# crude version of a cache, to show the kind of information we have to store |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
113 |
|
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
114 |
def load(self, repo): |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
115 |
"""load data from disk""" |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
116 |
assert repo.filtername is None |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
117 |
|
3408
f4ea9652661d
cachevfs: use a compatibility later for all access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3403
diff
changeset
|
118 |
cachevfs = compat.getcachevfs(repo) |
f4ea9652661d
cachevfs: use a compatibility later for all access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3403
diff
changeset
|
119 |
data = cachevfs.tryread(self._filepath) |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
120 |
self._data = array.array('l') |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
121 |
if not data: |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
122 |
self._cachekey = self.emptykey |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
123 |
else: |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
124 |
headerdata = data[:self._cachekeysize] |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
125 |
self._cachekey = self._deserializecachekey(headerdata) |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
126 |
self._data.fromstring(data[self._cachekeysize:]) |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
127 |
self._ondiskkey = self._cachekey |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
128 |
|
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
129 |
def save(self, repo): |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
130 |
"""save the data to disk |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
131 |
|
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
132 |
Format is pretty simple, we serialise the cache key and then drop the |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
133 |
bytearray. |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
134 |
""" |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
135 |
if self._cachekey is None or self._cachekey == self._ondiskkey: |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
136 |
return |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
137 |
|
4101
88000f1d2406
firstmergecache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3975
diff
changeset
|
138 |
try: |
88000f1d2406
firstmergecache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3975
diff
changeset
|
139 |
cachevfs = compat.getcachevfs(repo) |
88000f1d2406
firstmergecache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3975
diff
changeset
|
140 |
cachefile = cachevfs(self._filepath, 'w', atomictemp=True) |
88000f1d2406
firstmergecache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3975
diff
changeset
|
141 |
headerdata = self._serializecachekey() |
88000f1d2406
firstmergecache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3975
diff
changeset
|
142 |
cachefile.write(headerdata) |
88000f1d2406
firstmergecache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3975
diff
changeset
|
143 |
cachefile.write(self._data.tostring()) |
88000f1d2406
firstmergecache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3975
diff
changeset
|
144 |
cachefile.close() |
4102
3895f6fcd35c
firstmergecache: update the variable tracking on-disk state after write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4101
diff
changeset
|
145 |
self._ondiskkey = self._cachekey |
4101
88000f1d2406
firstmergecache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3975
diff
changeset
|
146 |
except (IOError, OSError) as exc: |
4109
d562316c548f
caches: issue both debug and blackbox log message
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4102
diff
changeset
|
147 |
repo.ui.log('firstmergecache', 'could not write update %s\n' % exc) |
4101
88000f1d2406
firstmergecache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3975
diff
changeset
|
148 |
repo.ui.debug('firstmergecache: could not write update %s\n' % exc) |