mercurial/discovery.py
author Martijn Pieters <mj@octobus.net>
Mon, 21 Jan 2019 16:37:23 +0000
changeset 41566 eb7ce452e0fb
parent 37637 1964d2d1f421
child 42026 98908e36d58a
permissions -rw-r--r--
branchmap: updating triggers a write Rather than separate updating and writing, create a subclass that doesn't write on update. This minimises chances we forget to write out updates somewhere. This also makes refactoring and improving the branchmap functionality easier. Differential Revision: https://phab.mercurial-scm.org/D5636
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
11313
0bb14798cd07 discovery: fix description line
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11301
diff changeset
     1
# discovery.py - protocol changeset discovery functions
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
     2
#
11313
0bb14798cd07 discovery: fix description line
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11301
diff changeset
     3
# Copyright 2010 Matt Mackall <mpm@selenic.com>
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
     4
#
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8210
diff changeset
     5
# This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9954
diff changeset
     6
# GNU General Public License version 2 or any later version.
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
     7
25944
337d010f31e6 discovery: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24702
diff changeset
     8
from __future__ import absolute_import
337d010f31e6 discovery: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24702
diff changeset
     9
32009
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
    10
import functools
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
    11
25944
337d010f31e6 discovery: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24702
diff changeset
    12
from .i18n import _
337d010f31e6 discovery: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24702
diff changeset
    13
from .node import (
32009
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
    14
    hex,
25944
337d010f31e6 discovery: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24702
diff changeset
    15
    nullid,
337d010f31e6 discovery: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24702
diff changeset
    16
    short,
337d010f31e6 discovery: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24702
diff changeset
    17
)
337d010f31e6 discovery: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24702
diff changeset
    18
337d010f31e6 discovery: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24702
diff changeset
    19
from . import (
337d010f31e6 discovery: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24702
diff changeset
    20
    bookmarks,
337d010f31e6 discovery: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24702
diff changeset
    21
    branchmap,
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26585
diff changeset
    22
    error,
25944
337d010f31e6 discovery: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24702
diff changeset
    23
    phases,
35184
bc775b8cc020 scmutil: extra utility to display a reasonable amount of nodes
Boris Feld <boris.feld@octobus.net>
parents: 32792
diff changeset
    24
    scmutil,
25944
337d010f31e6 discovery: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24702
diff changeset
    25
    setdiscovery,
337d010f31e6 discovery: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24702
diff changeset
    26
    treediscovery,
337d010f31e6 discovery: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24702
diff changeset
    27
    util,
337d010f31e6 discovery: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24702
diff changeset
    28
)
8109
496ae1ea4698 switch lock releasing in the core from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8108
diff changeset
    29
35305
483b5dd0f1aa push: restrict common discovery to the pushed set
Boris Feld <boris.feld@octobus.net>
parents: 35184
diff changeset
    30
def findcommonincoming(repo, remote, heads=None, force=False, ancestorsof=None):
14073
72c84f24b420 discovery: drop findoutgoing and simplify findcommonincoming's api
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13742
diff changeset
    31
    """Return a tuple (common, anyincoming, heads) used to identify the common
72c84f24b420 discovery: drop findoutgoing and simplify findcommonincoming's api
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13742
diff changeset
    32
    subset of nodes between repo and remote.
2601
00fc88b0b256 move most of tag code to localrepository class.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2581
diff changeset
    33
14073
72c84f24b420 discovery: drop findoutgoing and simplify findcommonincoming's api
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13742
diff changeset
    34
    "common" is a list of (at least) the heads of the common subset.
72c84f24b420 discovery: drop findoutgoing and simplify findcommonincoming's api
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13742
diff changeset
    35
    "anyincoming" is testable as a boolean indicating if any nodes are missing
72c84f24b420 discovery: drop findoutgoing and simplify findcommonincoming's api
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13742
diff changeset
    36
      locally. If remote does not support getbundle, this actually is a list of
72c84f24b420 discovery: drop findoutgoing and simplify findcommonincoming's api
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13742
diff changeset
    37
      roots of the nodes that would be incoming, to be supplied to
72c84f24b420 discovery: drop findoutgoing and simplify findcommonincoming's api
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13742
diff changeset
    38
      changegroupsubset. No code except for pull should be relying on this fact
72c84f24b420 discovery: drop findoutgoing and simplify findcommonincoming's api
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13742
diff changeset
    39
      any longer.
72c84f24b420 discovery: drop findoutgoing and simplify findcommonincoming's api
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13742
diff changeset
    40
    "heads" is either the supplied heads, or else the remote's heads.
35305
483b5dd0f1aa push: restrict common discovery to the pushed set
Boris Feld <boris.feld@octobus.net>
parents: 35184
diff changeset
    41
    "ancestorsof" if not None, restrict the discovery to a subset defined by
483b5dd0f1aa push: restrict common discovery to the pushed set
Boris Feld <boris.feld@octobus.net>
parents: 35184
diff changeset
    42
      these nodes. Changeset outside of this set won't be considered (and
483b5dd0f1aa push: restrict common discovery to the pushed set
Boris Feld <boris.feld@octobus.net>
parents: 35184
diff changeset
    43
      won't appears in "common")
14164
cb98fed52495 discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14073
diff changeset
    44
17424
e7cfe3587ea4 fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents: 17254
diff changeset
    45
    If you pass heads and they are all known locally, the response lists just
14164
cb98fed52495 discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14073
diff changeset
    46
    these heads in "common" and in "heads".
14213
30273f0c776b discovery: resurrect findoutgoing as findcommonoutgoing for extension hooks
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14184
diff changeset
    47
30273f0c776b discovery: resurrect findoutgoing as findcommonoutgoing for extension hooks
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14184
diff changeset
    48
    Please use findcommonoutgoing to compute the set of outgoing nodes to give
30273f0c776b discovery: resurrect findoutgoing as findcommonoutgoing for extension hooks
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14184
diff changeset
    49
    extensions a good hook into outgoing.
11301
3d0591a66118 move discovery methods from localrepo into new discovery module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11230
diff changeset
    50
    """
14073
72c84f24b420 discovery: drop findoutgoing and simplify findcommonincoming's api
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 13742
diff changeset
    51
14164
cb98fed52495 discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14073
diff changeset
    52
    if not remote.capable('getbundle'):
cb98fed52495 discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14073
diff changeset
    53
        return treediscovery.findcommonincoming(repo, remote, heads, force)
1806
a2c69737e65e Automatic nesting into running transactions in the same repository.
mason@suse.com
parents: 1802
diff changeset
    54
14164
cb98fed52495 discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14073
diff changeset
    55
    if heads:
20225
d2704c48f417 discovery: stop using nodemap for membership testing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 20184
diff changeset
    56
        knownnode = repo.changelog.hasnode # no nodemap until it is filtered
35879
6c1d3779c052 discovery: don't reimplement all()
Martin von Zweigbergk <martinvonz@google.com>
parents: 35849
diff changeset
    57
        if all(knownnode(h) for h in heads):
14164
cb98fed52495 discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14073
diff changeset
    58
            return (heads, False, heads)
8404
a2bc39ade36b commit: move 'nothing changed' test into commit()
Matt Mackall <mpm@selenic.com>
parents: 8403
diff changeset
    59
36715
613954a17a25 setdiscovery: back out changeset 5cfdf6137af8 (issue5809)
Martin von Zweigbergk <martinvonz@google.com>
parents: 35879
diff changeset
    60
    res = setdiscovery.findcommonheads(repo.ui, repo, remote,
35305
483b5dd0f1aa push: restrict common discovery to the pushed set
Boris Feld <boris.feld@octobus.net>
parents: 35184
diff changeset
    61
                                       abortwhenunrelated=not force,
483b5dd0f1aa push: restrict common discovery to the pushed set
Boris Feld <boris.feld@octobus.net>
parents: 35184
diff changeset
    62
                                       ancestorsof=ancestorsof)
