hgext3rd/serverminitopic.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Thu, 23 Nov 2017 16:53:29 +0100
changeset 3241 0d2c095aeb2a
parent 3207 35c79686a635
child 3511 768f752b5364
permissions -rw-r--r--
depthcache: issue a progress bar when loading the depth cache The operation can be in the minute order of magnitude of some larger repository. We better keep the user entertain when he wait.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3206
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     1
"""enable a minimal verison of topic for server
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     2
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     3
Non publishing repository will see topic as "branch:topic" in the branch field.
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     4
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     5
In addition to adding the extensions, the feature must be manually enabled in the config:
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     6
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     7
    [experimental]
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     8
    server-mini-topic = yes
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     9
"""
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    10
import hashlib
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    11
import contextlib
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    12
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    13
from mercurial import (
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    14
    branchmap,
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    15
    context,
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    16
    encoding,
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    17
    extensions,
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    18
    node,
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    19
    registrar,
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    20
    util,
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    21
    wireproto,
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    22
)
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    23
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    24
if util.safehasattr(registrar, 'configitem'):
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    25
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    26
    configtable = {}
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    27
    configitem = registrar.configitem(configtable)
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    28
    configitem('experimental', 'server-mini-topic',
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    29
               default=False,
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    30
    )
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    31
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    32
def hasminitopic(repo):
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    33
    """true if minitopic is enabled on the repository
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    34
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    35
    (The value is cached on the repository)
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    36
    """
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    37
    enabled = getattr(repo, '_hasminitopic', None)
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    38
    if enabled is None:
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    39
        enabled = (repo.ui.configbool('experimental', 'server-mini-topic')
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    40
                   and not repo.publishing())
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    41
        repo._hasminitopic = enabled
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    42
    return enabled
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    43
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    44
### make topic visible though "ctx.branch()"
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    45
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    46
class topicchangectx(context.changectx):
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    47
    """a sunclass of changectx that add topic to the branch name"""
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    48
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    49
    def branch(self):
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    50
        branch = super(topicchangectx, self).branch()
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    51
        if hasminitopic(self._repo) and self.phase():
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    52
            topic = self._changeset.extra.get('topic')
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    53
            if topic is not None:
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    54
                topic = encoding.tolocal(topic)
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    55
                branch = '%s:%s' % (branch, topic)
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    56
        return branch
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    57
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    58
### avoid caching topic data in rev-branch-cache
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    59
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    60
class revbranchcacheoverlay(object):
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    61
    """revbranch mixin that don't use the cache for non public changeset"""
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    62
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    63
    def _init__(self, *args, **kwargs):
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    64
        super(revbranchcacheoverlay, self).__init__(*args, **kwargs)
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    65
        if 'branchinfo' in vars(self):
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    66
            del self.branchinfo
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    67
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    68
    def branchinfo(self, rev):
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    69
        """return branch name and close flag for rev, using and updating
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    70
        persistent cache."""
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    71
        phase = self._repo._phasecache.phase(self, rev)
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    72
        if phase:
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    73
            ctx = self._repo[rev]
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    74
            return ctx.branch(), ctx.closesbranch()
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    75
        return super(revbranchcacheoverlay, self).branchinfo(rev)
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    76
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    77
def reposetup(ui, repo):
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    78
    """install a repo class with a special revbranchcache"""
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    79
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    80
    if hasminitopic(repo):
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    81
        repo = repo.unfiltered()
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    82
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    83
        class minitopicrepo(repo.__class__):
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    84
            """repository subclass that install the modified cache"""
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    85
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    86
            def revbranchcache(self):
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    87
                if self._revbranchcache is None:
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    88
                    cache = super(minitopicrepo, self).revbranchcache()
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    89
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    90
                    class topicawarerbc(revbranchcacheoverlay, cache.__class__):
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    91
                        pass
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    92
                    cache.__class__ = topicawarerbc
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    93
                    if 'branchinfo' in vars(cache):
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    94
                        del cache.branchinfo
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    95
                    self._revbranchcache = cache
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    96
                return self._revbranchcache
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    97
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    98
        repo.__class__ = minitopicrepo
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    99
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   100
### topic aware branch head cache
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   101
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   102
def _phaseshash(repo, maxrev):
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   103
    """uniq ID for a phase matching a set of rev"""
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   104
    revs = set()
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   105
    cl = repo.changelog
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   106
    fr = cl.filteredrevs
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   107
    nm = cl.nodemap
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   108
    for roots in repo._phasecache.phaseroots[1:]:
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   109
        for n in roots:
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   110
            r = nm.get(n)
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   111
            if r not in fr and r < maxrev:
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   112
                revs.add(r)
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   113
    key = node.nullid
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   114
    revs = sorted(revs)
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   115
    if revs:
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   116
        s = hashlib.sha1()
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   117
        for rev in revs:
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   118
            s.update('%s;' % rev)
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   119
        key = s.digest()
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   120
    return key
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   121
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   122
# needed to prevent reference used for 'super()' call using in branchmap.py to
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   123
# no go into cycle. (yes, URG)
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   124
_oldbranchmap = branchmap.branchcache
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   125
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   126
@contextlib.contextmanager
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   127
def oldbranchmap():
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   128
    previous = branchmap.branchcache
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   129
    try:
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   130
        branchmap.branchcache = _oldbranchmap
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   131
        yield
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   132
    finally:
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   133
        branchmap.branchcache = previous
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   134
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   135
_publiconly = set([
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   136
    'base',
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   137
    'immutable',
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   138
])
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   139
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   140
def mighttopic(repo):
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   141
    return hasminitopic(repo) and repo.filtername not in _publiconly
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   142
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   143
class _topiccache(branchmap.branchcache): # combine me with branchmap.branchcache
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   144
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   145
    def __init__(self, *args, **kwargs):
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   146
        # super() call may fail otherwise
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   147
        with oldbranchmap():
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   148
            super(_topiccache, self).__init__(*args, **kwargs)
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   149
        self.phaseshash = None
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   150
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   151
    def copy(self):
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   152
        """return an deep copy of the branchcache object"""
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   153
        new = self.__class__(self, self.tipnode, self.tiprev, self.filteredhash,
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   154
                             self._closednodes)
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   155
        new.phaseshash = self.phaseshash
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   156
        return new
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   157
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   158
    def validfor(self, repo):
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   159
        """Is the cache content valid regarding a repo
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   160
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   161
        - False when cached tipnode is unknown or if we detect a strip.
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   162
        - True when cache is up to date or a subset of current repo."""
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   163
        valid = super(_topiccache, self).validfor(repo)
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   164
        if not valid:
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   165
            return False
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   166
        elif not mighttopic(repo) and self.phaseshash is None:
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   167
            # phasehash at None means this is a branchmap
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   168
            # coming from a public only set
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   169
            return True
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   170
        else:
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   171
            try:
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   172
                valid = self.phaseshash == _phaseshash(repo, self.tiprev)
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   173
                return valid
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   174
            except IndexError:
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   175
                return False
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   176
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   177
    def write(self, repo):
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   178
        # we expect (hope) mutable set to be small enough to be that computing
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   179
        # it all the time will be fast enough
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   180
        if not mighttopic(repo):
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   181
            super(_topiccache, self).write(repo)
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   182
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   183
    def update(self, repo, revgen):
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   184
        """Given a branchhead cache, self, that may have extra nodes or be
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   185
        missing heads, and a generator of nodes that are strictly a superset of
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   186
        heads missing, this function updates self to be correct.
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   187
        """
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   188
        super(_topiccache, self).update(repo, revgen)
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   189
        if mighttopic(repo):
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   190
            self.phaseshash = _phaseshash(repo, self.tiprev)
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   191
3207
35c79686a635 serverminitopic: also avoid reading
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3206
diff changeset
   192
