hgext3rd/evolve/checkheads.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Sun, 23 Jul 2017 06:11:33 +0200
changeset 2764 a4a6f4128be5
parent 2274 72ba9d4418e0
permissions -rw-r--r--
rewriteutil: move 'reachablefrombookmark' to the module
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2245
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     1
# Code dedicated to the postprocessing new heads check with obsolescence
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     2
#
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     3
# Copyright 2017 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     4
#
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     5
# This software may be used and distributed according to the terms of the
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     6
# GNU General Public License version 2 or any later version.
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     7
2256
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
     8
import functools
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
     9
2245
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    10
from mercurial import (
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    11
    discovery,
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    12
    error,
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    13
    extensions,
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    14
    node as nodemod,
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    15
    phases,
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    16
    util,
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    17
)
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    18
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    19
from mercurial.i18n import _
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    20
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    21
from . import exthelper
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    22
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    23
nullid = nodemod.nullid
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    24
short = nodemod.short
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    25
_headssummary = discovery._headssummary
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    26
_oldheadssummary = discovery._oldheadssummary
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    27
_nowarnheads = discovery._nowarnheads
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    28
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    29
eh = exthelper.exthelper()
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    30
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    31
@eh.uisetup
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    32
def setupcheckheadswrapper(ui):
2274
72ba9d4418e0 checkheads: do not overwrite code for Mercurial 4.2 and above
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2257
diff changeset
    33
    if not util.safehasattr(discovery, '_postprocessobsolete'):
72ba9d4418e0 checkheads: do not overwrite code for Mercurial 4.2 and above
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2257
diff changeset
    34
        # hg-4.2+ has all the code natively
