Mercurial > evolve
annotate hgext3rd/topic/destination.py @ 3248:07c9b6f445bf
stablerange: rework the debug command to allow for multiple method
Similar to what we did for the other debug command related to sorting, we
prepare for the arrival of multiple method to produce the result (including
simple implementation that are easy to read but do not scale).
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Wed, 29 Nov 2017 10:53:21 -0500 |
parents | f7f8fcbed02c |
children | c0fbe70f2e48 |
rev | line source |
---|---|
1933
ca8674a8fce4
destination: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1912
diff
changeset
|
1 from __future__ import absolute_import |
ca8674a8fce4
destination: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1912
diff
changeset
|
2 |
1871
58ef5699fb35
merge: use topic to pick default destination
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1870
diff
changeset
|
3 from mercurial.i18n import _ |
1933
ca8674a8fce4
destination: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1912
diff
changeset
|
4 from mercurial import ( |
ca8674a8fce4
destination: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1912
diff
changeset
|
5 bookmarks, |
ca8674a8fce4
destination: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1912
diff
changeset
|
6 destutil, |
ca8674a8fce4
destination: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1912
diff
changeset
|
7 error, |
ca8674a8fce4
destination: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1912
diff
changeset
|
8 extensions, |
ca8674a8fce4
destination: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1912
diff
changeset
|
9 ) |
1986
042356d5ba59
ngtip: rely on topicmap for 'ngtip'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1984
diff
changeset
|
10 from . import topicmap |
1983
4864ddc4c6d9
destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1981
diff
changeset
|
11 from .evolvebits import builddependencies |
1871
58ef5699fb35
merge: use topic to pick default destination
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1870
diff
changeset
|
12 |
1962
c00815786813
compat: adapt to the new destspace argument of destmerge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1941
diff
changeset
|
13 def _destmergebranch(orig, repo, action='merge', sourceset=None, |
c00815786813
compat: adapt to the new destspace argument of destmerge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1941
diff
changeset
|
14 onheadcheck=True, destspace=None): |
1967
c5d4e856ad0e
destination: add an XXX about handling destspace in destmerge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1964
diff
changeset
|
15 # XXX: take destspace into account |
1984
2a07df823588
destination: honor the sourceset argument of _destmerge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1983
diff
changeset
|
16 if sourceset is None: |
2006 | 17 p1 = repo['.'] |
1984
2a07df823588
destination: honor the sourceset argument of _destmerge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1983
diff
changeset
|
18 else: |
2a07df823588
destination: honor the sourceset argument of _destmerge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1983
diff
changeset
|
19 # XXX: using only the max here is flacky. That code should eventually |
2a07df823588
destination: honor the sourceset argument of _destmerge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1983
diff
changeset
|
20 # be updated to take care of the whole sourceset. |
2006 | 21 p1 = repo[max(sourceset)] |
1871
58ef5699fb35
merge: use topic to pick default destination
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1870
diff
changeset
|
22 top = p1.topic() |
58ef5699fb35
merge: use topic to pick default destination
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1870
diff
changeset
|
23 if top: |
1983
4864ddc4c6d9
destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1981
diff
changeset
|
24 revs = repo.revs('topic(%s) - obsolete()', top) |
4864ddc4c6d9
destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1981
diff
changeset
|
25 deps, rdeps = builddependencies(repo, revs) |
4864ddc4c6d9
destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1981
diff
changeset
|
26 heads = [r for r in revs if not rdeps[r]] |
1981
b467fe430404
destmerge: honor the 'onheadcheck' argument
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1980
diff
changeset
|
27 if onheadcheck and p1.rev() not in heads: |
1871
58ef5699fb35
merge: use topic to pick default destination
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1870
diff
changeset
|
28 raise error.Abort(_("not at topic head, update or explicit")) |
1983
4864ddc4c6d9
destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1981
diff
changeset
|
29 |
4864ddc4c6d9
destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1981
diff
changeset
|
30 # prune heads above the source |
4864ddc4c6d9
destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1981
diff
changeset
|
31 otherheads = set(heads) |
4864ddc4c6d9
destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1981
diff
changeset
|
32 pool = set([p1.rev()]) |
4864ddc4c6d9
destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1981
diff
changeset
|
33 while pool: |
4864ddc4c6d9
destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1981
diff
changeset
|
34 current = pool.pop() |
4864ddc4c6d9
destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1981
diff
changeset
|
35 otherheads.discard(current) |
4864ddc4c6d9
destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1981
diff
changeset
|
36 pool.update(rdeps[current]) |
4864ddc4c6d9
destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1981
diff
changeset
|
37 if not otherheads: |
4864ddc4c6d9
destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1981
diff
changeset
|
38 # nothing to do at the topic level |
1871
58ef5699fb35
merge: use topic to pick default destination
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1870
diff
changeset
|
39 bhead = ngtip(repo, p1.branch(), all=True) |
58ef5699fb35
merge: use topic to pick default destination
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1870
diff
changeset
|
40 if not bhead: |
1980
3c4a20244771
destination: use the correct abort class for error
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1969
diff
changeset
|
41 raise error.NoMergeDestAbort(_("nothing to merge")) |
1871
58ef5699fb35
merge: use topic to pick default destination
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1870
diff
changeset
|
42 elif 1 == len(bhead): |
1986
042356d5ba59
ngtip: rely on topicmap for 'ngtip'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1984
diff
changeset
|
43 return bhead[0] |
1871
58ef5699fb35
merge: use topic to pick default destination
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1870
diff
changeset
|
44 else: |
1980
3c4a20244771
destination: use the correct abort class for error
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1969
diff
changeset
|
45 msg = _("branch '%s' has %d heads " |
3c4a20244771
destination: use the correct abort class for error
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1969
diff
changeset
|
46 "- please merge with an explicit rev") |
3c4a20244771
destination: use the correct abort class for error
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1969
diff
changeset
|
47 hint = _("run 'hg heads .' to see heads") |
3c4a20244771
destination: use the correct abort class for error
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1969
diff
changeset
|
48 raise error.ManyMergeDestAbort(msg % (p1.branch(), len(bhead)), |
3c4a20244771
destination: use the correct abort class for error
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1969
diff
changeset
|
49 hint=hint) |
1983
4864ddc4c6d9
destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1981
diff
changeset
|
50 elif len(otherheads) == 1: |
4864ddc4c6d9
destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1981
diff
changeset
|
51 return otherheads.pop() |
4864ddc4c6d9
destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1981
diff
changeset
|
52 else: |
1980
3c4a20244771
destination: use the correct abort class for error
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1969
diff
changeset
|
53 msg = _("topic '%s' has %d heads " |
3c4a20244771
destination: use the correct abort class for error
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1969
diff
changeset
|
54 "- please merge with an explicit rev") % (top, len(heads)) |
3c4a20244771
destination: use the correct abort class for error
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1969
diff
changeset
|
55 raise error.ManyMergeDestAbort(msg) |
3143
f7f8fcbed02c
compat: simply the wrapping of '_destmergebranch'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3142
diff
changeset
|
56 return orig(repo, action, sourceset, onheadcheck, destspace=destspace) |
1871
58ef5699fb35
merge: use topic to pick default destination
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1870
diff
changeset
|
57 |
2017
dd1055f38397
compat: handle difference of signature for update destination hooks
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2006
diff
changeset
|
58 def _destupdatetopic(repo, clean, check=None): |
1892
b1fadc089b82
update: change default update destination to take topic in account
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1891
diff
changeset
|
59 """decide on an update destination from current topic""" |
b1fadc089b82
update: change default update destination to take topic in account
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1891
diff
changeset
|
60 movemark = node = None |
b1fadc089b82
update: change default update destination to take topic in account
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1891
diff
changeset
|
61 topic = repo.currenttopic |
b1fadc089b82
update: change default update destination to take topic in account
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1891
diff
changeset
|
62 revs = repo.revs('.::topic("%s")' % topic) |
b1fadc089b82
update: change default update destination to take topic in account
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1891
diff
changeset
|
63 if not revs: |
b1fadc089b82
update: change default update destination to take topic in account
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1891
diff
changeset
|
64 return None, None, None |
b1fadc089b82
update: change default update destination to take topic in account
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1891
diff
changeset
|
65 node = revs.last() |
b1fadc089b82
update: change default update destination to take topic in account
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1891
diff
changeset
|
66 if bookmarks.isactivewdirparent(repo): |
b1fadc089b82
update: change default update destination to take topic in account
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1891
diff
changeset
|
67 movemark = repo['.'].node() |
b1fadc089b82
update: change default update destination to take topic in account
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1891
diff
changeset
|
68 return node, movemark, None |
b1fadc089b82
update: change default update destination to take topic in account
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1891
diff
changeset
|
69 |
1911
442a7cb8404e
histedit: restrict default edited set to current topic when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1902
diff
changeset
|
70 def desthistedit(orig, ui, repo): |
442a7cb8404e
histedit: restrict default edited set to current topic when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1902
diff
changeset
|
71 if not (ui.config('histedit', 'defaultrev', None) is None |
442a7cb8404e
histedit: restrict default edited set to current topic when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1902
diff
changeset
|
72 and repo.currenttopic): |
442a7cb8404e
histedit: restrict default edited set to current topic when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1902
diff
changeset
|
73 return orig(ui, repo) |
442a7cb8404e
histedit: restrict default edited set to current topic when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1902
diff
changeset
|
74 revs = repo.revs('::. and stack()') |
442a7cb8404e
histedit: restrict default edited set to current topic when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1902
diff
changeset
|
75 if revs: |
442a7cb8404e
histedit: restrict default edited set to current topic when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1902
diff
changeset
|
76 return revs.min() |
442a7cb8404e
histedit: restrict default edited set to current topic when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1902
diff
changeset
|
77 return None |
442a7cb8404e
histedit: restrict default edited set to current topic when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1902
diff
changeset
|
78 |
1870
8dd5200b4086
topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
79 def ngtip(repo, branch, all=False): |
8dd5200b4086
topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
80 """tip new generation""" |
8dd5200b4086
topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
81 ## search for untopiced heads of branch |
8dd5200b4086
topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
82 # could be heads((::branch(x) - topic())) |
8dd5200b4086
topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
83 # but that is expensive |
8dd5200b4086
topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
84 # |
8dd5200b4086
topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
85 # we should write plain code instead |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2017
diff
changeset
|
86 |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2017
diff
changeset
|
87 tmap = topicmap.gettopicrepo(repo).branchmap() |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2017
diff
changeset
|
88 if branch not in tmap: |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2017
diff
changeset
|
89 return [] |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2017
diff
changeset
|
90 elif all: |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2017
diff
changeset
|
91 return tmap.branchheads(branch) |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2017
diff
changeset
|
92 else: |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2017
diff
changeset
|
93 return [tmap.branchtip(branch)] |
1938
7e31d3e79806
destination: make sure 'setupdest' is the latest function in the module
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1933
diff
changeset
|
94 |
1941
7eb737b7a902
destination: rename 'setupdest' to 'modsetup'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1940
diff
changeset
|
95 def modsetup(ui): |
1940
6d53f81d3b64
destination: document 'setupdest'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1939
diff
changeset
|
96 """run a uisetup time to install all destinations wrapping""" |
3142
28e501581dc7
compat: drop support for 3.8's '_destrebase' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2891
diff
changeset
|
97 extensions.wrapfunction(destutil, '_destmergebranch', _destmergebranch) |
28e501581dc7
compat: drop support for 3.8's '_destrebase' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2891
diff
changeset
|
98 bridx = destutil.destupdatesteps.index('branch') |
28e501581dc7
compat: drop support for 3.8's '_destrebase' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2891
diff
changeset
|
99 destutil.destupdatesteps.insert(bridx, 'topic') |
28e501581dc7
compat: drop support for 3.8's '_destrebase' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2891
diff
changeset
|
100 destutil.destupdatestepmap['topic'] = _destupdatetopic |
28e501581dc7
compat: drop support for 3.8's '_destrebase' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2891
diff
changeset
|
101 extensions.wrapfunction(destutil, 'desthistedit', desthistedit) |