hgext3rd/topic/discovery.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Tue, 29 Aug 2017 17:25:01 +0200
changeset 2876 c47c988b239b
parent 2696 a32afe67e8a6
child 3182 bc09dd507c41
permissions -rw-r--r--
doc-front-page: add a feature summary at the beginning of the page
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
1887
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
     3
import weakref
1934
9d6d30e36cdd discovery: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1921
diff changeset
     4
1887
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
     5
from mercurial.i18n import _
1934
9d6d30e36cdd discovery: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1921
diff changeset
     6
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
     7
    bundle2,
daad8249d5cf discovery: move all setup into a 'modsetup' function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1934
diff changeset
     8
    discovery,
1934
9d6d30e36cdd discovery: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1921
diff changeset
     9
    error,
9d6d30e36cdd discovery: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1921
diff changeset
    10
    exchange,
1944
daad8249d5cf discovery: move all setup into a 'modsetup' function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1934
diff changeset
    11
    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
    12
    util,
1944
daad8249d5cf discovery: move all setup into a 'modsetup' function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1934
diff changeset
    13
    wireproto,
1934
9d6d30e36cdd discovery: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1921
diff changeset
    14
)
9d6d30e36cdd discovery: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1921
diff changeset
    15
2558
65cf338258d2 fix: fix _headssummary api
Boris Feld <boris.feld@octobus.net>
parents: 1965
diff changeset
    16
def _headssummary(orig, *args):
65cf338258d2 fix: fix _headssummary api
Boris Feld <boris.feld@octobus.net>
parents: 1965
diff changeset
    17
    # In mercurial < 4.2, we receive repo, remote and outgoing as arguments
65cf338258d2 fix: fix _headssummary api
Boris Feld <boris.feld@octobus.net>
parents: 1965
diff changeset
    18
    if len(args) == 3:
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    19
        pushoparg = False
2558
65cf338258d2 fix: fix _headssummary api
Boris Feld <boris.feld@octobus.net>
parents: 1965
diff changeset
    20
        repo, remote, outgoing = args
65cf338258d2 fix: fix _headssummary api
Boris Feld <boris.feld@octobus.net>
parents: 1965
diff changeset
    21
65cf338258d2 fix: fix _headssummary api
Boris Feld <boris.feld@octobus.net>
parents: 1965
diff changeset
    22
    # In mercurial > 4.3, we receive the pushop as arguments
65cf338258d2 fix: fix _headssummary api
Boris Feld <boris.feld@octobus.net>
parents: 1965
diff changeset
    23
    elif len(args) == 1:
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    24
        pushoparg = True
2558
65cf338258d2 fix: fix _headssummary api
Boris Feld <boris.feld@octobus.net>
parents: 1965
diff changeset
    25
        pushop = args[0]
65cf338258d2 fix: fix _headssummary api
Boris Feld <boris.feld@octobus.net>
parents: 1965
diff changeset
    26
        repo = pushop.repo.unfiltered()
65cf338258d2 fix: fix _headssummary api
Boris Feld <boris.feld@octobus.net>
parents: 1965
diff changeset
    27
        remote = pushop.remote
65cf338258d2 fix: fix _headssummary api
Boris Feld <boris.feld@octobus.net>
parents: 1965
diff changeset
    28
    else:
65cf338258d2 fix: fix _headssummary api
Boris Feld <boris.feld@octobus.net>
parents: 1965
diff changeset
    29
        msg = 'topic-ext _headssummary() takes 1 or 3 arguments (%d given)'
65cf338258d2 fix: fix _headssummary api
Boris Feld <boris.feld@octobus.net>
parents: 1965
diff changeset
    30
        raise TypeError(msg % len(args))
65cf338258d2 fix: fix _headssummary api
Boris Feld <boris.feld@octobus.net>
parents: 1965
diff changeset
    31
1886
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    32
    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
    33
                  or bool(remote.listkeys('phases').get('publishing', False)))
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
    34
    if publishing or not remote.capable('topics'):
2567
6eb87513024b fix: fix _headssummary call to orig
Boris Feld <boris.feld@octobus.net>
parents: 2558
diff changeset
    35
        return orig(*args)
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    36
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    37
    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
    38
        # 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
    39
        def __getitem__(self, key):
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    40
            ctx = super(repocls, self).__getitem__(key)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    41
            oldbranch = ctx.branch
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    42
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    43
            def branch():
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    44
                branch = oldbranch()
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    45
                topic = ctx.topic()
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    46
                if topic:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    47
                    branch = "%s:%s" % (branch, topic)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    48
                return branch
1965
0421772a9c30 discovery: flake8
Sean Farley <sean@farley.io>
parents: 1944
diff changeset
    49
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    50
            ctx.branch = branch
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    51
            return ctx
1965
0421772a9c30 discovery: flake8
Sean Farley <sean@farley.io>
parents: 1944
diff changeset
    52
2696
a32afe67e8a6 topic: also have the revbranchcache during the discovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2695
diff changeset
    53
        def revbranchcache(self):
a32afe67e8a6 topic: also have the revbranchcache during the discovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2695
diff changeset
    54
            rbc = super(repocls, self).revbranchcache()
