Mercurial > evolve
annotate hgext3rd/topic/destination.py @ 6935:954d7ea5cd67 stable tip
stack: when stack base is obsolete, pick any successor, even if at random
There are situations when s0 is obsolete and we also cannot pick just one
successor for it to use in stack. In such a case, let's pick the "latest"
successor from the first set.
We're assuming that obsutil.successorssets() returns data in the same order (it
should, since it makes sure to sort data internally). Keeping that in mind,
while the successor picked for s0 by this code is not based on any sort of
sophisticated logic, it should nonetheless be the same every time.
This patch is probably not going to completely break anything that was
previously working fine, because the previous behavior was to just abort with
an exception.
author | Anton Shestakov <av6@dwimlabs.net> |
---|---|
date | Sat, 16 Nov 2024 17:01:02 +0400 |
parents | 991be5efe7cb |
children |
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 ) |
4537
db3e17adee3e
topic: only wrap _destmergebranch for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4044
diff
changeset
|
10 from . import ( |
db3e17adee3e
topic: only wrap _destmergebranch for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4044
diff
changeset
|
11 common, |
db3e17adee3e
topic: only wrap _destmergebranch for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4044
diff
changeset
|
12 topicmap, |
db3e17adee3e
topic: only wrap _destmergebranch for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4044
diff
changeset
|
13 ) |
1983
4864ddc4c6d9
destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1981
diff
changeset
|
14 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
|
15 |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4539
diff
changeset
|
16 def _destmergebranch(orig, repo, action=b'merge', sourceset=None, |
1962
c00815786813
compat: adapt to the new destspace argument of destmerge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1941
diff
changeset
|
17 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
|
18 # 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
|
19 if sourceset is None: |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4539
diff
changeset
|
20 p1 = repo[b'.'] |
1984
2a07df823588
destination: honor the sourceset argument of _destmerge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1983
diff
changeset
|
21 else: |
2a07df823588
destination: honor the sourceset argument of _destmerge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1983
diff
changeset
|
22 # 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
|
23 # be updated to take care of the whole sourceset. |
2006 | 24 p1 = repo[max(sourceset)] |
4537
db3e17adee3e
topic: only wrap _destmergebranch for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4044
diff
changeset
|
25 top = None |
db3e17adee3e
topic: only wrap _destmergebranch for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4044
diff
changeset
|
26 if common.hastopicext(repo): |
db3e17adee3e
topic: only wrap _destmergebranch for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4044
diff
changeset
|
27 top = p1.topic() |
1871
58ef5699fb35
merge: use topic to pick default destination
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1870
diff
changeset
|
28 if top: |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4539
diff
changeset
|
29 revs = repo.revs(b'topic(%s) - obsolete()', top) |
1983
4864ddc4c6d9
destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1981
diff
changeset
|
30 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
|
31 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
|
32 if onheadcheck and p1.rev() not in heads: |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4539
diff
changeset
|
33 raise error.Abort(_(b"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
|
34 |
4864ddc4c6d9
destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1981
diff
changeset
|
35 # 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
|
36 otherheads = set(heads) |
4864ddc4c6d9
destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1981
diff
changeset
|
37 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
|
38 while pool: |
4864ddc4c6d9
destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1981
diff
changeset
|
39 current = pool.pop() |
4864ddc4c6d9
destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1981
diff
changeset
|
40 otherheads.discard(current) |
4864ddc4c6d9
destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1981
diff
changeset
|
41 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
|
42 if not otherheads: |
4864ddc4c6d9
destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1981
diff
changeset
|
43 # 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
|
44 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
|
45 if not bhead: |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4539
diff
changeset
|
46 raise error.NoMergeDestAbort(_(b"nothing to merge")) |
1871
58ef5699fb35
merge: use topic to pick default destination
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1870
diff
changeset
|
47 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
|
48 return bhead[0] |
1871
58ef5699fb35
merge: use topic to pick default destination
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1870
diff
changeset
|
49 else: |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4539
diff
changeset
|
50 msg = _(b"branch '%s' has %d heads " |
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4539
diff
changeset
|
51 b"- please merge with an explicit rev") |
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4539
diff
changeset
|
52 hint = _(b"run 'hg heads .' to see heads") |
1980
3c4a20244771
destination: use the correct abort class for error
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1969
diff
changeset
|
53 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
|
54 hint=hint) |
1983
4864ddc4c6d9
destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1981
diff
changeset
|
55 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
|
56 return otherheads.pop() |
4864ddc4c6d9
destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1981
diff
changeset
|
57 else: |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4539
diff
changeset
|
58 msg = _(b"topic '%s' has %d heads " |
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4539
diff
changeset
|
59 b"- please merge with an explicit rev") % (top, len(heads)) |
1980
3c4a20244771
destination: use the correct abort class for error
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1969
diff
changeset
|
60 raise error.ManyMergeDestAbort(msg) |
3143
f7f8fcbed02c
compat: simply the wrapping of '_destmergebranch'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3142
diff
changeset
|
61 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
|
62 |
2017
dd1055f38397
compat: handle difference of signature for update destination hooks
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2006
diff
changeset
|
63 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
|
64 """decide on an update destination from current topic""" |
4538
31c1645ef8bf
topic: only wrap _destupdatetopic for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4537
diff
changeset
|
65 if not common.hastopicext(repo): |
31c1645ef8bf
topic: only wrap _destupdatetopic for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4537
diff
changeset
|
66 return None, None, 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
|
67 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
|
68 topic = repo.currenttopic |
4044
c0fbe70f2e48
topic: check that repo.currenttopic is set before using it as an argument
Anton Shestakov <av6@dwimlabs.net>
parents:
3143
diff
changeset
|
69 if topic: |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4539
diff
changeset
|
70 revs = repo.revs(b'.::topic(%s)', topic) |
5982
991be5efe7cb
topic: correctly update from public commits with a (now hidden) topic
Anton Shestakov <av6@dwimlabs.net>
parents:
5026
diff
changeset
|
71 elif repo[b'.'].topic(): |
5026
e7949274c3f9
evolve: fix a bug in logic to choose destination when no active topic
Sushil khanchi <sushilkhanchi97@gmail.com>
parents:
5024
diff
changeset
|
72 revs = [] |
4044
c0fbe70f2e48
topic: check that repo.currenttopic is set before using it as an argument
Anton Shestakov <av6@dwimlabs.net>
parents:
3143
diff
changeset
|
73 else: |
1892
b1fadc089b82
update: change default update destination to take topic in account
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1891
diff
changeset
|
74 return None, None, None |
5024
b1a9d548af52
evolve: fix a bug in logic of choosing destination for hg update
Sushil khanchi <sushilkhanchi97@gmail.com>
parents:
4814
diff
changeset
|
75 if revs: |
b1a9d548af52
evolve: fix a bug in logic of choosing destination for hg update
Sushil khanchi <sushilkhanchi97@gmail.com>
parents:
4814
diff
changeset
|
76 node = revs.last() |
b1a9d548af52
evolve: fix a bug in logic of choosing destination for hg update
Sushil khanchi <sushilkhanchi97@gmail.com>
parents:
4814
diff
changeset
|
77 else: |
b1a9d548af52
evolve: fix a bug in logic of choosing destination for hg update
Sushil khanchi <sushilkhanchi97@gmail.com>
parents:
4814
diff
changeset
|
78 node = repo[b'.'].node() |
1892
b1fadc089b82
update: change default update destination to take topic in account
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1891
diff
changeset
|
79 if bookmarks.isactivewdirparent(repo): |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4539
diff
changeset
|
80 movemark = repo[b'.'].node() |
1892
b1fadc089b82
update: change default update destination to take topic in account
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1891
diff
changeset
|
81 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
|
82 |
1911
442a7cb8404e
histedit: restrict default edited set to current topic when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1902
diff
changeset
|
83 def desthistedit(orig, ui, repo): |
4539
91628e5c0f6d
topic: only wrap desthistedit for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4538
diff
changeset
|
84 if not common.hastopicext(repo): |
91628e5c0f6d
topic: only wrap desthistedit for repo with topic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4538
diff
changeset
|
85 return None |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4539
diff
changeset
|
86 if not (ui.config(b'histedit', b'defaultrev', None) is None |
1911
442a7cb8404e
histedit: restrict default edited set to current topic when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1902
diff
changeset
|
87 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
|
88 return orig(ui, repo) |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4539
diff
changeset
|
89 revs = repo.revs(b'::. and stack()') |
1911
442a7cb8404e
histedit: restrict default edited set to current topic when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1902
diff
changeset
|
90 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
|
91 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
|
92 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
|
93 |
1870
8dd5200b4086
topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
94 def ngtip(repo, branch, all=False): |
8dd5200b4086
topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
95 """tip new generation""" |
8dd5200b4086
topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
96 ## search for untopiced heads of branch |
8dd5200b4086
topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
97 # could be heads((::branch(x) - topic())) |
8dd5200b4086
topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
98 # but that is expensive |
8dd5200b4086
topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
99 # |
8dd5200b4086
topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
100 # we should write plain code instead |
2653
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2017
diff
changeset
|
101 |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2017
diff
changeset
|
102 tmap = topicmap.gettopicrepo(repo).branchmap() |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2017
diff
changeset
|
103 if branch not in tmap: |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2017
diff
changeset
|
104 return [] |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2017
diff
changeset
|
105 elif all: |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2017
diff
changeset
|
106 return tmap.branchheads(branch) |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2017
diff
changeset
|
107 else: |
13313d0cab71
topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2017
diff
changeset
|
108 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
|
109 |
1941
7eb737b7a902
destination: rename 'setupdest' to 'modsetup'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1940
diff
changeset
|
110 def modsetup(ui): |
1940
6d53f81d3b64
destination: document 'setupdest'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1939
diff
changeset
|
111 """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
|
112 extensions.wrapfunction(destutil, '_destmergebranch', _destmergebranch) |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4539
diff
changeset
|
113 bridx = destutil.destupdatesteps.index(b'branch') |
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4539
diff
changeset
|
114 destutil.destupdatesteps.insert(bridx, b'topic') |
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4539
diff
changeset
|
115 destutil.destupdatestepmap[b'topic'] = _destupdatetopic |
3142
28e501581dc7
compat: drop support for 3.8's '_destrebase' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
2891
diff
changeset
|
116 extensions.wrapfunction(destutil, 'desthistedit', desthistedit) |