author | Yuya Nishihara <yuya@tcha.org> |
Thu, 03 Oct 2019 23:39:29 -0400 | |
changeset 43043 | e370f9e4bfad |
parent 41146 | fbd168455b26 |
child 43076 | 2372284d9457 |
permissions | -rw-r--r-- |
26569
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
1 |
# destutil.py - Mercurial utility function for command destination |
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
2 |
# |
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
3 |
# Copyright Matt Mackall <mpm@selenic.com> and other |
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
4 |
# |
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
5 |
# This software may be used and distributed according to the terms of the |
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
6 |
# GNU General Public License version 2 or any later version. |
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
7 |
|
27333
2c60b4b2a0de
destutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27262
diff
changeset
|
8 |
from __future__ import absolute_import |
2c60b4b2a0de
destutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27262
diff
changeset
|
9 |
|
26569
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
10 |
from .i18n import _ |
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
11 |
from . import ( |
26641
5c57d01fe64e
destupdate: also include bookmark related logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26629
diff
changeset
|
12 |
bookmarks, |
26569
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
13 |
error, |
33142
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32698
diff
changeset
|
14 |
obsutil, |
31025
6cf2857526c7
scmutil: proxy revrange() through repo to break import cycles
Yuya Nishihara <yuya@tcha.org>
parents:
30962
diff
changeset
|
15 |
scmutil, |
37002
a72198790e15
show: use the new stack definition for show stack
Boris Feld <boris.feld@octobus.net>
parents:
33197
diff
changeset
|
16 |
stack |
26569
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
17 |
) |
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
18 |
|
37787
92213f6745ed
rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents:
37452
diff
changeset
|
19 |
def orphanpossibledestination(repo, rev): |
92213f6745ed
rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents:
37452
diff
changeset
|
20 |
"""Return all changesets that may be a new parent for orphan `rev`. |
92213f6745ed
rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents:
37452
diff
changeset
|
21 |
|
92213f6745ed
rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents:
37452
diff
changeset
|
22 |
This function works fine on non-orphan revisions, it's just silly |
92213f6745ed
rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents:
37452
diff
changeset
|
23 |
because there's no destination implied by obsolete markers, so |
92213f6745ed
rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents:
37452
diff
changeset
|
24 |
it'll return nothing. |
92213f6745ed
rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents:
37452
diff
changeset
|
25 |
""" |
92213f6745ed
rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents:
37452
diff
changeset
|
26 |
tonode = repo.changelog.node |
92213f6745ed
rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents:
37452
diff
changeset
|
27 |
parents = repo.changelog.parentrevs |
92213f6745ed
rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents:
37452
diff
changeset
|
28 |
torev = repo.changelog.rev |
92213f6745ed
rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents:
37452
diff
changeset
|
29 |
dest = set() |
92213f6745ed
rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents:
37452
diff
changeset
|
30 |
tovisit = list(parents(rev)) |
92213f6745ed
rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents:
37452
diff
changeset
|
31 |
while tovisit: |
92213f6745ed
rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents:
37452
diff
changeset
|
32 |
r = tovisit.pop() |
92213f6745ed
rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents:
37452
diff
changeset
|
33 |
succsets = obsutil.successorssets(repo, tonode(r)) |
92213f6745ed
rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents:
37452
diff
changeset
|
34 |
if not succsets: |
92213f6745ed
rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents:
37452
diff
changeset
|
35 |
# if there are no successors for r, r was probably pruned |
92213f6745ed
rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents:
37452
diff
changeset
|
36 |
# and we should walk up to r's parents to try and find |
92213f6745ed
rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents:
37452
diff
changeset
|
37 |
# some successors. |
92213f6745ed
rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents:
37452
diff
changeset
|
38 |
tovisit.extend(parents(r)) |
92213f6745ed
rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents:
37452
diff
changeset
|
39 |
else: |
92213f6745ed
rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents:
37452
diff
changeset
|
40 |
# We should probably pick only one destination from split |
92213f6745ed
rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents:
37452
diff
changeset
|
41 |
# (case where '1 < len(ss)'), This could be the currently |
92213f6745ed
rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents:
37452
diff
changeset
|
42 |
# tipmost, but the correct result is less clear when |
92213f6745ed
rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents:
37452
diff
changeset
|
43 |
# results of the split have been moved such that they |
92213f6745ed
rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents:
37452
diff
changeset
|
44 |
# reside on multiple branches. |
92213f6745ed
rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents:
37452
diff
changeset
|
45 |
for ss in succsets: |
92213f6745ed
rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents:
37452
diff
changeset
|
46 |
for n in ss: |
92213f6745ed
rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents:
37452
diff
changeset
|
47 |
dr = torev(n) |
92213f6745ed
rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents:
37452
diff
changeset
|
48 |
if dr != -1: |
92213f6745ed
rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents:
37452
diff
changeset
|
49 |
dest.add(dr) |
92213f6745ed
rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents:
37452
diff
changeset
|
50 |
return dest |
92213f6745ed
rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents:
37452
diff
changeset
|
51 |
|
30962
11c253997b0e
destutil: drop now-unused "check" parameter from destupdate()
Martin von Zweigbergk <martinvonz@google.com>
parents:
30961
diff
changeset
|
52 |
def _destupdateobs(repo, clean): |
26723
52d08a93de1f
destupdate: extract logic based on obsolescence marker in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26722
diff
changeset
|
53 |
"""decide of an update destination from obsolescence markers""" |
26569
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
54 |
node = None |
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
55 |
wc = repo[None] |
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
56 |
p1 = wc.p1() |
26723
52d08a93de1f
destupdate: extract logic based on obsolescence marker in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26722
diff
changeset
|
57 |
movemark = None |
26569
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
58 |
|
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
59 |
if p1.obsolete() and not p1.children(): |
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
60 |
# allow updating to successors |
33142
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32698
diff
changeset
|
61 |
successors = obsutil.successorssets(repo, p1.node()) |
26569
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
62 |
|
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
63 |
# behavior of certain cases is as follows, |
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
64 |
# |
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
65 |
# divergent changesets: update to highest rev, similar to what |
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
66 |
# is currently done when there are more than one head |
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
67 |
# (i.e. 'tip') |
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
68 |
# |
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
69 |
# replaced changesets: same as divergent except we know there |
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
70 |
# is no conflict |
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
71 |
# |
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
72 |
# pruned changeset: no update is done; though, we could |
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
73 |
# consider updating to the first non-obsolete parent, |
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
74 |
# similar to what is current done for 'hg prune' |
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
75 |
|
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
76 |
if successors: |
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
77 |
# flatten the list here handles both divergent (len > 1) |
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
78 |
# and the usual case (len = 1) |
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
79 |
successors = [n for sub in successors for n in sub] |
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
80 |
|
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
81 |
# get the max revision for the given successors set, |
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
82 |
# i.e. the 'tip' of a set |
2aeeef1dc9a5
update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff
changeset
|
83 |
node = repo.revs('max(%ln)', successors).first() |
26722
6cd643a1d32c
destupdate: move obsolete handling first
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26721
diff
changeset
|
84 |
if bookmarks.isactivewdirparent(repo): |
6cd643a1d32c
destupdate: move obsolete handling first
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26721
diff
changeset
|
85 |
movemark = repo['.'].node() |
26723
52d08a93de1f
destupdate: extract logic based on obsolescence marker in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26722
diff
changeset
|
86 |
return node, movemark, None |
52d08a93de1f
destupdate: extract logic based on obsolescence marker in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26722
diff
changeset
|
87 |
|
30962
11c253997b0e
destutil: drop now-unused "check" parameter from destupdate()
Martin von Zweigbergk <martinvonz@google.com>
parents:
30961
diff
changeset
|
88 |
def _destupdatebook(repo, clean): |
26724
7fc759c0c430
destupdate: extract logic based on bookmarks in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26723
diff
changeset
|
89 |
"""decide on an update destination from active bookmark""" |
7fc759c0c430
destupdate: extract logic based on bookmarks in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26723
diff
changeset
|
90 |
# we also move the active bookmark, if any |
37359
e27298bf11dd
bookmarks: calculateupdate() returns a bookmark, not a rev
Martin von Zweigbergk <martinvonz@google.com>
parents:
37004
diff
changeset
|
91 |
node = None |
37375
a973bb92ab71
bookmarks: drop always-None argument from calculateupdate()
Martin von Zweigbergk <martinvonz@google.com>
parents:
37359
diff
changeset
|
92 |
activemark, movemark = bookmarks.calculateupdate(repo.ui, repo) |
37359
e27298bf11dd
bookmarks: calculateupdate() returns a bookmark, not a rev
Martin von Zweigbergk <martinvonz@google.com>
parents:
37004
diff
changeset
|
93 |
if activemark is not None: |
37452
2b38c80557a4
destutil: look up bookmarks only among bookmarks
Martin von Zweigbergk <martinvonz@google.com>
parents:
37390
diff
changeset
|
94 |
node = repo._bookmarks[activemark] |
26724
7fc759c0c430
destupdate: extract logic based on bookmarks in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26723
diff
changeset
|
95 |
return node, movemark, activemark |
7fc759c0c430
destupdate: extract logic based on bookmarks in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26723
diff
changeset
|
96 |
|
30962
11c253997b0e
destutil: drop now-unused "check" parameter from destupdate()
Martin von Zweigbergk <martinvonz@google.com>
parents:
30961
diff
changeset
|
97 |
def _destupdatebranch(repo, clean): |
28385
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
98 |
"""decide on an update destination from current branch |
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
99 |
|
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
100 |
This ignores closed branch heads. |
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
101 |
""" |
26725
bde739aced83
destupdate: extract logic based on branch in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26724
diff
changeset
|
102 |
wc = repo[None] |
bde739aced83
destupdate: extract logic based on branch in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26724
diff
changeset
|
103 |
movemark = node = None |
28235
c2f0a47069ef
destutil: replace wc.branch() invocations by cached value for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28234
diff
changeset
|
104 |
currentbranch = wc.branch() |
29284
1c7167009936
update: fix bare --clean to work on new branch (issue5003) (BC)
liscju <piotr.listkiewicz@gmail.com>
parents:
29043
diff
changeset
|
105 |
|
1c7167009936
update: fix bare --clean to work on new branch (issue5003) (BC)
liscju <piotr.listkiewicz@gmail.com>
parents:
29043
diff
changeset
|
106 |
if clean: |
1c7167009936
update: fix bare --clean to work on new branch (issue5003) (BC)
liscju <piotr.listkiewicz@gmail.com>
parents:
29043
diff
changeset
|
107 |
currentbranch = repo['.'].branch() |
1c7167009936
update: fix bare --clean to work on new branch (issue5003) (BC)
liscju <piotr.listkiewicz@gmail.com>
parents:
29043
diff
changeset
|
108 |
|
28236
e333cea74741
destutil: use cached branch information instead of query for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28235
diff
changeset
|
109 |
if currentbranch in repo.branchmap(): |
28385
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
110 |
heads = repo.branchheads(currentbranch) |
28236
e333cea74741
destutil: use cached branch information instead of query for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28235
diff
changeset
|
111 |
if heads: |
e333cea74741
destutil: use cached branch information instead of query for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28235
diff
changeset
|
112 |
node = repo.revs('max(.::(%ln))', heads).first() |
26725
bde739aced83
destupdate: extract logic based on branch in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26724
diff
changeset
|
113 |
if bookmarks.isactivewdirparent(repo): |
bde739aced83
destupdate: extract logic based on branch in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26724
diff
changeset
|
114 |
movemark = repo['.'].node() |
28924
d9539959167d
update: resurrect bare update from null parent to tip-most branch head
Yuya Nishihara <yuya@tcha.org>
parents:
28903
diff
changeset
|
115 |
elif currentbranch == 'default' and not wc.p1(): |
d9539959167d
update: resurrect bare update from null parent to tip-most branch head
Yuya Nishihara <yuya@tcha.org>
parents:
28903
diff
changeset
|
116 |
# "null" parent belongs to "default" branch, but it doesn't exist, so |
d9539959167d
update: resurrect bare update from null parent to tip-most branch head
Yuya Nishihara <yuya@tcha.org>
parents:
28903
diff
changeset
|
117 |
# update to the tipmost non-closed branch head |
d9539959167d
update: resurrect bare update from null parent to tip-most branch head
Yuya Nishihara <yuya@tcha.org>
parents:
28903
diff
changeset
|
118 |
node = repo.revs('max(head() and not closed())').first() |
28236
e333cea74741
destutil: use cached branch information instead of query for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28235
diff
changeset
|
119 |
else: |
28903
e1dd0de26557
update: fix bare update to work on new branch
liscju <piotr.listkiewicz@gmail.com>
parents:
28684
diff
changeset
|
120 |
node = repo['.'].node() |
26725
bde739aced83
destupdate: extract logic based on branch in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26724
diff
changeset
|
121 |
return node, movemark, None |
bde739aced83
destupdate: extract logic based on branch in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26724
diff
changeset
|
122 |
|
30962
11c253997b0e
destutil: drop now-unused "check" parameter from destupdate()
Martin von Zweigbergk <martinvonz@google.com>
parents:
30961
diff
changeset
|
123 |
def _destupdatebranchfallback(repo, clean): |
28385
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
124 |
"""decide on an update destination from closed heads in current branch""" |
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
125 |
wc = repo[None] |
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
126 |
currentbranch = wc.branch() |
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
127 |
movemark = None |
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
128 |
if currentbranch in repo.branchmap(): |
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
129 |
# here, all descendant branch heads are closed |
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
130 |
heads = repo.branchheads(currentbranch, closed=True) |
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
131 |
assert heads, "any branch has at least one head" |
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
132 |
node = repo.revs('max(.::(%ln))', heads).first() |
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
133 |
assert node is not None, ("any revision has at least " |
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
134 |
"one descendant branch head") |
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
135 |
if bookmarks.isactivewdirparent(repo): |
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
136 |
movemark = repo['.'].node() |
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
137 |
else: |
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
138 |
# here, no "default" branch, and all branches are closed |
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
139 |
node = repo.lookup('tip') |
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
140 |
assert node is not None, "'tip' exists even in empty repository" |
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
141 |
return node, movemark, None |
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
142 |
|
30332
318a24b52eeb
spelling: fixes of non-dictionary words
Mads Kiilerich <madski@unity3d.com>
parents:
29964
diff
changeset
|
143 |
# order in which each step should be evaluated |
26726
8e6649616699
destupdate: have a generic and extensible way to run each step
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26725
diff
changeset
|
144 |
# steps are run until one finds a destination |
28385
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
145 |
destupdatesteps = ['evolution', 'bookmark', 'branch', 'branchfallback'] |
26726
8e6649616699
destupdate: have a generic and extensible way to run each step
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26725
diff
changeset
|
146 |
# mapping to ease extension overriding steps. |
8e6649616699
destupdate: have a generic and extensible way to run each step
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26725
diff
changeset
|
147 |
destupdatestepmap = {'evolution': _destupdateobs, |
8e6649616699
destupdate: have a generic and extensible way to run each step
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26725
diff
changeset
|
148 |
'bookmark': _destupdatebook, |
8e6649616699
destupdate: have a generic and extensible way to run each step
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26725
diff
changeset
|
149 |
'branch': _destupdatebranch, |
28385
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
150 |
'branchfallback': _destupdatebranchfallback, |
26726
8e6649616699
destupdate: have a generic and extensible way to run each step
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26725
diff
changeset
|
151 |
} |
8e6649616699
destupdate: have a generic and extensible way to run each step
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26725
diff
changeset
|
152 |
|
30962
11c253997b0e
destutil: drop now-unused "check" parameter from destupdate()
Martin von Zweigbergk <martinvonz@google.com>
parents:
30961
diff
changeset
|
153 |
def destupdate(repo, clean=False): |
26723
52d08a93de1f
destupdate: extract logic based on obsolescence marker in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26722
diff
changeset
|
154 |
"""destination for bare update operation |
52d08a93de1f
destupdate: extract logic based on obsolescence marker in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26722
diff
changeset
|
155 |
|
52d08a93de1f
destupdate: extract logic based on obsolescence marker in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26722
diff
changeset
|
156 |
return (rev, movemark, activemark) |
52d08a93de1f
destupdate: extract logic based on obsolescence marker in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26722
diff
changeset
|
157 |
|
52d08a93de1f
destupdate: extract logic based on obsolescence marker in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26722
diff
changeset
|
158 |
- rev: the revision to update to, |
52d08a93de1f
destupdate: extract logic based on obsolescence marker in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26722
diff
changeset
|
159 |
- movemark: node to move the active bookmark from |
52d08a93de1f
destupdate: extract logic based on obsolescence marker in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26722
diff
changeset
|
160 |
(cf bookmark.calculate update), |
52d08a93de1f
destupdate: extract logic based on obsolescence marker in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26722
diff
changeset
|
161 |
- activemark: a bookmark to activate at the end of the update. |
52d08a93de1f
destupdate: extract logic based on obsolescence marker in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26722
diff
changeset
|
162 |
""" |
26726
8e6649616699
destupdate: have a generic and extensible way to run each step
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26725
diff
changeset
|
163 |
node = movemark = activemark = None |
26723
52d08a93de1f
destupdate: extract logic based on obsolescence marker in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26722
diff
changeset
|
164 |
|
26726
8e6649616699
destupdate: have a generic and extensible way to run each step
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26725
diff
changeset
|
165 |
for step in destupdatesteps: |
30962
11c253997b0e
destutil: drop now-unused "check" parameter from destupdate()
Martin von Zweigbergk <martinvonz@google.com>
parents:
30961
diff
changeset
|
166 |
node, movemark, activemark = destupdatestepmap[step](repo, clean) |
26726
8e6649616699
destupdate: have a generic and extensible way to run each step
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26725
diff
changeset
|
167 |
if node is not None: |
8e6649616699
destupdate: have a generic and extensible way to run each step
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26725
diff
changeset
|
168 |
break |
26628
45b86dbabbda
destupdate: move the check related to the "clean" logic in the function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
169 |
rev = repo[node].rev() |
45b86dbabbda
destupdate: move the check related to the "clean" logic in the function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26587
diff
changeset
|
170 |
|
26641
5c57d01fe64e
destupdate: also include bookmark related logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26629
diff
changeset
|
171 |
return rev, movemark, activemark |
26714
9903261dcc81
destutil: move default merge destination into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26683
diff
changeset
|
172 |
|
28102
bd74b5e0d2c0
destutil: extract all 'mergedest' abort messages into a dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28065
diff
changeset
|
173 |
msgdestmerge = { |
bd74b5e0d2c0
destutil: extract all 'mergedest' abort messages into a dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28065
diff
changeset
|
174 |
# too many matching divergent bookmark |
bd74b5e0d2c0
destutil: extract all 'mergedest' abort messages into a dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28065
diff
changeset
|
175 |
'toomanybookmarks': |
28137
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
176 |
{'merge': |
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
177 |
(_("multiple matching bookmarks to merge -" |
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
178 |
" please merge with an explicit rev or bookmark"), |
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
179 |
_("run 'hg heads' to see all heads")), |
28189
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
180 |
'rebase': |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
181 |
(_("multiple matching bookmarks to rebase -" |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
182 |
" please rebase to an explicit rev or bookmark"), |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
183 |
_("run 'hg heads' to see all heads")), |
28137
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
184 |
}, |
28102
bd74b5e0d2c0
destutil: extract all 'mergedest' abort messages into a dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28065
diff
changeset
|
185 |
# no other matching divergent bookmark |
bd74b5e0d2c0
destutil: extract all 'mergedest' abort messages into a dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28065
diff
changeset
|
186 |
'nootherbookmarks': |
28137
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
187 |
{'merge': |
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
188 |
(_("no matching bookmark to merge - " |
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
189 |
"please merge with an explicit rev or bookmark"), |
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
190 |
_("run 'hg heads' to see all heads")), |
28189
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
191 |
'rebase': |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
192 |
(_("no matching bookmark to rebase - " |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
193 |
"please rebase to an explicit rev or bookmark"), |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
194 |
_("run 'hg heads' to see all heads")), |
28137
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
195 |
}, |
28102
bd74b5e0d2c0
destutil: extract all 'mergedest' abort messages into a dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28065
diff
changeset
|
196 |
# branch have too many unbookmarked heads, no obvious destination |
bd74b5e0d2c0
destutil: extract all 'mergedest' abort messages into a dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28065
diff
changeset
|
197 |
'toomanyheads': |
28137
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
198 |
{'merge': |
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
199 |
(_("branch '%s' has %d heads - please merge with an explicit rev"), |
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
200 |
_("run 'hg heads .' to see heads")), |
28189
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
201 |
'rebase': |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
202 |
(_("branch '%s' has %d heads - please rebase to an explicit rev"), |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
203 |
_("run 'hg heads .' to see heads")), |
28137
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
204 |
}, |
28102
bd74b5e0d2c0
destutil: extract all 'mergedest' abort messages into a dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28065
diff
changeset
|
205 |
# branch have no other unbookmarked heads |
bd74b5e0d2c0
destutil: extract all 'mergedest' abort messages into a dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28065
diff
changeset
|
206 |
'bookmarkedheads': |
28137
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
207 |
{'merge': |
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
208 |
(_("heads are bookmarked - please merge with an explicit rev"), |
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
209 |
_("run 'hg heads' to see all heads")), |
28189
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
210 |
'rebase': |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
211 |
(_("heads are bookmarked - please rebase to an explicit rev"), |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
212 |
_("run 'hg heads' to see all heads")), |
28137
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
213 |
}, |
28102
bd74b5e0d2c0
destutil: extract all 'mergedest' abort messages into a dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28065
diff
changeset
|
214 |
# branch have just a single heads, but there is other branches |
bd74b5e0d2c0
destutil: extract all 'mergedest' abort messages into a dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28065
diff
changeset
|
215 |
'nootherbranchheads': |
28137
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
216 |
{'merge': |
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
217 |
(_("branch '%s' has one head - please merge with an explicit rev"), |
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
218 |
_("run 'hg heads' to see all heads")), |
28189
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
219 |
'rebase': |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
220 |
(_("branch '%s' has one head - please rebase to an explicit rev"), |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
221 |
_("run 'hg heads' to see all heads")), |
28137
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
222 |
}, |
28102
bd74b5e0d2c0
destutil: extract all 'mergedest' abort messages into a dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28065
diff
changeset
|
223 |
# repository have a single head |
bd74b5e0d2c0
destutil: extract all 'mergedest' abort messages into a dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28065
diff
changeset
|
224 |
'nootherheads': |
28189
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
225 |
{'merge': |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
226 |
(_('nothing to merge'), |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
227 |
None), |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
228 |
'rebase': |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
229 |
(_('nothing to rebase'), |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
230 |
None), |
28137
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
231 |
}, |
28102
bd74b5e0d2c0
destutil: extract all 'mergedest' abort messages into a dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28065
diff
changeset
|
232 |
# repository have a single head and we are not on it |
bd74b5e0d2c0
destutil: extract all 'mergedest' abort messages into a dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28065
diff
changeset
|
233 |
'nootherheadsbehind': |
28137
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
234 |
{'merge': |
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
235 |
(_('nothing to merge'), |
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
236 |
_("use 'hg update' instead")), |
28189
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
237 |
'rebase': |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
238 |
(_('nothing to rebase'), |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
239 |
_("use 'hg update' instead")), |
28137
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
240 |
}, |
28102
bd74b5e0d2c0
destutil: extract all 'mergedest' abort messages into a dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28065
diff
changeset
|
241 |
# We are not on a head |
bd74b5e0d2c0
destutil: extract all 'mergedest' abort messages into a dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28065
diff
changeset
|
242 |
'notatheads': |
28137
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
243 |
{'merge': |
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
244 |
(_('working directory not at a head revision'), |
28189
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
245 |
_("use 'hg update' or merge with an explicit revision")), |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
246 |
'rebase': |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
247 |
(_('working directory not at a head revision'), |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
248 |
_("use 'hg update' or rebase to an explicit revision")) |
28137
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
249 |
}, |
28139
5476a7a039c0
destutil: allow to specify an explicit source for the merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28138
diff
changeset
|
250 |
'emptysourceset': |
5476a7a039c0
destutil: allow to specify an explicit source for the merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28138
diff
changeset
|
251 |
{'merge': |
5476a7a039c0
destutil: allow to specify an explicit source for the merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28138
diff
changeset
|
252 |
(_('source set is empty'), |
28189
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
253 |
None), |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
254 |
'rebase': |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
255 |
(_('source set is empty'), |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
256 |
None), |
28139
5476a7a039c0
destutil: allow to specify an explicit source for the merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28138
diff
changeset
|
257 |
}, |
5476a7a039c0
destutil: allow to specify an explicit source for the merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28138
diff
changeset
|
258 |
'multiplebranchessourceset': |
5476a7a039c0
destutil: allow to specify an explicit source for the merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28138
diff
changeset
|
259 |
{'merge': |
5476a7a039c0
destutil: allow to specify an explicit source for the merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28138
diff
changeset
|
260 |
(_('source set is rooted in multiple branches'), |
28189
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
261 |
None), |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
262 |
'rebase': |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
263 |
(_('rebaseset is rooted in multiple named branches'), |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28161
diff
changeset
|
264 |
_('specify an explicit destination with --dest')), |
28139
5476a7a039c0
destutil: allow to specify an explicit source for the merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28138
diff
changeset
|
265 |
}, |
28137
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
266 |
} |
28102
bd74b5e0d2c0
destutil: extract all 'mergedest' abort messages into a dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28065
diff
changeset
|
267 |
|
29043
cf7de4aeb86b
destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
28924
diff
changeset
|
268 |
def _destmergebook(repo, action='merge', sourceset=None, destspace=None): |
26727
5b7fd48f9868
destmerge: extract logic based on bookmark into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26726
diff
changeset
|
269 |
"""find merge destination in the active bookmark case""" |
5b7fd48f9868
destmerge: extract logic based on bookmark into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26726
diff
changeset
|
270 |
node = None |
32381
b9942bc6b292
localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents:
31025
diff
changeset
|
271 |
bmheads = bookmarks.headsforactive(repo) |
37452
2b38c80557a4
destutil: look up bookmarks only among bookmarks
Martin von Zweigbergk <martinvonz@google.com>
parents:
37390
diff
changeset
|
272 |
curhead = repo._bookmarks[repo._activebookmark] |
26727
5b7fd48f9868
destmerge: extract logic based on bookmark into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26726
diff
changeset
|
273 |
if len(bmheads) == 2: |
5b7fd48f9868
destmerge: extract logic based on bookmark into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26726
diff
changeset
|
274 |
if curhead == bmheads[0]: |
5b7fd48f9868
destmerge: extract logic based on bookmark into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26726
diff
changeset
|
275 |
node = bmheads[1] |
5b7fd48f9868
destmerge: extract logic based on bookmark into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26726
diff
changeset
|
276 |
else: |
5b7fd48f9868
destmerge: extract logic based on bookmark into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26726
diff
changeset
|
277 |
node = bmheads[0] |
5b7fd48f9868
destmerge: extract logic based on bookmark into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26726
diff
changeset
|
278 |
elif len(bmheads) > 2: |
28137
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
279 |
msg, hint = msgdestmerge['toomanybookmarks'][action] |
28141
13bb8de97f87
destutil: add more precise error classes for destmerge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28140
diff
changeset
|
280 |
raise error.ManyMergeDestAbort(msg, hint=hint) |
26727
5b7fd48f9868
destmerge: extract logic based on bookmark into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26726
diff
changeset
|
281 |
elif len(bmheads) <= 1: |
28137
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
282 |
msg, hint = msgdestmerge['nootherbookmarks'][action] |
28141
13bb8de97f87
destutil: add more precise error classes for destmerge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28140
diff
changeset
|
283 |
raise error.NoMergeDestAbort(msg, hint=hint) |
26727
5b7fd48f9868
destmerge: extract logic based on bookmark into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26726
diff
changeset
|
284 |
assert node is not None |
5b7fd48f9868
destmerge: extract logic based on bookmark into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26726
diff
changeset
|
285 |
return node |
5b7fd48f9868
destmerge: extract logic based on bookmark into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26726
diff
changeset
|
286 |
|
29043
cf7de4aeb86b
destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
28924
diff
changeset
|
287 |
def _destmergebranch(repo, action='merge', sourceset=None, onheadcheck=True, |
cf7de4aeb86b
destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
28924
diff
changeset
|
288 |
destspace=None): |
26728
e8f1b7285917
destmerge: extract logic based on branch heads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26727
diff
changeset
|
289 |
"""find merge destination based on branch heads""" |
e8f1b7285917
destmerge: extract logic based on branch heads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26727
diff
changeset
|
290 |
node = None |
28139
5476a7a039c0
destutil: allow to specify an explicit source for the merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28138
diff
changeset
|
291 |
|
5476a7a039c0
destutil: allow to specify an explicit source for the merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28138
diff
changeset
|
292 |
if sourceset is None: |
5476a7a039c0
destutil: allow to specify an explicit source for the merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28138
diff
changeset
|
293 |
sourceset = [repo[repo.dirstate.p1()].rev()] |
5476a7a039c0
destutil: allow to specify an explicit source for the merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28138
diff
changeset
|
294 |
branch = repo.dirstate.branch() |
5476a7a039c0
destutil: allow to specify an explicit source for the merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28138
diff
changeset
|
295 |
elif not sourceset: |
5476a7a039c0
destutil: allow to specify an explicit source for the merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28138
diff
changeset
|
296 |
msg, hint = msgdestmerge['emptysourceset'][action] |
28141
13bb8de97f87
destutil: add more precise error classes for destmerge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28140
diff
changeset
|
297 |
raise error.NoMergeDestAbort(msg, hint=hint) |
28139
5476a7a039c0
destutil: allow to specify an explicit source for the merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28138
diff
changeset
|
298 |
else: |
5476a7a039c0
destutil: allow to specify an explicit source for the merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28138
diff
changeset
|
299 |
branch = None |
5476a7a039c0
destutil: allow to specify an explicit source for the merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28138
diff
changeset
|
300 |
for ctx in repo.set('roots(%ld::%ld)', sourceset, sourceset): |
5476a7a039c0
destutil: allow to specify an explicit source for the merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28138
diff
changeset
|
301 |
if branch is not None and ctx.branch() != branch: |
5476a7a039c0
destutil: allow to specify an explicit source for the merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28138
diff
changeset
|
302 |
msg, hint = msgdestmerge['multiplebranchessourceset'][action] |
28141
13bb8de97f87
destutil: add more precise error classes for destmerge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28140
diff
changeset
|
303 |
raise error.ManyMergeDestAbort(msg, hint=hint) |
28139
5476a7a039c0
destutil: allow to specify an explicit source for the merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28138
diff
changeset
|
304 |
branch = ctx.branch() |
5476a7a039c0
destutil: allow to specify an explicit source for the merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28138
diff
changeset
|
305 |
|
26728
e8f1b7285917
destmerge: extract logic based on branch heads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26727
diff
changeset
|
306 |
bheads = repo.branchheads(branch) |
28161
3324345a498e
destutil: ensure we offer 'hg update' hint when not at head in all cases
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28141
diff
changeset
|
307 |
onhead = repo.revs('%ld and %ln', sourceset, bheads) |
3324345a498e
destutil: ensure we offer 'hg update' hint when not at head in all cases
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28141
diff
changeset
|
308 |
if onheadcheck and not onhead: |
28139
5476a7a039c0
destutil: allow to specify an explicit source for the merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28138
diff
changeset
|
309 |
# Case A: working copy if not on a head. (merge only) |
28105
1fc7b5363871
destutil: document various failure cases
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28104
diff
changeset
|
310 |
# |
1fc7b5363871
destutil: document various failure cases
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28104
diff
changeset
|
311 |
# This is probably a user mistake We bailout pointing at 'hg update' |
28103
7d852bb47b0a
merge: give priority to "not at head" failures for bare 'hg merge'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28102
diff
changeset
|
312 |
if len(repo.heads()) <= 1: |
28137
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
313 |
msg, hint = msgdestmerge['nootherheadsbehind'][action] |
28103
7d852bb47b0a
merge: give priority to "not at head" failures for bare 'hg merge'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28102
diff
changeset
|
314 |
else: |
28137
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
315 |
msg, hint = msgdestmerge['notatheads'][action] |
28103
7d852bb47b0a
merge: give priority to "not at head" failures for bare 'hg merge'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28102
diff
changeset
|
316 |
raise error.Abort(msg, hint=hint) |
28139
5476a7a039c0
destutil: allow to specify an explicit source for the merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28138
diff
changeset
|
317 |
# remove heads descendants of source from the set |
5476a7a039c0
destutil: allow to specify an explicit source for the merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28138
diff
changeset
|
318 |
bheads = list(repo.revs('%ln - (%ld::)', bheads, sourceset)) |
28138
5ad2017454ee
destutil: remove current head from list of candidates early
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28137
diff
changeset
|
319 |
# filters out bookmarked heads |
28139
5476a7a039c0
destutil: allow to specify an explicit source for the merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28138
diff
changeset
|
320 |
nbhs = list(repo.revs('%ld - bookmark()', bheads)) |
29043
cf7de4aeb86b
destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
28924
diff
changeset
|
321 |
|
cf7de4aeb86b
destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
28924
diff
changeset
|
322 |
if destspace is not None: |
cf7de4aeb86b
destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
28924
diff
changeset
|
323 |
# restrict search space |
cf7de4aeb86b
destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
28924
diff
changeset
|
324 |
# used in the 'hg pull --rebase' case, see issue 5214. |
cf7de4aeb86b
destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
28924
diff
changeset
|
325 |
nbhs = list(repo.revs('%ld and %ld', destspace, nbhs)) |
cf7de4aeb86b
destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
28924
diff
changeset
|
326 |
|
28138
5ad2017454ee
destutil: remove current head from list of candidates early
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28137
diff
changeset
|
327 |
if len(nbhs) > 1: |
5ad2017454ee
destutil: remove current head from list of candidates early
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28137
diff
changeset
|
328 |
# Case B: There is more than 1 other anonymous heads |
28105
1fc7b5363871
destutil: document various failure cases
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28104
diff
changeset
|
329 |
# |
1fc7b5363871
destutil: document various failure cases
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28104
diff
changeset
|
330 |
# This means that there will be more than 1 candidate. This is |
1fc7b5363871
destutil: document various failure cases
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28104
diff
changeset
|
331 |
# ambiguous. We abort asking the user to pick as explicit destination |
1fc7b5363871
destutil: document various failure cases
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28104
diff
changeset
|
332 |
# instead. |
28137
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
333 |
msg, hint = msgdestmerge['toomanyheads'][action] |
28138
5ad2017454ee
destutil: remove current head from list of candidates early
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28137
diff
changeset
|
334 |
msg %= (branch, len(bheads) + 1) |
28141
13bb8de97f87
destutil: add more precise error classes for destmerge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28140
diff
changeset
|
335 |
raise error.ManyMergeDestAbort(msg, hint=hint) |
28138
5ad2017454ee
destutil: remove current head from list of candidates early
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28137
diff
changeset
|
336 |
elif not nbhs: |
5ad2017454ee
destutil: remove current head from list of candidates early
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28137
diff
changeset
|
337 |
# Case B: There is no other anonymous heads |
28105
1fc7b5363871
destutil: document various failure cases
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28104
diff
changeset
|
338 |
# |
1fc7b5363871
destutil: document various failure cases
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28104
diff
changeset
|
339 |
# This means that there is no natural candidate to merge with. |
1fc7b5363871
destutil: document various failure cases
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28104
diff
changeset
|
340 |
# We abort, with various messages for various cases. |
28138
5ad2017454ee
destutil: remove current head from list of candidates early
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28137
diff
changeset
|
341 |
if bheads: |
28137
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
342 |
msg, hint = msgdestmerge['bookmarkedheads'][action] |
28102
bd74b5e0d2c0
destutil: extract all 'mergedest' abort messages into a dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28065
diff
changeset
|
343 |
elif len(repo.heads()) > 1: |
28137
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
344 |
msg, hint = msgdestmerge['nootherbranchheads'][action] |
28102
bd74b5e0d2c0
destutil: extract all 'mergedest' abort messages into a dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28065
diff
changeset
|
345 |
msg %= branch |
28161
3324345a498e
destutil: ensure we offer 'hg update' hint when not at head in all cases
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28141
diff
changeset
|
346 |
elif not onhead: |
3324345a498e
destutil: ensure we offer 'hg update' hint when not at head in all cases
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28141
diff
changeset
|
347 |
# if 'onheadcheck == False' (rebase case), |
3324345a498e
destutil: ensure we offer 'hg update' hint when not at head in all cases
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28141
diff
changeset
|
348 |
# this was not caught in Case A. |
3324345a498e
destutil: ensure we offer 'hg update' hint when not at head in all cases
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28141
diff
changeset
|
349 |
msg, hint = msgdestmerge['nootherheadsbehind'][action] |
28102
bd74b5e0d2c0
destutil: extract all 'mergedest' abort messages into a dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28065
diff
changeset
|
350 |
else: |
28137
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
351 |
msg, hint = msgdestmerge['nootherheads'][action] |
28141
13bb8de97f87
destutil: add more precise error classes for destmerge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28140
diff
changeset
|
352 |
raise error.NoMergeDestAbort(msg, hint=hint) |
26728
e8f1b7285917
destmerge: extract logic based on branch heads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26727
diff
changeset
|
353 |
else: |
e8f1b7285917
destmerge: extract logic based on branch heads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26727
diff
changeset
|
354 |
node = nbhs[0] |
e8f1b7285917
destmerge: extract logic based on branch heads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26727
diff
changeset
|
355 |
assert node is not None |
e8f1b7285917
destmerge: extract logic based on branch heads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26727
diff
changeset
|
356 |
return node |
e8f1b7285917
destmerge: extract logic based on branch heads in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26727
diff
changeset
|
357 |
|
29043
cf7de4aeb86b
destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
28924
diff
changeset
|
358 |
def destmerge(repo, action='merge', sourceset=None, onheadcheck=True, |
cf7de4aeb86b
destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
28924
diff
changeset
|
359 |
destspace=None): |
28137
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
360 |
"""return the default destination for a merge |
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
361 |
|
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
362 |
(or raise exception about why it can't pick one) |
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
363 |
|
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
364 |
:action: the action being performed, controls emitted error message |
b54c0246295b
destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28105
diff
changeset
|
365 |
""" |
29043
cf7de4aeb86b
destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
28924
diff
changeset
|
366 |
# destspace is here to work around issues with `hg pull --rebase` see |
cf7de4aeb86b
destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
28924
diff
changeset
|
367 |
# issue5214 for details |
26714
9903261dcc81
destutil: move default merge destination into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26683
diff
changeset
|
368 |
if repo._activebookmark: |
29043
cf7de4aeb86b
destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
28924
diff
changeset
|
369 |
node = _destmergebook(repo, action=action, sourceset=sourceset, |
cf7de4aeb86b
destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
28924
diff
changeset
|
370 |
destspace=destspace) |
26714
9903261dcc81
destutil: move default merge destination into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26683
diff
changeset
|
371 |
else: |
28140
276644ae9e8d
destutil: allow to disable the "on head check" in destmerge
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28139
diff
changeset
|
372 |
node = _destmergebranch(repo, action=action, sourceset=sourceset, |
29043
cf7de4aeb86b
destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
28924
diff
changeset
|
373 |
onheadcheck=onheadcheck, destspace=destspace) |
26714
9903261dcc81
destutil: move default merge destination into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26683
diff
changeset
|
374 |
return repo[node].rev() |
27262
3d0feb2f978b
histedit: pick an appropriate base changeset by default (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26728
diff
changeset
|
375 |
|
3d0feb2f978b
histedit: pick an appropriate base changeset by default (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26728
diff
changeset
|
376 |
def desthistedit(ui, repo): |
3d0feb2f978b
histedit: pick an appropriate base changeset by default (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26728
diff
changeset
|
377 |
"""Default base revision to edit for `hg histedit`.""" |
37003
2987726085c6
histedit: use the new stack definition for histedit
Boris Feld <boris.feld@octobus.net>
parents:
37002
diff
changeset
|
378 |
default = ui.config('histedit', 'defaultrev') |
2987726085c6
histedit: use the new stack definition for histedit
Boris Feld <boris.feld@octobus.net>
parents:
37002
diff
changeset
|
379 |
|
2987726085c6
histedit: use the new stack definition for histedit
Boris Feld <boris.feld@octobus.net>
parents:
37002
diff
changeset
|
380 |
if default is None: |
2987726085c6
histedit: use the new stack definition for histedit
Boris Feld <boris.feld@octobus.net>
parents:
37002
diff
changeset
|
381 |
revs = stack.getstack(repo) |
2987726085c6
histedit: use the new stack definition for histedit
Boris Feld <boris.feld@octobus.net>
parents:
37002
diff
changeset
|
382 |
elif default: |
27559
d13bcc9fd656
destutil: use scmutil.revrange for desthistedit (issue5001)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27333
diff
changeset
|
383 |
revs = scmutil.revrange(repo, [default]) |
41146
fbd168455b26
histedit: crashing with a more useful error message on empty defaultrev
rdamazio@google.com
parents:
37787
diff
changeset
|
384 |
else: |
fbd168455b26
histedit: crashing with a more useful error message on empty defaultrev
rdamazio@google.com
parents:
37787
diff
changeset
|
385 |
raise error.Abort(_("config option histedit.defaultrev can't be empty")) |
37003
2987726085c6
histedit: use the new stack definition for histedit
Boris Feld <boris.feld@octobus.net>
parents:
37002
diff
changeset
|
386 |
|
2987726085c6
histedit: use the new stack definition for histedit
Boris Feld <boris.feld@octobus.net>
parents:
37002
diff
changeset
|
387 |
if revs: |
37390
b95992605ef1
histedit: simplify desthistedit
Boris Feld <boris.feld@octobus.net>
parents:
37375
diff
changeset
|
388 |
# Take the first revision of the revset as the root |
b95992605ef1
histedit: simplify desthistedit
Boris Feld <boris.feld@octobus.net>
parents:
37375
diff
changeset
|
389 |
return revs.min() |
27262
3d0feb2f978b
histedit: pick an appropriate base changeset by default (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26728
diff
changeset
|
390 |
|
3d0feb2f978b
histedit: pick an appropriate base changeset by default (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26728
diff
changeset
|
391 |
return None |
28029
72072cfc7e91
update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27559
diff
changeset
|
392 |
|
33197
c5a07a3abe7d
show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33142
diff
changeset
|
393 |
def stackbase(ui, repo): |
37002
a72198790e15
show: use the new stack definition for show stack
Boris Feld <boris.feld@octobus.net>
parents:
33197
diff
changeset
|
394 |
revs = stack.getstack(repo) |
37004
68fcc5503ec5
stack: return a sorted smartrev by default
Boris Feld <boris.feld@octobus.net>
parents:
37003
diff
changeset
|
395 |
return revs.first() if revs else None |
33197
c5a07a3abe7d
show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33142
diff
changeset
|
396 |
|
28029
72072cfc7e91
update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27559
diff
changeset
|
397 |
def _statusotherbook(ui, repo): |
32381
b9942bc6b292
localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents:
31025
diff
changeset
|
398 |
bmheads = bookmarks.headsforactive(repo) |
37452
2b38c80557a4
destutil: look up bookmarks only among bookmarks
Martin von Zweigbergk <martinvonz@google.com>
parents:
37390
diff
changeset
|
399 |
curhead = repo._bookmarks[repo._activebookmark] |
28029
72072cfc7e91
update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27559
diff
changeset
|
400 |
if repo.revs('%n and parents()', curhead): |
72072cfc7e91
update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27559
diff
changeset
|
401 |
# we are on the active bookmark |
72072cfc7e91
update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27559
diff
changeset
|
402 |
bmheads = [b for b in bmheads if curhead != b] |
72072cfc7e91
update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27559
diff
changeset
|
403 |
if bmheads: |
72072cfc7e91
update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27559
diff
changeset
|
404 |
msg = _('%i other divergent bookmarks for "%s"\n') |
72072cfc7e91
update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27559
diff
changeset
|
405 |
ui.status(msg % (len(bmheads), repo._activebookmark)) |
72072cfc7e91
update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27559
diff
changeset
|
406 |
|
72072cfc7e91
update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27559
diff
changeset
|
407 |
def _statusotherbranchheads(ui, repo): |
72072cfc7e91
update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27559
diff
changeset
|
408 |
currentbranch = repo.dirstate.branch() |
28266
de8b09482fb7
destutil: show message about other branch heads, even if on a closed head
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28236
diff
changeset
|
409 |
allheads = repo.branchheads(currentbranch, closed=True) |
28029
72072cfc7e91
update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27559
diff
changeset
|
410 |
heads = repo.branchheads(currentbranch) |
28266
de8b09482fb7
destutil: show message about other branch heads, even if on a closed head
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28236
diff
changeset
|
411 |
if repo.revs('%ln and parents()', allheads): |
de8b09482fb7
destutil: show message about other branch heads, even if on a closed head
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28236
diff
changeset
|
412 |
# we are on a head, even though it might be closed |
28385
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
413 |
# |
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
414 |
# on closed otherheads |
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
415 |
# ========= ========== |
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
416 |
# o 0 all heads for current branch are closed |
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
417 |
# N only descendant branch heads are closed |
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
418 |
# x 0 there is only one non-closed branch head |
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
419 |
# N there are some non-closed branch heads |
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
420 |
# ========= ========== |
28233
9da2283d0c56
destutil: add new local variable to increase readability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28189
diff
changeset
|
421 |
otherheads = repo.revs('%ln - parents()', heads) |
28385
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
422 |
if repo['.'].closesbranch(): |
28684
1ace17e1e160
destutil: show message and hint at updating to the closed head as warning
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28683
diff
changeset
|
423 |
ui.warn(_('no open descendant heads on branch "%s", ' |
28683
d0210a35c81a
destutil: make messages at updating to the closed head usual form
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28385
diff
changeset
|
424 |
'updating to a closed head\n') % |
d0210a35c81a
destutil: make messages at updating to the closed head usual form
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28385
diff
changeset
|
425 |
(currentbranch)) |
28385
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
426 |
if otherheads: |
29964
40f845537dca
update: use single quotes in use warning
timeless <timeless@mozdev.org>
parents:
29284
diff
changeset
|
427 |
ui.warn(_("(committing will reopen the head, " |
40f845537dca
update: use single quotes in use warning
timeless <timeless@mozdev.org>
parents:
29284
diff
changeset
|
428 |
"use 'hg heads .' to see %i other heads)\n") % |
28683
d0210a35c81a
destutil: make messages at updating to the closed head usual form
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28385
diff
changeset
|
429 |
(len(otherheads))) |
28385
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
430 |
else: |
28684
1ace17e1e160
destutil: show message and hint at updating to the closed head as warning
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28683
diff
changeset
|
431 |
ui.warn(_('(committing will reopen branch "%s")\n') % |
28683
d0210a35c81a
destutil: make messages at updating to the closed head usual form
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28385
diff
changeset
|
432 |
(currentbranch)) |
28385
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
433 |
elif otherheads: |
32698
1b5c61d38a52
update: show the commit to which we updated in case of multiple heads (BC)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32381
diff
changeset
|
434 |
curhead = repo['.'] |
1b5c61d38a52
update: show the commit to which we updated in case of multiple heads (BC)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32381
diff
changeset
|
435 |
ui.status(_('updated to "%s: %s"\n') % (curhead, |
1b5c61d38a52
update: show the commit to which we updated in case of multiple heads (BC)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32381
diff
changeset
|
436 |
curhead.description().split('\n')[0])) |
28029
72072cfc7e91
update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27559
diff
changeset
|
437 |
ui.status(_('%i other heads for branch "%s"\n') % |
28233
9da2283d0c56
destutil: add new local variable to increase readability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28189
diff
changeset
|
438 |
(len(otherheads), currentbranch)) |
28029
72072cfc7e91
update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27559
diff
changeset
|
439 |
|
72072cfc7e91
update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27559
diff
changeset
|
440 |
def statusotherdests(ui, repo): |
72072cfc7e91
update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27559
diff
changeset
|
441 |
"""Print message about other head""" |
72072cfc7e91
update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27559
diff
changeset
|
442 |
# XXX we should probably include a hint: |
72072cfc7e91
update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27559
diff
changeset
|
443 |
# - about what to do |
72072cfc7e91
update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27559
diff
changeset
|
444 |
# - how to see such heads |
72072cfc7e91
update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27559
diff
changeset
|
445 |
if repo._activebookmark: |
72072cfc7e91
update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27559
diff
changeset
|
446 |
_statusotherbook(ui, repo) |
72072cfc7e91
update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27559
diff
changeset
|
447 |
else: |
72072cfc7e91
update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27559
diff
changeset
|
448 |
_statusotherbranchheads(ui, repo) |