hgext3rd/topic/discovery.py
author Anton Shestakov <av6@dwimlabs.net>
Sun, 05 May 2019 17:39:46 +0800
changeset 4650 7c05b1625921
parent 4544 75b414b298f5
child 4742 db3e7f6b5ceb
permissions -rw-r--r--
stack: get stack data directly from stack and remove stackdata() stackdata function began its life in 137f8b04901e as a proto-stack: it computed stack revs on its own and only had one property to return, "changesetcount". Later it started to prepare and return more properties, but since b933a8068c17 it was computing revs using a getstack function. And then finally in 17749d9d3968 it started to rely on stack class entirely. It was a good function, but now, when all the logic it provided was factored into stack class, I'd say it's finally time for it to be put to rest.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1934
9d6d30e36cdd discovery: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1921
diff changeset
     1
from __future__ import absolute_import
9d6d30e36cdd discovery: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1921
diff changeset
     2
3182
bc09dd507c41 topic: fix new head detection when using --publish on a topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2696
diff changeset
     3
import collections
1887
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
     4
import weakref
1934
9d6d30e36cdd discovery: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1921
diff changeset
     5
1887
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
     6
from mercurial.i18n import _
1934
9d6d30e36cdd discovery: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1921
diff changeset
     7
from mercurial import (
1944
daad8249d5cf discovery: move all setup into a 'modsetup' function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1934
diff changeset
     8
    bundle2,
daad8249d5cf discovery: move all setup into a 'modsetup' function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1934
diff changeset
     9
    discovery,
1934
9d6d30e36cdd discovery: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1921
diff changeset
    10
    error,
9d6d30e36cdd discovery: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1921
diff changeset
    11
    exchange,
1944
daad8249d5cf discovery: move all setup into a 'modsetup' function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1934
diff changeset
    12
    extensions,
2676
10dedac0d82e topic: also insert the extra head check with using the new head checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2675
diff changeset
    13
    util,
1934
9d6d30e36cdd discovery: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1921
diff changeset
    14
)
4540
22cde12d9467 topic: only wrap _headssummary for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4263
diff changeset
    15
from . import (
22cde12d9467 topic: only wrap _headssummary for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4263
diff changeset
    16
    common,
22cde12d9467 topic: only wrap _headssummary for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4263
diff changeset
    17
)
1934
9d6d30e36cdd discovery: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1921
diff changeset
    18
3678
d725fe3e3989 topic: handle wireproto module change from b4d85bc122bd
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3186
diff changeset
    19
try:
d725fe3e3989 topic: handle wireproto module change from b4d85bc122bd
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3186
diff changeset
    20
    from mercurial import wireproto
d725fe3e3989 topic: handle wireproto module change from b4d85bc122bd
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3186
diff changeset
    21
    wireproto.branchmap
3917
ca7f02c9fa57 compat: improve detection of Mercurial 4.6
Andrew Fischer <andrew@apastron.co>
parents: 3689
diff changeset
    22
except (AttributeError, ImportError): # <= hg-4.5
3678
d725fe3e3989 topic: handle wireproto module change from b4d85bc122bd
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3186
diff changeset
    23
    from mercurial import wireprotov1server as wireproto
d725fe3e3989 topic: handle wireproto module change from b4d85bc122bd
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3186
diff changeset
    24
3689
415c872d3308 topic: remove compatibility for older version in discovery wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3678
diff changeset
    25
def _headssummary(orig, pushop, *args, **kwargs):
2558
65cf338258d2 fix: fix _headssummary api
Boris Feld <boris.feld@octobus.net>
parents: 1965
diff changeset
    26
    # In mercurial > 4.3, we receive the pushop as arguments
3689
415c872d3308 topic: remove compatibility for older version in discovery wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3678
diff changeset
    27
    repo = pushop.repo.unfiltered()
415c872d3308 topic: remove compatibility for older version in discovery wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3678
diff changeset
    28
    remote = pushop.remote