14164
cb98fed52495 discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14073
diff changeset
    63
    common, anyinc, srvheads = res
cb98fed52495 discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14073
diff changeset
    64
    return (list(common), anyinc, heads or list(srvheads))
11301
3d0591a66118 move discovery methods from localrepo into new discovery module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11230
diff changeset
    65
15837
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
    66
class outgoing(object):
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
    67
    '''Represents the set of nodes present in a local repo but not in a
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
    68
    (possibly) remote one.
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
    69
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
    70
    Members:
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
    71
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
    72
      missing is a list of all nodes present in local but not in remote.
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
    73
      common is a list of all nodes shared between the two repos.
15838
7299e09a85a2 phases: make outgoing object and discovery aware of exclusion
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15837
diff changeset
    74
      excluded is the list of missing changeset that shouldn't be sent remotely.
15837
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
    75
      missingheads is the list of heads of missing.
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
    76
      commonheads is the list of heads of common.
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
    77
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
    78
    The sets are computed on demand from the heads, unless provided upfront
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
    79
    by discovery.'''
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
    80
29806
82e8c86cdd6d outgoing: add a 'missingroots' argument
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29805
diff changeset
    81
    def __init__(self, repo, commonheads=None, missingheads=None,
82e8c86cdd6d outgoing: add a 'missingroots' argument
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29805
diff changeset
    82
                 missingroots=None):
82e8c86cdd6d outgoing: add a 'missingroots' argument
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29805
diff changeset
    83
        # at least one of them must not be set
82e8c86cdd6d outgoing: add a 'missingroots' argument
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29805
diff changeset
    84
        assert None in (commonheads, missingroots)
29805
f09d0004481c outgoing: adds some default value for argument
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29804
diff changeset
    85
        cl = repo.changelog
29901
4d1e6f91f1c7 discovery: explicitly check for None in outgoing init
Ryan McElroy <rmcelroy@fb.com>
parents: 29806
diff changeset
    86
        if missingheads is None:
29805
f09d0004481c outgoing: adds some default value for argument
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29804
diff changeset
    87
            missingheads = cl.heads()
29806
82e8c86cdd6d outgoing: add a 'missingroots' argument
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29805
diff changeset
    88
        if missingroots:
82e8c86cdd6d outgoing: add a 'missingroots' argument
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29805
diff changeset
    89
            discbases = []
82e8c86cdd6d outgoing: add a 'missingroots' argument
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29805
diff changeset
    90
            for n in missingroots:
82e8c86cdd6d outgoing: add a 'missingroots' argument
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29805
diff changeset
    91
                discbases.extend([p for p in cl.parents(n) if p != nullid])
82e8c86cdd6d outgoing: add a 'missingroots' argument
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29805
diff changeset
    92
            # TODO remove call to nodesbetween.
82e8c86cdd6d outgoing: add a 'missingroots' argument
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29805
diff changeset
    93
            # TODO populate attributes on outgoing instance instead of setting
82e8c86cdd6d outgoing: add a 'missingroots' argument
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29805
diff changeset
    94
            # discbases.
82e8c86cdd6d outgoing: add a 'missingroots' argument
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29805
diff changeset
    95
            csets, roots, heads = cl.nodesbetween(missingroots, missingheads)
82e8c86cdd6d outgoing: add a 'missingroots' argument
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29805
diff changeset
    96
            included = set(csets)
82e8c86cdd6d outgoing: add a 'missingroots' argument
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29805
diff changeset
    97
            missingheads = heads
82e8c86cdd6d outgoing: add a 'missingroots' argument
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29805
diff changeset
    98
            commonheads = [n for n in discbases if n not in included]
82e8c86cdd6d outgoing: add a 'missingroots' argument
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29805
diff changeset
    99
        elif not commonheads:
29805
f09d0004481c outgoing: adds some default value for argument
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29804
diff changeset
   100
            commonheads = [nullid]
15837
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
   101
        self.commonheads = commonheads
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
   102
        self.missingheads = missingheads
29805
f09d0004481c outgoing: adds some default value for argument
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29804
diff changeset
   103
        self._revlog = cl
15837
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
   104
        self._common = None
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
   105
        self._missing = None
15838
7299e09a85a2 phases: make outgoing object and discovery aware of exclusion
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15837
diff changeset
   106
        self.excluded = []
15837
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
   107
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
   108
    def _computecommonmissing(self):
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
   109
        sets = self._revlog.findcommonmissing(self.commonheads,
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
   110
                                              self.missingheads)
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
   111
        self._common, self._missing = sets
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
   112
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
   113
    @util.propertycache
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
   114
    def common(self):
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
   115
        if self._common is None:
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
   116
            self._computecommonmissing()
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
   117
        return self._common
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
   118
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
   119
    @util.propertycache
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
   120
    def missing(self):
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
   121
        if self._missing is None:
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
   122
            self._computecommonmissing()
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
   123
        return self._missing
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
   124
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16657
diff changeset
   125
def findcommonoutgoing(repo, other, onlyheads=None, force=False,
16746
9acb5cd19162 merge with stable
Matt Mackall <mpm@selenic.com>
parents: 16683 16736
diff changeset
   126
                       commoninc=None, portable=False):
15837
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
   127
    '''Return an outgoing instance to identify the nodes present in repo but
cd956049fc14 discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15713
diff changeset
   128
    not in other.
14213
30273f0c776b discovery: resurrect findoutgoing as findcommonoutgoing for extension hooks
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14184
diff changeset
   129
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16657
diff changeset
   130
    If onlyheads is given, only nodes ancestral to nodes in onlyheads
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16657
diff changeset
   131
    (inclusive) are included. If you already know the local repo's heads,
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16657
diff changeset
   132
    passing them in onlyheads is faster than letting them be recomputed here.
14213
30273f0c776b discovery: resurrect findoutgoing as findcommonoutgoing for extension hooks
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14184
diff changeset
   133
17251
98166640b356 help: fix some instances of 'the the'
Mads Kiilerich <mads@kiilerich.com>
parents: 17248
diff changeset
   134
    If commoninc is given, it must be the result of a prior call to
16736
025b3b763ba9 bundle: make bundles more portable (isue3441)
Sune Foldager <cryo@cyanite.org>
parents: 16535
diff changeset
   135
    findcommonincoming(repo, other, force) to avoid recomputing it here.
025b3b763ba9 bundle: make bundles more portable (isue3441)
Sune Foldager <cryo@cyanite.org>
parents: 16535
diff changeset
   136
025b3b763ba9 bundle: make bundles more portable (isue3441)
Sune Foldager <cryo@cyanite.org>
parents: 16535
diff changeset
   137
    If portable is given, compute more conservative common and missingheads,
025b3b763ba9 bundle: make bundles more portable (isue3441)
Sune Foldager <cryo@cyanite.org>
parents: 16535
diff changeset
   138
    to make bundles created from the instance more portable.'''
15838
7299e09a85a2 phases: make outgoing object and discovery aware of exclusion
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15837
diff changeset
   139
    # declare an empty outgoing object to be filled later
29804
7b9157aa752f outgoing: pass a repo object to the constructor
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29690
diff changeset
   140
    og = outgoing(repo, None, None)
15838
7299e09a85a2 phases: make outgoing object and discovery aware of exclusion
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15837
diff changeset
   141
7299e09a85a2 phases: make outgoing object and discovery aware of exclusion
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15837
diff changeset
   142
    # get common set if not provided
7299e09a85a2 phases: make outgoing object and discovery aware of exclusion
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15837
diff changeset
   143
    if commoninc is None:
35305
483b5dd0f1aa push: restrict common discovery to the pushed set
Boris Feld <boris.feld@octobus.net>
parents: 35184
diff changeset
   144
        commoninc = findcommonincoming(repo, other, force=force,
483b5dd0f1aa push: restrict common discovery to the pushed set
Boris Feld <boris.feld@octobus.net>
parents: 35184
diff changeset
   145
                                       ancestorsof=onlyheads)
15838
7299e09a85a2 phases: make outgoing object and discovery aware of exclusion
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15837
diff changeset
   146
    og.commonheads, _any, _hds = commoninc
7299e09a85a2 phases: make outgoing object and discovery aware of exclusion
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15837
diff changeset
   147
7299e09a85a2 phases: make outgoing object and discovery aware of exclusion
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15837
diff changeset
   148
    # compute outgoing
17206
70ebb4bd8083 obsolete: do not exchange extinct changesets
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17205
diff changeset
   149
    mayexclude = (repo._phasecache.phaseroots[phases.secret] or repo.obsstore)
70ebb4bd8083 obsolete: do not exchange extinct changesets
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17205
diff changeset
   150
    if not mayexclude:
15838
7299e09a85a2 phases: make outgoing object and discovery aware of exclusion
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15837
diff changeset
   151
        og.missingheads = onlyheads or repo.heads()
7299e09a85a2 phases: make outgoing object and discovery aware of exclusion
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15837
diff changeset
   152
    elif onlyheads is None:
7299e09a85a2 phases: make outgoing object and discovery aware of exclusion
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15837
diff changeset
   153
        # use visible heads as it should be cached
18382
f3b21beb9802 filtering: rename filters to their antonyms
Kevin Bullock <kbullock@ringworld.org>
parents: 18361
diff changeset
   154
        og.missingheads = repo.filtered("served").heads()
17248
6ffb35b2284c discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents: 17214
diff changeset
   155
        og.excluded = [ctx.node() for ctx in repo.set('secret() or extinct()')]
15838
7299e09a85a2 phases: make outgoing object and discovery aware of exclusion
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15837
diff changeset
   156
    else:
7299e09a85a2 phases: make outgoing object and discovery aware of exclusion
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15837
diff changeset
   157
        # compute common, missing and exclude secret stuff
7299e09a85a2 phases: make outgoing object and discovery aware of exclusion
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15837
diff changeset
   158
        sets = repo.changelog.findcommonmissing(og.commonheads, onlyheads)
7299e09a85a2 phases: make outgoing object and discovery aware of exclusion
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15837
diff changeset
   159
        og._common, allmissing = sets
7299e09a85a2 phases: make outgoing object and discovery aware of exclusion
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15837
diff changeset
   160
        og._missing = missing = []
15951
bd84fc0b5f64 phases: properly register excluded changeset when revision are specified
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15932
diff changeset
   161
        og.excluded = excluded = []
15838
7299e09a85a2 phases: make outgoing object and discovery aware of exclusion
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15837
diff changeset
   162
        for node in allmissing:
17206
70ebb4bd8083 obsolete: do not exchange extinct changesets
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17205
diff changeset
   163
            ctx = repo[node]
17248
6ffb35b2284c discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents: 17214
diff changeset
   164
            if ctx.phase() >= phases.secret or ctx.extinct():
6ffb35b2284c discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents: 17214
diff changeset
   165
                excluded.append(node)
6ffb35b2284c discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents: 17214
diff changeset
   166
            else:
6ffb35b2284c discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents: 17214
diff changeset
   167
                missing.append(node)
17206
70ebb4bd8083 obsolete: do not exchange extinct changesets
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17205
diff changeset
   168
        if len(missing) == len(allmissing):
70ebb4bd8083 obsolete: do not exchange extinct changesets
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17205
diff changeset
   169
            missingheads = onlyheads
70ebb4bd8083 obsolete: do not exchange extinct changesets
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17205
diff changeset
   170
        else: # update missing heads
15955
5a14f48d6b9a discovery: ensure that missingheads are always heads of everything we tried
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15951
diff changeset
   171
            missingheads = phases.newheads(repo, onlyheads, excluded)
15838
7299e09a85a2 phases: make outgoing object and discovery aware of exclusion
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15837
diff changeset
   172
        og.missingheads = missingheads
16736
025b3b763ba9 bundle: make bundles more portable (isue3441)
Sune Foldager <cryo@cyanite.org>
parents: 16535
diff changeset
   173
    if portable:
025b3b763ba9 bundle: make bundles more portable (isue3441)
Sune Foldager <cryo@cyanite.org>
parents: 16535
diff changeset
   174
        # recompute common and missingheads as if -r<rev> had been given for
025b3b763ba9 bundle: make bundles more portable (isue3441)
Sune Foldager <cryo@cyanite.org>
parents: 16535
diff changeset
   175
        # each head of missing, and --base <rev> for each head of the proper
025b3b763ba9 bundle: make bundles more portable (isue3441)
Sune Foldager <cryo@cyanite.org>
parents: 16535
diff changeset
   176
        # ancestors of missing
025b3b763ba9 bundle: make bundles more portable (isue3441)
Sune Foldager <cryo@cyanite.org>
parents: 16535
diff changeset
   177
        og._computecommonmissing()
025b3b763ba9 bundle: make bundles more portable (isue3441)
Sune Foldager <cryo@cyanite.org>
parents: 16535
diff changeset
   178
        cl = repo.changelog
025b3b763ba9 bundle: make bundles more portable (isue3441)
Sune Foldager <cryo@cyanite.org>
parents: 16535
diff changeset
   179
        missingrevs = set(cl.rev(n) for n in og._missing)
16866
91f3ac205816 revlog: ancestors(*revs) becomes ancestors(revs) (API)
Bryan O'Sullivan <bryano@fb.com>
parents: 16835
diff changeset
   180
        og._common = set(cl.ancestors(missingrevs)) - missingrevs
16736
025b3b763ba9 bundle: make bundles more portable (isue3441)
Sune Foldager <cryo@cyanite.org>
parents: 16535
diff changeset
   181
        commonheads = set(og.commonheads)
025b3b763ba9 bundle: make bundles more portable (isue3441)
Sune Foldager <cryo@cyanite.org>
parents: 16535
diff changeset
   182
        og.missingheads = [h for h in og.missingheads if h not in commonheads]
025b3b763ba9 bundle: make bundles more portable (isue3441)
Sune Foldager <cryo@cyanite.org>
parents: 16535
diff changeset
   183
15838
7299e09a85a2 phases: make outgoing object and discovery aware of exclusion
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15837
diff changeset
   184
    return og
14213
30273f0c776b discovery: resurrect findoutgoing as findcommonoutgoing for extension hooks
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14184
diff changeset
   185
32706
993f58db2045 headssummary: directly feed the function with the 'pushop' object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32705
diff changeset
   186
def _headssummary(pushop):
17209
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   187
    """compute a summary of branch and heads status before and after push
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   188
32708
90cb4ec8df64 headsummary: expose the 'discardedheads' set in the headssummary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32707
diff changeset
   189
    return {'branch': ([remoteheads], [newheads],
90cb4ec8df64 headsummary: expose the 'discardedheads' set in the headssummary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32707
diff changeset
   190
                       [unsyncedheads], [discardedheads])} mapping
17211
4f321eecbf8d checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17209
diff changeset
   191
32708
90cb4ec8df64 headsummary: expose the 'discardedheads' set in the headssummary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32707
diff changeset
   192
    - branch: the branch name,
17211
4f321eecbf8d checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17209
diff changeset
   193
    - remoteheads: the list of remote heads known locally
32708
90cb4ec8df64 headsummary: expose the 'discardedheads' set in the headssummary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32707
diff changeset
   194
                   None if the branch is new,
90cb4ec8df64 headsummary: expose the 'discardedheads' set in the headssummary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32707
diff changeset
   195
    - newheads: the new remote heads (known locally) with outgoing pushed,
90cb4ec8df64 headsummary: expose the 'discardedheads' set in the headssummary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32707
diff changeset
   196
    - unsyncedheads: the list of remote heads unknown locally,
90cb4ec8df64 headsummary: expose the 'discardedheads' set in the headssummary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32707
diff changeset
   197
    - discardedheads: the list of heads made obsolete by the push.
17209
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   198
    """