def wrapread(orig, repo):
35c79686a635 serverminitopic: also avoid reading
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3206
diff changeset
   193
    # Avoiding to write cache for filter where topic applies is a good step,
35c79686a635 serverminitopic: also avoid reading
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3206
diff changeset
   194
    # but we need to also avoid reading it. Existing branchmap cache might
35c79686a635 serverminitopic: also avoid reading
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3206
diff changeset
   195
    # exists before the turned the feature on.
35c79686a635 serverminitopic: also avoid reading
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3206
diff changeset
   196
    if mighttopic(repo):
35c79686a635 serverminitopic: also avoid reading
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3206
diff changeset
   197
        return None
35c79686a635 serverminitopic: also avoid reading
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3206
diff changeset
   198
    return orig(repo)
35c79686a635 serverminitopic: also avoid reading
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3206
diff changeset
   199
3206
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   200
# advertise topic capabilities
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   201
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   202
def wireprotocaps(orig, repo, proto):
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   203
    caps = orig(repo, proto)
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   204
    if hasminitopic(repo):
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   205
        caps.append('topics')
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   206
    return caps
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   207
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   208
# wrap the necessary bit
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   209
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   210
def wrapclass(container, oldname, new):
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   211
    old = getattr(container, oldname)
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   212
    if not issubclass(old, new):
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   213
        targetclass = new
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   214
        # check if someone else already wrapped the class and handle that
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   215
        if not issubclass(new, old):
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   216
            class targetclass(new, old):
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   217
                pass
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   218
        setattr(container, oldname, targetclass)
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   219
    current = getattr(container, oldname)
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   220
    assert issubclass(current, new), (current, new, targetclass)
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   221
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   222
def uisetup(ui):
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   223
    wrapclass(context, 'changectx', topicchangectx)
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   224
    wrapclass(branchmap, 'branchcache', _topiccache)
3207
35c79686a635 serverminitopic: also avoid reading
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3206
diff changeset
   225
    extensions.wrapfunction(branchmap, 'read', wrapread)
3206
3ccde4699cf0 topic: introduce a minimal extensions to enable topic on the server
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   226
    extensions.wrapfunction(wireproto, '_capabilities', wireprotocaps)