hgext3rd/evolve/genericcaches.py
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--
evolve: add a utility fn to check validity of opts passed to `hg evolve`
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
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)