2558
65cf338258d2 fix: fix _headssummary api
Boris Feld <boris.feld@octobus.net>
parents: 1965
diff changeset
    29
1886
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    30
    publishing = ('phases' not in remote.listkeys('namespaces')
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    31
                  or bool(remote.listkeys('phases').get('publishing', False)))
4540
22cde12d9467 topic: only wrap _headssummary for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4263
diff changeset
    32
22cde12d9467 topic: only wrap _headssummary for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4263
diff changeset
    33
    if not common.hastopicext(pushop.repo):
22cde12d9467 topic: only wrap _headssummary for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4263
diff changeset
    34
        return orig(pushop, *args, **kwargs)
22cde12d9467 topic: only wrap _headssummary for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4263
diff changeset
    35
    elif ((publishing or not remote.capable('topics'))
3186
9d9ff55d1bb1 compat: fix comp ability of the new phase logic for Mercurial < 4.4
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3182
diff changeset
    36
            and not getattr(pushop, 'publish', False)):
3689
415c872d3308 topic: remove compatibility for older version in discovery wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3678
diff changeset
    37
        return orig(pushop, *args, **kwargs)
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    38
3182
bc09dd507c41 topic: fix new head detection when using --publish on a topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2696
diff changeset
    39
    publishedset = ()
bc09dd507c41 topic: fix new head detection when using --publish on a topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2696
diff changeset
    40
    remotebranchmap = None
bc09dd507c41 topic: fix new head detection when using --publish on a topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2696
diff changeset
    41
    origremotebranchmap = remote.branchmap
4263
35130e428ebd compat: drop code dealing with incompatibility for --publish with 4.3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4194
diff changeset
    42
    publishednode = [c.node() for c in pushop.outdatedphases]
35130e428ebd compat: drop code dealing with incompatibility for --publish with 4.3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4194
diff changeset
    43
    publishedset = repo.revs('ancestors(%ln + %ln)',
35130e428ebd compat: drop code dealing with incompatibility for --publish with 4.3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4194
diff changeset
    44
                             publishednode,
35130e428ebd compat: drop code dealing with incompatibility for --publish with 4.3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4194
diff changeset
    45
                             pushop.remotephases.publicheads)
3182
bc09dd507c41 topic: fix new head detection when using --publish on a topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2696
diff changeset
    46
4263
35130e428ebd compat: drop code dealing with incompatibility for --publish with 4.3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4194
diff changeset
    47
    rev = repo.unfiltered().changelog.nodemap.get
3182
bc09dd507c41 topic: fix new head detection when using --publish on a topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2696
diff changeset
    48
4263
35130e428ebd compat: drop code dealing with incompatibility for --publish with 4.3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4194
diff changeset
    49
    def remotebranchmap():
35130e428ebd compat: drop code dealing with incompatibility for --publish with 4.3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4194
diff changeset
    50
        # drop topic information from changeset about to be published
35130e428ebd compat: drop code dealing with incompatibility for --publish with 4.3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4194
diff changeset
    51
        result = collections.defaultdict(list)
35130e428ebd compat: drop code dealing with incompatibility for --publish with 4.3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4194
diff changeset
    52
        for branch, heads in origremotebranchmap().iteritems():
35130e428ebd compat: drop code dealing with incompatibility for --publish with 4.3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4194
diff changeset
    53
            if ':' not in branch:
35130e428ebd compat: drop code dealing with incompatibility for --publish with 4.3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4194
diff changeset
    54
                result[branch].extend(heads)
35130e428ebd compat: drop code dealing with incompatibility for --publish with 4.3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4194
diff changeset
    55
            else:
35130e428ebd compat: drop code dealing with incompatibility for --publish with 4.3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4194
diff changeset
    56
                namedbranch = branch.split(':', 1)[0]
35130e428ebd compat: drop code dealing with incompatibility for --publish with 4.3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4194
diff changeset
    57
                for h in heads:
35130e428ebd compat: drop code dealing with incompatibility for --publish with 4.3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4194
diff changeset
    58
                    r = rev(h)
35130e428ebd compat: drop code dealing with incompatibility for --publish with 4.3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4194
diff changeset
    59
                    if r is not None and r in publishedset:
35130e428ebd compat: drop code dealing with incompatibility for --publish with 4.3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4194
diff changeset
    60
                        result[namedbranch].append(h)
35130e428ebd compat: drop code dealing with incompatibility for --publish with 4.3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4194
diff changeset
    61
                    else:
35130e428ebd compat: drop code dealing with incompatibility for --publish with 4.3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4194
diff changeset
    62
                        result[branch].append(h)
35130e428ebd compat: drop code dealing with incompatibility for --publish with 4.3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4194
diff changeset
    63
        for heads in result.itervalues():
35130e428ebd compat: drop code dealing with incompatibility for --publish with 4.3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4194
diff changeset
    64
            heads.sort()
35130e428ebd compat: drop code dealing with incompatibility for --publish with 4.3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4194
diff changeset
    65
        return result
3182
bc09dd507c41 topic: fix new head detection when using --publish on a topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2696
diff changeset
    66
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    67
    class repocls(repo.__class__):
2696
a32afe67e8a6 topic: also have the revbranchcache during the discovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2695
diff changeset
    68
        # awful hack to see branch as "branch:topic"
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    69
        def __getitem__(self, key):
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    70
            ctx = super(repocls, self).__getitem__(key)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    71
            oldbranch = ctx.branch
3182
bc09dd507c41 topic: fix new head detection when using --publish on a topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2696
diff changeset
    72
            rev = ctx.rev()
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    73
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    74
            def branch():
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    75
                branch = oldbranch()
3182
bc09dd507c41 topic: fix new head detection when using --publish on a topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2696
diff changeset
    76
                if rev in publishedset:
bc09dd507c41 topic: fix new head detection when using --publish on a topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2696
diff changeset
    77
                    return branch
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    78
                topic = ctx.topic()
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    79
                if topic:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    80
                    branch = "%s:%s" % (branch, topic)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    81
                return branch
1965
0421772a9c30 discovery: flake8
Sean Farley <sean@farley.io>
parents: 1944
diff changeset
    82
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    83
            ctx.branch = branch
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    84
            return ctx
1965
0421772a9c30 discovery: flake8
Sean Farley <sean@farley.io>
parents: 1944
diff changeset
    85
2696
a32afe67e8a6 topic: also have the revbranchcache during the discovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2695
diff changeset
    86
        def revbranchcache(self):
a32afe67e8a6 topic: also have the revbranchcache during the discovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2695
diff changeset
    87
            rbc = super(repocls, self).revbranchcache()
4192
e527df0f2a68 topic: add the changelog argument to branchinfo()
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 4123
diff changeset
    88
            localchangelog = self.changelog
2696
a32afe67e8a6 topic: also have the revbranchcache during the discovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2695
diff changeset
    89
4192
e527df0f2a68 topic: add the changelog argument to branchinfo()
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 4123
diff changeset
    90
            def branchinfo(rev, changelog=None):
e527df0f2a68 topic: add the changelog argument to branchinfo()
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 4123
diff changeset
    91
                if changelog is None:
e527df0f2a68 topic: add the changelog argument to branchinfo()
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 4123
diff changeset
    92
                    changelog = localchangelog
2696
a32afe67e8a6 topic: also have the revbranchcache during the discovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2695
diff changeset
    93
                branch, close = changelog.branchinfo(rev)
3182
bc09dd507c41 topic: fix new head detection when using --publish on a topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2696
diff changeset
    94
                if rev in publishedset:
bc09dd507c41 topic: fix new head detection when using --publish on a topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2696
diff changeset
    95
                    return branch, close
