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