hgext3rd/evolve/firstmergecache.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Wed, 17 Apr 2019 20:54:28 +0200
branchstable
changeset 4524 f6099a171a9d
parent 4488 6c0992ce05f7
child 4745 854637e3d2d0
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:
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):
4341
d1aab9d82f5b evolve: adapt for deprecated ui.progress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4109
diff changeset
    78
            compat.progress(repo.ui, 'updating firstmerge cache',
d1aab9d82f5b evolve: adapt for deprecated ui.progress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4109
diff changeset
    79
                            pos, 'rev %s' % rev, unit='revision', total=total)
3241
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
4488
6c0992ce05f7 compat: drop getcachevfs, repo.cachevfs is supported in hg 4.4
Joerg Sonnenberger <joerg@bec.de>
parents: 4341
diff changeset
   118
        data = repo.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
   119
        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
   120
        if not data:
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   121
            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
   122
        else:
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   123
            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
   124
            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
   125
            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
   126
        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
   127
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   128
    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
   129
        """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
   130
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   131
        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
   132
        bytearray.
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   133
        """
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   134
        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
   135
            return
9361149224a7 depthcache: move to a dedicated object and storage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3236
diff changeset
   136
4101
88000f1d2406 firstmergecache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   137
        try:
4488
6c0992ce05f7 compat: drop getcachevfs, repo.cachevfs is supported in hg 4.4
Joerg Sonnenberger <joerg@bec.de>
parents: 4341
diff changeset
   138
            cachefile = repo.cachevfs(self._filepath, 'w', atomictemp=True)
4101
88000f1d2406 firstmergecache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   139
            headerdata = self._serializecachekey()
88000f1d2406 firstmergecache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   140
            cachefile.write(headerdata)
88000f1d2406 firstmergecache: ignore permission and OS errors when writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3975
diff changeset
   141
            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
   142
            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
   143
            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
   144
        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
   145
            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
   146
            repo.ui.debug('firstmergecache: could not write update %s\n' % exc)