32706
993f58db2045 headssummary: directly feed the function with the 'pushop' object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32705
diff changeset
   199
    repo = pushop.repo.unfiltered()
993f58db2045 headssummary: directly feed the function with the 'pushop' object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32705
diff changeset
   200
    remote = pushop.remote
993f58db2045 headssummary: directly feed the function with the 'pushop' object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32705
diff changeset
   201
    outgoing = pushop.outgoing
17209
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   202
    cl = repo.changelog
17211
4f321eecbf8d checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17209
diff changeset
   203
    headssum = {}
17209
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   204
    # A. Create set of branches involved in the push.
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   205
    branches = set(repo[n].branch() for n in outgoing.missing)
37637
1964d2d1f421 discovery: use command executor interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37636
diff changeset
   206
1964d2d1f421 discovery: use command executor interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37636
diff changeset
   207
    with remote.commandexecutor() as e:
1964d2d1f421 discovery: use command executor interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37636
diff changeset
   208
        remotemap = e.callcommand('branchmap', {}).result()
1964d2d1f421 discovery: use command executor interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37636
diff changeset
   209
17209
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   210
    newbranches = branches - set(remotemap)
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   211
    branches.difference_update(newbranches)
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   212
17211
4f321eecbf8d checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17209
diff changeset
   213
    # A. register remote heads
4f321eecbf8d checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17209
diff changeset
   214
    remotebranches = set()
37636
330ada7e8ea5 discovery: don't redundantly call branchmap
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37451
diff changeset
   215
    for branch, heads in remotemap.iteritems():
17211
4f321eecbf8d checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17209
diff changeset
   216
        remotebranches.add(branch)
4f321eecbf8d checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17209
diff changeset
   217
        known = []
4f321eecbf8d checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17209
diff changeset
   218
        unsynced = []
20225
d2704c48f417 discovery: stop using nodemap for membership testing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 20184
diff changeset
   219
        knownnode = cl.hasnode # do not use nodemap until it is filtered
17211
4f321eecbf8d checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17209
diff changeset
   220
        for h in heads:
20225
d2704c48f417 discovery: stop using nodemap for membership testing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 20184
diff changeset
   221
            if knownnode(h):
17211
4f321eecbf8d checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17209
diff changeset
   222
                known.append(h)
4f321eecbf8d checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17209
diff changeset
   223
            else:
4f321eecbf8d checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17209
diff changeset
   224
                unsynced.append(h)
4f321eecbf8d checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17209
diff changeset
   225
        headssum[branch] = (known, list(known), unsynced)
4f321eecbf8d checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17209
diff changeset
   226
    # B. add new branch data
4f321eecbf8d checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17209
diff changeset
   227
    missingctx = list(repo[n] for n in outgoing.missing)
4f321eecbf8d checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17209
diff changeset
   228
    touchedbranches = set()
4f321eecbf8d checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17209
diff changeset
   229
    for ctx in missingctx:
4f321eecbf8d checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17209
diff changeset
   230
        branch = ctx.branch()
4f321eecbf8d checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17209
diff changeset
   231
        touchedbranches.add(branch)
4f321eecbf8d checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17209
diff changeset
   232
        if branch not in headssum:
4f321eecbf8d checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17209
diff changeset
   233
            headssum[branch] = (None, [], [])
17209
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   234
17211
4f321eecbf8d checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17209
diff changeset
   235
    # C drop data about untouched branches:
4f321eecbf8d checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17209
diff changeset
   236
    for branch in remotebranches - touchedbranches:
4f321eecbf8d checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17209
diff changeset
   237
        del headssum[branch]
17209
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   238
17211
4f321eecbf8d checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17209
diff changeset
   239
    # D. Update newmap with outgoing changes.
17209
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   240
    # This will possibly add new heads and remove existing ones.
41566
eb7ce452e0fb branchmap: updating triggers a write
Martijn Pieters <mj@octobus.net>
parents: 37637
diff changeset
   241
    newmap = branchmap.remotebranchcache((branch, heads[1])
18124
79db6d40bced branchmap: store branchcache in a dedicated object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18120
diff changeset
   242
                                 for branch, heads in headssum.iteritems()
79db6d40bced branchmap: store branchcache in a dedicated object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18120
diff changeset
   243
                                 if heads[0] is not None)
18305
2502a15e033d branchmap: pass revision insteads of changectx to the update function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18284
diff changeset
   244
    newmap.update(repo, (ctx.rev() for ctx in missingctx))
17211
4f321eecbf8d checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17209
diff changeset
   245
    for branch, newheads in newmap.iteritems():
4f321eecbf8d checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17209
diff changeset
   246
        headssum[branch][1][:] = newheads
32672
315d74d0f059 headssummary: ensure all returned lists are sorted
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32671
diff changeset
   247
    for branch, items in headssum.iteritems():
315d74d0f059 headssummary: ensure all returned lists are sorted
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32671
diff changeset
   248
        for l in items:
315d74d0f059 headssummary: ensure all returned lists are sorted
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32671
diff changeset
   249
            if l is not None:
315d74d0f059 headssummary: ensure all returned lists are sorted
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32671
diff changeset
   250
                l.sort()
32708
90cb4ec8df64 headsummary: expose the 'discardedheads' set in the headssummary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32707
diff changeset
   251
        headssum[branch] = items + ([],)
90cb4ec8df64 headsummary: expose the 'discardedheads' set in the headssummary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32707
diff changeset
   252
32707
32c8f98aebf4 checkheads: perform obsolescence post processing directly in _headssummary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32706
diff changeset
   253
    # If there are no obsstore, no post processing are needed.
32c8f98aebf4 checkheads: perform obsolescence post processing directly in _headssummary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32706
diff changeset
   254
    if repo.obsstore:
32791
1cb14923dee9 checkheads: use "revnum" in the "allfuturecommon" set
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32790
diff changeset
   255
        torev = repo.changelog.rev
32792
4374e88e808c checkheads: use a "lazyancestors" object for allfuturecommon
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32791
diff changeset
   256
        futureheads = set(torev(h) for h in outgoing.missingheads)
4374e88e808c checkheads: use a "lazyancestors" object for allfuturecommon
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32791
diff changeset
   257
        futureheads |= set(torev(h) for h in outgoing.commonheads)
4374e88e808c checkheads: use a "lazyancestors" object for allfuturecommon
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32791
diff changeset
   258
        allfuturecommon = repo.changelog.ancestors(futureheads, inclusive=True)
32707
32c8f98aebf4 checkheads: perform obsolescence post processing directly in _headssummary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32706
diff changeset
   259
        for branch, heads in sorted(headssum.iteritems()):
32708
90cb4ec8df64 headsummary: expose the 'discardedheads' set in the headssummary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32707
diff changeset
   260
            remoteheads, newheads, unsyncedheads, placeholder = heads
32707
32c8f98aebf4 checkheads: perform obsolescence post processing directly in _headssummary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32706
diff changeset
   261
            result = _postprocessobsolete(pushop, allfuturecommon, newheads)