2245
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    35
        extensions.wrapfunction(discovery, 'checkheads',
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    36
                                checkheadsfulloverlay)
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    37
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    38
# have dedicated wrapper to keep the rest as close as core as possible
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    39
def checkheadsfulloverlay(orig, pushop):
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    40
    if pushop.repo.obsstore:
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    41
        return corecheckheads(pushop)
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    42
    else:
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    43
        return orig(pushop)
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    44
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    45
# copied from mercurial.discovery.checkheads as in a5bad127128d (4.1)
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    46
#
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    47
# The only differences are:
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    48
# * the _postprocessobsolete section have been extracted,
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    49
# * minor test adjustment to please flake8
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    50
def corecheckheads(pushop):
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    51
    """Check that a push won't add any outgoing head
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    52
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    53
    raise Abort error and display ui message as needed.
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    54
    """
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    55
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    56
    repo = pushop.repo.unfiltered()
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    57
    remote = pushop.remote
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    58
    outgoing = pushop.outgoing
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    59
    remoteheads = pushop.remoteheads
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    60
    newbranch = pushop.newbranch
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    61
    inc = bool(pushop.incoming)
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    62
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    63
    # Check for each named branch if we're creating new remote heads.
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    64
    # To be a remote head after push, node must be either:
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    65
    # - unknown locally
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    66
    # - a local outgoing head descended from update
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    67
    # - a remote head that's known locally and not
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    68
    #   ancestral to an outgoing head
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    69
    if remoteheads == [nullid]:
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    70
        # remote is empty, nothing to check.
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    71
        return
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    72
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    73
    if remote.capable('branchmap'):
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    74
        headssum = _headssummary(repo, remote, outgoing)
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    75
    else:
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    76
        headssum = _oldheadssummary(repo, remoteheads, outgoing, inc)
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    77
    newbranches = [branch for branch, heads in headssum.iteritems()
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    78
                   if heads[0] is None]
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    79
    # 1. Check for new branches on the remote.
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    80
    if newbranches and not newbranch:  # new branch requires --new-branch
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    81
        branchnames = ', '.join(sorted(newbranches))
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    82
        raise error.Abort(_("push creates new remote branches: %s!")
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    83
                          % branchnames,
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    84
                          hint=_("use 'hg push --new-branch' to create"
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    85
                                 " new remote branches"))
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    86
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    87
    # 2. Find heads that we need not warn about
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    88
    nowarnheads = _nowarnheads(pushop)
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    89
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    90
    # 3. Check for new heads.
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    91
    # If there are more heads after the push than before, a suitable
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    92
    # error message, depending on unsynced status, is displayed.
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    93
    errormsg = None
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    94
    # If there is no obsstore, allfuturecommon won't be used, so no
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    95
    # need to compute it.
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    96
    if repo.obsstore:
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    97
        allmissing = set(outgoing.missing)
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    98
        cctx = repo.set('%ld', outgoing.common)
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    99
        allfuturecommon = set(c.node() for c in cctx)
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   100
        allfuturecommon.update(allmissing)
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   101
    for branch, heads in sorted(headssum.iteritems()):
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   102
        remoteheads, newheads, unsyncedheads = heads
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   103
        candidate_newhs = set(newheads)
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   104
        # add unsynced data
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   105
        if remoteheads is None:
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   106
            oldhs = set()
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   107
        else:
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   108
            oldhs = set(remoteheads)
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   109
        oldhs.update(unsyncedheads)
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   110
        candidate_newhs.update(unsyncedheads)
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   111
        dhs = None # delta heads, the new heads on branch
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   112
        if not repo.obsstore:
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   113
            discardedheads = set()
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   114
            newhs = candidate_newhs
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   115
        else:
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   116
            newhs, discardedheads = _postprocessobsolete(pushop,
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   117
                                                         allfuturecommon,
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   118
                                                         candidate_newhs)
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   119
        unsynced = sorted(h for h in unsyncedheads if h not in discardedheads)
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   120
        if unsynced:
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   121
            if None in unsynced:
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   122
                # old remote, no heads data
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   123
                heads = None
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   124
            elif len(unsynced) <= 4 or repo.ui.verbose:
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   125
                heads = ' '.join(short(h) for h in unsynced)
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   126
            else:
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   127
                heads = (' '.join(short(h) for h in unsynced[:4]) +
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   128
                         ' ' + _("and %s others") % (len(unsynced) - 4))
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   129
            if heads is None:
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   130
                repo.ui.status(_("remote has heads that are "
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   131
                                 "not known locally\n"))
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   132
            elif branch is None:
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   133
                repo.ui.status(_("remote has heads that are "
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   134
                                 "not known locally: %s\n") % heads)
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   135
            else:
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   136
                repo.ui.status(_("remote has heads on branch '%s' that are "
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   137
                                 "not known locally: %s\n") % (branch, heads))
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   138
        if remoteheads is None:
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   139
            if len(newhs) > 1:
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   140
                dhs = list(newhs)
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   141
                if errormsg is None:
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   142
                    errormsg = (_("push creates new branch '%s' "
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   143
                                  "with multiple heads") % (branch))
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   144
                    hint = _("merge or"
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   145
                             " see 'hg help push' for details about"
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   146
                             " pushing new heads")
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   147
        elif len(newhs) > len(oldhs):
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   148
            # remove bookmarked or existing remote heads from the new heads list
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   149
            dhs = sorted(newhs - nowarnheads - oldhs)
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   150
        if dhs:
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   151
            if errormsg is None:
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   152
                if branch not in ('default', None):
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   153
                    errormsg = _("push creates new remote head %s "
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   154
                                 "on branch '%s'!") % (short(dhs[0]), branch)
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   155
                elif repo[dhs[0]].bookmarks():
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   156
                    errormsg = (_("push creates new remote head %s "
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   157
                                  "with bookmark '%s'!")
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   158
                                % (short(dhs[0]), repo[dhs[0]].bookmarks()[0]))
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   159
                else:
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   160
                    errormsg = _("push creates new remote head %s!"
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   161
                                 ) % short(dhs[0])
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   162
                if unsyncedheads:
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   163
                    hint = _("pull and merge or"
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   164
                             " see 'hg help push' for details about"
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   165
                             " pushing new heads")
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   166
                else:
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   167
                    hint = _("merge or"
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   168
                             " see 'hg help push' for details about"
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   169
                             " pushing new heads")
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   170
            if branch is None:
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   171
                repo.ui.note(_("new remote heads:\n"))
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   172
            else:
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   173
                repo.ui.note(_("new remote heads on branch '%s':\n") % branch)
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   174
            for h in dhs:
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   175
                repo.ui.note((" %s\n") % short(h))
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   176
    if errormsg:
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   177
        raise error.Abort(errormsg, hint=hint)
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   178
2247
2320a7e3cbd7 checkheads: basic handling of pruned heads (and associated tests)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2246
diff changeset
   179