2696
a32afe67e8a6 topic: also have the revbranchcache during the discovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2695
diff changeset
    96
                topic = repo[rev].topic()
a32afe67e8a6 topic: also have the revbranchcache during the discovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2695
diff changeset
    97
                if topic:
a32afe67e8a6 topic: also have the revbranchcache during the discovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2695
diff changeset
    98
                    branch = "%s:%s" % (branch, topic)
a32afe67e8a6 topic: also have the revbranchcache during the discovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2695
diff changeset
    99
                return branch, close
a32afe67e8a6 topic: also have the revbranchcache during the discovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2695
diff changeset
   100
a32afe67e8a6 topic: also have the revbranchcache during the discovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2695
diff changeset
   101
            rbc.branchinfo = branchinfo
a32afe67e8a6 topic: also have the revbranchcache during the discovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2695
diff changeset
   102
            return rbc
a32afe67e8a6 topic: also have the revbranchcache during the discovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2695
diff changeset
   103
2695
b4824e169f18 topic: cleanup the repository wrapping logic in topic discovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2676
diff changeset
   104
    oldrepocls = repo.__class__
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
   105
    try:
1886
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   106
        repo.__class__ = repocls
3186
9d9ff55d1bb1 compat: fix comp ability of the new phase logic for Mercurial < 4.4
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3182
diff changeset
   107
        if remotebranchmap is not None:
9d9ff55d1bb1 compat: fix comp ability of the new phase logic for Mercurial < 4.4
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3182
diff changeset
   108
            remote.branchmap = remotebranchmap
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
   109
        unxx = repo.filtered('unfiltered-topic')
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
   110
        repo.unfiltered = lambda: unxx
3689
415c872d3308 topic: remove compatibility for older version in discovery wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3678
diff changeset
   111
        pushop.repo = repo
415c872d3308 topic: remove compatibility for older version in discovery wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3678
diff changeset
   112
        summary = orig(pushop)
1886
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   113
        for key, value in summary.iteritems():
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   114
            if ':' in key: # This is a topic
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   115
                if value[0] is None and value[1]:
2674
9585fac76d2d topic: adjust head checking wrapping to not interfere with concurrent push
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2673
diff changeset
   116
                    summary[key] = ([value[1][0]], ) + value[1:]
1886
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   117
        return summary
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   118
    finally:
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
   119
        if 'unfiltered' in vars(repo):
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
   120
            del repo.unfiltered
2695
b4824e169f18 topic: cleanup the repository wrapping logic in topic discovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2676
diff changeset
   121
        repo.__class__ = oldrepocls
3186
9d9ff55d1bb1 compat: fix comp ability of the new phase logic for Mercurial < 4.4
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3182
diff changeset
   122
        if remotebranchmap is not None:
9d9ff55d1bb1 compat: fix comp ability of the new phase logic for Mercurial < 4.4
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3182
diff changeset
   123
            remote.branchmap = origremotebranchmap
1886
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   124
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   125
def wireprotobranchmap(orig, repo, proto):
4541
7e98faf278d6 topic: only wrap wireprotobranchmap for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4540
diff changeset
   126
    if not common.hastopicext(repo):
7e98faf278d6 topic: only wrap wireprotobranchmap for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4540
diff changeset
   127
        return orig(repo, proto)
1886
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   128
    oldrepo = repo.__class__
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   129
    try:
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   130
        class repocls(repo.__class__):
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   131
            def branchmap(self):
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   132
                usetopic = not self.publishing()
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   133
                return super(repocls, self).branchmap(topic=usetopic)
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   134
        repo.__class__ = repocls
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   135
        return orig(repo, proto)
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   136
    finally:
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
   137
        repo.__class__ = oldrepo