32708
90cb4ec8df64 headsummary: expose the 'discardedheads' set in the headssummary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32707
diff changeset
   262
            headssum[branch] = (remoteheads, sorted(result[0]), unsyncedheads,
90cb4ec8df64 headsummary: expose the 'discardedheads' set in the headssummary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32707
diff changeset
   263
                                sorted(result[1]))
17211
4f321eecbf8d checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17209
diff changeset
   264
    return headssum
17209
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   265
17211
4f321eecbf8d checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17209
diff changeset
   266
def _oldheadssummary(repo, remoteheads, outgoing, inc=False):
17209
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   267
    """Compute branchmapsummary for repo without branchmap support"""
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   268
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   269
    # 1-4b. old servers: Check for new topological heads.
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   270
    # Construct {old,new}map with branch = None (topological branch).
18120
88990d3e3d75 branchmap: extract _updatebranchcache from repo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18104
diff changeset
   271
    # (code based on update)
20225
d2704c48f417 discovery: stop using nodemap for membership testing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 20184
diff changeset
   272
    knownnode = repo.changelog.hasnode # no nodemap until it is filtered
32672
315d74d0f059 headssummary: ensure all returned lists are sorted
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32671
diff changeset
   273
    oldheads = sorted(h for h in remoteheads if knownnode(h))
17209
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   274
    # all nodes in outgoing.missing are children of either:
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   275
    # - an element of oldheads
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   276
    # - another element of outgoing.missing
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   277
    # - nullrev
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   278
    # This explains why the new head are very simple to compute.
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   279
    r = repo.set('heads(%ln + %ln)', oldheads, outgoing.missing)
32672
315d74d0f059 headssummary: ensure all returned lists are sorted
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32671
diff changeset
   280
    newheads = sorted(c.node() for c in r)
22178
70383c6961b4 discovery: prevent crash on unknown remote heads with old repo (issue4337)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21580
diff changeset
   281
    # set some unsynced head to issue the "unsynced changes" warning
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22178
diff changeset
   282
    if inc:
32671
81cbfaea1e0f discovery: also use lists for the returns of '_oldheadssummary'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32331
diff changeset
   283
        unsynced = [None]
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22178
diff changeset
   284
    else:
32671
81cbfaea1e0f discovery: also use lists for the returns of '_oldheadssummary'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32331
diff changeset
   285
        unsynced = []
32708
90cb4ec8df64 headsummary: expose the 'discardedheads' set in the headssummary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32707
diff changeset
   286
    return {None: (oldheads, newheads, unsynced, [])}
17209
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   287
26936
d47ac02fcefa discovery: pass pushop to _nowarnheads
Ryan McElroy <rmcelroy@fb.com>
parents: 26935
diff changeset
   288
def _nowarnheads(pushop):
26862
894f54d84d4a discovery: factor out calculation of heads to not warn about
Ryan McElroy <rmcelroy@fb.com>
parents: 26819
diff changeset
   289
    # Compute newly pushed bookmarks. We don't warn about bookmarked heads.
26936
d47ac02fcefa discovery: pass pushop to _nowarnheads
Ryan McElroy <rmcelroy@fb.com>
parents: 26935
diff changeset
   290
    repo = pushop.repo.unfiltered()
d47ac02fcefa discovery: pass pushop to _nowarnheads
Ryan McElroy <rmcelroy@fb.com>
parents: 26935
diff changeset
   291
    remote = pushop.remote
26862
894f54d84d4a discovery: factor out calculation of heads to not warn about
Ryan McElroy <rmcelroy@fb.com>
parents: 26819
diff changeset
   292
    localbookmarks = repo._bookmarks
37637
1964d2d1f421 discovery: use command executor interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37636
diff changeset
   293
1964d2d1f421 discovery: use command executor interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37636
diff changeset
   294
    with remote.commandexecutor() as e:
1964d2d1f421 discovery: use command executor interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37636
diff changeset
   295
        remotebookmarks = e.callcommand('listkeys', {
1964d2d1f421 discovery: use command executor interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37636
diff changeset
   296
            'namespace': 'bookmarks',
1964d2d1f421 discovery: use command executor interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37636
diff changeset
   297
        }).result()
1964d2d1f421 discovery: use command executor interface
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37636
diff changeset
   298
26862
894f54d84d4a discovery: factor out calculation of heads to not warn about
Ryan McElroy <rmcelroy@fb.com>
parents: 26819
diff changeset
   299
    bookmarkedheads = set()
29229
89bba2beb03e bookmarks: allow pushing active bookmark on new remote head (issue5236)
liscju <piotr.listkiewicz@gmail.com>
parents: 26936
diff changeset
   300
89bba2beb03e bookmarks: allow pushing active bookmark on new remote head (issue5236)
liscju <piotr.listkiewicz@gmail.com>
parents: 26936
diff changeset
   301
    # internal config: bookmarks.pushing
89bba2beb03e bookmarks: allow pushing active bookmark on new remote head (issue5236)
liscju <piotr.listkiewicz@gmail.com>
parents: 26936
diff changeset
   302
    newbookmarks = [localbookmarks.expandname(b)
89bba2beb03e bookmarks: allow pushing active bookmark on new remote head (issue5236)
liscju <piotr.listkiewicz@gmail.com>
parents: 26936
diff changeset
   303
                    for b in pushop.ui.configlist('bookmarks', 'pushing')]
89bba2beb03e bookmarks: allow pushing active bookmark on new remote head (issue5236)
liscju <piotr.listkiewicz@gmail.com>
parents: 26936
diff changeset
   304
26862
894f54d84d4a discovery: factor out calculation of heads to not warn about
Ryan McElroy <rmcelroy@fb.com>
parents: 26819
diff changeset
   305
    for bm in localbookmarks:
894f54d84d4a discovery: factor out calculation of heads to not warn about
Ryan McElroy <rmcelroy@fb.com>
parents: 26819
diff changeset
   306
        rnode = remotebookmarks.get(bm)
894f54d84d4a discovery: factor out calculation of heads to not warn about
Ryan McElroy <rmcelroy@fb.com>
parents: 26819
diff changeset
   307
        if rnode and rnode in repo:
37451
444ed53f93df discovery: look up bookmarks only among bookmarks
Martin von Zweigbergk <martinvonz@google.com>
parents: 36715
diff changeset
   308
            lctx, rctx = localbookmarks.changectx(bm), repo[rnode]
26862
894f54d84d4a discovery: factor out calculation of heads to not warn about
Ryan McElroy <rmcelroy@fb.com>
parents: 26819
diff changeset
   309
            if bookmarks.validdest(repo, rctx, lctx):
894f54d84d4a discovery: factor out calculation of heads to not warn about
Ryan McElroy <rmcelroy@fb.com>
parents: 26819
diff changeset
   310
                bookmarkedheads.add(lctx.node())
894f54d84d4a discovery: factor out calculation of heads to not warn about
Ryan McElroy <rmcelroy@fb.com>
parents: 26819
diff changeset
   311
        else:
894f54d84d4a discovery: factor out calculation of heads to not warn about
Ryan McElroy <rmcelroy@fb.com>
parents: 26819
diff changeset
   312
            if bm in newbookmarks and bm not in remotebookmarks:
37451
444ed53f93df discovery: look up bookmarks only among bookmarks
Martin von Zweigbergk <martinvonz@google.com>
parents: 36715
diff changeset
   313
                bookmarkedheads.add(localbookmarks[bm])
26862
894f54d84d4a discovery: factor out calculation of heads to not warn about
Ryan McElroy <rmcelroy@fb.com>
parents: 26819
diff changeset
   314
