author | Martin von Zweigbergk <martinvonz@google.com> |
Mon, 09 Dec 2019 10:44:42 -0800 | |
changeset 5004 | dc43e62ea796 |
parent 4965 | 191ed83dbc07 |
permissions | -rw-r--r-- |
3237
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
1 |
# cache.py - utilities for caching |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
2 |
# |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
3 |
# Copyright 2017 Octobus SAS <contact@octobus.net> |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
4 |
# |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
5 |
# This software may be used and distributed according to the terms of the |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
6 |
# GNU General Public License version 2 or any later version. |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
7 |
from __future__ import absolute_import |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
8 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
9 |
import abc |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
10 |
import struct |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
11 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
12 |
from mercurial import ( |
3238
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
13 |
node, |
3237
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
14 |
util, |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
15 |
) |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
16 |
|
4965
191ed83dbc07
pytype: ignore abc.ABCMeta metaclasses that don't work on py3
Anton Shestakov <av6@dwimlabs.net>
parents:
4814
diff
changeset
|
17 |
class incrementalcachebase(object): # pytype: disable=ignored-metaclass |
3237
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
18 |
"""base class for incremental cache from append only source |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
19 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
20 |
There are multiple append only data source we might want to cache |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
21 |
computation from. One of the common pattern is to track the state of the |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
22 |
file and update the cache with the extra data (eg: branchmap-cache tracking |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
23 |
changelog). This pattern also needs to detect when a the source is striped |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
24 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
25 |
The overall pattern is similar whatever the actual source is. This class |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
26 |
introduces the basic patterns. |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
27 |
""" |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
28 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
29 |
__metaclass__ = abc.ABCMeta |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
30 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
31 |
# default key used for an empty cache |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
32 |
emptykey = () |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
33 |
|
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
3685
diff
changeset
|
34 |
_cachekeyspec = b'' # used for serialization |
3237
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
35 |
_cachename = None # used for debug message |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
36 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
37 |
@abc.abstractmethod |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
38 |
def __init__(self): |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
39 |
super(incrementalcachebase, self).__init__() |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
40 |
self._cachekey = None |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
41 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
42 |
@util.propertycache |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
43 |
def _cachekeystruct(self): |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
44 |
# dynamic property to help subclass to change it |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
3685
diff
changeset
|
45 |
return struct.Struct(b'>' + self._cachekeyspec) |
3237
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
46 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
47 |
@util.propertycache |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
48 |
def _cachekeysize(self): |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
49 |
# dynamic property to help subclass to change it |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
50 |
return self._cachekeystruct.size |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
51 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
52 |
@abc.abstractmethod |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
53 |
def _updatefrom(self, repo, data): |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
54 |
"""override this method to update you date from incrementally read data. |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
55 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
56 |
Content of <data> will depends of the sources. |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
57 |
""" |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
58 |
raise NotImplementedError |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
59 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
60 |
@abc.abstractmethod |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
61 |
def clear(self, reset=False): |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
62 |
"""invalidate the cache content |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
63 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
64 |
if 'reset' is passed, we detected a strip and the cache will have to be |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
65 |
recomputed. |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
66 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
67 |
Subclasses MUST overide this method to actually affect the cache data. |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
68 |
""" |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
69 |
if reset: |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
70 |
self._cachekey = self.emptykey if reset else None |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
71 |
else: |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
72 |
self._cachekey = None |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
73 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
74 |
@abc.abstractmethod |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
75 |
def load(self, repo): |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
76 |
"""Load data from disk |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
77 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
78 |
Subclasses MUST restore the "cachekey" attribute while doing so. |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
79 |
""" |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
80 |
raise NotImplementedError |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
81 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
82 |
@abc.abstractmethod |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
83 |
def _fetchupdatedata(self, repo): |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
84 |
"""Check the source for possible changes and return necessary data |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
85 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
86 |
The return is a tree elements tuple: reset, data, cachekey |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
87 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
88 |
* reset: `True` when a strip is detected and cache need to be reset |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
89 |
* data: new data to take in account, actual type depends of the source |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
90 |
* cachekey: the cache key covering <data> and precious covered data |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
91 |
""" |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
92 |
raise NotImplementedError |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
93 |
|
3239
0c8c7b5274a5
cache: adds debug details about what the content of the update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3238
diff
changeset
|
94 |
@abc.abstractmethod |
0c8c7b5274a5
cache: adds debug details about what the content of the update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3238
diff
changeset
|
95 |
def _updatesummary(self, data): |
0c8c7b5274a5
cache: adds debug details about what the content of the update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3238
diff
changeset
|
96 |
"""return a small string to be included in debug output""" |
0c8c7b5274a5
cache: adds debug details about what the content of the update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3238
diff
changeset
|
97 |
raise NotImplementedError |
0c8c7b5274a5
cache: adds debug details about what the content of the update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3238
diff
changeset
|
98 |
|
3237
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
99 |
# Useful "public" function (no need to override them) |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
100 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
101 |
def update(self, repo): |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
102 |
"""update the cache with new repository data |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
103 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
104 |
The update will be incremental when possible""" |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
105 |
repo = repo.unfiltered() |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
106 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
107 |
# If we do not have any data, try loading from disk |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
108 |
if self._cachekey is None: |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
109 |
self.load(repo) |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
110 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
111 |
reset, data, newkey = self._fetchupdatedata(repo) |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
112 |
if newkey == self._cachekey: |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
113 |
return |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
114 |
if reset or self._cachekey is None: |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
3685
diff
changeset
|
115 |
repo.ui.log(b'cache', b'strip detected, %s cache reset\n' |
3237
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
116 |
% self._cachename) |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
117 |
self.clear(reset=True) |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
118 |
|
3685
bf000d1a525f
timer: drop compat layer for time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3279
diff
changeset
|
119 |
starttime = util.timer() |
3237
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
120 |
self._updatefrom(repo, data) |
3685
bf000d1a525f
timer: drop compat layer for time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3279
diff
changeset
|
121 |
duration = util.timer() - starttime |
3239
0c8c7b5274a5
cache: adds debug details about what the content of the update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3238
diff
changeset
|
122 |
summary = self._updatesummary(data) |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
3685
diff
changeset
|
123 |
repo.ui.log(b'cache', b'updated %s in %.4f seconds (%s)\n', |
3239
0c8c7b5274a5
cache: adds debug details about what the content of the update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3238
diff
changeset
|
124 |
self._cachename, duration, summary) |
3237
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
125 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
126 |
self._cachekey = newkey |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
127 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
128 |
def _serializecachekey(self): |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
129 |
"""provide a bytes version of the cachekey""" |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
130 |
return self._cachekeystruct.pack(*self._cachekey) |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
131 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
132 |
def _deserializecachekey(self, data): |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
133 |
"""read the cachekey from bytes""" |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
134 |
return self._cachekeystruct.unpack(data) |
3238
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
135 |
|
4965
191ed83dbc07
pytype: ignore abc.ABCMeta metaclasses that don't work on py3
Anton Shestakov <av6@dwimlabs.net>
parents:
4814
diff
changeset
|
136 |
class changelogsourcebase(incrementalcachebase): # pytype: disable=ignored-metaclass |
3238
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
137 |
"""an abstract class for cache sourcing data from the changelog |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
138 |
|
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
139 |
For this purpose it use a cache key covering changelog content. |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
140 |
The cache key parts are: (tiprev, tipnode) |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
141 |
""" |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
142 |
|
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
143 |
__metaclass__ = abc.ABCMeta |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
144 |
|
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
145 |
# default key used for an empty cache |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
146 |
emptykey = (0, node.nullid) |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
3685
diff
changeset
|
147 |
_cachekeyspec = b'i20s' |
3238
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
148 |
_cachename = None # used for debug message |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
149 |
|
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
150 |
# Useful "public" function (no need to override them) |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
151 |
|
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
152 |
def _fetchchangelogdata(self, cachekey, cl): |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
153 |
"""use a cachekey to fetch incremental data |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
154 |
|
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
155 |
Exists as its own method to help subclass to reuse it.""" |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
156 |
tiprev = len(cl) - 1 |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
157 |
tipnode = cl.node(tiprev) |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
158 |
newkey = (tiprev, tipnode) |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
159 |
tiprev = len(cl) - 1 |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
160 |
if newkey == cachekey: |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
161 |
return False, [], newkey |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
162 |
keyrev, keynode = cachekey |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
163 |
if tiprev < keyrev or cl.node(keyrev) != keynode: |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
164 |
revs = () |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
165 |
if len(cl): |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
166 |
revs = list(cl.revs(stop=tiprev)) |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
167 |
return True, revs, newkey |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
168 |
else: |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
169 |
return False, list(cl.revs(start=keyrev + 1, stop=tiprev)), newkey |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
170 |
|
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
171 |
def _fetchupdatedata(self, repo): |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
172 |
return self._fetchchangelogdata(self._cachekey, repo.changelog) |
3239
0c8c7b5274a5
cache: adds debug details about what the content of the update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3238
diff
changeset
|
173 |
|
0c8c7b5274a5
cache: adds debug details about what the content of the update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3238
diff
changeset
|
174 |
def _updatesummary(self, data): |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
3685
diff
changeset
|
175 |
return b'%ir' % len(data) |