author | Pulkit Goyal <7895pulkit@gmail.com> |
Sat, 06 Jan 2018 19:07:43 +0530 | |
changeset 3386 | 2a51107e60cf |
parent 3366 | 83b372eceb81 |
child 3403 | 73920cb25af3 |
permissions | -rw-r--r-- |
3236
7c78b0c482a1
depth: basic debugdepth implementation and test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
1 |
from __future__ import absolute_import |
7c78b0c482a1
depth: basic debugdepth implementation and test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
2 |
|
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
3 |
import array |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
4 |
import weakref |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
5 |
|
3236
7c78b0c482a1
depth: basic debugdepth implementation and test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
6 |
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
|
7 |
localrepo, |
3332
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
8 |
node as nodemod, |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
9 |
util, |
3236
7c78b0c482a1
depth: basic debugdepth implementation and test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
10 |
) |
7c78b0c482a1
depth: basic debugdepth implementation and test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
11 |
|
7c78b0c482a1
depth: basic debugdepth implementation and test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
12 |
from . import ( |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
13 |
error, |
3236
7c78b0c482a1
depth: basic debugdepth implementation and test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
14 |
exthelper, |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
15 |
genericcaches, |
3310
87cb2635352b
depthcache: use parents filter in depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3299
diff
changeset
|
16 |
utility, |
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 |
|
3310
87cb2635352b
depthcache: use parents filter in depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3299
diff
changeset
|
19 |
filterparents = utility.filterparents |
87cb2635352b
depthcache: use parents filter in depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3299
diff
changeset
|
20 |
|
3236
7c78b0c482a1
depth: basic debugdepth implementation and test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
21 |
eh = exthelper.exthelper() |
7c78b0c482a1
depth: basic debugdepth implementation and test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
22 |
|
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
23 |
@eh.reposetup |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
24 |
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
|
25 |
|
3332
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
26 |
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
|
27 |
|
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
28 |
@localrepo.unfilteredpropertycache |
3332
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
29 |
def firstmergecache(self): |
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
30 |
cache = firstmergecache() |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
31 |
cache.update(self) |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
32 |
return cache |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
33 |
|
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
34 |
@localrepo.unfilteredmethod |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
35 |
def destroyed(self): |
3332
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
36 |
if 'firstmergecach' in vars(self): |
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
37 |
self.firstmergecache.clear() |
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
38 |
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
|
39 |
|
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
40 |
if util.safehasattr(repo, 'updatecaches'): |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
41 |
@localrepo.unfilteredmethod |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
42 |
def updatecaches(self, tr=None): |
3366
83b372eceb81
caches: pass the transaction to the "shouldwarncache" logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3351
diff
changeset
|
43 |
if utility.shouldwarmcache(self, tr): |
3351
a4edd014c166
firstmergecache: cleanup the update logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3340
diff
changeset
|
44 |
self.firstmergecache.update(self) |
a4edd014c166
firstmergecache: cleanup the update logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3340
diff
changeset
|
45 |
self.firstmergecache.save(self) |
3332
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
46 |
super(firstmergecacherepo, self).updatecaches(tr) |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
47 |
|
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
48 |
else: |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
49 |
def transaction(self, *args, **kwargs): |
3332
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
50 |
tr = super(firstmergecacherepo, self).transaction(*args, **kwargs) |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
51 |
reporef = weakref.ref(self) |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
52 |
|
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
53 |
def _warmcache(tr): |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
54 |
repo = reporef() |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
55 |
if repo is None: |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
56 |
return |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
57 |
repo = repo.unfiltered() |
3351
a4edd014c166
firstmergecache: cleanup the update logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3340
diff
changeset
|
58 |
repo.firstmergecache.update(repo) |
a4edd014c166
firstmergecache: cleanup the update logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3340
diff
changeset
|
59 |
repo.firstmergecache.save(repo) |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
60 |
|
3366
83b372eceb81
caches: pass the transaction to the "shouldwarncache" logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3351
diff
changeset
|
61 |
if utility.shouldwarmcache(self, tr): |
3332
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
62 |
tr.addpostclose('warmcache-01-firstparentcache', _warmcache) |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
63 |
return tr |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
64 |
|
3332
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
65 |
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
|
66 |
|
3332
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
67 |
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
|
68 |
|
3332
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
69 |
_filepath = 'evoext-firstmerge-00' |
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
70 |
_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
|
71 |
|
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
72 |
def __init__(self): |
3332
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
73 |
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
|
74 |
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
|
75 |
|
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
76 |
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
|
77 |
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
|
78 |
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
|
79 |
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
|
80 |
|
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
81 |
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
|
82 |
"""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
|
83 |
""" |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
84 |
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
|
85 |
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
|
86 |
|
0d2c095aeb2a
depthcache: issue a progress bar when loading the depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3240
diff
changeset
|
87 |
def progress(pos, rev): |
3332
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
88 |
repo.ui.progress('updating firstmerge cache', |
3241
0d2c095aeb2a
depthcache: issue a progress bar when loading the depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3240
diff
changeset
|
89 |
pos, 'rev %s' % rev, unit='revision', total=total) |
0d2c095aeb2a
depthcache: issue a progress bar when loading the depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3240
diff
changeset
|
90 |
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
|
91 |
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
|
92 |
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
|
93 |
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
|
94 |
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
|
95 |
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
|
96 |
progress(None, '') |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
97 |
|
3332
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
98 |
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
|
99 |
cl = changelog |
3310
87cb2635352b
depthcache: use parents filter in depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3299
diff
changeset
|
100 |
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
|
101 |
if not ps: |
3332
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
102 |
return nodemod.nullrev |
3310
87cb2635352b
depthcache: use parents filter in depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3299
diff
changeset
|
103 |
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
|
104 |
# linear commit case |
3332
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
105 |
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
|
106 |
else: |
3332
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
107 |
return rev |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
108 |
|
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
109 |
# cache internal logic |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
110 |
|
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
111 |
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
|
112 |
"""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
|
113 |
|
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
114 |
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
|
115 |
recomputed. |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
116 |
|
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
117 |
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
|
118 |
""" |
3332
7d4c157b6519
stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3310
diff
changeset
|
119 |
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
|
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 |
|
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
122 |
# 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
|
123 |
|
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
124 |
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
|
125 |
"""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
|
126 |
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
|
127 |
|
3242
55e1ad0d7174
compat: in depth cache, only use cachevfs when available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3241
diff
changeset
|
128 |
if util.safehasattr(repo, 'cachevfs'): |
55e1ad0d7174
compat: in depth cache, only use cachevfs when available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3241
diff
changeset
|
129 |
data = repo.cachevfs.tryread(self._filepath) |
55e1ad0d7174
compat: in depth cache, only use cachevfs when available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3241
diff
changeset
|
130 |
else: |
55e1ad0d7174
compat: in depth cache, only use cachevfs when available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3241
diff
changeset
|
131 |
data = repo.vfs.tryread('cache/' + self._filepath) |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
132 |
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
|
133 |
if not data: |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
134 |
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
|
135 |
else: |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
136 |
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
|
137 |
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
|
138 |
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
|
139 |
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
|
140 |
|
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
141 |
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
|
142 |
"""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
|
143 |
|
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
144 |
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
|
145 |
bytearray. |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
146 |
""" |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
147 |
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
|
148 |
return |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
149 |
|
3242
55e1ad0d7174
compat: in depth cache, only use cachevfs when available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3241
diff
changeset
|
150 |
if util.safehasattr(repo, 'cachevfs'): |
55e1ad0d7174
compat: in depth cache, only use cachevfs when available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3241
diff
changeset
|
151 |
cachefile = repo.cachevfs(self._filepath, 'w', atomictemp=True) |
55e1ad0d7174
compat: in depth cache, only use cachevfs when available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3241
diff
changeset
|
152 |
else: |
55e1ad0d7174
compat: in depth cache, only use cachevfs when available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3241
diff
changeset
|
153 |
cachefile = repo.vfs('cache/' + self._filepath, 'w', atomictemp=True) |
3240
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
154 |
headerdata = self._serializecachekey() |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
155 |
cachefile.write(headerdata) |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
156 |
cachefile.write(self._data.tostring()) |
9361149224a7
depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3236
diff
changeset
|
157 |
cachefile.close() |