894f54d84d4a discovery: factor out calculation of heads to not warn about
Ryan McElroy <rmcelroy@fb.com>
parents: 26819
diff changeset
   315
    return bookmarkedheads
894f54d84d4a discovery: factor out calculation of heads to not warn about
Ryan McElroy <rmcelroy@fb.com>
parents: 26819
diff changeset
   316
26935
c4a7bbc78c74 exchange: pass pushop to discovery.checkheads
Ryan McElroy <rmcelroy@fb.com>
parents: 26862
diff changeset
   317
def checkheads(pushop):
15932
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15893
diff changeset
   318
    """Check that a push won't add any outgoing head
3684
975c2469c316 correct remote heads test in prepush
Matt Mackall <mpm@selenic.com>
parents: 3682
diff changeset
   319
15932
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15893
diff changeset
   320
    raise Abort error and display ui message as needed.
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15893
diff changeset
   321
    """
26935
c4a7bbc78c74 exchange: pass pushop to discovery.checkheads
Ryan McElroy <rmcelroy@fb.com>
parents: 26862
diff changeset
   322
c4a7bbc78c74 exchange: pass pushop to discovery.checkheads
Ryan McElroy <rmcelroy@fb.com>
parents: 26862
diff changeset
   323
    repo = pushop.repo.unfiltered()
c4a7bbc78c74 exchange: pass pushop to discovery.checkheads
Ryan McElroy <rmcelroy@fb.com>
parents: 26862
diff changeset
   324
    remote = pushop.remote
c4a7bbc78c74 exchange: pass pushop to discovery.checkheads
Ryan McElroy <rmcelroy@fb.com>
parents: 26862
diff changeset
   325
    outgoing = pushop.outgoing
c4a7bbc78c74 exchange: pass pushop to discovery.checkheads
Ryan McElroy <rmcelroy@fb.com>
parents: 26862
diff changeset
   326
    remoteheads = pushop.remoteheads
c4a7bbc78c74 exchange: pass pushop to discovery.checkheads
Ryan McElroy <rmcelroy@fb.com>
parents: 26862
diff changeset
   327
    newbranch = pushop.newbranch
c4a7bbc78c74 exchange: pass pushop to discovery.checkheads
Ryan McElroy <rmcelroy@fb.com>
parents: 26862
diff changeset
   328
    inc = bool(pushop.incoming)
c4a7bbc78c74 exchange: pass pushop to discovery.checkheads
Ryan McElroy <rmcelroy@fb.com>
parents: 26862
diff changeset
   329
17209
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   330
    # Check for each named branch if we're creating new remote heads.
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   331
    # To be a remote head after push, node must be either:
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   332
    # - unknown locally
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   333
    # - a local outgoing head descended from update
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   334
    # - a remote head that's known locally and not
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   335
    #   ancestral to an outgoing head
15932
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15893
diff changeset
   336
    if remoteheads == [nullid]:
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15893
diff changeset
   337
        # remote is empty, nothing to check.
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15893
diff changeset
   338
        return
2439
e8c4f3d3df8c extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2424
diff changeset
   339
15932
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15893
diff changeset
   340
    if remote.capable('branchmap'):
32706
993f58db2045 headssummary: directly feed the function with the 'pushop' object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32705
diff changeset
   341
        headssum = _headssummary(pushop)
17209
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   342
    else:
17211
4f321eecbf8d checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17209
diff changeset
   343
        headssum = _oldheadssummary(repo, remoteheads, outgoing, inc)
32709
16ada4cbb1a9 push: add a way to allow concurrent pushes on unrelated heads
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32708
diff changeset
   344
    pushop.pushbranchmap = headssum
17211
4f321eecbf8d checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17209
diff changeset
   345
    newbranches = [branch for branch, heads in headssum.iteritems()
4f321eecbf8d checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17209
diff changeset
   346
                   if heads[0] is None]
17209
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   347
    # 1. Check for new branches on the remote.
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   348
    if newbranches and not newbranch:  # new branch requires --new-branch
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   349
        branchnames = ', '.join(sorted(newbranches))
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26585
diff changeset
   350
        raise error.Abort(_("push creates new remote branches: %s!")
17209
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   351
                           % branchnames,
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   352
                         hint=_("use 'hg push --new-branch' to create"
5cd3e526ac37 checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17206
diff changeset
   353
                                " new remote branches"))
1466
b6d9ea0bc107 Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents: 1464
diff changeset
   354
26862
894f54d84d4a discovery: factor out calculation of heads to not warn about
Ryan McElroy <rmcelroy@fb.com>
parents: 26819
diff changeset
   355
    # 2. Find heads that we need not warn about
26936
d47ac02fcefa discovery: pass pushop to _nowarnheads
Ryan McElroy <rmcelroy@fb.com>
parents: 26935
diff changeset
   356
    nowarnheads = _nowarnheads(pushop)
17212
246131d670c2 checkheads: extract bookmark computation from the branch loop
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17211
diff changeset
   357
246131d670c2 checkheads: extract bookmark computation from the branch loop
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17211
diff changeset
   358
    # 3. Check for new heads.
15932
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15893
diff changeset
   359
    # If there are more heads after the push than before, a suitable
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15893
diff changeset
   360
    # error message, depending on unsynced status, is displayed.
26585
b38d93735a4f discovery: rename 'error' to 'errormsg'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25944
diff changeset
   361
    errormsg = None
18361
06f075836010 discovery: process heads in sorted order
Mads Kiilerich <mads@kiilerich.com>
parents: 18305
diff changeset
   362
    for branch, heads in sorted(headssum.iteritems()):
32708
90cb4ec8df64 headsummary: expose the 'discardedheads' set in the headssummary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32707
diff changeset
   363
        remoteheads, newheads, unsyncedheads, discardedheads = heads
17214
738ad56dd8a6 checkheads: take future obsoleted heads into account
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17212
diff changeset
   364
        # add unsynced data
20381
fff0a71f8177 discovery: cleanup of variable names and comments
Mads Kiilerich <madski@unity3d.com>
parents: 20225
diff changeset
   365
        if remoteheads is None:
19840
b00ba31313c3 discovery: abort also when pushing multiple headed new branch
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18382
diff changeset
   366
            oldhs = set()
b00ba31313c3 discovery: abort also when pushing multiple headed new branch
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18382
diff changeset
   367
        else:
20381
fff0a71f8177 discovery: cleanup of variable names and comments
Mads Kiilerich <madski@unity3d.com>
parents: 20225
diff changeset
   368
            oldhs = set(remoteheads)
fff0a71f8177 discovery: cleanup of variable names and comments
Mads Kiilerich <madski@unity3d.com>
parents: 20225
diff changeset
   369
        oldhs.update(unsyncedheads)
fff0a71f8177 discovery: cleanup of variable names and comments
Mads Kiilerich <madski@unity3d.com>
parents: 20225
diff changeset
   370
        dhs = None # delta heads, the new heads on branch
32675
fc9296c15112 checkheads: simplify the code around obsolescence post-processing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32674
diff changeset
   371
        newhs = set(newheads)
32673
bd966b9f3274 checkheads: clarify that we no longer touch the head unknown locally
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32672
diff changeset
   372
        newhs.update(unsyncedheads)
32674
7a7c4f3afb98 checkheads: drop now unused filtering of 'unsyncedheads'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32673
diff changeset
   373
        if unsyncedheads:
7a7c4f3afb98 checkheads: drop now unused filtering of 'unsyncedheads'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32673
diff changeset
   374
            if None in unsyncedheads:
22178
70383c6961b4 discovery: prevent crash on unknown remote heads with old repo (issue4337)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21580
diff changeset
   375
                # old remote, no heads data
70383c6961b4 discovery: prevent crash on unknown remote heads with old repo (issue4337)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21580
diff changeset
   376
                heads = None
