annotate mercurial/destutil.py @ 45095:8e04607023e5

procutil: ensure that procutil.std{out,err}.write() writes all bytes Python 3 offers different kind of streams and it’s not guaranteed for all of them that calling write() writes all bytes. When Python is started in unbuffered mode, sys.std{out,err}.buffer are instances of io.FileIO, whose write() can write less bytes for platform-specific reasons (e.g. Linux has a 0x7ffff000 bytes maximum and could write less if interrupted by a signal; when writing to Windows consoles, it’s limited to 32767 bytes to avoid the "not enough space" error). This can lead to silent loss of data, both when using sys.std{out,err}.buffer (which may in fact not be a buffered stream) and when using the text streams sys.std{out,err} (I’ve created a CPython bug report for that: https://bugs.python.org/issue41221). Python may fix the problem at some point. For now, we implement our own wrapper for procutil.std{out,err} that calls the raw stream’s write() method until all bytes have been written. We don’t use sys.std{out,err} for larger writes, so I think it’s not worth the effort to patch them.
author Manuel Jacob <me@manueljacob.de>
date Fri, 10 Jul 2020 12:27:58 +0200
parents 8ff1ecfadcd1
children c7abdbc8fd47
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 _
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
11 from . import bookmarks, error, obsutil, scmutil, stack
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
12
26569
2aeeef1dc9a5 update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
13
37787
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37452
diff changeset
14 def orphanpossibledestination(repo, rev):
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37452
diff changeset
15 """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
16
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37452
diff changeset
17 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
18 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
19 it'll return nothing.
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37452
diff changeset
20 """
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37452
diff changeset
21 tonode = repo.changelog.node
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37452
diff changeset
22 parents = repo.changelog.parentrevs
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37452
diff changeset
23 torev = repo.changelog.rev
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37452
diff changeset
24 dest = set()
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37452
diff changeset
25 tovisit = list(parents(rev))
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37452
diff changeset
26 while tovisit:
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37452
diff changeset
27 r = tovisit.pop()
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37452
diff changeset
28 succsets = obsutil.successorssets(repo, tonode(r))
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37452
diff changeset
29 if not succsets:
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37452
diff changeset
30 # 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
31 # 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
32 # some successors.
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37452
diff changeset
33 tovisit.extend(parents(r))
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37452
diff changeset
34 else:
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37452
diff changeset
35 # 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
36 # (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
37 # 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
38 # 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
39 # reside on multiple branches.
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37452
diff changeset
40 for ss in succsets:
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37452
diff changeset
41 for n in ss:
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37452
diff changeset
42 dr = torev(n)
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37452
diff changeset
43 if dr != -1:
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37452
diff changeset
44 dest.add(dr)
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37452
diff changeset
45 return dest
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37452
diff changeset
46
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
47
30962
11c253997b0e destutil: drop now-unused "check" parameter from destupdate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30961
diff changeset
48 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
49 """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
50 node = None
2aeeef1dc9a5 update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
51 wc = repo[None]
2aeeef1dc9a5 update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
52 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
53 movemark = None
26569
2aeeef1dc9a5 update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
54
2aeeef1dc9a5 update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
55 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
56 # 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
57 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
58
2aeeef1dc9a5 update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
59 # 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
60 #
2aeeef1dc9a5 update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
61 # 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
62 # 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
63 # (i.e. 'tip')
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 # 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
66 # is no conflict
2aeeef1dc9a5 update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
67 #
2aeeef1dc9a5 update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
68 # 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
69 # 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
70 # 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
71
2aeeef1dc9a5 update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
72 if successors:
2aeeef1dc9a5 update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
73 # 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
74 # 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
75 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
76
2aeeef1dc9a5 update: move default destination computation to a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
77 # 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
78 # i.e. the 'tip' of a set
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
79 node = repo.revs(b'max(%ln)', successors).first()
26722
6cd643a1d32c destupdate: move obsolete handling first
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26721
diff changeset
80 if bookmarks.isactivewdirparent(repo):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
81 movemark = repo[b'.'].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
82 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
83
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
84
30962
11c253997b0e destutil: drop now-unused "check" parameter from destupdate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30961
diff changeset
85 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
86 """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
87 # 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
88 node = None
37375
a973bb92ab71 bookmarks: drop always-None argument from calculateupdate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37359
diff changeset
89 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
90 if activemark is not None:
37452
2b38c80557a4 destutil: look up bookmarks only among bookmarks
Martin von Zweigbergk <martinvonz@google.com>
parents: 37390
diff changeset
91 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
92 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
93
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
94
30962
11c253997b0e destutil: drop now-unused "check" parameter from destupdate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30961
diff changeset
95 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
96 """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
97
3f9e25a42e69 destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28266
diff changeset
98 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
99 """
26725
bde739aced83 destupdate: extract logic based on branch in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26724
diff changeset
100 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
101 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
102 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
103
1c7167009936 update: fix bare --clean to work on new branch (issue5003) (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 29043
diff changeset
104 if clean:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
105 currentbranch = repo[b'.'].branch()
29284
1c7167009936 update: fix bare --clean to work on new branch (issue5003) (BC)
liscju <piotr.listkiewicz@gmail.com>
parents: 29043
diff changeset
106
28236
e333cea74741 destutil: use cached branch information instead of query for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28235
diff changeset
107 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
108 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
109 if heads:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
110 node = repo.revs(b'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
111 if bookmarks.isactivewdirparent(repo):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
112 movemark = repo[b'.'].node()
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
113 elif currentbranch == b'default' and not wc.p1():
28924
d9539959167d update: resurrect bare update from null parent to tip-most branch head
Yuya Nishihara <yuya@tcha.org>
parents: 28903
diff changeset
114 # "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
115 # update to the tipmost non-closed branch head
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
116 node = repo.revs(b'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
117 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
118 node = repo[b'.'].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
119 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
120
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
121
30962
11c253997b0e destutil: drop now-unused "check" parameter from destupdate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30961
diff changeset
122 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
123 """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
124 wc = repo[None]
3f9e25a42e69 destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28266
diff changeset
125 currentbranch = wc.branch()
3f9e25a42e69 destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28266
diff changeset
126 movemark = None
3f9e25a42e69 destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28266
diff changeset
127 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
128 # 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
129 heads = repo.branchheads(currentbranch, closed=True)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
130 assert heads, b"any branch has at least one head"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
131 node = repo.revs(b'max(.::(%ln))', heads).first()
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43114
diff changeset
132 assert (
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43114
diff changeset
133 node is not None
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43114
diff changeset
134 ), b"any revision has at least one descendant branch head"
28385
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):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
136 movemark = repo[b'.'].node()
28385
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
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
139 node = repo.lookup(b'tip')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
140 assert node is not None, b"'tip' exists even in empty repository"
28385
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
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
143
30332
318a24b52eeb spelling: fixes of non-dictionary words
Mads Kiilerich <madski@unity3d.com>
parents: 29964
diff changeset
144 # 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
145 # steps are run until one finds a destination
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
146 destupdatesteps = [b'evolution', b'bookmark', b'branch', b'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
147 # mapping to ease extension overriding steps.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
148 destupdatestepmap = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
149 b'evolution': _destupdateobs,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
150 b'bookmark': _destupdatebook,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
151 b'branch': _destupdatebranch,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
152 b'branchfallback': _destupdatebranchfallback,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
153 }
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
154
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
155
30962
11c253997b0e destutil: drop now-unused "check" parameter from destupdate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30961
diff changeset
156 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
157 """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
158
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 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
160
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 - 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
162 - 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
163 (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
164 - 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
165 """
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
166 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
167
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
168 for step in destupdatesteps:
30962
11c253997b0e destutil: drop now-unused "check" parameter from destupdate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 30961
diff changeset
169 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
170 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
171 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
172 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
173
26641
5c57d01fe64e destupdate: also include bookmark related logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26629
diff changeset
174 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
175
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
176
28102
bd74b5e0d2c0 destutil: extract all 'mergedest' abort messages into a dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28065
diff changeset
177 msgdestmerge = {
bd74b5e0d2c0 destutil: extract all 'mergedest' abort messages into a dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28065
diff changeset
178 # too many matching divergent bookmark
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
179 b'toomanybookmarks': {
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
180 b'merge': (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
181 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
182 b"multiple matching bookmarks to merge -"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
183 b" please merge with an explicit rev or bookmark"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
184 ),
43114
8197b395710e destutil: provide hint on rebase+merge for how to specify destination/rev
Kyle Lippincott <spectral@google.com>
parents: 43077
diff changeset
185 _(b"run 'hg heads' to see all heads, specify rev with -r"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
186 ),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
187 b'rebase': (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
188 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
189 b"multiple matching bookmarks to rebase -"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
190 b" please rebase to an explicit rev or bookmark"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
191 ),
43114
8197b395710e destutil: provide hint on rebase+merge for how to specify destination/rev
Kyle Lippincott <spectral@google.com>
parents: 43077
diff changeset
192 _(b"run 'hg heads' to see all heads, specify destination with -d"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
193 ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
194 },
28102
bd74b5e0d2c0 destutil: extract all 'mergedest' abort messages into a dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28065
diff changeset
195 # no other matching divergent bookmark
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
196 b'nootherbookmarks': {
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
197 b'merge': (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
198 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
199 b"no matching bookmark to merge - "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
200 b"please merge with an explicit rev or bookmark"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
201 ),
43114
8197b395710e destutil: provide hint on rebase+merge for how to specify destination/rev
Kyle Lippincott <spectral@google.com>
parents: 43077
diff changeset
202 _(b"run 'hg heads' to see all heads, specify rev with -r"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
203 ),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
204 b'rebase': (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
205 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
206 b"no matching bookmark to rebase - "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
207 b"please rebase to an explicit rev or bookmark"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
208 ),
43114
8197b395710e destutil: provide hint on rebase+merge for how to specify destination/rev
Kyle Lippincott <spectral@google.com>
parents: 43077
diff changeset
209 _(b"run 'hg heads' to see all heads, specify destination with -d"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
210 ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
211 },
28102
bd74b5e0d2c0 destutil: extract all 'mergedest' abort messages into a dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28065
diff changeset
212 # branch have too many unbookmarked heads, no obvious destination
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
213 b'toomanyheads': {
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
214 b'merge': (
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
215 _(b"branch '%s' has %d heads - please merge with an explicit rev"),
43114
8197b395710e destutil: provide hint on rebase+merge for how to specify destination/rev
Kyle Lippincott <spectral@google.com>
parents: 43077
diff changeset
216 _(b"run 'hg heads .' to see heads, specify rev with -r"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
217 ),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
218 b'rebase': (
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
219 _(b"branch '%s' has %d heads - please rebase to an explicit rev"),
43114
8197b395710e destutil: provide hint on rebase+merge for how to specify destination/rev
Kyle Lippincott <spectral@google.com>
parents: 43077
diff changeset
220 _(b"run 'hg heads .' to see heads, specify destination with -d"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
221 ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
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 # branch have no other unbookmarked heads
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
224 b'bookmarkedheads': {
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
225 b'merge': (
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
226 _(b"heads are bookmarked - please merge with an explicit rev"),
43114
8197b395710e destutil: provide hint on rebase+merge for how to specify destination/rev
Kyle Lippincott <spectral@google.com>
parents: 43077
diff changeset
227 _(b"run 'hg heads' to see all heads, specify rev with -r"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
228 ),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
229 b'rebase': (
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
230 _(b"heads are bookmarked - please rebase to an explicit rev"),
43114
8197b395710e destutil: provide hint on rebase+merge for how to specify destination/rev
Kyle Lippincott <spectral@google.com>
parents: 43077
diff changeset
231 _(b"run 'hg heads' to see all heads, specify destination with -d"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
232 ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
233 },
28102
bd74b5e0d2c0 destutil: extract all 'mergedest' abort messages into a dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28065
diff changeset
234 # branch have just a single heads, but there is other branches
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
235 b'nootherbranchheads': {
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
236 b'merge': (
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
237 _(b"branch '%s' has one head - please merge with an explicit rev"),
43114
8197b395710e destutil: provide hint on rebase+merge for how to specify destination/rev
Kyle Lippincott <spectral@google.com>
parents: 43077
diff changeset
238 _(b"run 'hg heads' to see all heads, specify rev with -r"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
239 ),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
240 b'rebase': (
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
241 _(b"branch '%s' has one head - please rebase to an explicit rev"),
43114
8197b395710e destutil: provide hint on rebase+merge for how to specify destination/rev
Kyle Lippincott <spectral@google.com>
parents: 43077
diff changeset
242 _(b"run 'hg heads' to see all heads, specify destination with -d"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
243 ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
244 },
28102
bd74b5e0d2c0 destutil: extract all 'mergedest' abort messages into a dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28065
diff changeset
245 # repository have a single head
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
246 b'nootherheads': {
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
247 b'merge': (_(b'nothing to merge'), None),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
248 b'rebase': (_(b'nothing to rebase'), None),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
249 },
28102
bd74b5e0d2c0 destutil: extract all 'mergedest' abort messages into a dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28065
diff changeset
250 # repository have a single head and we are not on it
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
251 b'nootherheadsbehind': {
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
252 b'merge': (_(b'nothing to merge'), _(b"use 'hg update' instead")),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
253 b'rebase': (_(b'nothing to rebase'), _(b"use 'hg update' instead")),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
254 },
28102
bd74b5e0d2c0 destutil: extract all 'mergedest' abort messages into a dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28065
diff changeset
255 # We are not on a head
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
256 b'notatheads': {
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
257 b'merge': (
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
258 _(b'working directory not at a head revision'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
259 _(b"use 'hg update' or merge with an explicit revision"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
260 ),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
261 b'rebase': (
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
262 _(b'working directory not at a head revision'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
263 _(b"use 'hg update' or rebase to an explicit revision"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
264 ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
265 },
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
266 b'emptysourceset': {
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
267 b'merge': (_(b'source set is empty'), None),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
268 b'rebase': (_(b'source set is empty'), None),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
269 },
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
270 b'multiplebranchessourceset': {
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
271 b'merge': (_(b'source set is rooted in multiple branches'), None),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
272 b'rebase': (
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
273 _(b'rebaseset is rooted in multiple named branches'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
274 _(b'specify an explicit destination with --dest'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
275 ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
276 },
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
277 }
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
278
28102
bd74b5e0d2c0 destutil: extract all 'mergedest' abort messages into a dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28065
diff changeset
279
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
280 def _destmergebook(repo, action=b'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
281 """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
282 node = None
32381
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31025
diff changeset
283 bmheads = bookmarks.headsforactive(repo)
37452
2b38c80557a4 destutil: look up bookmarks only among bookmarks
Martin von Zweigbergk <martinvonz@google.com>
parents: 37390
diff changeset
284 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
285 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
286 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
287 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
288 else:
5b7fd48f9868 destmerge: extract logic based on bookmark into its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26726
diff changeset
289 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
290 elif len(bmheads) > 2:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
291 msg, hint = msgdestmerge[b'toomanybookmarks'][action]
28141
13bb8de97f87 destutil: add more precise error classes for destmerge
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28140
diff changeset
292 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
293 elif len(bmheads) <= 1:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
294 msg, hint = msgdestmerge[b'nootherbookmarks'][action]
28141
13bb8de97f87 destutil: add more precise error classes for destmerge
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28140
diff changeset
295 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
296 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
297 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
298
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
299
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
300 def _destmergebranch(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
301 repo, action=b'merge', sourceset=None, onheadcheck=True, destspace=None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
302 ):
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
303 """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
304 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
305
5476a7a039c0 destutil: allow to specify an explicit source for the merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28138
diff changeset
306 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
307 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
308 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
309 elif not sourceset:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
310 msg, hint = msgdestmerge[b'emptysourceset'][action]
28141
13bb8de97f87 destutil: add more precise error classes for destmerge
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28140
diff changeset
311 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
312 else:
5476a7a039c0 destutil: allow to specify an explicit source for the merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28138
diff changeset
313 branch = None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
314 for ctx in repo.set(b'roots(%ld::%ld)', sourceset, sourceset):
28139
5476a7a039c0 destutil: allow to specify an explicit source for the merge
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28138
diff changeset
315 if branch is not None and ctx.branch() != branch:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
316 msg, hint = msgdestmerge[b'multiplebranchessourceset'][action]
28141
13bb8de97f87 destutil: add more precise error classes for destmerge
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28140
diff changeset
317 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
318 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
319
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
320 bheads = repo.branchheads(branch)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
321 onhead = repo.revs(b'%ld and %ln', sourceset, bheads)
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
322 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
323 # 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
324 #
1fc7b5363871 destutil: document various failure cases
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28104
diff changeset
325 # 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
326 if len(repo.heads()) <= 1:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
327 msg, hint = msgdestmerge[b'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
328 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
329 msg, hint = msgdestmerge[b'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
330 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
331 # remove heads descendants of source from the set
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
332 bheads = list(repo.revs(b'%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
333 # filters out bookmarked heads
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
334 nbhs = list(repo.revs(b'%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
335
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
336 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
337 # 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
338 # used in the 'hg pull --rebase' case, see issue 5214.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
339 nbhs = list(repo.revs(b'%ld and %ld', destspace, nbhs))
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
340
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 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
342 # 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
343 #
1fc7b5363871 destutil: document various failure cases
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28104
diff changeset
344 # 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
345 # 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
346 # instead.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
347 msg, hint = msgdestmerge[b'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
348 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
349 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
350 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
351 # 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
352 #
1fc7b5363871 destutil: document various failure cases
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28104
diff changeset
353 # 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
354 # 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
355 if bheads:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
356 msg, hint = msgdestmerge[b'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
357 elif len(repo.heads()) > 1:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
358 msg, hint = msgdestmerge[b'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
359 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
360 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
361 # 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
362 # this was not caught in Case A.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
363 msg, hint = msgdestmerge[b'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
364 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
365 msg, hint = msgdestmerge[b'nootherheads'][action]
28141
13bb8de97f87 destutil: add more precise error classes for destmerge
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28140
diff changeset
366 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
367 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
368 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
369 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
370 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
371
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
372
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
373 def destmerge(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
374 repo, action=b'merge', sourceset=None, onheadcheck=True, destspace=None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
375 ):
28137
b54c0246295b destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28105
diff changeset
376 """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
377
b54c0246295b destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28105
diff changeset
378 (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
379
b54c0246295b destutil: add an 'action' layer to the destmerge message dictionary
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28105
diff changeset
380 :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
381 """
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
382 # 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
383 # 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
384 if repo._activebookmark:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
385 node = _destmergebook(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
386 repo, action=action, sourceset=sourceset, destspace=destspace
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
387 )
26714
9903261dcc81 destutil: move default merge destination into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26683
diff changeset
388 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
389 node = _destmergebranch(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
390 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
391 action=action,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
392 sourceset=sourceset,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
393 onheadcheck=onheadcheck,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
394 destspace=destspace,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
395 )
26714
9903261dcc81 destutil: move default merge destination into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26683
diff changeset
396 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
397
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
398
27262
3d0feb2f978b histedit: pick an appropriate base changeset by default (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26728
diff changeset
399 def desthistedit(ui, repo):
3d0feb2f978b histedit: pick an appropriate base changeset by default (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26728
diff changeset
400 """Default base revision to edit for `hg histedit`."""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
401 default = ui.config(b'histedit', b'defaultrev')
37003
2987726085c6 histedit: use the new stack definition for histedit
Boris Feld <boris.feld@octobus.net>
parents: 37002
diff changeset
402
2987726085c6 histedit: use the new stack definition for histedit
Boris Feld <boris.feld@octobus.net>
parents: 37002
diff changeset
403 if default is None:
2987726085c6 histedit: use the new stack definition for histedit
Boris Feld <boris.feld@octobus.net>
parents: 37002
diff changeset
404 revs = stack.getstack(repo)
2987726085c6 histedit: use the new stack definition for histedit
Boris Feld <boris.feld@octobus.net>
parents: 37002
diff changeset
405 elif default:
27559
d13bcc9fd656 destutil: use scmutil.revrange for desthistedit (issue5001)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27333
diff changeset
406 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
407 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
408 raise error.Abort(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
409 _(b"config option histedit.defaultrev can't be empty")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
410 )
37003
2987726085c6 histedit: use the new stack definition for histedit
Boris Feld <boris.feld@octobus.net>
parents: 37002
diff changeset
411
2987726085c6 histedit: use the new stack definition for histedit
Boris Feld <boris.feld@octobus.net>
parents: 37002
diff changeset
412 if revs:
37390
b95992605ef1 histedit: simplify desthistedit
Boris Feld <boris.feld@octobus.net>
parents: 37375
diff changeset
413 # Take the first revision of the revset as the root
b95992605ef1 histedit: simplify desthistedit
Boris Feld <boris.feld@octobus.net>
parents: 37375
diff changeset
414 return revs.min()
27262
3d0feb2f978b histedit: pick an appropriate base changeset by default (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26728
diff changeset
415
3d0feb2f978b histedit: pick an appropriate base changeset by default (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26728
diff changeset
416 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
417
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
418
33197
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33142
diff changeset
419 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
420 revs = stack.getstack(repo)
37004
68fcc5503ec5 stack: return a sorted smartrev by default
Boris Feld <boris.feld@octobus.net>
parents: 37003
diff changeset
421 return revs.first() if revs else None
33197
c5a07a3abe7d show: implement "stack" view
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33142
diff changeset
422
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
423
28029
72072cfc7e91 update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27559
diff changeset
424 def _statusotherbook(ui, repo):
32381
b9942bc6b292 localrepo: extract bookmarkheads method to bookmarks.py
Augie Fackler <augie@google.com>
parents: 31025
diff changeset
425 bmheads = bookmarks.headsforactive(repo)
37452
2b38c80557a4 destutil: look up bookmarks only among bookmarks
Martin von Zweigbergk <martinvonz@google.com>
parents: 37390
diff changeset
426 curhead = repo._bookmarks[repo._activebookmark]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
427 if repo.revs(b'%n and parents()', curhead):
28029
72072cfc7e91 update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27559
diff changeset
428 # 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
429 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
430 if bmheads:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
431 msg = _(b'%i other divergent bookmarks for "%s"\n')
28029
72072cfc7e91 update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27559
diff changeset
432 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
433
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
434
28029
72072cfc7e91 update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27559
diff changeset
435 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
436 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
437 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
438 heads = repo.branchheads(currentbranch)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
439 if repo.revs(b'%ln and parents()', allheads):
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
440 # 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
441 #
3f9e25a42e69 destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28266
diff changeset
442 # on closed otherheads
3f9e25a42e69 destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28266
diff changeset
443 # ========= ==========
3f9e25a42e69 destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28266
diff changeset
444 # 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
445 # 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
446 # 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
447 # 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
448 # ========= ==========
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
449 otherheads = repo.revs(b'%ln - parents()', heads)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
450 if repo[b'.'].closesbranch():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
451 ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
452 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
453 b'no open descendant heads on branch "%s", '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
454 b'updating to a closed head\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
455 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
456 % currentbranch
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
457 )
28385
3f9e25a42e69 destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28266
diff changeset
458 if otherheads:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
459 ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
460 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
461 b"(committing will reopen the head, "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
462 b"use 'hg heads .' to see %i other heads)\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
463 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
464 % (len(otherheads))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
465 )
28385
3f9e25a42e69 destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28266
diff changeset
466 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
467 ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
468 _(b'(committing will reopen branch "%s")\n') % currentbranch
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
469 )
28385
3f9e25a42e69 destutil: choose non-closed branch head at first (BC)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28266
diff changeset
470 elif otherheads:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
471 curhead = repo[b'.']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
472 ui.status(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
473 _(b'updated to "%s: %s"\n')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
474 % (curhead, curhead.description().split(b'\n')[0])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
475 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
476 ui.status(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
477 _(b'%i other heads for branch "%s"\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
478 % (len(otherheads), currentbranch)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
479 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41146
diff changeset
480
28029
72072cfc7e91 update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27559
diff changeset
481
72072cfc7e91 update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27559
diff changeset
482 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
483 """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
484 # 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
485 # - 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
486 # - 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
487 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
488 _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
489 else:
72072cfc7e91 update: warn about other topological heads on bare update
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27559
diff changeset
490 _statusotherbranchheads(ui, repo)