hgext3rd/evolve/genericcaches.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Wed, 17 Apr 2019 20:54:28 +0200
branchstable
changeset 4524 f6099a171a9d
parent 3685 bf000d1a525f
child 4814 48b30ff742cb
permissions -rw-r--r--
branching: merge 8.5.0 expected output in stable Upstream stable is now for mercurial 5.0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
9a2cc4687cb9 cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    17
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
    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
9a2cc4687cb9 cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    34
    _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
    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
9a2cc4687cb9 cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    45
        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
    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:
9a2cc4687cb9 cache: introduce an abstract class for cache we can upgrade incrementally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   115
            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
   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)
0c8c7b5274a5 cache: adds debug details about what the content of the update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3238
diff changeset
   123
        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
   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
88f11b9881b2 cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3237
diff changeset
   136
class changelogsourcebase(incrementalcachebase):
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)
88f11b9881b2 cache: introduce a changelogsourcebase class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3237
diff changeset
   147
    _cachekeyspec = 'i20s'
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):
0c8c7b5274a5 cache: adds debug details about what the content of the update
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3238
diff changeset
   175
        return '%ir' % len(data)