def _postprocessobsolete(pushop, futurecommon, candidate):
2245
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   180
    """post process the list of new heads with obsolescence information
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   181
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   182
    Exist as a subfunction to contains the complexity and allow extensions to
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   183
    experiment with smarter logic.
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   184
    Returns (newheads, discarded_heads) tuple
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   185
    """
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   186
    # remove future heads which are actually obsoleted by another
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   187
    # pushed element:
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   188
    #
2256
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   189
    # known issue
2245
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   190
    #
2246
fb4ef91f888e checkheads: give up on processing locally unknown changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2245
diff changeset
   191
    # * We "silently" skip processing on all changeset unknown locally
fb4ef91f888e checkheads: give up on processing locally unknown changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2245
diff changeset
   192
    #
2249
0ecb9fba6364 checkheads: handle partial obsolescence
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2247
diff changeset
   193
    # * if <nh> is public on the remote, it won't be affected by obsolete
0ecb9fba6364 checkheads: handle partial obsolescence
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2247
diff changeset
   194
    #     marker and a new is created
2245
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   195
    repo = pushop.repo
2246
fb4ef91f888e checkheads: give up on processing locally unknown changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2245
diff changeset
   196
    unfi = repo.unfiltered()
2256
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   197
    tonode = unfi.changelog.node
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   198
    public = phases.public
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   199
    getphase = unfi._phasecache.phase
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   200
    ispublic = (lambda r: getphase(unfi, r) == public)
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   201
    hasoutmarker = functools.partial(pushingmarkerfor, unfi.obsstore, futurecommon)
2257
7980ca5b1217 checkheads: add a small debug message in case were we give up fast
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2256
diff changeset
   202
    successorsmarkers = unfi.obsstore.successors
2245
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   203
    newhs = set()
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   204
    discarded = set()
2249
0ecb9fba6364 checkheads: handle partial obsolescence
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2247
diff changeset
   205
    # I leave the print in the code because they are so handy at debugging
0ecb9fba6364 checkheads: handle partial obsolescence
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2247
diff changeset
   206
    # and I keep getting back to this piece of code.
0ecb9fba6364 checkheads: handle partial obsolescence
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2247
diff changeset
   207
    #
0ecb9fba6364 checkheads: handle partial obsolescence
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2247
diff changeset
   208
    localcandidate = set()
0ecb9fba6364 checkheads: handle partial obsolescence
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2247
diff changeset
   209
    unknownheads = set()
0ecb9fba6364 checkheads: handle partial obsolescence
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2247
diff changeset
   210
    for h in candidate:
0ecb9fba6364 checkheads: handle partial obsolescence
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2247
diff changeset
   211
        if h in unfi:
0ecb9fba6364 checkheads: handle partial obsolescence
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2247
diff changeset
   212
            localcandidate.add(h)
0ecb9fba6364 checkheads: handle partial obsolescence
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2247
diff changeset
   213
        else:
2257
7980ca5b1217 checkheads: add a small debug message in case were we give up fast
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2256
diff changeset
   214
            if successorsmarkers.get(h) is not None:
7980ca5b1217 checkheads: add a small debug message in case were we give up fast
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2256
diff changeset
   215
                msg = ('checkheads: remote head unknown locally has'
7980ca5b1217 checkheads: add a small debug message in case were we give up fast
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2256
diff changeset
   216
                       ' local marker: %s\n')
