hgext3rd/evolve/firstmergecache.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Fri, 14 Sep 2018 10:39:01 +0200
branchstable
changeset 4109 d562316c548f
parent 4102 3895f6fcd35c
child 4341 d1aab9d82f5b
permissions -rw-r--r--
caches: issue both debug and blackbox log message This increase the odd someone looking for issue will find them.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3403
73920cb25af3 stablerange: add missing licence and copyright header
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3366
diff changeset
     1
# Code dedicated to the cache of 'max(merge()) and ::X'
73920cb25af3 stablerange: add missing licence and copyright header
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3366
diff changeset
     2
#
73920cb25af3 stablerange: add missing licence and copyright header
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3366
diff changeset
     3
# These stable ranges are use for obsolescence markers discovery
73920cb25af3 stablerange: add missing licence and copyright header
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3366
diff changeset
     4
#
73920cb25af3 stablerange: add missing licence and copyright header
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3366
diff changeset
     5
# Copyright 2017 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
73920cb25af3 stablerange: add missing licence and copyright header
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3366
diff changeset
     6
#
73920cb25af3 stablerange: add missing licence and copyright header
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3366
diff changeset
     7
# This software may be used and distributed according to the terms of the
73920cb25af3 stablerange: add missing licence and copyright header
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3366
diff changeset
     8
# GNU General Public License version 2 or any later version.
73920cb25af3 stablerange: add missing licence and copyright header
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3366
diff changeset
     9
3236
7c78b0c482a1 depth: basic debugdepth implementation and test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    10
from __future__ import absolute_import
7c78b0c482a1 depth: basic debugdepth implementation and test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    11
3240
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    12
import array
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    13
3236
7c78b0c482a1 depth: basic debugdepth implementation and test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    14
from mercurial import (
3240
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    15
    localrepo,
3332
7d4c157b6519 stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3310
diff changeset
    16
    node as nodemod,
3236
7c78b0c482a1 depth: basic debugdepth implementation and test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    17
)
7c78b0c482a1 depth: basic debugdepth implementation and test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    18
7c78b0c482a1 depth: basic debugdepth implementation and test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    19
from . import (
3408
f4ea9652661d cachevfs: use a compatibility later for all access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3403
diff changeset
    20
    compat,
3240
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    21
    error,
3236
7c78b0c482a1 depth: basic debugdepth implementation and test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    22
    exthelper,
3240
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    23
    genericcaches,
3310
87cb2635352b depthcache: use parents filter in depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3299
diff changeset
    24
    utility,
3236
7c78b0c482a1 depth: basic debugdepth implementation and test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    25
)
7c78b0c482a1 depth: basic debugdepth implementation and test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    26
3310
87cb2635352b depthcache: use parents filter in depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3299
diff changeset
    27
filterparents = utility.filterparents
87cb2635352b depthcache: use parents filter in depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3299
diff changeset
    28
3236
7c78b0c482a1 depth: basic debugdepth implementation and test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    29
eh = exthelper.exthelper()
7c78b0c482a1 depth: basic debugdepth implementation and test
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    30
3240
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    31
@eh.reposetup
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    32
def setupcache(ui, repo):
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    33
3332
7d4c157b6519 stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3310
diff changeset
    34
    class firstmergecacherepo(repo.__class__):
3240
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    35
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    36
        @localrepo.unfilteredpropertycache
3332
7d4c157b6519 stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3310
diff changeset
    37
        def firstmergecache(self):
7d4c157b6519 stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3310
diff changeset
    38
            cache = firstmergecache()
3240
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    39
            cache.update(self)
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    40
            return cache
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    41
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    42
        @localrepo.unfilteredmethod
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    43
        def destroyed(self):
3332
7d4c157b6519 stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3310
diff changeset
    44
            if 'firstmergecach' in vars(self):
7d4c157b6519 stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3310
diff changeset
    45
                self.firstmergecache.clear()
7d4c157b6519 stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3310
diff changeset
    46
            super(firstmergecacherepo, self).destroyed()
3240
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    47
3968
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3504
diff changeset
    48
        @localrepo.unfilteredmethod
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3504
diff changeset
    49
        def updatecaches(self, tr=None, **kwargs):
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3504
diff changeset
    50
            if utility.shouldwarmcache(self, tr):
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3504
diff changeset
    51
                self.firstmergecache.update(self)
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3504
diff changeset
    52
                self.firstmergecache.save(self)
37178a2d3557 compat: drop compatibility layer for updatecaches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3504
diff changeset
    53
            super(firstmergecacherepo, self).updatecaches(tr, **kwargs)
3240
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    54
3332
7d4c157b6519 stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3310
diff changeset
    55
    repo.__class__ = firstmergecacherepo
3240
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    56
3332
7d4c157b6519 stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3310
diff changeset
    57
class firstmergecache(genericcaches.changelogsourcebase):
3240
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    58
3332
7d4c157b6519 stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3310
diff changeset
    59
    _filepath = 'evoext-firstmerge-00'
7d4c157b6519 stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3310
diff changeset
    60
    _cachename = 'evo-ext-firstmerge'
3240
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    61
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    62
    def __init__(self):
3332
7d4c157b6519 stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3310
diff changeset
    63
        super(firstmergecache, self).__init__()
3240
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    64
        self._data = array.array('l')
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    65
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    66
    def get(self, rev):
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    67
        if len(self._data) <= rev:
3332
7d4c157b6519 stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3310
diff changeset
    68
            raise error.ProgrammingError('firstmergecache must be warmed before use')