21198
56a04085c23c discovery: don't report all "unsynced" remote heads (issue4230)
Mads Kiilerich <madski@unity3d.com>
parents: 20502
diff changeset
   377
            else:
35184
bc775b8cc020 scmutil: extra utility to display a reasonable amount of nodes
Boris Feld <boris.feld@octobus.net>
parents: 32792
diff changeset
   378
                heads = scmutil.nodesummaries(repo, unsyncedheads)
22178
70383c6961b4 discovery: prevent crash on unknown remote heads with old repo (issue4337)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21580
diff changeset
   379
            if heads is None:
70383c6961b4 discovery: prevent crash on unknown remote heads with old repo (issue4337)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21580
diff changeset
   380
                repo.ui.status(_("remote has heads that are "
70383c6961b4 discovery: prevent crash on unknown remote heads with old repo (issue4337)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21580
diff changeset
   381
                                 "not known locally\n"))
70383c6961b4 discovery: prevent crash on unknown remote heads with old repo (issue4337)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21580
diff changeset
   382
            elif branch is None:
20502
7648e9aef6ee discovery: make "note: unsynced remote changes!" less serious than a warning
Mads Kiilerich <madski@unity3d.com>
parents: 20501
diff changeset
   383
                repo.ui.status(_("remote has heads that are "
7648e9aef6ee discovery: make "note: unsynced remote changes!" less serious than a warning
Mads Kiilerich <madski@unity3d.com>
parents: 20501
diff changeset
   384
                                 "not known locally: %s\n") % heads)
20501
8a9e0b523d2d discovery: improve "note: unsynced remote changes!" warning
Mads Kiilerich <madski@unity3d.com>
parents: 20403
diff changeset
   385
            else:
20502
7648e9aef6ee discovery: make "note: unsynced remote changes!" less serious than a warning
Mads Kiilerich <madski@unity3d.com>
parents: 20501
diff changeset
   386
                repo.ui.status(_("remote has heads on branch '%s' that are "
7648e9aef6ee discovery: make "note: unsynced remote changes!" less serious than a warning
Mads Kiilerich <madski@unity3d.com>
parents: 20501
diff changeset
   387
                                 "not known locally: %s\n") % (branch, heads))
20381
fff0a71f8177 discovery: cleanup of variable names and comments
Mads Kiilerich <madski@unity3d.com>
parents: 20225
diff changeset
   388
        if remoteheads is None:
fff0a71f8177 discovery: cleanup of variable names and comments
Mads Kiilerich <madski@unity3d.com>
parents: 20225
diff changeset
   389
            if len(newhs) > 1:
19840
b00ba31313c3 discovery: abort also when pushing multiple headed new branch
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18382
diff changeset
   390
                dhs = list(newhs)
26585
b38d93735a4f discovery: rename 'error' to 'errormsg'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25944
diff changeset
   391
                if errormsg is None:
b38d93735a4f discovery: rename 'error' to 'errormsg'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25944
diff changeset
   392
                    errormsg = (_("push creates new branch '%s' "
b38d93735a4f discovery: rename 'error' to 'errormsg'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25944
diff changeset
   393
                                  "with multiple heads") % (branch))
19840
b00ba31313c3 discovery: abort also when pushing multiple headed new branch
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18382
diff changeset
   394
                    hint = _("merge or"
29973
4ddb05751b12 discovery: use single quotes in use warning
timeless <timeless@mozdev.org>
parents: 29901
diff changeset
   395
                             " see 'hg help push' for details about"
19840
b00ba31313c3 discovery: abort also when pushing multiple headed new branch
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18382
diff changeset
   396
                             " pushing new heads")
b00ba31313c3 discovery: abort also when pushing multiple headed new branch
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18382
diff changeset
   397
        elif len(newhs) > len(oldhs):
20381
fff0a71f8177 discovery: cleanup of variable names and comments
Mads Kiilerich <madski@unity3d.com>
parents: 20225
diff changeset
   398
            # remove bookmarked or existing remote heads from the new heads list
26862
894f54d84d4a discovery: factor out calculation of heads to not warn about
Ryan McElroy <rmcelroy@fb.com>
parents: 26819
diff changeset
   399
            dhs = sorted(newhs - nowarnheads - oldhs)
16835
4267c840c481 bookmarks: allow existing remote bookmarks to become heads when pushing
Levi Bard <levi@unity3d.com>
parents: 16746
diff changeset
   400
        if dhs:
26585
b38d93735a4f discovery: rename 'error' to 'errormsg'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25944
diff changeset
   401
            if errormsg is None:
15932
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15893
diff changeset
   402
                if branch not in ('default', None):
26585
b38d93735a4f discovery: rename 'error' to 'errormsg'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25944
diff changeset
   403
                    errormsg = _("push creates new remote head %s "
b38d93735a4f discovery: rename 'error' to 'errormsg'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25944
diff changeset
   404
                                 "on branch '%s'!") % (short(dhs[0]), branch)
21580
32601b0b74c0 discovery: if a push would create a new head, mention the bookmark name if any
Stephen Lee <sphen.lee@gmail.com>
parents: 21198
diff changeset
   405
                elif repo[dhs[0]].bookmarks():
26585
b38d93735a4f discovery: rename 'error' to 'errormsg'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25944
diff changeset
   406
                    errormsg = _("push creates new remote head %s "
b38d93735a4f discovery: rename 'error' to 'errormsg'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25944
diff changeset
   407
                                 "with bookmark '%s'!") % (
b38d93735a4f discovery: rename 'error' to 'errormsg'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25944
diff changeset
   408
                                 short(dhs[0]), repo[dhs[0]].bookmarks()[0])
15932
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15893
diff changeset
   409
                else:
26585
b38d93735a4f discovery: rename 'error' to 'errormsg'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25944
diff changeset
   410
                    errormsg = _("push creates new remote head %s!"
b38d93735a4f discovery: rename 'error' to 'errormsg'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25944
diff changeset
   411
                                 ) % short(dhs[0])
20381
fff0a71f8177 discovery: cleanup of variable names and comments
Mads Kiilerich <madski@unity3d.com>
parents: 20225
diff changeset
   412
                if unsyncedheads:
19934
bfc6ed892349 push: hide description about "-f" in the hint to prevent from using it easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19840
diff changeset
   413
                    hint = _("pull and merge or"
29973
4ddb05751b12 discovery: use single quotes in use warning
timeless <timeless@mozdev.org>
parents: 29901
diff changeset
   414
                             " see 'hg help push' for details about"
19934
bfc6ed892349 push: hide description about "-f" in the hint to prevent from using it easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19840
diff changeset
   415
                             " pushing new heads")
15932
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15893
diff changeset
   416
                else:
19934
bfc6ed892349 push: hide description about "-f" in the hint to prevent from using it easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19840
diff changeset
   417
                    hint = _("merge or"
29973
4ddb05751b12 discovery: use single quotes in use warning
timeless <timeless@mozdev.org>
parents: 29901
diff changeset
   418
                             " see 'hg help push' for details about"
19934
bfc6ed892349 push: hide description about "-f" in the hint to prevent from using it easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19840
diff changeset
   419
                             " pushing new heads")
20051
b988b3b19303 discovery: make note messages for new heads more readable
Mads Kiilerich <madski@unity3d.com>
parents: 20050
diff changeset
   420
            if branch is None:
b988b3b19303 discovery: make note messages for new heads more readable
Mads Kiilerich <madski@unity3d.com>
parents: 20050
diff changeset
   421
                repo.ui.note(_("new remote heads:\n"))
b988b3b19303 discovery: make note messages for new heads more readable
Mads Kiilerich <madski@unity3d.com>
parents: 20050
diff changeset
   422
            else:
b988b3b19303 discovery: make note messages for new heads more readable
Mads Kiilerich <madski@unity3d.com>
parents: 20050
diff changeset
   423
                repo.ui.note(_("new remote heads on branch '%s':\n") % branch)
15932
4154338f0bc0 discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15893
diff changeset
   424
            for h in dhs:
20051
b988b3b19303 discovery: make note messages for new heads more readable
Mads Kiilerich <madski@unity3d.com>
parents: 20050
diff changeset
   425
                repo.ui.note((" %s\n") % short(h))
26585
b38d93735a4f discovery: rename 'error' to 'errormsg'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25944
diff changeset
   426
    if errormsg:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26585
diff changeset
   427
        raise error.Abort(errormsg, hint=hint)
31586
df82f375fa00 checkheads: extract obsolete post processing in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29973
diff changeset
   428
df82f375fa00 checkheads: extract obsolete post processing in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29973
diff changeset
   429
def _postprocessobsolete(pushop, futurecommon, candidate_newhs):
df82f375fa00 checkheads: extract obsolete post processing in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29973
diff changeset
   430
    """post process the list of new heads with obsolescence information
df82f375fa00 checkheads: extract obsolete post processing in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29973
diff changeset
   431
32009
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   432
    Exists as a sub-function to contain the complexity and allow extensions to
31586
df82f375fa00 checkheads: extract obsolete post processing in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29973
diff changeset
   433
    experiment with smarter logic.
32009
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   434
31586
df82f375fa00 checkheads: extract obsolete post processing in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29973
diff changeset
   435
    Returns (newheads, discarded_heads) tuple
df82f375fa00 checkheads: extract obsolete post processing in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29973
diff changeset
   436
    """
32009
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   437
    # known issue
31586
df82f375fa00 checkheads: extract obsolete post processing in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29973
diff changeset
   438
    #
32009
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   439
    # * We "silently" skip processing on all changeset unknown locally
31586
df82f375fa00 checkheads: extract obsolete post processing in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29973
diff changeset
   440
    #
32009
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   441
    # * if <nh> is public on the remote, it won't be affected by obsolete
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   442
    #     marker and a new is created
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   443
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   444
    # define various utilities and containers
31586
df82f375fa00 checkheads: extract obsolete post processing in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29973
diff changeset
   445
    repo = pushop.repo
32009
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   446
    unfi = repo.unfiltered()
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   447
    tonode = unfi.changelog.node
32790
d4b5468719da checkheads: use 'nodemap.get' to convert nodes to revs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32789
diff changeset
   448
    torev = unfi.changelog.nodemap.get
32009
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   449
    public = phases.public
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   450
    getphase = unfi._phasecache.phase
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   451
    ispublic = (lambda r: getphase(unfi, r) == public)
32791
1cb14923dee9 checkheads: use "revnum" in the "allfuturecommon" set
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32790
diff changeset
   452
    ispushed = (lambda n: torev(n) in futurecommon)
32789
443e8543a125 checkheads: pass "ispushed" function to the obsmarkers logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32709
diff changeset
   453
    hasoutmarker = functools.partial(pushingmarkerfor, unfi.obsstore, ispushed)
32009
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   454
    successorsmarkers = unfi.obsstore.successors
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   455
    newhs = set() # final set of new heads
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   456
    discarded = set() # new head of fully replaced branch
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   457
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   458
    localcandidate = set() # candidate heads known locally
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   459
    unknownheads = set() # candidate heads unknown locally
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   460
    for h in candidate_newhs:
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   461
        if h in unfi:
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   462
            localcandidate.add(h)
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   463
        else:
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   464
            if successorsmarkers.get(h) is not None:
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   465
                msg = ('checkheads: remote head unknown locally has'
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   466
                       ' local marker: %s\n')
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   467
                repo.ui.debug(msg % hex(h))
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   468
            unknownheads.add(h)
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   469
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   470
    # fast path the simple case
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   471
    if len(localcandidate) == 1:
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   472
        return unknownheads | set(candidate_newhs), set()
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   473
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   474
    # actually process branch replacement
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   475
    while localcandidate:
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   476
        nh = localcandidate.pop()
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   477
        # run this check early to skip the evaluation of the whole branch
32791
1cb14923dee9 checkheads: use "revnum" in the "allfuturecommon" set
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32790
diff changeset
   478
        if (torev(nh) in futurecommon or ispublic(torev(nh))):
32009
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   479
            newhs.add(nh)
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   480
            continue
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   481
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   482
        # Get all revs/nodes on the branch exclusive to this head
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   483
        # (already filtered heads are "ignored"))
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   484
        branchrevs = unfi.revs('only(%n, (%ln+%ln))',
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   485
                               nh, localcandidate, newhs)
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   486
        branchnodes = [tonode(r) for r in branchrevs]
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   487
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   488
        # The branch won't be hidden on the remote if
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   489
        # * any part of it is public,
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   490
        # * any part of it is considered part of the result by previous logic,
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   491
        # * if we have no markers to push to obsolete it.
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   492
        if (any(ispublic(r) for r in branchrevs)
32791
1cb14923dee9 checkheads: use "revnum" in the "allfuturecommon" set
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32790
diff changeset
   493
                or any(torev(n) in futurecommon for n in branchnodes)
32009
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   494
                or any(not hasoutmarker(n) for n in branchnodes)):
31586
df82f375fa00 checkheads: extract obsolete post processing in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29973
diff changeset
   495
            newhs.add(nh)
df82f375fa00 checkheads: extract obsolete post processing in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29973
diff changeset
   496
        else:
32009
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   497
            # note: there is a corner case if there is a merge in the branch.
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   498
            # we might end up with -more- heads.  However, these heads are not
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   499
            # "added" by the push, but more by the "removal" on the remote so I
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   500
            # think is a okay to ignore them,
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   501
            discarded.add(nh)
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   502
    newhs |= unknownheads
31586
df82f375fa00 checkheads: extract obsolete post processing in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29973
diff changeset
   503
    return newhs, discarded
32009
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   504
32789
443e8543a125 checkheads: pass "ispushed" function to the obsmarkers logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32709
diff changeset
   505
def pushingmarkerfor(obsstore, ispushed, node):
32009
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   506
    """true if some markers are to be pushed for node
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   507
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   508
    We cannot just look in to the pushed obsmarkers from the pushop because
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   509
    discovery might have filtered relevant markers. In addition listing all
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   510
    markers relevant to all changesets in the pushed set would be too expensive
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   511
    (O(len(repo)))
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   512
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   513
    (note: There are cache opportunity in this function. but it would requires
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   514
    a two dimensional stack.)
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   515
    """
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   516
    successorsmarkers = obsstore.successors
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   517
    stack = [node]
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   518
    seen = set(stack)
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   519
    while stack:
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   520
        current = stack.pop()
32789
443e8543a125 checkheads: pass "ispushed" function to the obsmarkers logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32709
diff changeset
   521
        if ispushed(current):
32009
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   522
            return True
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   523
        markers = successorsmarkers.get(current, ())
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   524
        # markers fields = ('prec', 'succs', 'flag', 'meta', 'date', 'parents')
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   525
        for m in markers:
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   526
            nexts = m[1] # successors
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   527
            if not nexts: # this is a prune marker
32095
c52728b383b4 discovery: prevent crash caused by prune marker having no parent data
Yuya Nishihara <yuya@tcha.org>
parents: 32009
diff changeset
   528
                nexts = m[5] or () # parents
32009
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   529
            for n in nexts:
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   530
                if n not in seen:
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   531
                    seen.add(n)
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   532
                    stack.append(n)
c6cb21ddf74a checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31586
diff changeset
   533
    return False