7980ca5b1217 checkheads: add a small debug message in case were we give up fast
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2256
diff changeset
   217
                repo.ui.debug(msg % nodemod.hex(h))
2249
0ecb9fba6364 checkheads: handle partial obsolescence
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2247
diff changeset
   218
            unknownheads.add(h)
0ecb9fba6364 checkheads: handle partial obsolescence
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2247
diff changeset
   219
    if len(localcandidate) == 1:
0ecb9fba6364 checkheads: handle partial obsolescence
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2247
diff changeset
   220
        return unknownheads | set(candidate), set()
0ecb9fba6364 checkheads: handle partial obsolescence
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2247
diff changeset
   221
    while localcandidate:
0ecb9fba6364 checkheads: handle partial obsolescence
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2247
diff changeset
   222
        nh = localcandidate.pop()
2256
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   223
        # run this check early to skip the revset on the whole branch
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   224
        if (nh in futurecommon
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   225
                or unfi[nh].phase() <= public):
2246
fb4ef91f888e checkheads: give up on processing locally unknown changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2245
diff changeset
   226
            newhs.add(nh)
fb4ef91f888e checkheads: give up on processing locally unknown changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2245
diff changeset
   227
            continue
2256
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   228
        # XXX there is a corner case if there is a merge in the branch. we
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   229
        # might end up with -more- heads.  However, these heads are not "added"
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   230
        # by the push, but more by the "removal" on the remote so I think is a
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   231
        # okay to ignore them,
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   232
        branchrevs = unfi.revs('only(%n, (%ln+%ln))',
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   233
                               nh, localcandidate, newhs)
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   234
        branchnodes = [tonode(r) for r in branchrevs]
2249
0ecb9fba6364 checkheads: handle partial obsolescence
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2247
diff changeset
   235
2256
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   236
        # The branch will still exist on the remote if
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   237
        # * any part of it is public,
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   238
        # * any part of it is considered part of the result by previous logic,
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   239
        # * if we have no markers to push to obsolete it.
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   240
        if (any(ispublic(r) for r in branchrevs)
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   241
                or any(n in futurecommon for n in branchnodes)
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   242
                or any(not hasoutmarker(n) for n in branchnodes)):
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   243
            newhs.add(nh)
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   244
        else:
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   245
            discarded.add(nh)
2249
0ecb9fba6364 checkheads: handle partial obsolescence
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2247
diff changeset
   246
    newhs |= unknownheads
2245
a14e05e4bb20 checkheads: import our own copy of the checkheads code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   247
    return newhs, discarded
2256
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   248
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   249
def pushingmarkerfor(obsstore, pushset, node):
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   250
    """True if some markers are to be pushed for node
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   251
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   252
    We cannot just look in to the pushed obsmarkers from the pushop because
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   253
    discover might have filtered relevant markers. In addition listing all
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   254
    markers relevant to all changeset in the pushed set would be too expensive.
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   255
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   256
    The is probably some cache opportunity in this function. but it would
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   257
    requires a two dimentions stack.
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   258
    """
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   259
    successorsmarkers = obsstore.successors
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   260
    stack = [node]
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   261
    seen = set(stack)
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   262
    while stack:
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   263
        current = stack.pop()
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   264
        if current in pushset:
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   265
            return True
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   266
        markers = successorsmarkers.get(current, ())
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   267
        # markers fields = ('prec', 'succs', 'flag', 'meta', 'date', 'parents')
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   268
        for m in markers:
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   269
            nexts = m[1] # successors
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   270
            if not nexts: # this is a prune marker
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   271
                nexts = m[5] # parents
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   272
            for n in nexts:
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   273
                if n not in seen:
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   274
                    seen.add(n)
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   275
                    stack.append(n)
7ec214ea5d67 checkheahds: switch algorithm to use pushed markers instead
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2249
diff changeset
   276
    return False