a32afe67e8a6 topic: also have the revbranchcache during the discovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2695
diff changeset
    55
            changelog = self.changelog
a32afe67e8a6 topic: also have the revbranchcache during the discovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2695
diff changeset
    56
a32afe67e8a6 topic: also have the revbranchcache during the discovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2695
diff changeset
    57
            def branchinfo(rev):
a32afe67e8a6 topic: also have the revbranchcache during the discovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2695
diff changeset
    58
                branch, close = changelog.branchinfo(rev)
a32afe67e8a6 topic: also have the revbranchcache during the discovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2695
diff changeset
    59
                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
    60
                if topic:
a32afe67e8a6 topic: also have the revbranchcache during the discovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2695
diff changeset
    61
                    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
    62
                return branch, close
a32afe67e8a6 topic: also have the revbranchcache during the discovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2695
diff changeset
    63
a32afe67e8a6 topic: also have the revbranchcache during the discovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2695
diff changeset
    64
            rbc.branchinfo = branchinfo
a32afe67e8a6 topic: also have the revbranchcache during the discovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2695
diff changeset
    65
            return rbc
a32afe67e8a6 topic: also have the revbranchcache during the discovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2695
diff changeset
    66
2695
b4824e169f18 topic: cleanup the repository wrapping logic in topic discovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2676
diff changeset
    67
    oldrepocls = repo.__class__
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    68
    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
    69
        repo.__class__ = repocls
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    70
        unxx = repo.filtered('unfiltered-topic')
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    71
        repo.unfiltered = lambda: unxx
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    72
        if pushoparg:
2695
b4824e169f18 topic: cleanup the repository wrapping logic in topic discovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2676
diff changeset
    73
            pushop.repo = repo
b4824e169f18 topic: cleanup the repository wrapping logic in topic discovery
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2676
diff changeset
    74
            summary = orig(pushop)
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    75
        else:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    76
            summary = orig(repo, remote, outgoing)
1886
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    77
        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
    78
            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
    79
                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
    80
                    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
    81
        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
    82
    finally:
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    83
        if 'unfiltered' in vars(repo):
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2567
diff changeset
    84
            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
    85
        repo.__class__ = oldrepocls
1886
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    86
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    87
def wireprotobranchmap(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
    88
    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
    89
    try:
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    90
        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
    91
            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
    92
                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
    93
                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
    94
        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
    95
        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
    96
    finally:
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    97
        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
    98
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
    99
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   100
# 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
   101
# 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
   102
# 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
   103
# head.
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   104
#
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   105
# 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
   106
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
   107
    data = {}
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   108
    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
   109
        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
   110
            continue
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   111
        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
   112
    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
   113
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   114
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
   115
    """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
   116
    orig(op, inpart)
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   117
    if op.repo.publishing():
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   118
        return
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   119
    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
   120
    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
   121
        return
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   122
    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
   123
    reporef = weakref.ref(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
   124
    oldvalidator = tr.validator
1921
4898296d7d25 discovery: whitespace
Sean Farley <sean@farley.io>
parents: 1920
diff changeset
   125
1887
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   126
    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
   127
        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
   128
        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
   129
            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
   130
            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
   131
            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
   132
                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
   133
                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
   134
                    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
   135
                    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
   136
            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
   137
                if 1 < newnb:
1921
4898296d7d25 discovery: whitespace
Sean Farley <sean@farley.io>
parents: 1920
diff changeset
   138
                    msg = _('push create more than 1 head on new branch "%s"'
4898296d7d25 discovery: whitespace
Sean Farley <sean@farley.io>
parents: 1920
diff changeset
   139
                            % 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
   140
                    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
   141
        return oldvalidator(tr)
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   142
    tr.validator = validator
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   143
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
   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
def _pushb2phases(orig, pushop, bundler):
2673
1014341c637b topic: also detect head checking using the concurrent part
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2653
diff changeset
   146
    checktypes = ('check:heads', 'check:updated-heads')
1014341c637b topic: also detect head checking using the concurrent part
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2653
diff changeset
   147
    hascheck = any(p.type in checktypes for p in bundler._parts)
1014341c637b topic: also detect head checking using the concurrent part
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2653
diff changeset
   148
    if not hascheck and pushop.outdatedphases:
1887
68125d026b07 push: hackish handeling of new branch head from phase move
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1886
diff changeset
   149
        exchange._pushb2ctxcheckheads(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
   150
    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
   151
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
   152
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
   153
    caps = 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
   154
    if repo.peer().capable('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
   155
        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
   156
    return caps
1944
daad8249d5cf discovery: move all setup into a 'modsetup' function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1934
diff changeset
   157
daad8249d5cf discovery: move all setup into a 'modsetup' function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1934
diff changeset
   158
def modsetup(ui):
daad8249d5cf discovery: move all setup into a 'modsetup' function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1934
diff changeset
   159
    """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
   160
    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
   161
    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
   162
    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
   163
    # 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
   164
    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
   165
    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
   166
    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
   167
    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
   168
        # 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
   169
        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
   170
        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
   171
        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
   172
    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
   173
    exchange.b2partsgenmapping['phase'] = exchange._pushb2phases