Mercurial > hg
annotate mercurial/discovery.py @ 35616:706aa203b396
fileset: add a lightweight file filtering language
This patch was inspired by one that Jun Wu authored for the fb-experimental
repo, to avoid using matcher for efficiency[1]. We want a way to specify what
files will be converted to LFS at commit time. And per discussion, we also want
to specify what files to skip, text diff, or merge in another config option.
The current `lfs.threshold` config option could not satisfy complex needs. I'm
putting it in a core package because Augie floated the idea of also using it for
narrow and sparse.
Yuya suggested farming out to fileset.parse(), which added support for more
symbols. The only fileset element not supported here is 'negate'. (List isn't
supported by filesets either.) I also changed the 'always' token to the 'all()'
predicate for consistency, and introduced 'none()' to improve readability in a
future tracked file based config. The extension operator was changed from '.'
to '**', to match how recursive path globs are specified. Finally, I changed
the path matcher from '/' to 'path:' at Yuya's suggestion, for consistency with
matcher. Unfortunately, ':' is currently reserved in filesets, so this has to
be quoted to be processed as a string instead of a symbol[2]. We should
probably revisit that, because it's seriously ugly. But it's only used by an
experimental extension, and I think using a file based config for LFS may drive
some more tweaks, so I'm settling for this for now.
I reserved all of the glob characters in fileset except '.' and '_' for the
extension test because those are likely valid extension characters.
Sample filter settings:
all() # everything
size(">20MB") # larger than 20MB
!**.txt # except for .txt files
**.zip | **.tar.gz | **.7z # some types of compressed files
"path:bin" # files under "bin" in the project root
[1] https://www.mercurial-scm.org/pipermail/mercurial-devel/2017-December/109387.html
[2] https://www.mercurial-scm.org/pipermail/mercurial-devel/2018-January/109729.html
author | Matt Harbison <matt_harbison@yahoo.com> |
---|---|
date | Wed, 10 Jan 2018 22:23:34 -0500 |
parents | 483b5dd0f1aa |
children | 5cfdf6137af8 |
rev | line source |
---|---|
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 | 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: |
cb98fed52495
discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14073
diff
changeset
|
56 allknown = True |
20225
d2704c48f417
discovery: stop using nodemap for membership testing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20184
diff
changeset
|
57 knownnode = repo.changelog.hasnode # no nodemap until it is filtered |
14164
cb98fed52495
discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14073
diff
changeset
|
58 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
|
59 if not knownnode(h): |
14164
cb98fed52495
discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14073
diff
changeset
|
60 allknown = False |
cb98fed52495
discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14073
diff
changeset
|
61 break |
cb98fed52495
discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14073
diff
changeset
|
62 if allknown: |
cb98fed52495
discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14073
diff
changeset
|
63 return (heads, False, heads) |
8404
a2bc39ade36b
commit: move 'nothing changed' test into commit()
Matt Mackall <mpm@selenic.com>
parents:
8403
diff
changeset
|
64 |
14164
cb98fed52495
discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14073
diff
changeset
|
65 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
|
66 abortwhenunrelated=not force, |
483b5dd0f1aa
push: restrict common discovery to the pushed set
Boris Feld <boris.feld@octobus.net>
parents:
35184
diff
changeset
|
67 ancestorsof=ancestorsof) |
14164
cb98fed52495
discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14073
diff
changeset
|
68 common, anyinc, srvheads = res |
cb98fed52495
discovery: add new set-based discovery
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14073
diff
changeset
|
69 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
|
70 |
15837
cd956049fc14
discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15713
diff
changeset
|
71 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
|
72 '''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
|
73 (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
|
74 |
cd956049fc14
discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15713
diff
changeset
|
75 Members: |
cd956049fc14
discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15713
diff
changeset
|
76 |
cd956049fc14
discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15713
diff
changeset
|
77 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
|
78 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
|
79 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
|
80 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
|
81 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
|
82 |
cd956049fc14
discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15713
diff
changeset
|
83 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
|
84 by discovery.''' |
cd956049fc14
discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15713
diff
changeset
|
85 |
29806
82e8c86cdd6d
outgoing: add a 'missingroots' argument
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29805
diff
changeset
|
86 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
|
87 missingroots=None): |
82e8c86cdd6d
outgoing: add a 'missingroots' argument
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29805
diff
changeset
|
88 # 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
|
89 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
|
90 cl = repo.changelog |
29901
4d1e6f91f1c7
discovery: explicitly check for None in outgoing init
Ryan McElroy <rmcelroy@fb.com>
parents:
29806
diff
changeset
|
91 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
|
92 missingheads = cl.heads() |
29806
82e8c86cdd6d
outgoing: add a 'missingroots' argument
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29805
diff
changeset
|
93 if missingroots: |
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 for n in missingroots: |
82e8c86cdd6d
outgoing: add a 'missingroots' argument
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29805
diff
changeset
|
96 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
|
97 # TODO remove call to nodesbetween. |
82e8c86cdd6d
outgoing: add a 'missingroots' argument
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29805
diff
changeset
|
98 # 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
|
99 # discbases. |
82e8c86cdd6d
outgoing: add a 'missingroots' argument
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29805
diff
changeset
|
100 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
|
101 included = set(csets) |
82e8c86cdd6d
outgoing: add a 'missingroots' argument
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29805
diff
changeset
|
102 missingheads = heads |
82e8c86cdd6d
outgoing: add a 'missingroots' argument
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29805
diff
changeset
|
103 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
|
104 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
|
105 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
|
106 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
|
107 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
|
108 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
|
109 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
|
110 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
|
111 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
|
112 |
cd956049fc14
discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15713
diff
changeset
|
113 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
|
114 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
|
115 self.missingheads) |
cd956049fc14
discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15713
diff
changeset
|
116 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
|
117 |
cd956049fc14
discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15713
diff
changeset
|
118 @util.propertycache |
cd956049fc14
discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15713
diff
changeset
|
119 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
|
120 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
|
121 self._computecommonmissing() |
cd956049fc14
discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15713
diff
changeset
|
122 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
|
123 |
cd956049fc14
discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15713
diff
changeset
|
124 @util.propertycache |
cd956049fc14
discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15713
diff
changeset
|
125 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
|
126 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
|
127 self._computecommonmissing() |
cd956049fc14
discovery: introduce outgoing object for result of findcommonoutgoing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15713
diff
changeset
|
128 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
|
129 |
16683 | 130 def findcommonoutgoing(repo, other, onlyheads=None, force=False, |
16746 | 131 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
|
132 '''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
|
133 not in other. |
14213
30273f0c776b
discovery: resurrect findoutgoing as findcommonoutgoing for extension hooks
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14184
diff
changeset
|
134 |
16683 | 135 If onlyheads is given, only nodes ancestral to nodes in onlyheads |
136 (inclusive) are included. If you already know the local repo's heads, | |
137 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
|
138 |
17251
98166640b356
help: fix some instances of 'the the'
Mads Kiilerich <mads@kiilerich.com>
parents:
17248
diff
changeset
|
139 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
|
140 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
|
141 |
025b3b763ba9
bundle: make bundles more portable (isue3441)
Sune Foldager <cryo@cyanite.org>
parents:
16535
diff
changeset
|
142 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
|
143 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
|
144 # 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
|
145 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
|
146 |
7299e09a85a2
phases: make outgoing object and discovery aware of exclusion
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15837
diff
changeset
|
147 # 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
|
148 if commoninc is None: |
35305
483b5dd0f1aa
push: restrict common discovery to the pushed set
Boris Feld <boris.feld@octobus.net>
parents:
35184
diff
changeset
|
149 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
|
150 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
|
151 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
|
152 |
7299e09a85a2
phases: make outgoing object and discovery aware of exclusion
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15837
diff
changeset
|
153 # compute outgoing |
17206
70ebb4bd8083
obsolete: do not exchange extinct changesets
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17205
diff
changeset
|
154 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
|
155 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
|
156 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
|
157 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
|
158 # 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
|
159 og.missingheads = repo.filtered("served").heads() |
17248
6ffb35b2284c
discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents:
17214
diff
changeset
|
160 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
|
161 else: |
7299e09a85a2
phases: make outgoing object and discovery aware of exclusion
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15837
diff
changeset
|
162 # 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
|
163 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
|
164 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
|
165 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
|
166 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
|
167 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
|
168 ctx = repo[node] |
17248
6ffb35b2284c
discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents:
17214
diff
changeset
|
169 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
|
170 excluded.append(node) |
6ffb35b2284c
discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents:
17214
diff
changeset
|
171 else: |
6ffb35b2284c
discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents:
17214
diff
changeset
|
172 missing.append(node) |
17206
70ebb4bd8083
obsolete: do not exchange extinct changesets
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17205
diff
changeset
|
173 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
|
174 missingheads = onlyheads |
70ebb4bd8083
obsolete: do not exchange extinct changesets
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17205
diff
changeset
|
175 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
|
176 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
|
177 og.missingheads = missingheads |
16736
025b3b763ba9
bundle: make bundles more portable (isue3441)
Sune Foldager <cryo@cyanite.org>
parents:
16535
diff
changeset
|
178 if portable: |
025b3b763ba9
bundle: make bundles more portable (isue3441)
Sune Foldager <cryo@cyanite.org>
parents:
16535
diff
changeset
|
179 # 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
|
180 # 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
|
181 # ancestors of missing |
025b3b763ba9
bundle: make bundles more portable (isue3441)
Sune Foldager <cryo@cyanite.org>
parents:
16535
diff
changeset
|
182 og._computecommonmissing() |
025b3b763ba9
bundle: make bundles more portable (isue3441)
Sune Foldager <cryo@cyanite.org>
parents:
16535
diff
changeset
|
183 cl = repo.changelog |
025b3b763ba9
bundle: make bundles more portable (isue3441)
Sune Foldager <cryo@cyanite.org>
parents:
16535
diff
changeset
|
184 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
|
185 og._common = set(cl.ancestors(missingrevs)) - missingrevs |
16736
025b3b763ba9
bundle: make bundles more portable (isue3441)
Sune Foldager <cryo@cyanite.org>
parents:
16535
diff
changeset
|
186 commonheads = set(og.commonheads) |
025b3b763ba9
bundle: make bundles more portable (isue3441)
Sune Foldager <cryo@cyanite.org>
parents:
16535
diff
changeset
|
187 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
|
188 |
15838
7299e09a85a2
phases: make outgoing object and discovery aware of exclusion
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15837
diff
changeset
|
189 return og |
14213
30273f0c776b
discovery: resurrect findoutgoing as findcommonoutgoing for extension hooks
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14184
diff
changeset
|
190 |
32706
993f58db2045
headssummary: directly feed the function with the 'pushop' object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32705
diff
changeset
|
191 def _headssummary(pushop): |
17209
5cd3e526ac37
checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17206
diff
changeset
|
192 """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
|
193 |
32708
90cb4ec8df64
headsummary: expose the 'discardedheads' set in the headssummary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32707
diff
changeset
|
194 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
|
195 [unsyncedheads], [discardedheads])} mapping |
17211
4f321eecbf8d
checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17209
diff
changeset
|
196 |
32708
90cb4ec8df64
headsummary: expose the 'discardedheads' set in the headssummary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32707
diff
changeset
|
197 - 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
|
198 - 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
|
199 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
|
200 - 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
|
201 - 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
|
202 - 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
|
203 """ |
32706
993f58db2045
headssummary: directly feed the function with the 'pushop' object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32705
diff
changeset
|
204 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
|
205 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
|
206 outgoing = pushop.outgoing |
17209
5cd3e526ac37
checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17206
diff
changeset
|
207 cl = repo.changelog |
17211
4f321eecbf8d
checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17209
diff
changeset
|
208 headssum = {} |
17209
5cd3e526ac37
checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17206
diff
changeset
|
209 # 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
|
210 branches = set(repo[n].branch() for n in outgoing.missing) |
5cd3e526ac37
checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17206
diff
changeset
|
211 remotemap = remote.branchmap() |
5cd3e526ac37
checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17206
diff
changeset
|
212 newbranches = branches - set(remotemap) |
5cd3e526ac37
checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17206
diff
changeset
|
213 branches.difference_update(newbranches) |
5cd3e526ac37
checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17206
diff
changeset
|
214 |
17211
4f321eecbf8d
checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17209
diff
changeset
|
215 # A. register remote heads |
4f321eecbf8d
checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17209
diff
changeset
|
216 remotebranches = set() |
4f321eecbf8d
checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17209
diff
changeset
|
217 for branch, heads in remote.branchmap().iteritems(): |
4f321eecbf8d
checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17209
diff
changeset
|
218 remotebranches.add(branch) |
4f321eecbf8d
checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17209
diff
changeset
|
219 known = [] |
4f321eecbf8d
checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17209
diff
changeset
|
220 unsynced = [] |
20225
d2704c48f417
discovery: stop using nodemap for membership testing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
20184
diff
changeset
|
221 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
|
222 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
|
223 if knownnode(h): |
17211
4f321eecbf8d
checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17209
diff
changeset
|
224 known.append(h) |
4f321eecbf8d
checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17209
diff
changeset
|
225 else: |
4f321eecbf8d
checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17209
diff
changeset
|
226 unsynced.append(h) |
4f321eecbf8d
checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17209
diff
changeset
|
227 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
|
228 # 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
|
229 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
|
230 touchedbranches = set() |
4f321eecbf8d
checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17209
diff
changeset
|
231 for ctx in missingctx: |
4f321eecbf8d
checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17209
diff
changeset
|
232 branch = ctx.branch() |
4f321eecbf8d
checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17209
diff
changeset
|
233 touchedbranches.add(branch) |
4f321eecbf8d
checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17209
diff
changeset
|
234 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
|
235 headssum[branch] = (None, [], []) |
17209
5cd3e526ac37
checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17206
diff
changeset
|
236 |
17211
4f321eecbf8d
checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17209
diff
changeset
|
237 # 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
|
238 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
|
239 del headssum[branch] |
17209
5cd3e526ac37
checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17206
diff
changeset
|
240 |
17211
4f321eecbf8d
checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17209
diff
changeset
|
241 # D. Update newmap with outgoing changes. |
17209
5cd3e526ac37
checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17206
diff
changeset
|
242 # This will possibly add new heads and remove existing ones. |
18124
79db6d40bced
branchmap: store branchcache in a dedicated object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18120
diff
changeset
|
243 newmap = branchmap.branchcache((branch, heads[1]) |
79db6d40bced
branchmap: store branchcache in a dedicated object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18120
diff
changeset
|
244 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
|
245 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
|
246 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
|
247 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
|
248 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
|
249 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
|
250 for l in items: |
315d74d0f059
headssummary: ensure all returned lists are sorted
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32671
diff
changeset
|
251 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
|
252 l.sort() |
32708
90cb4ec8df64
headsummary: expose the 'discardedheads' set in the headssummary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32707
diff
changeset
|
253 headssum[branch] = items + ([],) |
90cb4ec8df64
headsummary: expose the 'discardedheads' set in the headssummary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32707
diff
changeset
|
254 |
32707
32c8f98aebf4
checkheads: perform obsolescence post processing directly in _headssummary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32706
diff
changeset
|
255 # 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
|
256 if repo.obsstore: |
32791
1cb14923dee9
checkheads: use "revnum" in the "allfuturecommon" set
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32790
diff
changeset
|
257 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
|
258 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
|
259 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
|
260 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
|
261 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
|
262 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
|
263 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
|
264 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
|
265 sorted(result[1])) |
17211
4f321eecbf8d
checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17209
diff
changeset
|
266 return headssum |
17209
5cd3e526ac37
checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17206
diff
changeset
|
267 |
17211
4f321eecbf8d
checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17209
diff
changeset
|
268 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
|
269 """Compute branchmapsummary for repo without branchmap support""" |
5cd3e526ac37
checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17206
diff
changeset
|
270 |
5cd3e526ac37
checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17206
diff
changeset
|
271 # 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
|
272 # 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
|
273 # (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
|
274 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
|
275 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
|
276 # 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
|
277 # - an element of oldheads |
5cd3e526ac37
checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17206
diff
changeset
|
278 # - another element of outgoing.missing |
5cd3e526ac37
checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17206
diff
changeset
|
279 # - nullrev |
5cd3e526ac37
checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17206
diff
changeset
|
280 # 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
|
281 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
|
282 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
|
283 # 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
|
284 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
|
285 unsynced = [None] |
24306
6ddc86eedc3b
style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
22178
diff
changeset
|
286 else: |
32671
81cbfaea1e0f
discovery: also use lists for the returns of '_oldheadssummary'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32331
diff
changeset
|
287 unsynced = [] |
32708
90cb4ec8df64
headsummary: expose the 'discardedheads' set in the headssummary
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32707
diff
changeset
|
288 return {None: (oldheads, newheads, unsynced, [])} |
17209
5cd3e526ac37
checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17206
diff
changeset
|
289 |
26936
d47ac02fcefa
discovery: pass pushop to _nowarnheads
Ryan McElroy <rmcelroy@fb.com>
parents:
26935
diff
changeset
|
290 def _nowarnheads(pushop): |
26862
894f54d84d4a
discovery: factor out calculation of heads to not warn about
Ryan McElroy <rmcelroy@fb.com>
parents:
26819
diff
changeset
|
291 # 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
|
292 repo = pushop.repo.unfiltered() |
d47ac02fcefa
discovery: pass pushop to _nowarnheads
Ryan McElroy <rmcelroy@fb.com>
parents:
26935
diff
changeset
|
293 remote = pushop.remote |
26862
894f54d84d4a
discovery: factor out calculation of heads to not warn about
Ryan McElroy <rmcelroy@fb.com>
parents:
26819
diff
changeset
|
294 localbookmarks = repo._bookmarks |
894f54d84d4a
discovery: factor out calculation of heads to not warn about
Ryan McElroy <rmcelroy@fb.com>
parents:
26819
diff
changeset
|
295 remotebookmarks = remote.listkeys('bookmarks') |
894f54d84d4a
discovery: factor out calculation of heads to not warn about
Ryan McElroy <rmcelroy@fb.com>
parents:
26819
diff
changeset
|
296 bookmarkedheads = set() |
29229
89bba2beb03e
bookmarks: allow pushing active bookmark on new remote head (issue5236)
liscju <piotr.listkiewicz@gmail.com>
parents:
26936
diff
changeset
|
297 |
89bba2beb03e
bookmarks: allow pushing active bookmark on new remote head (issue5236)
liscju <piotr.listkiewicz@gmail.com>
parents:
26936
diff
changeset
|
298 # internal config: bookmarks.pushing |
89bba2beb03e
bookmarks: allow pushing active bookmark on new remote head (issue5236)
liscju <piotr.listkiewicz@gmail.com>
parents:
26936
diff
changeset
|
299 newbookmarks = [localbookmarks.expandname(b) |
89bba2beb03e
bookmarks: allow pushing active bookmark on new remote head (issue5236)
liscju <piotr.listkiewicz@gmail.com>
parents:
26936
diff
changeset
|
300 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
|
301 |
26862
894f54d84d4a
discovery: factor out calculation of heads to not warn about
Ryan McElroy <rmcelroy@fb.com>
parents:
26819
diff
changeset
|
302 for bm in localbookmarks: |
894f54d84d4a
discovery: factor out calculation of heads to not warn about
Ryan McElroy <rmcelroy@fb.com>
parents:
26819
diff
changeset
|
303 rnode = remotebookmarks.get(bm) |
894f54d84d4a
discovery: factor out calculation of heads to not warn about
Ryan McElroy <rmcelroy@fb.com>
parents:
26819
diff
changeset
|
304 if rnode and rnode in repo: |
894f54d84d4a
discovery: factor out calculation of heads to not warn about
Ryan McElroy <rmcelroy@fb.com>
parents:
26819
diff
changeset
|
305 lctx, rctx = repo[bm], repo[rnode] |
894f54d84d4a
discovery: factor out calculation of heads to not warn about
Ryan McElroy <rmcelroy@fb.com>
parents:
26819
diff
changeset
|
306 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
|
307 bookmarkedheads.add(lctx.node()) |
894f54d84d4a
discovery: factor out calculation of heads to not warn about
Ryan McElroy <rmcelroy@fb.com>
parents:
26819
diff
changeset
|
308 else: |
894f54d84d4a
discovery: factor out calculation of heads to not warn about
Ryan McElroy <rmcelroy@fb.com>
parents:
26819
diff
changeset
|
309 if bm in newbookmarks and bm not in remotebookmarks: |
894f54d84d4a
discovery: factor out calculation of heads to not warn about
Ryan McElroy <rmcelroy@fb.com>
parents:
26819
diff
changeset
|
310 bookmarkedheads.add(repo[bm].node()) |
894f54d84d4a
discovery: factor out calculation of heads to not warn about
Ryan McElroy <rmcelroy@fb.com>
parents:
26819
diff
changeset
|
311 |
894f54d84d4a
discovery: factor out calculation of heads to not warn about
Ryan McElroy <rmcelroy@fb.com>
parents:
26819
diff
changeset
|
312 return bookmarkedheads |
894f54d84d4a
discovery: factor out calculation of heads to not warn about
Ryan McElroy <rmcelroy@fb.com>
parents:
26819
diff
changeset
|
313 |
26935
c4a7bbc78c74
exchange: pass pushop to discovery.checkheads
Ryan McElroy <rmcelroy@fb.com>
parents:
26862
diff
changeset
|
314 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
|
315 """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
|
316 |
15932
4154338f0bc0
discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
15893
diff
changeset
|
317 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
|
318 """ |
26935
c4a7bbc78c74
exchange: pass pushop to discovery.checkheads
Ryan McElroy <rmcelroy@fb.com>
parents:
26862
diff
changeset
|
319 |
c4a7bbc78c74
exchange: pass pushop to discovery.checkheads
Ryan McElroy <rmcelroy@fb.com>
parents:
26862
diff
changeset
|
320 repo = pushop.repo.unfiltered() |
c4a7bbc78c74
exchange: pass pushop to discovery.checkheads
Ryan McElroy <rmcelroy@fb.com>
parents:
26862
diff
changeset
|
321 remote = pushop.remote |
c4a7bbc78c74
exchange: pass pushop to discovery.checkheads
Ryan McElroy <rmcelroy@fb.com>
parents:
26862
diff
changeset
|
322 outgoing = pushop.outgoing |
c4a7bbc78c74
exchange: pass pushop to discovery.checkheads
Ryan McElroy <rmcelroy@fb.com>
parents:
26862
diff
changeset
|
323 remoteheads = pushop.remoteheads |
c4a7bbc78c74
exchange: pass pushop to discovery.checkheads
Ryan McElroy <rmcelroy@fb.com>
parents:
26862
diff
changeset
|
324 newbranch = pushop.newbranch |
c4a7bbc78c74
exchange: pass pushop to discovery.checkheads
Ryan McElroy <rmcelroy@fb.com>
parents:
26862
diff
changeset
|
325 inc = bool(pushop.incoming) |
c4a7bbc78c74
exchange: pass pushop to discovery.checkheads
Ryan McElroy <rmcelroy@fb.com>
parents:
26862
diff
changeset
|
326 |
17209
5cd3e526ac37
checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17206
diff
changeset
|
327 # 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
|
328 # 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
|
329 # - unknown locally |
5cd3e526ac37
checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17206
diff
changeset
|
330 # - a local outgoing head descended from update |
5cd3e526ac37
checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17206
diff
changeset
|
331 # - 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
|
332 # 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
|
333 if remoteheads == [nullid]: |
4154338f0bc0
discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
15893
diff
changeset
|
334 # 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
|
335 return |
2439
e8c4f3d3df8c
extend network protocol to stop clients from locking servers
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2424
diff
changeset
|
336 |
15932
4154338f0bc0
discovery: diet discovery.prepush from non-discovery code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
15893
diff
changeset
|
337 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
|
338 headssum = _headssummary(pushop) |
17209
5cd3e526ac37
checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17206
diff
changeset
|
339 else: |
17211
4f321eecbf8d
checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17209
diff
changeset
|
340 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
|
341 pushop.pushbranchmap = headssum |
17211
4f321eecbf8d
checkheads: simplify the structure build by preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17209
diff
changeset
|
342 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
|
343 if heads[0] is None] |
17209
5cd3e526ac37
checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17206
diff
changeset
|
344 # 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
|
345 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
|
346 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
|
347 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
|
348 % branchnames, |
5cd3e526ac37
checkheads: extract branchmap preprocessing
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17206
diff
changeset
|
349 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
|
350 " new remote branches")) |
1466
b6d9ea0bc107
Added a lot of comments to changegroupsubset.
Eric Hopper <hopper@omnifarious.org>
parents:
1464
diff
changeset
|
351 |
26862
894f54d84d4a
discovery: factor out calculation of heads to not warn about
Ryan McElroy <rmcelroy@fb.com>
parents:
26819
diff
changeset
|
352 # 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
|
353 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
|
354 |
246131d670c2
checkheads: extract bookmark computation from the branch loop
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17211
diff
changeset
|
355 # 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
|
356 # 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
|
357 # 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
|
358 errormsg = None |
18361
06f075836010
discovery: process heads in sorted order
Mads Kiilerich <mads@kiilerich.com>
parents:
18305
diff
changeset
|
359 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
|
360 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
|
361 # add unsynced data |
20381
fff0a71f8177
discovery: cleanup of variable names and comments
Mads Kiilerich <madski@unity3d.com>
parents:
20225
diff
changeset
|
362 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
|
363 oldhs = set() |
b00ba31313c3
discovery: abort also when pushing multiple headed new branch
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
18382
diff
changeset
|
364 else: |
20381
fff0a71f8177
discovery: cleanup of variable names and comments
Mads Kiilerich <madski@unity3d.com>
parents:
20225
diff
changeset
|
365 oldhs = set(remoteheads) |
fff0a71f8177
discovery: cleanup of variable names and comments
Mads Kiilerich <madski@unity3d.com>
parents:
20225
diff
changeset
|
366 oldhs.update(unsyncedheads) |
fff0a71f8177
discovery: cleanup of variable names and comments
Mads Kiilerich <madski@unity3d.com>
parents:
20225
diff
changeset
|
367 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
|
368 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
|
369 newhs.update(unsyncedheads) |
32674
7a7c4f3afb98
checkheads: drop now unused filtering of 'unsyncedheads'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32673
diff
changeset
|
370 if unsyncedheads: |
7a7c4f3afb98
checkheads: drop now unused filtering of 'unsyncedheads'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32673
diff
changeset
|
371 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
|
372 # 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
|
373 heads = None |
21198
56a04085c23c
discovery: don't report all "unsynced" remote heads (issue4230)
Mads Kiilerich <madski@unity3d.com>
parents:
20502
diff
changeset
|
374 else: |
35184
bc775b8cc020
scmutil: extra utility to display a reasonable amount of nodes
Boris Feld <boris.feld@octobus.net>
parents:
32792
diff
changeset
|
375 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
|
376 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
|
377 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
|
378 "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
|
379 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
|
380 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
|
381 "not known locally: %s\n") % heads) |
20501
8a9e0b523d2d
discovery: improve "note: unsynced remote changes!" warning
Mads Kiilerich <madski@unity3d.com>
parents:
20403
diff
changeset
|
382 else: |
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 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
|
384 "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
|
385 if remoteheads is None: |
fff0a71f8177
discovery: cleanup of variable names and comments
Mads Kiilerich <madski@unity3d.com>
parents:
20225
diff
changeset
|
386 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
|
387 dhs = list(newhs) |
26585
b38d93735a4f
discovery: rename 'error' to 'errormsg'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25944
diff
changeset
|
388 if errormsg is None: |
b38d93735a4f
discovery: rename 'error' to 'errormsg'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25944
diff
changeset
|
389 errormsg = (_("push creates new branch '%s' " |
b38d93735a4f
discovery: rename 'error' to 'errormsg'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25944
diff
changeset
|
390 "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
|
391 hint = _("merge or" |
29973
4ddb05751b12
discovery: use single quotes in use warning
timeless <timeless@mozdev.org>
parents:
29901
diff
changeset
|
392 " 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
|
393 " pushing new heads") |
b00ba31313c3
discovery: abort also when pushing multiple headed new branch
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
18382
diff
changeset
|
394 elif len(newhs) > len(oldhs): |
20381
fff0a71f8177
discovery: cleanup of variable names and comments
Mads Kiilerich <madski@unity3d.com>
parents:
20225
diff
changeset
|
395 # 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
|
396 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
|
397 if dhs: |
26585
b38d93735a4f
discovery: rename 'error' to 'errormsg'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25944
diff
changeset
|
398 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
|
399 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
|
400 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
|
401 "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
|
402 elif repo[dhs[0]].bookmarks(): |
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 "with bookmark '%s'!") % ( |
b38d93735a4f
discovery: rename 'error' to 'errormsg'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25944
diff
changeset
|
405 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
|
406 else: |
26585
b38d93735a4f
discovery: rename 'error' to 'errormsg'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25944
diff
changeset
|
407 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
|
408 ) % short(dhs[0]) |
20381
fff0a71f8177
discovery: cleanup of variable names and comments
Mads Kiilerich <madski@unity3d.com>
parents:
20225
diff
changeset
|
409 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
|
410 hint = _("pull and merge or" |
29973
4ddb05751b12
discovery: use single quotes in use warning
timeless <timeless@mozdev.org>
parents:
29901
diff
changeset
|
411 " 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
|
412 " 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
|
413 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
|
414 hint = _("merge or" |
29973
4ddb05751b12
discovery: use single quotes in use warning
timeless <timeless@mozdev.org>
parents:
29901
diff
changeset
|
415 " 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
|
416 " pushing new heads") |
20051
b988b3b19303
discovery: make note messages for new heads more readable
Mads Kiilerich <madski@unity3d.com>
parents:
20050
diff
changeset
|
417 if branch is None: |
b988b3b19303
discovery: make note messages for new heads more readable
Mads Kiilerich <madski@unity3d.com>
parents:
20050
diff
changeset
|
418 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
|
419 else: |
b988b3b19303
discovery: make note messages for new heads more readable
Mads Kiilerich <madski@unity3d.com>
parents:
20050
diff
changeset
|
420 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
|
421 for h in dhs: |
20051
b988b3b19303
discovery: make note messages for new heads more readable
Mads Kiilerich <madski@unity3d.com>
parents:
20050
diff
changeset
|
422 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
|
423 if errormsg: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26585
diff
changeset
|
424 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
|
425 |
df82f375fa00
checkheads: extract obsolete post processing in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29973
diff
changeset
|
426 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
|
427 """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
|
428 |
32009
c6cb21ddf74a
checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31586
diff
changeset
|
429 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
|
430 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
|
431 |
31586
df82f375fa00
checkheads: extract obsolete post processing in its own function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29973
diff
changeset
|
432 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
|
433 """ |
32009
c6cb21ddf74a
checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31586
diff
changeset
|
434 # 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
|
435 # |
32009
c6cb21ddf74a
checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31586
diff
changeset
|
436 # * 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
|
437 # |
32009
c6cb21ddf74a
checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31586
diff
changeset
|
438 # * 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
|
439 # 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
|
440 |
c6cb21ddf74a
checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31586
diff
changeset
|
441 # 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
|
442 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
|
443 unfi = repo.unfiltered() |
c6cb21ddf74a
checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31586
diff
changeset
|
444 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
|
445 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
|
446 public = phases.public |
c6cb21ddf74a
checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31586
diff
changeset
|
447 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
|
448 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
|
449 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
|
450 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
|
451 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
|
452 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
|
453 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
|
454 |
c6cb21ddf74a
checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31586
diff
changeset
|
455 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
|
456 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
|
457 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
|
458 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
|
459 localcandidate.add(h) |
c6cb21ddf74a
checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31586
diff
changeset
|
460 else: |
c6cb21ddf74a
checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31586
diff
changeset
|
461 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
|
462 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
|
463 ' 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
|
464 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
|
465 unknownheads.add(h) |
c6cb21ddf74a
checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31586
diff
changeset
|
466 |
c6cb21ddf74a
checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31586
diff
changeset
|
467 # 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
|
468 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
|
469 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
|
470 |
c6cb21ddf74a
checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31586
diff
changeset
|
471 # 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
|
472 while localcandidate: |
c6cb21ddf74a
checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31586
diff
changeset
|
473 nh = localcandidate.pop() |
c6cb21ddf74a
checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31586
diff
changeset
|
474 # 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
|
475 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
|
476 newhs.add(nh) |
c6cb21ddf74a
checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31586
diff
changeset
|
477 continue |
c6cb21ddf74a
checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31586
diff
changeset
|
478 |
c6cb21ddf74a
checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31586
diff
changeset
|
479 # 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
|
480 # (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
|
481 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
|
482 nh, localcandidate, newhs) |
c6cb21ddf74a
checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31586
diff
changeset
|
483 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
|
484 |
c6cb21ddf74a
checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31586
diff
changeset
|
485 # 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
|
486 # * 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
|
487 # * 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
|
488 # * 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
|
489 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
|
490 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
|
491 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
|
492 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
|
493 else: |
32009
c6cb21ddf74a
checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31586
diff
changeset
|
494 # 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
|
495 # 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
|
496 # "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
|
497 # 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
|
498 discarded.add(nh) |
c6cb21ddf74a
checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31586
diff
changeset
|
499 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
|
500 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
|
501 |
32789
443e8543a125
checkheads: pass "ispushed" function to the obsmarkers logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32709
diff
changeset
|
502 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
|
503 """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
|
504 |
c6cb21ddf74a
checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31586
diff
changeset
|
505 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
|
506 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
|
507 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
|
508 (O(len(repo))) |
c6cb21ddf74a
checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31586
diff
changeset
|
509 |
c6cb21ddf74a
checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31586
diff
changeset
|
510 (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
|
511 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
|
512 """ |
c6cb21ddf74a
checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31586
diff
changeset
|
513 successorsmarkers = obsstore.successors |
c6cb21ddf74a
checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31586
diff
changeset
|
514 stack = [node] |
c6cb21ddf74a
checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31586
diff
changeset
|
515 seen = set(stack) |
c6cb21ddf74a
checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31586
diff
changeset
|
516 while stack: |
c6cb21ddf74a
checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31586
diff
changeset
|
517 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
|
518 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
|
519 return True |
c6cb21ddf74a
checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31586
diff
changeset
|
520 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
|
521 # 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
|
522 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
|
523 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
|
524 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
|
525 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
|
526 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
|
527 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
|
528 seen.add(n) |
c6cb21ddf74a
checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31586
diff
changeset
|
529 stack.append(n) |
c6cb21ddf74a
checkheads: upgrade the obsolescence postprocessing logic (issue4354)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31586
diff
changeset
|
530 return False |