3240
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    69
        return self._data[rev]
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    70
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    71
    def _updatefrom(self, repo, data):
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    72
        """compute the rev of one revision, assert previous revision has an hot cache
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    73
        """
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    74
        cl = repo.unfiltered().changelog
3241
0d2c095aeb2a depthcache: issue a progress bar when loading the depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3240
diff changeset
    75
        total = len(data)
0d2c095aeb2a depthcache: issue a progress bar when loading the depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3240
diff changeset
    76
0d2c095aeb2a depthcache: issue a progress bar when loading the depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3240
diff changeset
    77
        def progress(pos, rev):
3332
7d4c157b6519 stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3310
diff changeset
    78
            repo.ui.progress('updating firstmerge cache',
3241
0d2c095aeb2a depthcache: issue a progress bar when loading the depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3240
diff changeset
    79
                             pos, 'rev %s' % rev, unit='revision', total=total)
0d2c095aeb2a depthcache: issue a progress bar when loading the depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3240
diff changeset
    80
        progress(0, '')
0d2c095aeb2a depthcache: issue a progress bar when loading the depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3240
diff changeset
    81
        for idx, rev in enumerate(data, 1):
3240
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    82
            assert rev == len(self._data), (rev, len(self._data))
3332
7d4c157b6519 stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3310
diff changeset
    83
            self._data.append(self._firstmerge(cl, rev))
3241
0d2c095aeb2a depthcache: issue a progress bar when loading the depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3240
diff changeset
    84
            if not (idx % 10000): # progress as a too high performance impact
0d2c095aeb2a depthcache: issue a progress bar when loading the depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3240
diff changeset
    85
                progress(idx, rev)
0d2c095aeb2a depthcache: issue a progress bar when loading the depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3240
diff changeset
    86
        progress(None, '')
3240
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    87
3332
7d4c157b6519 stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3310
diff changeset
    88
    def _firstmerge(self, changelog, rev):
3240
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    89
        cl = changelog
3310
87cb2635352b depthcache: use parents filter in depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3299
diff changeset
    90
        ps = filterparents(cl.parentrevs(rev))
87cb2635352b depthcache: use parents filter in depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3299
diff changeset
    91
        if not ps:
3332
7d4c157b6519 stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3310
diff changeset
    92
            return nodemod.nullrev
3310
87cb2635352b depthcache: use parents filter in depth cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3299
diff changeset
    93
        elif len(ps) == 1:
3240
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    94
            # linear commit case
3332
7d4c157b6519 stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3310
diff changeset
    95
            return self.get(ps[0])
3240
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    96
        else:
3332
7d4c157b6519 stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3310
diff changeset
    97
            return rev
3240
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    98
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
    99
    # cache internal logic
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   100
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   101
    def clear(self, reset=False):
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   102
        """invalidate the cache content
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   103
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   104
        if 'reset' is passed, we detected a strip and the cache will have to be
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   105
        recomputed.
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   106
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   107
        Subclasses MUST overide this method to actually affect the cache data.
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   108
        """
3332
7d4c157b6519 stablerange: add a new 'firstmerge' cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3310
diff changeset
   109
        super(firstmergecache, self).clear()
3240
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   110
        self._data = array.array('l')
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   111
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   112
    # crude version of a cache, to show the kind of information we have to store
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   113
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   114
    def load(self, repo):
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   115
        """load data from disk"""
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   116
        assert repo.filtername is None
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   117
3408
f4ea9652661d cachevfs: use a compatibility later for all access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3403
diff changeset
   118
        cachevfs = compat.getcachevfs(repo)
f4ea9652661d cachevfs: use a compatibility later for all access
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3403
diff changeset
   119
        data = cachevfs.tryread(self._filepath)
3240
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   120
        self._data = array.array('l')
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   121
        if not data:
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   122
            self._cachekey = self.emptykey
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   123
        else:
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   124
            headerdata = data[:self._cachekeysize]
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   125
            self._cachekey = self._deserializecachekey(headerdata)
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   126
            self._data.fromstring(data[self._cachekeysize:])
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   127
        self._ondiskkey = self._cachekey
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   128
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   129
    def save(self, repo):
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   130
        """save the data to disk
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   131
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   132
        Format is pretty simple, we serialise the cache key and then drop the
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   133
        bytearray.
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   134
        """
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   135
        if self._cachekey is None or self._cachekey == self._ondiskkey:
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   136
            return
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   137
4101
88000f1d2406 firstmergecache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   138
        try:
88000f1d2406 firstmergecache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   139
            cachevfs = compat.getcachevfs(repo)
88000f1d2406 firstmergecache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   140
            cachefile = cachevfs(self._filepath, 'w', atomictemp=True)
88000f1d2406 firstmergecache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   141
            headerdata = self._serializecachekey()
88000f1d2406 firstmergecache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   142
            cachefile.write(headerdata)
88000f1d2406 firstmergecache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   143
            cachefile.write(self._data.tostring())
88000f1d2406 firstmergecache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   144
            cachefile.close()
4102
3895f6fcd35c firstmergecache: update the variable tracking on-disk state after write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4101
diff changeset
   145
            self._ondiskkey = self._cachekey
4101
88000f1d2406 firstmergecache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   146
        except (IOError, OSError) as exc:
4109
d562316c548f caches: issue both debug and blackbox log message
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4102
diff changeset
   147
            repo.ui.log('firstmergecache', 'could not write update %s\n' % exc)
4101
88000f1d2406 firstmergecache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   148
            repo.ui.debug('firstmergecache: could not write update %s\n' % exc)