Mercurial > hg
annotate mercurial/destutil.py @ 39559:07b58266bce3
wireprotov2: implement commands as a generator of objects
Previously, wire protocol version 2 inherited version 1's model of
having separate types to represent the results of different wire
protocol commands.
As I implemented more powerful commands in future commits, I found
I was using a common pattern of returning a special type to hold a
generator. This meant the command function required a closure to
do most of the work. That made logic flow more difficult to follow.
I also noticed that many commands were effectively a sequence of
objects to be CBOR encoded.
I think it makes sense to define version 2 commands as generators.
This way, commands can simply emit the data structures they wish to
send to the client. This eliminates the need for a closure in
command functions and removes encoding from the bodies of commands.
As part of this commit, the handling of response objects has been
moved into the serverreactor class. This puts the reactor in the
driver's seat with regards to CBOR encoding and error handling.
Having error handling in the function that emits frames is
particularly important because exceptions in that function can lead
to things getting in a bad state: I'm fairly certain that uncaught
exceptions in the frame generator were causing deadlocks.
I also introduced a dedicated error type for explicit error reporting
in command handlers. This will be used in subsequent commits.
There's still a bit of work to be done here, especially around
formalizing the error handling "protocol." I've added yet another
TODO to track this so we don't forget.
Test output changed because we're using generators and no longer know
we are at the end of the data until we hit the end of the generator.
This means we can't emit the end-of-stream flag until we've exhausted
the generator. Hence the introduction of 0-sized end-of-stream frames.
Differential Revision: https://phab.mercurial-scm.org/D4472
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Wed, 05 Sep 2018 09:06:40 -0700 |
parents | 92213f6745ed |
children | fbd168455b26 |
rev | line source |
---|---|
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]) |
37003
2987726085c6
histedit: use the new stack definition for histedit
Boris Feld <boris.feld@octobus.net>
parents:
37002
diff
changeset
|
384 |
2987726085c6
histedit: use the new stack definition for histedit
Boris Feld <boris.feld@octobus.net>
parents:
37002
diff
changeset
|
385 if revs: |
37390
b95992605ef1
histedit: simplify desthistedit
Boris Feld <boris.feld@octobus.net>
parents:
37375
diff
changeset
|
386 # Take the first revision of the revset as the root |
b95992605ef1
histedit: simplify desthistedit
Boris Feld <boris.feld@octobus.net>
parents:
37375
diff
changeset
|
387 return revs.min() |
27262
3d0feb2f978b
histedit: pick an appropriate base changeset by default (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26728
diff
changeset
|
388 |
3d0feb2f978b
histedit: pick an appropriate base changeset by default (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26728
diff
changeset
|
389 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
|
390 |
33197
c5a07a3abe7d
show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33142
diff
changeset
|
391 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
|
392 revs = stack.getstack(repo) |
37004
68fcc5503ec5
stack: return a sorted smartrev by default
Boris Feld <boris.feld@octobus.net>
parents:
37003
diff
changeset
|
393 return revs.first() if revs else None |
33197
c5a07a3abe7d
show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents:
33142
diff
changeset
|
394 |
28029
72072cfc7e91
update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27559
diff
changeset
|
395 def _statusotherbook(ui, repo): |
32381
b9942bc6b292
localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents:
31025
diff
changeset
|
396 bmheads = bookmarks.headsforactive(repo) |
37452
2b38c80557a4
destutil: look up bookmarks only among bookmarks
Martin von Zweigbergk <martinvonz@google.com>
parents:
37390
diff
changeset
|
397 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
|
398 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
|
399 # 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
|
400 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
|
401 if bmheads: |
72072cfc7e91
update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27559
diff
changeset
|
402 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
|
403 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
|
404 |
72072cfc7e91
update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27559
diff
changeset
|
405 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
|
406 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
|
407 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
|
408 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
|
409 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
|
410 # 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
|
411 # |
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
412 # on closed otherheads |
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 # 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
|
415 # 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
|
416 # 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
|
417 # 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
|
418 # ========= ========== |
28233
9da2283d0c56
destutil: add new local variable to increase readability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28189
diff
changeset
|
419 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
|
420 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
|
421 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
|
422 '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
|
423 (currentbranch)) |
28385
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
424 if otherheads: |
29964
40f845537dca
update: use single quotes in use warning
timeless <timeless@mozdev.org>
parents:
29284
diff
changeset
|
425 ui.warn(_("(committing will reopen the head, " |
40f845537dca
update: use single quotes in use warning
timeless <timeless@mozdev.org>
parents:
29284
diff
changeset
|
426 "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
|
427 (len(otherheads))) |
28385
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
428 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
|
429 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
|
430 (currentbranch)) |
28385
3f9e25a42e69
destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28266
diff
changeset
|
431 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
|
432 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
|
433 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
|
434 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
|
435 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
|
436 (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
|
437 |
72072cfc7e91
update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27559
diff
changeset
|
438 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
|
439 """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
|
440 # 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
|
441 # - 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
|
442 # - 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
|
443 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
|
444 _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
|
445 else: |
72072cfc7e91
update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
27559
diff
changeset
|
446 _statusotherbranchheads(ui, repo) |