author | Pulkit Goyal <7895pulkit@gmail.com> |
Sat, 06 Jan 2018 19:07:43 +0530 | |
changeset 3386 | 2a51107e60cf |
parent 3279 | 4a9718a83602 |
child 3685 | bf000d1a525f |
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 |
3279
4a9718a83602
genericcaches: handle the lack of util.timer in 4.1
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3239
diff
changeset
|
11 |
import time |
4a9718a83602
genericcaches: handle the lack of util.timer in 4.1
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3239
diff
changeset
|
12 |
import os |
3237
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
13 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
14 |
from mercurial import ( |
3238
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
15 |
node, |
3279
4a9718a83602
genericcaches: handle the lack of util.timer in 4.1
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3239
diff
changeset
|
16 |
pycompat, |
3237
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
17 |
util, |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
18 |
) |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
19 |
|
3279
4a9718a83602
genericcaches: handle the lack of util.timer in 4.1
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3239
diff
changeset
|
20 |
# prior to hg-4.2 there are not util.timer |
4a9718a83602
genericcaches: handle the lack of util.timer in 4.1
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3239
diff
changeset
|
21 |
if util.safehasattr(util, 'timer'): |
4a9718a83602
genericcaches: handle the lack of util.timer in 4.1
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3239
diff
changeset
|
22 |
timer = util.timer |
4a9718a83602
genericcaches: handle the lack of util.timer in 4.1
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3239
diff
changeset
|
23 |
elif util.safehasattr(time, "perf_counter"): |
4a9718a83602
genericcaches: handle the lack of util.timer in 4.1
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3239
diff
changeset
|
24 |
timer = time.perf_counter |
4a9718a83602
genericcaches: handle the lack of util.timer in 4.1
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3239
diff
changeset
|
25 |
elif getattr(pycompat, 'osname', os.name) == 'nt': |
4a9718a83602
genericcaches: handle the lack of util.timer in 4.1
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3239
diff
changeset
|
26 |
timer = time.clock |
4a9718a83602
genericcaches: handle the lack of util.timer in 4.1
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3239
diff
changeset
|
27 |
else: |
4a9718a83602
genericcaches: handle the lack of util.timer in 4.1
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3239
diff
changeset
|
28 |
timer = time.time |
4a9718a83602
genericcaches: handle the lack of util.timer in 4.1
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3239
diff
changeset
|
29 |
|
3237
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
30 |
class incrementalcachebase(object): |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
31 |
"""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
|
32 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
33 |
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
|
34 |
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
|
35 |
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
|
36 |
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
|
37 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
38 |
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
|
39 |
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
|
40 |
""" |
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 |
__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
|
43 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
44 |
# 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
|
45 |
emptykey = () |
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 |
_cachekeyspec = '' # used for serialization |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
48 |
_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
|
49 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
50 |
@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
|
51 |
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
|
52 |
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
|
53 |
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
|
54 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
55 |
@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
|
56 |
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
|
57 |
# 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
|
58 |
return struct.Struct('>' + self._cachekeyspec) |
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 |
@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
|
61 |
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
|
62 |
# 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
|
63 |
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
|
64 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
65 |
@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
|
66 |
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
|
67 |
"""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
|
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 |
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
|
70 |
""" |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
71 |
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
|
72 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
73 |
@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
|
74 |
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
|
75 |
"""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
|
76 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
77 |
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
|
78 |
recomputed. |
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 |
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
|
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 |
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
|
83 |
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
|
84 |
else: |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
85 |
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
|
86 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
87 |
@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
|
88 |
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
|
89 |
"""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
|
90 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
91 |
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
|
92 |
""" |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
93 |
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
|
94 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
95 |
@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
|
96 |
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
|
97 |
"""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
|
98 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
99 |
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
|
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 |
* 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
|
102 |
* 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
|
103 |
* 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
|
104 |
""" |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
105 |
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
|
106 |
|
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
|
107 |
@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
|
108 |
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
|
109 |
"""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
|
110 |
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
|
111 |
|
3237
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
112 |
# 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
|
113 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
114 |
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
|
115 |
"""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
|
116 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
117 |
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
|
118 |
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
|
119 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
120 |
# 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
|
121 |
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
|
122 |
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
|
123 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
124 |
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
|
125 |
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
|
126 |
return |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
127 |
if reset or 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
|
128 |
repo.ui.log('cache', 'strip detected, %s cache reset\n' |
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
129 |
% 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
|
130 |
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
|
131 |
|
3279
4a9718a83602
genericcaches: handle the lack of util.timer in 4.1
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3239
diff
changeset
|
132 |
starttime = 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
|
133 |
self._updatefrom(repo, data) |
3279
4a9718a83602
genericcaches: handle the lack of util.timer in 4.1
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3239
diff
changeset
|
134 |
duration = 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
|
135 |
summary = self._updatesummary(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
|
136 |
repo.ui.log('cache', 'updated %s in %.4f seconds (%s)\n', |
0c8c7b5274a5
cache: adds debug details about what the content of the update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3238
diff
changeset
|
137 |
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
|
138 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
139 |
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
|
140 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
141 |
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
|
142 |
"""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
|
143 |
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
|
144 |
|
9a2cc4687cb9
cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
145 |
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
|
146 |
"""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
|
147 |
return self._cachekeystruct.unpack(data) |
3238
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
148 |
|
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
149 |
class changelogsourcebase(incrementalcachebase): |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
150 |
"""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
|
151 |
|
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
152 |
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
|
153 |
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
|
154 |
""" |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
155 |
|
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
156 |
__metaclass__ = abc.ABCMeta |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
157 |
|
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
158 |
# 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
|
159 |
emptykey = (0, node.nullid) |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
160 |
_cachekeyspec = 'i20s' |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
161 |
_cachename = None # used for debug message |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
162 |
|
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
163 |
# 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
|
164 |
|
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
165 |
def _fetchchangelogdata(self, cachekey, cl): |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
166 |
"""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
|
167 |
|
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
168 |
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
|
169 |
tiprev = len(cl) - 1 |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
170 |
tipnode = cl.node(tiprev) |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
171 |
newkey = (tiprev, tipnode) |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
172 |
tiprev = len(cl) - 1 |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
173 |
if newkey == cachekey: |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
174 |
return False, [], newkey |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
175 |
keyrev, keynode = cachekey |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
176 |
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
|
177 |
revs = () |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
178 |
if len(cl): |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
179 |
revs = list(cl.revs(stop=tiprev)) |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
180 |
return True, revs, newkey |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
181 |
else: |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
182 |
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
|
183 |
|
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
184 |
def _fetchupdatedata(self, repo): |
88f11b9881b2
cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3237
diff
changeset
|
185 |
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
|
186 |
|
0c8c7b5274a5
cache: adds debug details about what the content of the update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3238
diff
changeset
|
187 |
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
|
188 |
return '%ir' % len(data) |