1887
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   138
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   139
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   140
# Discovery have deficiency around phases, branch can get new heads with pure
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   141
# phases change. This happened with a changeset was allowed to be pushed
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   142
# because it had a topic, but it later become public and create a new branch
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   143
# head.
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   144
#
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   145
# Handle this by doing an extra check for new head creation server side
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   146
def _nbheads(repo):
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   147
    data = {}
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   148
    for b in repo.branchmap().iterbranches():
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   149
        if ':' in b[0]:
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   150
            continue
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   151
        data[b[0]] = len(b[1])
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   152
    return data
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   153
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   154
def handlecheckheads(orig, op, inpart):
2675
304232cc14b6 topic: some document for an obscure function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2674
diff changeset
   155
    """This is used to check for new heads when publishing changeset"""
1887
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   156
    orig(op, inpart)
4542
f5127bfc1588 topic: only wrap handlecheckheads for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4541
diff changeset
   157
    if not common.hastopicext(op.repo) or op.repo.publishing():
1887
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   158
        return
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   159
    tr = op.gettransaction()
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   160
    if tr.hookargs['source'] not in ('push', 'serve'): # not a push
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   161
        return
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   162
    tr._prepushheads = _nbheads(op.repo)
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   163
    reporef = weakref.ref(op.repo)
4123
119fced5a891 topic: add a compatibility to access transaction's validator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3917
diff changeset
   164
    if util.safehasattr(tr, 'validator'): # hg <= 4.7
119fced5a891 topic: add a compatibility to access transaction's validator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3917
diff changeset
   165
        oldvalidator = tr.validator
119fced5a891 topic: add a compatibility to access transaction's validator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3917
diff changeset
   166
    else:
119fced5a891 topic: add a compatibility to access transaction's validator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3917
diff changeset
   167
        oldvalidator = tr._validator
1921
4898296d7d25 discovery: whitespace
Sean Farley <sean@farley.io>
parents: 1920
diff changeset
   168
1887
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   169
    def validator(tr):
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   170
        repo = reporef()
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   171
        if repo is not None:
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   172
            repo.invalidatecaches()
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   173
            finalheads = _nbheads(repo)
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   174
            for branch, oldnb in tr._prepushheads.iteritems():
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   175
                newnb = finalheads.pop(branch, 0)
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   176
                if oldnb < newnb:
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   177
                    msg = _('push create a new head on branch "%s"' % branch)
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   178
                    raise error.Abort(msg)
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   179
            for branch, newnb in finalheads.iteritems():
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   180
                if 1 < newnb:
1921
4898296d7d25 discovery: whitespace
Sean Farley <sean@farley.io>
parents: 1920
diff changeset
   181
                    msg = _('push create more than 1 head on new branch "%s"'
4898296d7d25 discovery: whitespace
Sean Farley <sean@farley.io>
parents: 1920
diff changeset
   182
                            % branch)
1887
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   183
                    raise error.Abort(msg)
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   184
        return oldvalidator(tr)
4123
119fced5a891 topic: add a compatibility to access transaction's validator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3917
diff changeset
   185
    if util.safehasattr(tr, 'validator'): # hg <= 4.7
119fced5a891 topic: add a compatibility to access transaction's validator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3917
diff changeset
   186
        tr.validator = validator
119fced5a891 topic: add a compatibility to access transaction's validator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3917
diff changeset
   187
    else:
119fced5a891 topic: add a compatibility to access transaction's validator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3917
diff changeset
   188
        tr._validator = validator
1887
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   189
handlecheckheads.params = frozenset()
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   190
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   191
def _pushb2phases(orig, pushop, bundler):
4543
7f1e1ba3d16b topic: only wrap _pushb2phases for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4542
diff changeset
   192
    if common.hastopicext(pushop.repo):
7f1e1ba3d16b topic: only wrap _pushb2phases for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4542
diff changeset
   193
        checktypes = ('check:heads', 'check:updated-heads')
7f1e1ba3d16b topic: only wrap _pushb2phases for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4542
diff changeset
   194
        hascheck = any(p.type in checktypes for p in bundler._parts)
7f1e1ba3d16b topic: only wrap _pushb2phases for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4542
diff changeset
   195
        if not hascheck and pushop.outdatedphases:
7f1e1ba3d16b topic: only wrap _pushb2phases for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4542
diff changeset
   196
            exchange._pushb2ctxcheckheads(pushop, bundler)
1887
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   197
    return orig(pushop, bundler)
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   198
1903
58cdf061d49a topic: don't take topic into account when pushing to non-topic repo
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1901
diff changeset
   199
def wireprotocaps(orig, repo, proto):
58cdf061d49a topic: don't take topic into account when pushing to non-topic repo
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1901
diff changeset
   200
    caps = orig(repo, proto)
4544
75b414b298f5 topic: only wrap wireprotocaps for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4543
diff changeset
   201
    if common.hastopicext(repo) and repo.peer().capable('topics'):
1903
58cdf061d49a topic: don't take topic into account when pushing to non-topic repo
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1901
diff changeset
   202
        caps.append('topics')
58cdf061d49a topic: don't take topic into account when pushing to non-topic repo
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1901
diff changeset
   203
    return caps
1944
daad8249d5cf discovery: move all setup into a 'modsetup' function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1934
diff changeset
   204
daad8249d5cf discovery: move all setup into a 'modsetup' function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1934
diff changeset
   205
def modsetup(ui):
daad8249d5cf discovery: move all setup into a 'modsetup' function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1934
diff changeset
   206
    """run at uisetup time to install all destinations wrapping"""
daad8249d5cf discovery: move all setup into a 'modsetup' function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1934
diff changeset
   207
    extensions.wrapfunction(discovery, '_headssummary', _headssummary)
daad8249d5cf discovery: move all setup into a 'modsetup' function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1934
diff changeset
   208
    extensions.wrapfunction(wireproto, 'branchmap', wireprotobranchmap)
daad8249d5cf discovery: move all setup into a 'modsetup' function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1934
diff changeset
   209
    extensions.wrapfunction(wireproto, '_capabilities', wireprotocaps)
2676
10dedac0d82e topic: also insert the extra head check with using the new head checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2675
diff changeset
   210
    # we need a proper wrap b2 part stuff
1944
daad8249d5cf discovery: move all setup into a 'modsetup' function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1934
diff changeset
   211
    extensions.wrapfunction(bundle2, 'handlecheckheads', handlecheckheads)
daad8249d5cf discovery: move all setup into a 'modsetup' function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1934
diff changeset
   212
    bundle2.handlecheckheads.params = frozenset()
daad8249d5cf discovery: move all setup into a 'modsetup' function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1934
diff changeset
   213
    bundle2.parthandlermapping['check:heads'] = bundle2.handlecheckheads
2676
10dedac0d82e topic: also insert the extra head check with using the new head checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2675
diff changeset
   214
    if util.safehasattr(bundle2, 'handlecheckupdatedheads'):
10dedac0d82e topic: also insert the extra head check with using the new head checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2675
diff changeset
   215
        # we still need a proper wrap b2 part stuff
10dedac0d82e topic: also insert the extra head check with using the new head checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2675
diff changeset
   216
        extensions.wrapfunction(bundle2, 'handlecheckupdatedheads', handlecheckheads)
10dedac0d82e topic: also insert the extra head check with using the new head checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2675
diff changeset
   217
        bundle2.handlecheckupdatedheads.params = frozenset()
10dedac0d82e topic: also insert the extra head check with using the new head checking
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2675
diff changeset
   218
        bundle2.parthandlermapping['check:updated-heads'] = bundle2.handlecheckupdatedheads
1944
daad8249d5cf discovery: move all setup into a 'modsetup' function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1934
diff changeset
   219
    extensions.wrapfunction(exchange, '_pushb2phases', _pushb2phases)
daad8249d5cf discovery: move all setup into a 'modsetup' function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1934
diff changeset
   220
    exchange.b2partsgenmapping['phase'] = exchange._pushb2phases