annotate hgext/rebase.py @ 37787:92213f6745ed

rebase: introduce support for automatically rebasing orphan changes _destautorebase(SRC) is based on the _destrestack(SRC) revset from fbamend. The supporting _possibledestination function is extracted from evolve, with minor cleanups. We've considered some alternatives here: * This change, but with --auto as the flag name. We're hedging our bets on this a little in this change so that if this ends up being the wrong direction we haven't burned the valauble --auto name on rebase. * --destination auto: I've got reservations about the discoverability of this, and we don't currently have a good story for a revset alias of sorts that changes behavior depending on the context in which it's used. * A "rebase presets" feature, where we could use the currently-an-error positional argument space for the rebase command to define presets, so that users could define a 'linearize' preset that specifies --revision='orphan()-obsolete()' and --dest=_destautoorphanrebase(SRC). Personally, I find the third option somewhat appealing, but am hesitant to "spend" the functionality space of positional arguments to the rebase command. We should revisit the way we expose this functionality sometime in the 4.7 cycle once we've had a chance to vet the implementation of the functionality. Differential Revision: https://phab.mercurial-scm.org/D2668
author Augie Fackler <augie@google.com>
date Sun, 04 Mar 2018 15:29:41 -0500
parents 953db9e00eeb
children 46e8abc4eb04 69d1cafe75f2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1 # rebase.py - rebasing feature for mercurial
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
2 #
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
3 # Copyright 2008 Stefano Tortarolo <stefano.tortarolo at gmail dot com>
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
4 #
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8222
diff changeset
5 # This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9815
diff changeset
6 # GNU General Public License version 2 or any later version.
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
7
8934
9dda4c73fc3b extensions: change descriptions for extensions providing a few commands
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8706
diff changeset
8 '''command to move sets of revisions to a different ancestor
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
9
7999
b25110140573 rebase: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7955
diff changeset
10 This extension lets you rebase changesets in an existing Mercurial
b25110140573 rebase: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7955
diff changeset
11 repository.
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
12
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
13 For more information:
26421
4b0fc75f9403 urls: bulk-change primary website URLs
Matt Mackall <mpm@selenic.com>
parents: 26360
diff changeset
14 https://mercurial-scm.org/wiki/RebaseExtension
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
15 '''
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
16
29128
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
17 from __future__ import absolute_import
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
18
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
19 import errno
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
20 import os
29205
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 29128
diff changeset
21
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 29128
diff changeset
22 from mercurial.i18n import _
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 29128
diff changeset
23 from mercurial.node import (
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 29128
diff changeset
24 nullrev,
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 29128
diff changeset
25 short,
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 29128
diff changeset
26 )
29128
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
27 from mercurial import (
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
28 bookmarks,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
29 cmdutil,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
30 commands,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
31 copies,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
32 destutil,
30490
ee2097c560c1 rebase: refer to dirstateguard by its new name
Augie Fackler <augie@google.com>
parents: 30459
diff changeset
33 dirstateguard,
29128
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
34 error,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
35 extensions,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
36 hg,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
37 lock,
30271
0fa1a41d04e4 rebase: rename merge to mergemod
timeless <timeless@mozdev.org>
parents: 30007
diff changeset
38 merge as mergemod,
30495
d528ddc11b33 rebase: refer to checkunresolved by its new name
Augie Fackler <augie@google.com>
parents: 30490
diff changeset
39 mergeutil,
29128
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
40 obsolete,
33145
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33139
diff changeset
41 obsutil,
29128
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
42 patch,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
43 phases,
35002
1a07f9187831 py3: handle keyword arguments in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34963
diff changeset
44 pycompat,
29128
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
45 registrar,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
46 repair,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
47 revset,
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
48 revsetlang,
29128
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
49 scmutil,
31023
aea06029919e revset: import set classes directly from smartset module
Yuya Nishihara <yuya@tcha.org>
parents: 30865
diff changeset
50 smartset,
29128
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
51 util,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
52 )
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
53
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
54 release = lock.release
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
55
26669
07db7e95c464 rebase: added comments
Christian Delahousse <cdelahousse@fb.com>
parents: 26587
diff changeset
56 # The following constants are used throughout the rebase module. The ordering of
07db7e95c464 rebase: added comments
Christian Delahousse <cdelahousse@fb.com>
parents: 26587
diff changeset
57 # their values must be maintained.
07db7e95c464 rebase: added comments
Christian Delahousse <cdelahousse@fb.com>
parents: 26587
diff changeset
58
07db7e95c464 rebase: added comments
Christian Delahousse <cdelahousse@fb.com>
parents: 26587
diff changeset
59 # Indicates that a revision needs to be rebased
23490
102f144f6e02 rebase: add a 'revtodo' constant
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23489
diff changeset
60 revtodo = -1
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
61 revtodostr = '-1'
33843
d8d0ef5f5975 rebase: remove revprecursor and revpruned states (BC)
Jun Wu <quark@fb.com>
parents: 33842
diff changeset
62
d8d0ef5f5975 rebase: remove revprecursor and revpruned states (BC)
Jun Wu <quark@fb.com>
parents: 33842
diff changeset
63 # legacy revstates no longer needed in current code
33845
3ddbab49efcf rebase: remove revignored and nullmerge states
Jun Wu <quark@fb.com>
parents: 33844
diff changeset
64 # -2: nullmerge, -3: revignored, -4: revprecursor, -5: revpruned
3ddbab49efcf rebase: remove revignored and nullmerge states
Jun Wu <quark@fb.com>
parents: 33844
diff changeset
65 legacystates = {'-2', '-3', '-4', '-5'}
10352
66d954e76ffb rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10351
diff changeset
66
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
67 cmdtable = {}
32337
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32327
diff changeset
68 command = registrar.command(cmdtable)
29841
d5883fd055c6 extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents: 29610
diff changeset
69 # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
25186
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 25102
diff changeset
70 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 25102
diff changeset
71 # be specifying the version(s) of Mercurial they are tested with, or
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 25102
diff changeset
72 # leave the attribute unspecified.
29841
d5883fd055c6 extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents: 29610
diff changeset
73 testedwith = 'ships-with-hg-core'
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
74
26671
66dc39cd7d06 rebase: factor out nothing to rebase return code
Ryan McElroy <rmcelroy@fb.com>
parents: 26669
diff changeset
75 def _nothingtorebase():
66dc39cd7d06 rebase: factor out nothing to rebase return code
Ryan McElroy <rmcelroy@fb.com>
parents: 26669
diff changeset
76 return 1
66dc39cd7d06 rebase: factor out nothing to rebase return code
Ryan McElroy <rmcelroy@fb.com>
parents: 26669
diff changeset
77
27976
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
78 def _savegraft(ctx, extra):
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
79 s = ctx.extra().get('source', None)
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
80 if s is not None:
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
81 extra['source'] = s
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
82 s = ctx.extra().get('intermediate-source', None)
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
83 if s is not None:
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
84 extra['intermediate-source'] = s
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
85
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
86 def _savebranch(ctx, extra):
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
87 extra['branch'] = ctx.branch()
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
88
29043
cf7de4aeb86b destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 28686
diff changeset
89 def _destrebase(repo, sourceset, destspace=None):
28189
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
90 """small wrapper around destmerge to pass the right extra args
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
91
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
92 Please wrap destutil.destmerge instead."""
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
93 return destutil.destmerge(repo, action='rebase', 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: 28686
diff changeset
94 onheadcheck=False, destspace=destspace)
26717
1755e1d9d1c3 rebase: extra default destination in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26677
diff changeset
95
28394
dcb4209bd30d revset: replace extpredicate by revsetpredicate of registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28280
diff changeset
96 revsetpredicate = registrar.revsetpredicate()
27586
42910f9fffeb revset: use delayregistrar to register predicate in extension easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 27577
diff changeset
97
42910f9fffeb revset: use delayregistrar to register predicate in extension easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 27577
diff changeset
98 @revsetpredicate('_destrebase')
26719
8bed1eae99df rebase: rename and test '_destrebase'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26718
diff changeset
99 def _revsetdestrebase(repo, subset, x):
26301
3f8c5c284c86 rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26165
diff changeset
100 # ``_rebasedefaultdest()``
3f8c5c284c86 rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26165
diff changeset
101
3f8c5c284c86 rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26165
diff changeset
102 # default destination for rebase.
3f8c5c284c86 rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26165
diff changeset
103 # # XXX: Currently private because I expect the signature to change.
3f8c5c284c86 rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26165
diff changeset
104 # # XXX: - bailing out in case of ambiguity vs returning all data.
3f8c5c284c86 rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26165
diff changeset
105 # i18n: "_rebasedefaultdest" is a keyword
28189
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
106 sourceset = None
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
107 if x is not None:
31023
aea06029919e revset: import set classes directly from smartset module
Yuya Nishihara <yuya@tcha.org>
parents: 30865
diff changeset
108 sourceset = revset.getset(repo, smartset.fullreposet(repo), x)
aea06029919e revset: import set classes directly from smartset module
Yuya Nishihara <yuya@tcha.org>
parents: 30865
diff changeset
109 return subset & smartset.baseset([_destrebase(repo, sourceset)])
26301
3f8c5c284c86 rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26165
diff changeset
110
37787
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
111 @revsetpredicate('_destautoorphanrebase')
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
112 def _revsetdestautoorphanrebase(repo, subset, x):
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
113 """automatic rebase destination for a single orphan revision"""
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
114 unfi = repo.unfiltered()
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
115 obsoleted = unfi.revs('obsolete()')
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
116
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
117 src = revset.getset(repo, subset, x).first()
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
118
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
119 # Empty src or already obsoleted - Do not return a destination
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
120 if not src or src in obsoleted:
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
121 return smartset.baseset()
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
122 dests = destutil.orphanpossibledestination(repo, src)
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
123 if len(dests) > 1:
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
124 raise error.Abort(
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
125 _("ambiguous automatic rebase: %r could end up on any of %r") % (
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
126 src, dests))
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
127 # We have zero or one destination, so we can just return here.
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
128 return smartset.baseset(dests)
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
129
33841
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33789
diff changeset
130 def _ctxdesc(ctx):
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33789
diff changeset
131 """short description for a context"""
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33789
diff changeset
132 desc = '%d:%s "%s"' % (ctx.rev(), ctx,
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33789
diff changeset
133 ctx.description().split('\n', 1)[0])
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33789
diff changeset
134 repo = ctx.repo()
34290
4f969b9e0cf5 rebase: also include other namespaces in changeset description
Martin von Zweigbergk <martinvonz@google.com>
parents: 34095
diff changeset
135 names = []
4f969b9e0cf5 rebase: also include other namespaces in changeset description
Martin von Zweigbergk <martinvonz@google.com>
parents: 34095
diff changeset
136 for nsname, ns in repo.names.iteritems():
4f969b9e0cf5 rebase: also include other namespaces in changeset description
Martin von Zweigbergk <martinvonz@google.com>
parents: 34095
diff changeset
137 if nsname == 'branches':
4f969b9e0cf5 rebase: also include other namespaces in changeset description
Martin von Zweigbergk <martinvonz@google.com>
parents: 34095
diff changeset
138 continue
4f969b9e0cf5 rebase: also include other namespaces in changeset description
Martin von Zweigbergk <martinvonz@google.com>
parents: 34095
diff changeset
139 names.extend(ns.names(repo, ctx.node()))
33841
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33789
diff changeset
140 if names:
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33789
diff changeset
141 desc += ' (%s)' % ' '.join(names)
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33789
diff changeset
142 return desc
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33789
diff changeset
143
29358
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
144 class rebaseruntime(object):
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
145 """This class is a container for rebase runtime state"""
35388
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
146 def __init__(self, repo, ui, inmemory=False, opts=None):
29399
adb0d58b8b0b rebase: pass repo, ui and opts objects to the RR class constructor
Kostia Balytskyi <ikostia@fb.com>
parents: 29372
diff changeset
147 if opts is None:
adb0d58b8b0b rebase: pass repo, ui and opts objects to the RR class constructor
Kostia Balytskyi <ikostia@fb.com>
parents: 29372
diff changeset
148 opts = {}
adb0d58b8b0b rebase: pass repo, ui and opts objects to the RR class constructor
Kostia Balytskyi <ikostia@fb.com>
parents: 29372
diff changeset
149
34094
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
150 # prepared: whether we have rebasestate prepared or not. Currently it
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
151 # decides whether "self.repo" is unfiltered or not.
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
152 # The rebasestate has explicit hash to hash instructions not depending
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
153 # on visibility. If rebasestate exists (in-memory or on-disk), use
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
154 # unfiltered repo to avoid visibility issues.
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
155 # Before knowing rebasestate (i.e. when starting a new rebase (not
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
156 # --continue or --abort)), the original repo should be used so
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
157 # visibility-dependent revsets are correct.
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
158 self.prepared = False
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
159 self._repo = repo
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
160
29399
adb0d58b8b0b rebase: pass repo, ui and opts objects to the RR class constructor
Kostia Balytskyi <ikostia@fb.com>
parents: 29372
diff changeset
161 self.ui = ui
adb0d58b8b0b rebase: pass repo, ui and opts objects to the RR class constructor
Kostia Balytskyi <ikostia@fb.com>
parents: 29372
diff changeset
162 self.opts = opts
29358
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
163 self.originalwd = None
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
164 self.external = nullrev
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
165 # Mapping between the old revision id and either what is the new rebased
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
166 # revision or what needs to be done with the old revision. The state
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
167 # dict will be what contains most of the rebase progress state.
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
168 self.state = {}
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
169 self.activebookmark = None
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
170 self.destmap = {}
29360
4cbe62ab5c97 rebase: move local variable 'skipped' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29359
diff changeset
171 self.skipped = set()
29358
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
172
29400
c79da70a4659 rebase: move collapse-related local variables to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29399
diff changeset
173 self.collapsef = opts.get('collapse', False)
c79da70a4659 rebase: move collapse-related local variables to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29399
diff changeset
174 self.collapsemsg = cmdutil.logmessage(ui, opts)
29401
87acd047711e rebase: move local variables 'date' and 'extrafns' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29400
diff changeset
175 self.date = opts.get('date', None)
87acd047711e rebase: move local variables 'date' and 'extrafns' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29400
diff changeset
176
87acd047711e rebase: move local variables 'date' and 'extrafns' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29400
diff changeset
177 e = opts.get('extrafn') # internal, used by e.g. hgsubversion
87acd047711e rebase: move local variables 'date' and 'extrafns' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29400
diff changeset
178 self.extrafns = [_savegraft]
87acd047711e rebase: move local variables 'date' and 'extrafns' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29400
diff changeset
179 if e:
87acd047711e rebase: move local variables 'date' and 'extrafns' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29400
diff changeset
180 self.extrafns = [e]
29400
c79da70a4659 rebase: move collapse-related local variables to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29399
diff changeset
181
29402
7481ffb7ff83 rebase: move local variables related to keeping things unchanged to the RR
Kostia Balytskyi <ikostia@fb.com>
parents: 29401
diff changeset
182 self.keepf = opts.get('keep', False)
7481ffb7ff83 rebase: move local variables related to keeping things unchanged to the RR
Kostia Balytskyi <ikostia@fb.com>
parents: 29401
diff changeset
183 self.keepbranchesf = opts.get('keepbranches', False)
29404
591a8069b60e rebase: move local variable 'obsoletenotrebased' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29403
diff changeset
184 self.obsoletenotrebased = {}
35058
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35002
diff changeset
185 self.obsoletewithoutsuccessorindestination = set()
35388
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
186 self.inmemory = inmemory
29402
7481ffb7ff83 rebase: move local variables related to keeping things unchanged to the RR
Kostia Balytskyi <ikostia@fb.com>
parents: 29401
diff changeset
187
34094
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
188 @property
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
189 def repo(self):
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
190 if self.prepared:
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
191 return self._repo.unfiltered()
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
192 else:
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
193 return self._repo
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
194
31224
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31223
diff changeset
195 def storestatus(self, tr=None):
31223
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
196 """Store the current status to allow recovery"""
31224
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31223
diff changeset
197 if tr:
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31223
diff changeset
198 tr.addfilegenerator('rebasestate', ('rebasestate',),
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31223
diff changeset
199 self._writestatus, location='plain')
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31223
diff changeset
200 else:
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31223
diff changeset
201 with self.repo.vfs("rebasestate", "w") as f:
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31223
diff changeset
202 self._writestatus(f)
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31223
diff changeset
203
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31223
diff changeset
204 def _writestatus(self, f):
34095
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34094
diff changeset
205 repo = self.repo
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34094
diff changeset
206 assert repo.filtername is None
31223
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
207 f.write(repo[self.originalwd].hex() + '\n')
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
208 # was "dest". we now write dest per src root below.
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
209 f.write('\n')
31223
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
210 f.write(repo[self.external].hex() + '\n')
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
211 f.write('%d\n' % int(self.collapsef))
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
212 f.write('%d\n' % int(self.keepf))
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
213 f.write('%d\n' % int(self.keepbranchesf))
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
214 f.write('%s\n' % (self.activebookmark or ''))
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
215 destmap = self.destmap
31223
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
216 for d, v in self.state.iteritems():
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
217 oldrev = repo[d].hex()
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
218 if v >= 0:
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
219 newrev = repo[v].hex()
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
220 else:
35915
83b9f96ce20f py3: use "%d" to convert integer to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35701
diff changeset
221 newrev = "%d" % v
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
222 destnode = repo[destmap[d]].hex()
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
223 f.write("%s:%s:%s\n" % (oldrev, newrev, destnode))
31223
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
224 repo.ui.debug('rebase status stored\n')
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
225
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
226 def restorestatus(self):
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
227 """Restore a previously stored status"""
34094
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
228 self.prepared = True
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
229 repo = self.repo
34095
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34094
diff changeset
230 assert repo.filtername is None
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
231 keepbranches = None
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
232 legacydest = None
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
233 collapse = False
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
234 external = nullrev
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
235 activebookmark = None
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
236 state = {}
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
237 destmap = {}
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
238
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
239 try:
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
240 f = repo.vfs("rebasestate")
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
241 for i, l in enumerate(f.read().splitlines()):
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
242 if i == 0:
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
243 originalwd = repo[l].rev()
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
244 elif i == 1:
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
245 # this line should be empty in newer version. but legacy
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
246 # clients may still use it
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
247 if l:
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
248 legacydest = repo[l].rev()
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
249 elif i == 2:
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
250 external = repo[l].rev()
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
251 elif i == 3:
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
252 collapse = bool(int(l))
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
253 elif i == 4:
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
254 keep = bool(int(l))
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
255 elif i == 5:
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
256 keepbranches = bool(int(l))
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
257 elif i == 6 and not (len(l) == 81 and ':' in l):
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
258 # line 6 is a recent addition, so for backwards
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
259 # compatibility check that the line doesn't look like the
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
260 # oldrev:newrev lines
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
261 activebookmark = l
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
262 else:
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
263 args = l.split(':')
37377
3dfd7f018c69 rebase: convert "oldrev" to revnum earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 37376
diff changeset
264 oldrev = repo[args[0]].rev()
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
265 newrev = args[1]
33843
d8d0ef5f5975 rebase: remove revprecursor and revpruned states (BC)
Jun Wu <quark@fb.com>
parents: 33842
diff changeset
266 if newrev in legacystates:
d8d0ef5f5975 rebase: remove revprecursor and revpruned states (BC)
Jun Wu <quark@fb.com>
parents: 33842
diff changeset
267 continue
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
268 if len(args) > 2:
37376
25940470c7e6 rebase: make "destnode" consistently a revnum and rename it to "destrev"
Martin von Zweigbergk <martinvonz@google.com>
parents: 37332
diff changeset
269 destrev = repo[args[2]].rev()
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
270 else:
37376
25940470c7e6 rebase: make "destnode" consistently a revnum and rename it to "destrev"
Martin von Zweigbergk <martinvonz@google.com>
parents: 37332
diff changeset
271 destrev = legacydest
37377
3dfd7f018c69 rebase: convert "oldrev" to revnum earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 37376
diff changeset
272 destmap[oldrev] = destrev
37378
953db9e00eeb rebase: remove unnecessary and incorrect handling of nullid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37377
diff changeset
273 if newrev == revtodostr:
37377
3dfd7f018c69 rebase: convert "oldrev" to revnum earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 37376
diff changeset
274 state[oldrev] = revtodo
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
275 # Legacy compat special case
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
276 else:
37377
3dfd7f018c69 rebase: convert "oldrev" to revnum earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 37376
diff changeset
277 state[oldrev] = repo[newrev].rev()
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
278
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
279 except IOError as err:
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
280 if err.errno != errno.ENOENT:
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
281 raise
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
282 cmdutil.wrongtooltocontinue(repo, _('rebase'))
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
283
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
284 if keepbranches is None:
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
285 raise error.Abort(_('.hg/rebasestate is incomplete'))
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
286
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
287 skipped = set()
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
288 # recompute the set of skipped revs
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
289 if not collapse:
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
290 seen = set(destmap.values())
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
291 for old, new in sorted(state.items()):
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
292 if new != revtodo and new in seen:
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
293 skipped.add(old)
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
294 seen.add(new)
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
295 repo.ui.debug('computed skipped revs: %s\n' %
36147
6eb7d95f8970 py3: port string formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35997
diff changeset
296 (' '.join('%d' % r for r in sorted(skipped)) or ''))
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
297 repo.ui.debug('rebase status resumed\n')
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
298
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
299 self.originalwd = originalwd
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
300 self.destmap = destmap
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
301 self.state = state
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
302 self.skipped = skipped
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
303 self.collapsef = collapse
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
304 self.keepf = keep
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
305 self.keepbranchesf = keepbranches
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
306 self.external = external
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
307 self.activebookmark = activebookmark
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
308
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
309 def _handleskippingobsolete(self, obsoleterevs, destmap):
29479
5d16ebe7b14f rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents: 29478
diff changeset
310 """Compute structures necessary for skipping obsolete revisions
5d16ebe7b14f rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents: 29478
diff changeset
311
5d16ebe7b14f rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents: 29478
diff changeset
312 obsoleterevs: iterable of all obsolete revisions in rebaseset
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
313 destmap: {srcrev: destrev} destination revisions
29479
5d16ebe7b14f rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents: 29478
diff changeset
314 """
5d16ebe7b14f rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents: 29478
diff changeset
315 self.obsoletenotrebased = {}
34492
a5a810df4c81 configitems: register the 'experimental.rebaseskipobsolete' config
Boris Feld <boris.feld@octobus.net>
parents: 34367
diff changeset
316 if not self.ui.configbool('experimental', 'rebaseskipobsolete'):
29479
5d16ebe7b14f rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents: 29478
diff changeset
317 return
5d16ebe7b14f rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents: 29478
diff changeset
318 obsoleteset = set(obsoleterevs)
35995
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
319 (self.obsoletenotrebased,
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
320 self.obsoletewithoutsuccessorindestination,
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
321 obsoleteextinctsuccessors) = _computeobsoletenotrebased(
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
322 self.repo, obsoleteset, destmap)
29479
5d16ebe7b14f rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents: 29478
diff changeset
323 skippedset = set(self.obsoletenotrebased)
35058
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35002
diff changeset
324 skippedset.update(self.obsoletewithoutsuccessorindestination)
35995
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
325 skippedset.update(obsoleteextinctsuccessors)
33846
3b04a6ff625c rebase: remove rebaseset from _checkobsrebase
Jun Wu <quark@fb.com>
parents: 33845
diff changeset
326 _checkobsrebase(self.repo, self.ui, obsoleteset, skippedset)
29479
5d16ebe7b14f rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents: 29478
diff changeset
327
29472
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
328 def _prepareabortorcontinue(self, isabort):
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
329 try:
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
330 self.restorestatus()
31225
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
331 self.collapsemsg = restorecollapsemsg(self.repo, isabort)
29472
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
332 except error.RepoLookupError:
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
333 if isabort:
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
334 clearstatus(self.repo)
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
335 clearcollapsemsg(self.repo)
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
336 self.repo.ui.warn(_('rebase aborted (no revision is removed,'
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
337 ' only broken state is cleared)\n'))
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
338 return 0
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
339 else:
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
340 msg = _('cannot continue inconsistent rebase')
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
341 hint = _('use "hg rebase --abort" to clear broken state')
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
342 raise error.Abort(msg, hint=hint)
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
343 if isabort:
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
344 return abort(self.repo, self.originalwd, self.destmap,
29472
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
345 self.state, activebookmark=self.activebookmark)
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
346
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
347 def _preparenewrebase(self, destmap):
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
348 if not destmap:
29473
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
349 return _nothingtorebase()
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
350
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
351 rebaseset = destmap.keys()
29473
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
352 allowunstable = obsolete.isenabled(self.repo, obsolete.allowunstableopt)
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
353 if (not (self.keepf or allowunstable)
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
354 and self.repo.revs('first(children(%ld) - %ld)',
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
355 rebaseset, rebaseset)):
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
356 raise error.Abort(
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
357 _("can't remove original changesets with"
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
358 " unrebased descendants"),
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
359 hint=_('use --keep to keep original changesets'))
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
360
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
361 result = buildstate(self.repo, destmap, self.collapsef)
29473
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
362
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
363 if not result:
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
364 # Empty state built, nothing to rebase
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
365 self.ui.status(_('nothing to rebase\n'))
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
366 return _nothingtorebase()
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
367
31302
681046de87f1 rebase: abort if *any* commit in rebase set is public
Martin von Zweigbergk <martinvonz@google.com>
parents: 31297
diff changeset
368 for root in self.repo.set('roots(%ld)', rebaseset):
681046de87f1 rebase: abort if *any* commit in rebase set is public
Martin von Zweigbergk <martinvonz@google.com>
parents: 31297
diff changeset
369 if not self.keepf and not root.mutable():
681046de87f1 rebase: abort if *any* commit in rebase set is public
Martin von Zweigbergk <martinvonz@google.com>
parents: 31297
diff changeset
370 raise error.Abort(_("can't rebase public changeset %s")
681046de87f1 rebase: abort if *any* commit in rebase set is public
Martin von Zweigbergk <martinvonz@google.com>
parents: 31297
diff changeset
371 % root,
681046de87f1 rebase: abort if *any* commit in rebase set is public
Martin von Zweigbergk <martinvonz@google.com>
parents: 31297
diff changeset
372 hint=_("see 'hg help phases' for details"))
29473
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
373
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
374 (self.originalwd, self.destmap, self.state) = result
29473
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
375 if self.collapsef:
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
376 dests = set(self.destmap.values())
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
377 if len(dests) != 1:
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
378 raise error.Abort(
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
379 _('--collapse does not work with multiple destinations'))
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
380 destrev = next(iter(dests))
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
381 destancestors = self.repo.changelog.ancestors([destrev],
33847
ddf77c0cc169 rebase: remove self.destancestors
Jun Wu <quark@fb.com>
parents: 33846
diff changeset
382 inclusive=True)
ddf77c0cc169 rebase: remove self.destancestors
Jun Wu <quark@fb.com>
parents: 33846
diff changeset
383 self.external = externalparent(self.repo, self.state, destancestors)
29473
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
384
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
385 for destrev in sorted(set(destmap.values())):
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
386 dest = self.repo[destrev]
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
387 if dest.closesbranch() and not self.keepbranchesf:
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
388 self.ui.status(_('reopening closed branch head %s\n') % dest)
29473
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
389
34094
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
390 self.prepared = True
29473
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
391
35333
8dba17546016 rebase: extract _assignworkingcopy
Phil Cohen <phillco@fb.com>
parents: 35332
diff changeset
392 def _assignworkingcopy(self):
35290
482614b3802a rebase: add the --inmemory option flag; assign a wctx object for the rebase
Phil Cohen <phillco@fb.com>
parents: 35287
diff changeset
393 if self.inmemory:
482614b3802a rebase: add the --inmemory option flag; assign a wctx object for the rebase
Phil Cohen <phillco@fb.com>
parents: 35287
diff changeset
394 from mercurial.context import overlayworkingctx
482614b3802a rebase: add the --inmemory option flag; assign a wctx object for the rebase
Phil Cohen <phillco@fb.com>
parents: 35287
diff changeset
395 self.wctx = overlayworkingctx(self.repo)
35384
b9bdee046cc2 tests: add a simple test for in-memory rebase
Phil Cohen <phillco@fb.com>
parents: 35333
diff changeset
396 self.repo.ui.debug("rebasing in-memory\n")
35290
482614b3802a rebase: add the --inmemory option flag; assign a wctx object for the rebase
Phil Cohen <phillco@fb.com>
parents: 35287
diff changeset
397 else:
482614b3802a rebase: add the --inmemory option flag; assign a wctx object for the rebase
Phil Cohen <phillco@fb.com>
parents: 35287
diff changeset
398 self.wctx = self.repo[None]
35384
b9bdee046cc2 tests: add a simple test for in-memory rebase
Phil Cohen <phillco@fb.com>
parents: 35333
diff changeset
399 self.repo.ui.debug("rebasing on disk\n")
37027
81b35d275a60 rebase: get "inmemory" state directly from rebase runtime
Martin von Zweigbergk <martinvonz@google.com>
parents: 37025
diff changeset
400 self.repo.ui.log("rebase", "", rebase_imm_used=self.inmemory)
35333
8dba17546016 rebase: extract _assignworkingcopy
Phil Cohen <phillco@fb.com>
parents: 35332
diff changeset
401
8dba17546016 rebase: extract _assignworkingcopy
Phil Cohen <phillco@fb.com>
parents: 35332
diff changeset
402 def _performrebase(self, tr):
8dba17546016 rebase: extract _assignworkingcopy
Phil Cohen <phillco@fb.com>
parents: 35332
diff changeset
403 self._assignworkingcopy()
8dba17546016 rebase: extract _assignworkingcopy
Phil Cohen <phillco@fb.com>
parents: 35332
diff changeset
404 repo, ui = self.repo, self.ui
29477
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
405 if self.keepbranchesf:
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
406 # insert _savebranch at the start of extrafns so if
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
407 # there's a user-provided extrafn it can clobber branch if
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
408 # desired
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
409 self.extrafns.insert(0, _savebranch)
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
410 if self.collapsef:
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
411 branches = set()
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
412 for rev in self.state:
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
413 branches.add(repo[rev].branch())
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
414 if len(branches) > 1:
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
415 raise error.Abort(_('cannot collapse multiple named '
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
416 'branches'))
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
417
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
418 # Calculate self.obsoletenotrebased
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
419 obsrevs = _filterobsoleterevs(self.repo, self.state)
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
420 self._handleskippingobsolete(obsrevs, self.destmap)
29477
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
421
33332
3b7cb3d17137 rebase: use scmutil.cleanupnodes (issue5606) (BC)
Jun Wu <quark@fb.com>
parents: 33157
diff changeset
422 # Keep track of the active bookmarks in order to reset them later
29477
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
423 self.activebookmark = self.activebookmark or repo._activebookmark
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
424 if self.activebookmark:
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
425 bookmarks.deactivate(repo)
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
426
31225
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
427 # Store the state before we begin so users can run 'hg rebase --abort'
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
428 # if we fail before the transaction closes.
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
429 self.storestatus()
37031
74f91bec6991 rebase: register status file generator only once when using single transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 37028
diff changeset
430 if tr:
74f91bec6991 rebase: register status file generator only once when using single transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 37028
diff changeset
431 # When using single transaction, store state when transaction
74f91bec6991 rebase: register status file generator only once when using single transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 37028
diff changeset
432 # commits.
74f91bec6991 rebase: register status file generator only once when using single transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 37028
diff changeset
433 self.storestatus(tr)
31225
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
434
29872
58db005d870e rebase: properly calculate total commits to rebase (issue5347)
timeless <timeless@mozdev.org>
parents: 29841
diff changeset
435 cands = [k for k, v in self.state.iteritems() if v == revtodo]
58db005d870e rebase: properly calculate total commits to rebase (issue5347)
timeless <timeless@mozdev.org>
parents: 29841
diff changeset
436 total = len(cands)
36933
61600b024a70 rebase: move constant expressions out of inner loop in _performrebase()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36932
diff changeset
437 posholder = [0]
61600b024a70 rebase: move constant expressions out of inner loop in _performrebase()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36932
diff changeset
438 def progress(ctx):
61600b024a70 rebase: move constant expressions out of inner loop in _performrebase()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36932
diff changeset
439 posholder[0] += 1
61600b024a70 rebase: move constant expressions out of inner loop in _performrebase()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36932
diff changeset
440 self.repo.ui.progress(_("rebasing"), posholder[0],
61600b024a70 rebase: move constant expressions out of inner loop in _performrebase()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36932
diff changeset
441 ("%d:%s" % (ctx.rev(), ctx)),
61600b024a70 rebase: move constant expressions out of inner loop in _performrebase()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36932
diff changeset
442 _('changesets'), total)
61600b024a70 rebase: move constant expressions out of inner loop in _performrebase()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36932
diff changeset
443 allowdivergence = self.ui.configbool(
61600b024a70 rebase: move constant expressions out of inner loop in _performrebase()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36932
diff changeset
444 'experimental', 'evolution.allowdivergence')
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
445 for subset in sortsource(self.destmap):
36932
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36931
diff changeset
446 sortedrevs = self.repo.revs('sort(%ld, -topo)', subset)
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36931
diff changeset
447 if not allowdivergence:
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36931
diff changeset
448 sortedrevs -= self.repo.revs(
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36931
diff changeset
449 'descendants(%ld) and not %ld',
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36931
diff changeset
450 self.obsoletewithoutsuccessorindestination,
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36931
diff changeset
451 self.obsoletewithoutsuccessorindestination,
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36931
diff changeset
452 )
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36931
diff changeset
453 for rev in sortedrevs:
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36931
diff changeset
454 self._rebasenode(tr, rev, allowdivergence, progress)
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
455 ui.progress(_('rebasing'), None)
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
456 ui.note(_('rebase merging completed\n'))
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
457
37033
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37032
diff changeset
458 def _concludenode(self, rev, p1, p2, editor, commitmsg=None):
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37032
diff changeset
459 '''Commit the wd changes with parents p1 and p2.
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37032
diff changeset
460
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37032
diff changeset
461 Reuse commit info from rev but also store useful information in extra.
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37032
diff changeset
462 Return node of committed revision.'''
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37032
diff changeset
463 repo = self.repo
37034
fbc82a08bdcb rebase: pass in ctx, not rev, to conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37033
diff changeset
464 ctx = repo[rev]
37035
b7f5d03e1e54 rebase: look up commit message to reuse outside of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37034
diff changeset
465 if commitmsg is None:
b7f5d03e1e54 rebase: look up commit message to reuse outside of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37034
diff changeset
466 commitmsg = ctx.description()
37041
0b1230a5a958 rebase: look up default date outside of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37040
diff changeset
467 date = self.date
0b1230a5a958 rebase: look up default date outside of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37040
diff changeset
468 if date is None:
0b1230a5a958 rebase: look up default date outside of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37040
diff changeset
469 date = ctx.date()
37036
0ab0d94ead72 rebase: pass in "extra" itself into conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37035
diff changeset
470 extra = {'rebase_source': ctx.hex()}
37037
bd0086bd3af4 rebase: inline _makextrafn() now that we have only one caller
Martin von Zweigbergk <martinvonz@google.com>
parents: 37036
diff changeset
471 for c in self.extrafns:
bd0086bd3af4 rebase: inline _makextrafn() now that we have only one caller
Martin von Zweigbergk <martinvonz@google.com>
parents: 37036
diff changeset
472 c(ctx, extra)
37038
7db86856f27f rebase: pass in "keepbranch" to conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37037
diff changeset
473 keepbranch = self.keepbranchesf and repo[p1].branch() != ctx.branch()
37039
7616073a4cf1 rebase: pass in entire "overrides" dict to conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37038
diff changeset
474 destphase = max(ctx.phase(), phases.draft)
7616073a4cf1 rebase: pass in entire "overrides" dict to conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37038
diff changeset
475 overrides = {('phases', 'new-commit'): destphase}
7616073a4cf1 rebase: pass in entire "overrides" dict to conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37038
diff changeset
476 if keepbranch:
7616073a4cf1 rebase: pass in entire "overrides" dict to conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37038
diff changeset
477 overrides[('ui', 'allowemptycommit')] = True
37040
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
478 with repo.ui.configoverride(overrides, 'rebase'):
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
479 if self.inmemory:
37043
a8d8cdafe29c rebase: rename conclude[memory]node() to commit[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
480 newnode = commitmemorynode(repo, p1, p2,
37040
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
481 wctx=self.wctx,
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
482 extra=extra,
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
483 commitmsg=commitmsg,
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
484 editor=editor,
37042
8ff5772711fa rebase: pass in "user" instead of "ctx" to conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37041
diff changeset
485 user=ctx.user(),
37041
0b1230a5a958 rebase: look up default date outside of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37040
diff changeset
486 date=date)
37040
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
487 mergemod.mergestate.clean(repo)
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
488 else:
37043
a8d8cdafe29c rebase: rename conclude[memory]node() to commit[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
489 newnode = commitnode(repo, p1, p2,
37040
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
490 extra=extra,
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
491 commitmsg=commitmsg,
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
492 editor=editor,
37042
8ff5772711fa rebase: pass in "user" instead of "ctx" to conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37041
diff changeset
493 user=ctx.user(),
37041
0b1230a5a958 rebase: look up default date outside of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37040
diff changeset
494 date=date)
37033
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37032
diff changeset
495
37040
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
496 if newnode is None:
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
497 # If it ended up being a no-op commit, then the normal
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
498 # merge state clean-up path doesn't happen, so do it
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
499 # here. Fix issue5494
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
500 mergemod.mergestate.clean(repo)
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
501 return newnode
37033
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37032
diff changeset
502
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
503 def _rebasenode(self, tr, rev, allowdivergence, progressfn):
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
504 repo, ui, opts = self.repo, self.ui, self.opts
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
505 dest = self.destmap[rev]
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
506 ctx = repo[rev]
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
507 desc = _ctxdesc(ctx)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
508 if self.state[rev] == rev:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
509 ui.status(_('already rebased %s\n') % desc)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
510 elif (not allowdivergence
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
511 and rev in self.obsoletewithoutsuccessorindestination):
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
512 msg = _('note: not rebasing %s and its descendants as '
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
513 'this would cause divergence\n') % desc
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
514 repo.ui.status(msg)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
515 self.skipped.add(rev)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
516 elif rev in self.obsoletenotrebased:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
517 succ = self.obsoletenotrebased[rev]
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
518 if succ is None:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
519 msg = _('note: not rebasing %s, it has no '
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
520 'successor\n') % desc
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
521 else:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
522 succdesc = _ctxdesc(repo[succ])
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
523 msg = (_('note: not rebasing %s, already in '
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
524 'destination as %s\n') % (desc, succdesc))
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
525 repo.ui.status(msg)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
526 # Make clearrebased aware state[rev] is not a true successor
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
527 self.skipped.add(rev)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
528 # Record rev as moved to its desired destination in self.state.
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
529 # This helps bookmark and working parent movement.
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
530 dest = max(adjustdest(repo, rev, self.destmap, self.state,
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
531 self.skipped))
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
532 self.state[rev] = dest
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
533 elif self.state[rev] == revtodo:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
534 ui.status(_('rebasing %s\n') % desc)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
535 progressfn(ctx)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
536 p1, p2, base = defineparents(repo, rev, self.destmap,
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
537 self.state, self.skipped,
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
538 self.obsoletenotrebased)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
539 if len(repo[None].parents()) == 2:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
540 repo.ui.debug('resuming interrupted rebase\n')
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
541 else:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
542 overrides = {('ui', 'forcemerge'): opts.get('tool', '')}
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
543 with ui.configoverride(overrides, 'rebase'):
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
544 stats = rebasenode(repo, rev, p1, base, self.collapsef,
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
545 dest, wctx=self.wctx)
37125
6f570c501e3e merge: deprecate accessing update results by index
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37043
diff changeset
546 if stats.unresolvedcount > 0:
37027
81b35d275a60 rebase: get "inmemory" state directly from rebase runtime
Martin von Zweigbergk <martinvonz@google.com>
parents: 37025
diff changeset
547 if self.inmemory:
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
548 raise error.InMemoryMergeConflictsError()
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
549 else:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
550 raise error.InterventionRequired(
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
551 _('unresolved conflicts (see hg '
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
552 'resolve, then hg rebase --continue)'))
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
553 if not self.collapsef:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
554 merging = p2 != nullrev
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
555 editform = cmdutil.mergeeditform(merging, 'rebase')
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
556 editor = cmdutil.getcommiteditor(editform=editform,
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
557 **pycompat.strkwargs(opts))
37033
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37032
diff changeset
558 newnode = self._concludenode(rev, p1, p2, editor)
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
559 else:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
560 # Skip commit if we are collapsing
37027
81b35d275a60 rebase: get "inmemory" state directly from rebase runtime
Martin von Zweigbergk <martinvonz@google.com>
parents: 37025
diff changeset
561 if self.inmemory:
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
562 self.wctx.setbase(repo[p1])
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
563 else:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
564 repo.setparents(repo[p1].node())
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
565 newnode = None
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
566 # Update the state
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
567 if newnode is not None:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
568 self.state[rev] = repo[newnode].rev()
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
569 ui.debug('rebased as %s\n' % short(newnode))
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
570 else:
29477
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
571 if not self.collapsef:
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
572 ui.warn(_('note: rebase of %d:%s created no changes '
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
573 'to commit\n') % (rev, ctx))
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
574 self.skipped.add(rev)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
575 self.state[rev] = p1
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
576 ui.debug('next revision set to %d\n' % p1)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
577 else:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
578 ui.status(_('already rebased %s as %s\n') %
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
579 (desc, repo[self.state[rev]]))
37032
98663bed146e rebase: store rebase state after each commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 37031
diff changeset
580 if not tr:
98663bed146e rebase: store rebase state after each commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 37031
diff changeset
581 # When not using single transaction, store state after each
98663bed146e rebase: store rebase state after each commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 37031
diff changeset
582 # commit is completely done. On InterventionRequired, we thus
98663bed146e rebase: store rebase state after each commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 37031
diff changeset
583 # won't store the status. Instead, we'll hit the "len(parents) == 2"
98663bed146e rebase: store rebase state after each commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 37031
diff changeset
584 # case and realize that the commit was in progress.
98663bed146e rebase: store rebase state after each commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 37031
diff changeset
585 self.storestatus()
29477
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
586
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
587 def _finishrebase(self):
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
588 repo, ui, opts = self.repo, self.ui, self.opts
34883
c858afe9c59b rebase: add support to output nodechanges
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34872
diff changeset
589 fm = ui.formatter('rebase', opts)
c858afe9c59b rebase: add support to output nodechanges
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34872
diff changeset
590 fm.startitem()
36771
f7e3fe95b663 rebase: delete obsolete internal "keepopen" option
Martin von Zweigbergk <martinvonz@google.com>
parents: 36478
diff changeset
591 if self.collapsef:
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
592 p1, p2, _base = defineparents(repo, min(self.state), self.destmap,
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
593 self.state, self.skipped,
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
594 self.obsoletenotrebased)
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
595 editopt = opts.get('edit')
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
596 editform = 'rebase.collapse'
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
597 if self.collapsemsg:
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
598 commitmsg = self.collapsemsg
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
599 else:
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
600 commitmsg = 'Collapsed revision'
33622
5a5f600b06ad rebase: sort collapsed revisions in commit message (issue5643)
Yuya Nishihara <yuya@tcha.org>
parents: 33590
diff changeset
601 for rebased in sorted(self.state):
33848
bc9e075133c9 rebase: remove "state >= revtodo" condition
Jun Wu <quark@fb.com>
parents: 33847
diff changeset
602 if rebased not in self.skipped:
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
603 commitmsg += '\n* %s' % repo[rebased].description()
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
604 editopt = True
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
605 editor = cmdutil.getcommiteditor(edit=editopt, editform=editform)
29552
db26925bdbb0 rebase: remove sortedstate-related confusion
Kostia Balytskyi <ikostia@fb.com>
parents: 29551
diff changeset
606 revtoreuse = max(self.state)
33619
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
607
37033
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37032
diff changeset
608 newnode = self._concludenode(revtoreuse, p1, self.external,
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37032
diff changeset
609 editor, commitmsg=commitmsg)
36928
9457c395fcbb rebase: fix issue 5494 also with --collapse
Martin von Zweigbergk <martinvonz@google.com>
parents: 36927
diff changeset
610
33864
70354bd4f19b rebase: only change self.state when collapsing in _finishrebase
Jun Wu <quark@fb.com>
parents: 33863
diff changeset
611 if newnode is not None:
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
612 newrev = repo[newnode].rev()
36299
238646784294 py3: use default dict iterator instead of iterkeys
Augie Fackler <augie@google.com>
parents: 36271
diff changeset
613 for oldrev in self.state:
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
614 self.state[oldrev] = newrev
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
615
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
616 if 'qtip' in repo.tags():
36400
7b86aa31b004 py3: fix handling of keyword arguments at more places
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36394
diff changeset
617 updatemq(repo, self.state, self.skipped,
7b86aa31b004 py3: fix handling of keyword arguments at more places
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36394
diff changeset
618 **pycompat.strkwargs(opts))
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
619
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
620 # restore original working directory
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
621 # (we do this before stripping)
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
622 newwd = self.state.get(self.originalwd, self.originalwd)
33843
d8d0ef5f5975 rebase: remove revprecursor and revpruned states (BC)
Jun Wu <quark@fb.com>
parents: 33842
diff changeset
623 if newwd < 0:
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
624 # original directory is a parent of rebase set root or ignored
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
625 newwd = self.originalwd
36975
795eb53f1d3e rebase: allow in-memory merge of the working copy parent
Martin von Zweigbergk <martinvonz@google.com>
parents: 36960
diff changeset
626 if newwd not in [c.rev() for c in repo[None].parents()]:
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
627 ui.note(_("update back to initial working directory parent\n"))
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
628 hg.updaterepo(repo, newwd, False)
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
629
34354
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
630 collapsedas = None
36774
a835bf3fe40a rebase: collapse two nested if-conditions
Martin von Zweigbergk <martinvonz@google.com>
parents: 36773
diff changeset
631 if self.collapsef and not self.keepf:
a835bf3fe40a rebase: collapse two nested if-conditions
Martin von Zweigbergk <martinvonz@google.com>
parents: 36773
diff changeset
632 collapsedas = newnode
34367
f61f5af5ed31 merge with stable
Martin von Zweigbergk <martinvonz@google.com>
parents: 34290 34354
diff changeset
633 clearrebased(ui, repo, self.destmap, self.state, self.skipped,
34883
c858afe9c59b rebase: add support to output nodechanges
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34872
diff changeset
634 collapsedas, self.keepf, fm=fm)
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
635
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
636 clearstatus(repo)
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
637 clearcollapsemsg(repo)
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
638
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
639 ui.note(_("rebase completed\n"))
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
640 util.unlinkpath(repo.sjoin('undo'), ignoremissing=True)
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
641 if self.skipped:
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
642 skippedlen = len(self.skipped)
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
643 ui.note(_("%d revisions have been skipped\n") % skippedlen)
34883
c858afe9c59b rebase: add support to output nodechanges
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34872
diff changeset
644 fm.end()
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
645
33332
3b7cb3d17137 rebase: use scmutil.cleanupnodes (issue5606) (BC)
Jun Wu <quark@fb.com>
parents: 33157
diff changeset
646 if (self.activebookmark and self.activebookmark in repo._bookmarks and
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
647 repo['.'].node() == repo._bookmarks[self.activebookmark]):
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
648 bookmarks.activate(repo, self.activebookmark)
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
649
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
650 @command('rebase',
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
651 [('s', 'source', '',
22789
5f4934487382 rebase: attempt to clarify --base
Matt Mackall <mpm@selenic.com>
parents: 22405
diff changeset
652 _('rebase the specified changeset and descendants'), _('REV')),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
653 ('b', 'base', '',
22789
5f4934487382 rebase: attempt to clarify --base
Matt Mackall <mpm@selenic.com>
parents: 22405
diff changeset
654 _('rebase everything from branching point of specified changeset'),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
655 _('REV')),
15270
6cb6064f1d50 rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15269
diff changeset
656 ('r', 'rev', [],
6cb6064f1d50 rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15269
diff changeset
657 _('rebase these revisions'),
6cb6064f1d50 rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15269
diff changeset
658 _('REV')),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
659 ('d', 'dest', '',
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
660 _('rebase onto the specified changeset'), _('REV')),
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
661 ('', 'collapse', False, _('collapse the rebased changesets')),
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
662 ('m', 'message', '',
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
663 _('use text as collapse commit message'), _('TEXT')),
15219
9d58569a8b92 rebase: add --edit switch
Matt Mackall <mpm@selenic.com>
parents: 15214
diff changeset
664 ('e', 'edit', False, _('invoke editor on commit messages')),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
665 ('l', 'logfile', '',
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
666 _('read collapse commit message from file'), _('FILE')),
25025
72f7f98bc5e5 rebase: add short -k option for --keep
Nat Mote <nmote@fb.com>
parents: 24998
diff changeset
667 ('k', 'keep', False, _('keep original changesets')),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
668 ('', 'keepbranches', False, _('keep original branch names')),
17005
50f434510da6 rebase: do not add second parent to rebased changeset (drop detach option) (BC)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 16867
diff changeset
669 ('D', 'detach', False, _('(DEPRECATED)')),
22382
d5b04ee8ecf7 rebase: add a deprecated -i/--interactive flag
David Soria Parra <davidsp@fb.com>
parents: 22251
diff changeset
670 ('i', 'interactive', False, _('(DEPRECATED)')),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
671 ('t', 'tool', '', _('specify merge tool')),
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
672 ('c', 'continue', False, _('continue an interrupted rebase')),
37787
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
673 ('a', 'abort', False, _('abort an interrupted rebase')),
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
674 ('', 'auto-orphans', '', _('automatically rebase orphan revisions '
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
675 'in the specified revset (EXPERIMENTAL)')),
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
676 ] +
34963
ddf37b6b8c3d rebase: drop --style option
Yuya Nishihara <yuya@tcha.org>
parents: 34883
diff changeset
677 cmdutil.formatteropts,
17325
e4db509c08ec rebase: remove second broken synopsis line (issue3172)
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
678 _('[-s REV | -b REV] [-d REV] [OPTION]'))
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
679 def rebase(ui, repo, **opts):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
680 """move changeset (and descendants) to a different branch
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
681
7999
b25110140573 rebase: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7955
diff changeset
682 Rebase uses repeated merging to graft changesets from one part of
10646
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
683 history (the source) onto another (the destination). This can be
11188
b5c0f6a11430 rebase: stress that only local changesets should be rebased
Martin Geisler <mg@lazybytes.net>
parents: 10762
diff changeset
684 useful for linearizing *local* changes relative to a master
10646
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
685 development tree.
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
686
27454
3e3be524a712 rebase: simplify documentation about public commits
timeless <timeless@mozdev.org>
parents: 27344
diff changeset
687 Published commits cannot be rebased (see :hg:`help phases`).
3e3be524a712 rebase: simplify documentation about public commits
timeless <timeless@mozdev.org>
parents: 27344
diff changeset
688 To copy commits, see :hg:`help graft`.
18516
9fbeb61b8ad2 rebase: mention phases in the help
Kevin Bullock <kbullock@ringworld.org>
parents: 18514
diff changeset
689
28189
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
690 If you don't specify a destination changeset (``-d/--dest``), rebase
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
691 will use the same logic as :hg:`merge` to pick a destination. if
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
692 the current branch contains exactly one other head, the other head
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
693 is merged with by default. Otherwise, an explicit revision with
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
694 which to merge with must be provided. (destination changeset is not
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
695 modified by rebasing, but new changesets are added as its
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
696 descendants.)
10646
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
697
27956
f3eb98b8fe12 doc: prevent non-literal text block from being treated as literal one
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 27932
diff changeset
698 Here are the ways to select changesets:
27455
a9a047878e14 rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents: 27454
diff changeset
699
a9a047878e14 rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents: 27454
diff changeset
700 1. Explicitly select them using ``--rev``.
10646
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
701
27455
a9a047878e14 rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents: 27454
diff changeset
702 2. Use ``--source`` to select a root changeset and include all of its
27959
4322849a5357 doc: use correct indentation for enumeration
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 27956
diff changeset
703 descendants.
27455
a9a047878e14 rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents: 27454
diff changeset
704
a9a047878e14 rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents: 27454
diff changeset
705 3. Use ``--base`` to select a changeset; rebase will find ancestors
27959
4322849a5357 doc: use correct indentation for enumeration
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 27956
diff changeset
706 and their descendants which are not also ancestors of the destination.
18518
0324a1d88a53 rebase: mention --rev in the help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18516
diff changeset
707
27932
6bc2299cc12f rebase: restore help for rebase w/o args (issue5059)
timeless <timeless@mozdev.org>
parents: 27866
diff changeset
708 4. If you do not specify any of ``--rev``, ``source``, or ``--base``,
27959
4322849a5357 doc: use correct indentation for enumeration
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 27956
diff changeset
709 rebase will use ``--base .`` as above.
27932
6bc2299cc12f rebase: restore help for rebase w/o args (issue5059)
timeless <timeless@mozdev.org>
parents: 27866
diff changeset
710
35287
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
711 If ``--source`` or ``--rev`` is used, special names ``SRC`` and ``ALLSRC``
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
712 can be used in ``--dest``. Destination would be calculated per source
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
713 revision with ``SRC`` substituted by that single source revision and
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
714 ``ALLSRC`` substituted by all source revisions.
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
715
27456
2337958596e3 rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents: 27455
diff changeset
716 Rebase will destroy original changesets unless you use ``--keep``.
2337958596e3 rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents: 27455
diff changeset
717 It will also move your bookmarks (even if you do).
2337958596e3 rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents: 27455
diff changeset
718
2337958596e3 rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents: 27455
diff changeset
719 Some changesets may be dropped if they do not contribute changes
2337958596e3 rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents: 27455
diff changeset
720 (e.g. merges from the destination branch).
10646
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
721
27457
97cc045f1cfe rebase: simplify documentation about heads
timeless <timeless@mozdev.org>
parents: 27456
diff changeset
722 Unlike ``merge``, rebase will do nothing if you are at the branch tip of
97cc045f1cfe rebase: simplify documentation about heads
timeless <timeless@mozdev.org>
parents: 27456
diff changeset
723 a named branch with two heads. You will need to explicitly specify source
97cc045f1cfe rebase: simplify documentation about heads
timeless <timeless@mozdev.org>
parents: 27456
diff changeset
724 and/or destination.
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
725
28001
ade12bf2bf0e rebase: mention help merge-tools in help
timeless <timeless@mozdev.org>
parents: 27977
diff changeset
726 If you need to use a tool to automate merge/conflict decisions, you
ade12bf2bf0e rebase: mention help merge-tools in help
timeless <timeless@mozdev.org>
parents: 27977
diff changeset
727 can specify one with ``--tool``, see :hg:`help merge-tools`.
28002
e862b1fd33a8 rebase: document that tool does not apply to deleted files
timeless <timeless@mozdev.org>
parents: 28001
diff changeset
728 As a caveat: the tool will not be used to mediate when a file was
e862b1fd33a8 rebase: document that tool does not apply to deleted files
timeless <timeless@mozdev.org>
parents: 28001
diff changeset
729 deleted, there is no hook presently available for this.
28001
ade12bf2bf0e rebase: mention help merge-tools in help
timeless <timeless@mozdev.org>
parents: 27977
diff changeset
730
27458
d39e743e3578 rebase: mention conflict in documentation instead of merge
timeless <timeless@mozdev.org>
parents: 27457
diff changeset
731 If a rebase is interrupted to manually resolve a conflict, it can be
8076
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8031
diff changeset
732 continued with --continue/-c or aborted with --abort/-a.
11205
d26f662bfbf5 rebase: add error codes
Matt Mackall <mpm@selenic.com>
parents: 11204
diff changeset
733
22790
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
734 .. container:: verbose
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
735
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
736 Examples:
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
737
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
738 - move "local changes" (current commit back to branching point)
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
739 to the current branch tip after a pull::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
740
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
741 hg rebase
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
742
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
743 - move a single changeset to the stable branch::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
744
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
745 hg rebase -r 5f493448 -d stable
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
746
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
747 - splice a commit and all its descendants onto another part of history::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
748
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
749 hg rebase --source c0c3 --dest 4cf9
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
750
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
751 - rebase everything on a branch marked by a bookmark onto the
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
752 default branch::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
753
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
754 hg rebase --base myfeature --dest default
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
755
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
756 - collapse a sequence of changes into a single commit::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
757
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
758 hg rebase --collapse -r 1520:1525 -d .
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
759
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
760 - move a named branch while preserving its name::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
761
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
762 hg rebase -r "branch(featureX)" -d 1.3 --keepbranches
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
763
35287
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
764 - stabilize orphaned changesets so history looks linear::
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
765
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
766 hg rebase -r 'orphan()-obsolete()'\
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
767 -d 'first(max((successors(max(roots(ALLSRC) & ::SRC)^)-obsolete())::) +\
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
768 max(::((roots(ALLSRC) & ::SRC)^)-obsolete()))'
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
769
31558
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
770 Configuration Options:
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
771
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
772 You can make rebase require a destination if you set the following config
32084
091d6b9157da help: apply bulk fixes for indentation and literal blocking issues
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32083
diff changeset
773 option::
31558
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
774
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
775 [commands]
32083
1c911adebf48 rebase: fix incorrect configuration example
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31733
diff changeset
776 rebase.requiredest = True
31558
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
777
33569
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
778 By default, rebase will close the transaction after each commit. For
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
779 performance purposes, you can configure rebase to use a single transaction
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
780 across the entire rebase. WARNING: This setting introduces a significant
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
781 risk of losing the work you've done in a rebase if the rebase aborts
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
782 unexpectedly::
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
783
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
784 [rebase]
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
785 singletransaction = True
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
786
35388
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
787 By default, rebase writes to the working copy, but you can configure it to
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
788 run in-memory for for better performance, and to allow it to run if the
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
789 working copy is dirty::
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
790
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
791 [rebase]
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
792 experimental.inmemory = True
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
793
31558
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
794 Return Values:
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
795
19971
2a9bb64faa0b rebase: add description about exit code when there are unresolved conflicts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19969
diff changeset
796 Returns 0 on success, 1 if nothing to rebase or there are
2a9bb64faa0b rebase: add description about exit code when there are unresolved conflicts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19969
diff changeset
797 unresolved conflicts.
22790
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
798
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
799 """
35388
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
800 inmemory = ui.configbool('rebase', 'experimental.inmemory')
35701
c5d220a621e7 rebase: don't run IMM if running rebase in a transaction
Phil Cohen <phillco@fb.com>
parents: 35487
diff changeset
801 if (opts.get('continue') or opts.get('abort') or
c5d220a621e7 rebase: don't run IMM if running rebase in a transaction
Phil Cohen <phillco@fb.com>
parents: 35487
diff changeset
802 repo.currenttransaction() is not None):
35320
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
803 # in-memory rebase is not compatible with resuming rebases.
35701
c5d220a621e7 rebase: don't run IMM if running rebase in a transaction
Phil Cohen <phillco@fb.com>
parents: 35487
diff changeset
804 # (Or if it is run within a transaction, since the restart logic can
c5d220a621e7 rebase: don't run IMM if running rebase in a transaction
Phil Cohen <phillco@fb.com>
parents: 35487
diff changeset
805 # fail the entire transaction.)
35388
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
806 inmemory = False
35320
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
807
37787
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
808 if opts.get('auto_orphans'):
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
809 for key in opts:
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
810 if key != 'auto_orphans' and opts.get(key):
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
811 raise error.Abort(_('--auto-orphans is incompatible with %s') %
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
812 ('--' + key))
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
813 userrevs = list(repo.revs(opts.get('auto_orphans')))
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
814 opts['rev'] = [revsetlang.formatspec('%ld and orphan()', userrevs)]
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
815 opts['dest'] = '_destautoorphanrebase(SRC)'
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
816
35388
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
817 if inmemory:
35320
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
818 try:
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
819 # in-memory merge doesn't support conflicts, so if we hit any, abort
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
820 # and re-run as an on-disk merge.
37332
b48b7b130d08 rebase: use single transaction when running in memory
Martin von Zweigbergk <martinvonz@google.com>
parents: 37125
diff changeset
821 overrides = {('rebase', 'singletransaction'): True}
b48b7b130d08 rebase: use single transaction when running in memory
Martin von Zweigbergk <martinvonz@google.com>
parents: 37125
diff changeset
822 with ui.configoverride(overrides, 'rebase'):
b48b7b130d08 rebase: use single transaction when running in memory
Martin von Zweigbergk <martinvonz@google.com>
parents: 37125
diff changeset
823 return _origrebase(ui, repo, inmemory=inmemory, **opts)
35320
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
824 except error.InMemoryMergeConflictsError:
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
825 ui.warn(_('hit merge conflicts; re-running rebase without in-memory'
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
826 ' merge\n'))
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
827 _origrebase(ui, repo, **{'abort': True})
35388
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
828 return _origrebase(ui, repo, inmemory=False, **opts)
35320
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
829 else:
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
830 return _origrebase(ui, repo, **opts)
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
831
35388
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
832 def _origrebase(ui, repo, inmemory=False, **opts):
35002
1a07f9187831 py3: handle keyword arguments in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34963
diff changeset
833 opts = pycompat.byteskwargs(opts)
35388
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
834 rbsrt = rebaseruntime(repo, ui, inmemory, opts)
15219
9d58569a8b92 rebase: add --edit switch
Matt Mackall <mpm@selenic.com>
parents: 15214
diff changeset
835
32917
070920db8b87 rebase: use context manager for locking in rebase()
Martin von Zweigbergk <martinvonz@google.com>
parents: 32900
diff changeset
836 with repo.wlock(), repo.lock():
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
837 # Validate input and define rebasing points
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
838 destf = opts.get('dest', None)
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
839 srcf = opts.get('source', None)
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
840 basef = opts.get('base', None)
15270
6cb6064f1d50 rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15269
diff changeset
841 revf = opts.get('rev', [])
29043
cf7de4aeb86b destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 28686
diff changeset
842 # search default destination in this space
cf7de4aeb86b destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 28686
diff changeset
843 # 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: 28686
diff changeset
844 destspace = opts.get('_destspace')
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
845 contf = opts.get('continue')
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
846 abortf = opts.get('abort')
22382
d5b04ee8ecf7 rebase: add a deprecated -i/--interactive flag
David Soria Parra <davidsp@fb.com>
parents: 22251
diff changeset
847 if opts.get('interactive'):
26496
b885ab9ca182 rebase: enable histedit for useful help with it
timeless@mozdev.org
parents: 26495
diff changeset
848 try:
b885ab9ca182 rebase: enable histedit for useful help with it
timeless@mozdev.org
parents: 26495
diff changeset
849 if extensions.find('histedit'):
b885ab9ca182 rebase: enable histedit for useful help with it
timeless@mozdev.org
parents: 26495
diff changeset
850 enablehistedit = ''
b885ab9ca182 rebase: enable histedit for useful help with it
timeless@mozdev.org
parents: 26495
diff changeset
851 except KeyError:
b885ab9ca182 rebase: enable histedit for useful help with it
timeless@mozdev.org
parents: 26495
diff changeset
852 enablehistedit = " --config extensions.histedit="
b885ab9ca182 rebase: enable histedit for useful help with it
timeless@mozdev.org
parents: 26495
diff changeset
853 help = "hg%s help -e histedit" % enablehistedit
22382
d5b04ee8ecf7 rebase: add a deprecated -i/--interactive flag
David Soria Parra <davidsp@fb.com>
parents: 22251
diff changeset
854 msg = _("interactive history editing is supported by the "
26494
832f40d2af53 rebase: factor out histedit help command
timeless@mozdev.org
parents: 26421
diff changeset
855 "'histedit' extension (see \"%s\")") % help
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26496
diff changeset
856 raise error.Abort(msg)
22382
d5b04ee8ecf7 rebase: add a deprecated -i/--interactive flag
David Soria Parra <davidsp@fb.com>
parents: 22251
diff changeset
857
29400
c79da70a4659 rebase: move collapse-related local variables to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29399
diff changeset
858 if rbsrt.collapsemsg and not rbsrt.collapsef:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26496
diff changeset
859 raise error.Abort(
13661
ee349e228835 rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents: 13609
diff changeset
860 _('message can only be specified with collapse'))
ee349e228835 rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents: 13609
diff changeset
861
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
862 if contf or abortf:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
863 if contf and abortf:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26496
diff changeset
864 raise error.Abort(_('cannot use both abort and continue'))
29400
c79da70a4659 rebase: move collapse-related local variables to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29399
diff changeset
865 if rbsrt.collapsef:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26496
diff changeset
866 raise error.Abort(
11285
f118029e534c rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents: 11205
diff changeset
867 _('cannot use collapse with continue or abort'))
8117
2b30d8488819 remove unnecessary outer parenthesis in if-statements
Martin Geisler <mg@lazybytes.net>
parents: 8112
diff changeset
868 if srcf or basef or destf:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26496
diff changeset
869 raise error.Abort(
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
870 _('abort and continue do not allow specifying revisions'))
26165
927c0d84e09f rebase: fix warning about ignoring tool option on rebase continue (issue4698)
liscju <piotr.listkiewicz@gmail.com>
parents: 26029
diff changeset
871 if abortf and opts.get('tool', False):
13856
0995eee8ffe4 rebase: add --tool argument for specifying merge tool
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 13778
diff changeset
872 ui.warn(_('tool option will be ignored\n'))
30273
86f4ef63d507 rebase: check for conflicts before continuing
timeless <timeless@mozdev.org>
parents: 30271
diff changeset
873 if contf:
86f4ef63d507 rebase: check for conflicts before continuing
timeless <timeless@mozdev.org>
parents: 30271
diff changeset
874 ms = mergemod.mergestate.read(repo)
30495
d528ddc11b33 rebase: refer to checkunresolved by its new name
Augie Fackler <augie@google.com>
parents: 30490
diff changeset
875 mergeutil.checkunresolved(ms)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
876
29472
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
877 retcode = rbsrt._prepareabortorcontinue(abortf)
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
878 if retcode is not None:
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
879 return retcode
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
880 else:
37025
0782ac132a41 rebase: pass "inmemory" directly to _definedestmap()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37021
diff changeset
881 destmap = _definedestmap(ui, repo, inmemory, destf, srcf, basef,
0782ac132a41 rebase: pass "inmemory" directly to _definedestmap()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37021
diff changeset
882 revf, destspace=destspace)
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
883 retcode = rbsrt._preparenewrebase(destmap)
29473
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
884 if retcode is not None:
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
885 return retcode
36775
6dab3bdb1f00 rebase: only store collapse message once
Martin von Zweigbergk <martinvonz@google.com>
parents: 36774
diff changeset
886 storecollapsemsg(repo, rbsrt.collapsemsg)
21027
25ee5dbebc6b rebase: tell when reopening a closed branch head
Mads Kiilerich <madski@unity3d.com>
parents: 20790
diff changeset
887
33569
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
888 tr = None
33619
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
889
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
890 singletr = ui.configbool('rebase', 'singletransaction')
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
891 if singletr:
33569
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
892 tr = repo.transaction('rebase')
35480
01b084914a60 rebase: don't take out a dirstate guard for in-memory rebase
Phil Cohen <phillco@fb.com>
parents: 35434
diff changeset
893
01b084914a60 rebase: don't take out a dirstate guard for in-memory rebase
Phil Cohen <phillco@fb.com>
parents: 35434
diff changeset
894 # If `rebase.singletransaction` is enabled, wrap the entire operation in
01b084914a60 rebase: don't take out a dirstate guard for in-memory rebase
Phil Cohen <phillco@fb.com>
parents: 35434
diff changeset
895 # one transaction here. Otherwise, transactions are obtained when
01b084914a60 rebase: don't take out a dirstate guard for in-memory rebase
Phil Cohen <phillco@fb.com>
parents: 35434
diff changeset
896 # committing each node, which is slower but allows partial success.
33569
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
897 with util.acceptintervention(tr):
35480
01b084914a60 rebase: don't take out a dirstate guard for in-memory rebase
Phil Cohen <phillco@fb.com>
parents: 35434
diff changeset
898 # Same logic for the dirstate guard, except we don't create one when
01b084914a60 rebase: don't take out a dirstate guard for in-memory rebase
Phil Cohen <phillco@fb.com>
parents: 35434
diff changeset
899 # rebasing in-memory (it's not needed).
36773
1004fd71810f rebase: reduce scope of "dsguard" variables a bit
Martin von Zweigbergk <martinvonz@google.com>
parents: 36772
diff changeset
900 dsguard = None
35480
01b084914a60 rebase: don't take out a dirstate guard for in-memory rebase
Phil Cohen <phillco@fb.com>
parents: 35434
diff changeset
901 if singletr and not inmemory:
33619
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
902 dsguard = dirstateguard.dirstateguard(repo, 'rebase')
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
903 with util.acceptintervention(dsguard):
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
904 rbsrt._performrebase(tr)
36927
17a744c5e270 rebase: also include commit of collapsed commits in single transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 36775
diff changeset
905 rbsrt._finishrebase()
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
906
37025
0782ac132a41 rebase: pass "inmemory" directly to _definedestmap()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37021
diff changeset
907 def _definedestmap(ui, repo, inmemory, destf=None, srcf=None, basef=None,
35388
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
908 revf=None, destspace=None):
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
909 """use revisions argument to define destmap {srcrev: destrev}"""
31431
406705701c2d rebase: explicitly tests for None
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31395
diff changeset
910 if revf is None:
406705701c2d rebase: explicitly tests for None
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31395
diff changeset
911 revf = []
31395
361bccce566a rebase: don't use mutable default argument value
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31380
diff changeset
912
29043
cf7de4aeb86b destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 28686
diff changeset
913 # 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: 28686
diff changeset
914 # issue5214 for details
28136
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
915 if srcf and basef:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
916 raise error.Abort(_('cannot specify both a source and a base'))
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
917 if revf and basef:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
918 raise error.Abort(_('cannot specify both a revision and a base'))
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
919 if revf and srcf:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
920 raise error.Abort(_('cannot specify both a revision and a source'))
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
921
37025
0782ac132a41 rebase: pass "inmemory" directly to _definedestmap()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37021
diff changeset
922 if not inmemory:
35291
aa660c1203a9 rebase: do not bail on uncomitted changes if rebasing in-memory
Phil Cohen <phillco@fb.com>
parents: 35290
diff changeset
923 cmdutil.checkunfinished(repo)
aa660c1203a9 rebase: do not bail on uncomitted changes if rebasing in-memory
Phil Cohen <phillco@fb.com>
parents: 35290
diff changeset
924 cmdutil.bailifchanged(repo)
28136
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
925
31731
b5afec71c1f9 rebase: allow destination-free continue and abort (issue5513)
Ryan McElroy <rmcelroy@fb.com>
parents: 31621
diff changeset
926 if ui.configbool('commands', 'rebase.requiredest') and not destf:
b5afec71c1f9 rebase: allow destination-free continue and abort (issue5513)
Ryan McElroy <rmcelroy@fb.com>
parents: 31621
diff changeset
927 raise error.Abort(_('you must specify a destination'),
b5afec71c1f9 rebase: allow destination-free continue and abort (issue5513)
Ryan McElroy <rmcelroy@fb.com>
parents: 31621
diff changeset
928 hint=_('use: hg rebase -d REV'))
b5afec71c1f9 rebase: allow destination-free continue and abort (issue5513)
Ryan McElroy <rmcelroy@fb.com>
parents: 31621
diff changeset
929
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
930 dest = None
28136
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
931
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
932 if revf:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
933 rebaseset = scmutil.revrange(repo, revf)
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
934 if not rebaseset:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
935 ui.status(_('empty "rev" revision set - nothing to rebase\n'))
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
936 return None
28136
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
937 elif srcf:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
938 src = scmutil.revrange(repo, [srcf])
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
939 if not src:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
940 ui.status(_('empty "source" revision set - nothing to rebase\n'))
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
941 return None
28136
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
942 rebaseset = repo.revs('(%ld)::', src)
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
943 assert rebaseset
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
944 else:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
945 base = scmutil.revrange(repo, [basef or '.'])
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
946 if not base:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
947 ui.status(_('empty "base" revision set - '
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
948 "can't compute rebase set\n"))
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
949 return None
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
950 if destf:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
951 # --base does not support multiple destinations
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
952 dest = scmutil.revsingle(repo, destf)
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
953 else:
29043
cf7de4aeb86b destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 28686
diff changeset
954 dest = repo[_destrebase(repo, base, destspace=destspace)]
36475
7b84b737352d py3: replace str() calls with their preferred bytes equivalent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36405
diff changeset
955 destf = bytes(dest)
28189
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
956
30580
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
957 roots = [] # selected children of branching points
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
958 bpbase = {} # {branchingpoint: [origbase]}
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
959 for b in base: # group bases by branching points
36405
0b57596253b8 rebase: use ctx.rev() instead of %d % ctx
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36400
diff changeset
960 bp = repo.revs('ancestor(%d, %d)', b, dest.rev()).first()
30580
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
961 bpbase[bp] = bpbase.get(bp, []) + [b]
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
962 if None in bpbase:
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
963 # emulate the old behavior, showing "nothing to rebase" (a better
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
964 # behavior may be abort with "cannot find branching point" error)
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
965 bpbase.clear()
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
966 for bp, bs in bpbase.iteritems(): # calculate roots
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
967 roots += list(repo.revs('children(%d) & ancestors(%ld)', bp, bs))
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
968
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
969 rebaseset = repo.revs('%ld::', roots)
28136
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
970
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
971 if not rebaseset:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
972 # transform to list because smartsets are not comparable to
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
973 # lists. This should be improved to honor laziness of
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
974 # smartset.
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
975 if list(base) == [dest.rev()]:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
976 if basef:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
977 ui.status(_('nothing to rebase - %s is both "base"'
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
978 ' and destination\n') % dest)
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
979 else:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
980 ui.status(_('nothing to rebase - working directory '
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
981 'parent is also destination\n'))
36405
0b57596253b8 rebase: use ctx.rev() instead of %d % ctx
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36400
diff changeset
982 elif not repo.revs('%ld - ::%d', base, dest.rev()):
28136
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
983 if basef:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
984 ui.status(_('nothing to rebase - "base" %s is '
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
985 'already an ancestor of destination '
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
986 '%s\n') %
36475
7b84b737352d py3: replace str() calls with their preferred bytes equivalent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36405
diff changeset
987 ('+'.join(bytes(repo[r]) for r in base),
28136
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
988 dest))
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
989 else:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
990 ui.status(_('nothing to rebase - working '
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
991 'directory parent is already an '
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
992 'ancestor of destination %s\n') % dest)
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
993 else: # can it happen?
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
994 ui.status(_('nothing to rebase from %s to %s\n') %
36475
7b84b737352d py3: replace str() calls with their preferred bytes equivalent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36405
diff changeset
995 ('+'.join(bytes(repo[r]) for r in base), dest))
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
996 return None
36975
795eb53f1d3e rebase: allow in-memory merge of the working copy parent
Martin von Zweigbergk <martinvonz@google.com>
parents: 36960
diff changeset
997
35332
03bec089e105 rebase: disable `inmemory` if the rebaseset contains the working copy
Phil Cohen <phillco@fb.com>
parents: 35320
diff changeset
998 rebasingwcp = repo['.'].rev() in rebaseset
35487
bf556bd2f589 rebase: switch ui.log calls to common style
Phil Cohen <phillco@fb.com>
parents: 35480
diff changeset
999 ui.log("rebase", "", rebase_rebasing_wcp=rebasingwcp)
37025
0782ac132a41 rebase: pass "inmemory" directly to _definedestmap()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37021
diff changeset
1000 if inmemory and rebasingwcp:
35332
03bec089e105 rebase: disable `inmemory` if the rebaseset contains the working copy
Phil Cohen <phillco@fb.com>
parents: 35320
diff changeset
1001 # Check these since we did not before.
03bec089e105 rebase: disable `inmemory` if the rebaseset contains the working copy
Phil Cohen <phillco@fb.com>
parents: 35320
diff changeset
1002 cmdutil.checkunfinished(repo)
03bec089e105 rebase: disable `inmemory` if the rebaseset contains the working copy
Phil Cohen <phillco@fb.com>
parents: 35320
diff changeset
1003 cmdutil.bailifchanged(repo)
28189
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
1004
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
1005 if not destf:
29043
cf7de4aeb86b destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 28686
diff changeset
1006 dest = repo[_destrebase(repo, rebaseset, destspace=destspace)]
36475
7b84b737352d py3: replace str() calls with their preferred bytes equivalent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36405
diff changeset
1007 destf = bytes(dest)
28189
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
1008
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1009 allsrc = revsetlang.formatspec('%ld', rebaseset)
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1010 alias = {'ALLSRC': allsrc}
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1011
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1012 if dest is None:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1013 try:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1014 # fast path: try to resolve dest without SRC alias
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1015 dest = scmutil.revsingle(repo, destf, localalias=alias)
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1016 except error.RepoLookupError:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1017 # multi-dest path: resolve dest for each SRC separately
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1018 destmap = {}
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1019 for r in rebaseset:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1020 alias['SRC'] = revsetlang.formatspec('%d', r)
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1021 # use repo.anyrevs instead of scmutil.revsingle because we
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1022 # don't want to abort if destset is empty.
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1023 destset = repo.anyrevs([destf], user=True, localalias=alias)
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1024 size = len(destset)
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1025 if size == 1:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1026 destmap[r] = destset.first()
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1027 elif size == 0:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1028 ui.note(_('skipping %s - empty destination\n') % repo[r])
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1029 else:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1030 raise error.Abort(_('rebase destination for %s is not '
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1031 'unique') % repo[r])
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1032
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1033 if dest is not None:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1034 # single-dest case: assign dest to each rev in rebaseset
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1035 destrev = dest.rev()
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1036 destmap = {r: destrev for r in rebaseset} # {srcrev: destrev}
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1037
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1038 if not destmap:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1039 ui.status(_('nothing to rebase - empty destination\n'))
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1040 return None
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1041
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1042 return destmap
28136
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
1043
32248
b47e6b0ba6ca rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents: 32175
diff changeset
1044 def externalparent(repo, state, destancestors):
19955
2160c2e0d7d1 rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents: 19951
diff changeset
1045 """Return the revision that should be used as the second parent
32248
b47e6b0ba6ca rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents: 32175
diff changeset
1046 when the revisions in state is collapsed on top of destancestors.
19955
2160c2e0d7d1 rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents: 19951
diff changeset
1047 Abort if there is more than one parent.
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
1048 """
19955
2160c2e0d7d1 rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents: 19951
diff changeset
1049 parents = set()
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
1050 source = min(state)
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
1051 for rev in state:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
1052 if rev == source:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
1053 continue
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
1054 for p in repo[rev].parents():
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
1055 if (p.rev() not in state
32248
b47e6b0ba6ca rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents: 32175
diff changeset
1056 and p.rev() not in destancestors):
19955
2160c2e0d7d1 rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents: 19951
diff changeset
1057 parents.add(p.rev())
2160c2e0d7d1 rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents: 19951
diff changeset
1058 if not parents:
2160c2e0d7d1 rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents: 19951
diff changeset
1059 return nullrev
2160c2e0d7d1 rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents: 19951
diff changeset
1060 if len(parents) == 1:
2160c2e0d7d1 rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents: 19951
diff changeset
1061 return parents.pop()
36478
a6e9a360ccd8 py3: use '%d' for integers instead of b'%s'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36475
diff changeset
1062 raise error.Abort(_('unable to collapse on top of %d, there is more '
19956
78ab0f85e249 rebase: improve error message for more than one external parent
Mads Kiilerich <madski@unity3d.com>
parents: 19955
diff changeset
1063 'than one external parent: %s') %
32248
b47e6b0ba6ca rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents: 32175
diff changeset
1064 (max(destancestors),
36475
7b84b737352d py3: replace str() calls with their preferred bytes equivalent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36405
diff changeset
1065 ', '.join("%d" % p for p in sorted(parents))))
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
1066
37043
a8d8cdafe29c rebase: rename conclude[memory]node() to commit[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
1067 def commitmemorynode(repo, p1, p2, wctx, editor, extra, user, date, commitmsg):
37042
8ff5772711fa rebase: pass in "user" instead of "ctx" to conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37041
diff changeset
1068 '''Commit the memory changes with parents p1 and p2.
35319
228916ca12b5 rebase: add concludememorynode(), and call it when rebasing in-memory
Phil Cohen <phillco@fb.com>
parents: 35318
diff changeset
1069 Return node of committed revision.'''
37040
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
1070 # Replicates the empty check in ``repo.commit``.
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
1071 if wctx.isempty() and not repo.ui.configbool('ui', 'allowemptycommit'):
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
1072 return None
35319
228916ca12b5 rebase: add concludememorynode(), and call it when rebasing in-memory
Phil Cohen <phillco@fb.com>
parents: 35318
diff changeset
1073
37040
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
1074 # By convention, ``extra['branch']`` (set by extrafn) clobbers
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
1075 # ``branch`` (used when passing ``--keepbranches``).
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
1076 branch = repo[p1].branch()
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
1077 if 'branch' in extra:
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
1078 branch = extra['branch']
35319
228916ca12b5 rebase: add concludememorynode(), and call it when rebasing in-memory
Phil Cohen <phillco@fb.com>
parents: 35318
diff changeset
1079
37040
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
1080 memctx = wctx.tomemctx(commitmsg, parents=(p1, p2), date=date,
37042
8ff5772711fa rebase: pass in "user" instead of "ctx" to conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37041
diff changeset
1081 extra=extra, user=user, branch=branch, editor=editor)
37040
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
1082 commitres = repo.commitctx(memctx)
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
1083 wctx.clean() # Might be reused
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
1084 return commitres
35319
228916ca12b5 rebase: add concludememorynode(), and call it when rebasing in-memory
Phil Cohen <phillco@fb.com>
parents: 35318
diff changeset
1085
37043
a8d8cdafe29c rebase: rename conclude[memory]node() to commit[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
1086 def commitnode(repo, p1, p2, editor, extra, user, date, commitmsg):
37042
8ff5772711fa rebase: pass in "user" instead of "ctx" to conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37041
diff changeset
1087 '''Commit the wd changes with parents p1 and p2.
23459
2e047b1558a5 rebase: clarify naming of variables holding node hashes - don't call them rev
Mads Kiilerich <madski@unity3d.com>
parents: 23457
diff changeset
1088 Return node of committed revision.'''
33619
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
1089 dsguard = util.nullcontextmanager()
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
1090 if not repo.ui.configbool('rebase', 'singletransaction'):
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
1091 dsguard = dirstateguard.dirstateguard(repo, 'rebase')
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
1092 with dsguard:
33120
b63351f6a246 rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32084
diff changeset
1093 repo.setparents(repo[p1].node(), repo[p2].node())
22038
021becbf024a rebase: do not retract phase boundary by hand
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22004
diff changeset
1094
37040
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
1095 # Commit might fail if unresolved files exist
37042
8ff5772711fa rebase: pass in "user" instead of "ctx" to conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37041
diff changeset
1096 newnode = repo.commit(text=commitmsg, user=user, date=date,
8ff5772711fa rebase: pass in "user" instead of "ctx" to conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37041
diff changeset
1097 extra=extra, editor=editor)
22038
021becbf024a rebase: do not retract phase boundary by hand
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22004
diff changeset
1098
33120
b63351f6a246 rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32084
diff changeset
1099 repo.dirstate.setbranch(repo[newnode].branch())
b63351f6a246 rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32084
diff changeset
1100 return newnode
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1101
36772
0f3116c08e65 rebase: remove unused argument "state" from rebasenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36771
diff changeset
1102 def rebasenode(repo, rev, p1, base, collapse, dest, wctx):
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
1103 'Rebase a single revision rev on top of p1 using base as merge ancestor'
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1104 # Merge phase
32248
b47e6b0ba6ca rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents: 32175
diff changeset
1105 # Update to destination and merge it with local
35317
5c25fe7fb1e6 rebase: do not update if IMM; instead, set the overlaywctx's parents
Phil Cohen <phillco@fb.com>
parents: 35316
diff changeset
1106 if wctx.isinmemory():
5c25fe7fb1e6 rebase: do not update if IMM; instead, set the overlaywctx's parents
Phil Cohen <phillco@fb.com>
parents: 35316
diff changeset
1107 wctx.setbase(repo[p1])
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1108 else:
35317
5c25fe7fb1e6 rebase: do not update if IMM; instead, set the overlaywctx's parents
Phil Cohen <phillco@fb.com>
parents: 35316
diff changeset
1109 if repo['.'].rev() != p1:
5c25fe7fb1e6 rebase: do not update if IMM; instead, set the overlaywctx's parents
Phil Cohen <phillco@fb.com>
parents: 35316
diff changeset
1110 repo.ui.debug(" update to %d:%s\n" % (p1, repo[p1]))
5c25fe7fb1e6 rebase: do not update if IMM; instead, set the overlaywctx's parents
Phil Cohen <phillco@fb.com>
parents: 35316
diff changeset
1111 mergemod.update(repo, p1, False, True)
5c25fe7fb1e6 rebase: do not update if IMM; instead, set the overlaywctx's parents
Phil Cohen <phillco@fb.com>
parents: 35316
diff changeset
1112 else:
5c25fe7fb1e6 rebase: do not update if IMM; instead, set the overlaywctx's parents
Phil Cohen <phillco@fb.com>
parents: 35316
diff changeset
1113 repo.ui.debug(" already in destination\n")
35410
83014fa95435 rebase: fix for hgsubversion
Phil Cohen <phillco@fb.com>
parents: 35388
diff changeset
1114 # This is, alas, necessary to invalidate workingctx's manifest cache,
83014fa95435 rebase: fix for hgsubversion
Phil Cohen <phillco@fb.com>
parents: 35388
diff changeset
1115 # as well as other data we litter on it in other places.
83014fa95435 rebase: fix for hgsubversion
Phil Cohen <phillco@fb.com>
parents: 35388
diff changeset
1116 wctx = repo[None]
35317
5c25fe7fb1e6 rebase: do not update if IMM; instead, set the overlaywctx's parents
Phil Cohen <phillco@fb.com>
parents: 35316
diff changeset
1117 repo.dirstate.write(repo.currenttransaction())
23461
ffef6d503ab2 rebase: avoid redundant repo[rev].rev() - just keep working in rev space
Mads Kiilerich <madski@unity3d.com>
parents: 23460
diff changeset
1118 repo.ui.debug(" merge against %d:%s\n" % (rev, repo[rev]))
19969
ad9db007656f rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19956
diff changeset
1119 if base is not None:
23461
ffef6d503ab2 rebase: avoid redundant repo[rev].rev() - just keep working in rev space
Mads Kiilerich <madski@unity3d.com>
parents: 23460
diff changeset
1120 repo.ui.debug(" detach base %d:%s\n" % (base, repo[base]))
16696
d1afbf03e69a rebase: allow collapsing branches in place (issue3111)
Patrick Mezard <patrick@mezard.eu>
parents: 16566
diff changeset
1121 # When collapsing in-place, the parent is the common ancestor, we
d1afbf03e69a rebase: allow collapsing branches in place (issue3111)
Patrick Mezard <patrick@mezard.eu>
parents: 16566
diff changeset
1122 # have to allow merging with it.
30271
0fa1a41d04e4 rebase: rename merge to mergemod
timeless <timeless@mozdev.org>
parents: 30007
diff changeset
1123 stats = mergemod.update(repo, rev, True, True, base, collapse,
35318
2bac2d836ce0 rebase: pass the wctx object (IMM or on-disk) to merge.update
Phil Cohen <phillco@fb.com>
parents: 35317
diff changeset
1124 labels=['dest', 'source'], wc=wctx)
22905
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
1125 if collapse:
34787
754b5117622f context: add workingfilectx.markcopied
Phil Cohen <phillco@fb.com>
parents: 34614
diff changeset
1126 copies.duplicatecopies(repo, wctx, rev, dest)
22905
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
1127 else:
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
1128 # If we're not using --collapse, we need to
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
1129 # duplicate copies between the revision we're
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
1130 # rebasing and its first parent, but *not*
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
1131 # duplicate any copies that have already been
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
1132 # performed in the destination.
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
1133 p1rev = repo[rev].p1().rev()
34787
754b5117622f context: add workingfilectx.markcopied
Phil Cohen <phillco@fb.com>
parents: 34614
diff changeset
1134 copies.duplicatecopies(repo, wctx, rev, p1rev, skiprev=dest)
22905
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
1135 return stats
6923
ebf1462f2145 strip trailing whitespace, replace tabs by spaces
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6906
diff changeset
1136
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
1137 def adjustdest(repo, rev, destmap, state, skipped):
33590
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1138 """adjust rebase destination given the current rebase state
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1139
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1140 rev is what is being rebased. Return a list of two revs, which are the
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1141 adjusted destinations for rev's p1 and p2, respectively. If a parent is
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1142 nullrev, return dest without adjustment for it.
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1143
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1144 For example, when doing rebasing B+E to F, C to G, rebase will first move B
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1145 to B1, and E's destination will be adjusted from F to B1.
33590
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1146
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1147 B1 <- written during rebasing B
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1148 |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1149 F <- original destination of B, E
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1150 |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1151 | E <- rev, which is being rebased
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1152 | |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1153 | D <- prev, one parent of rev being checked
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1154 | |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1155 | x <- skipped, ex. no successor or successor in (::dest)
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1156 | |
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1157 | C <- rebased as C', different destination
33590
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1158 | |
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1159 | B <- rebased as B1 C'
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1160 |/ |
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1161 A G <- destination of C, different
33590
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1162
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1163 Another example about merge changeset, rebase -r C+G+H -d K, rebase will
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1164 first move C to C1, G to G1, and when it's checking H, the adjusted
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1165 destinations will be [C1, G1].
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1166
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1167 H C1 G1
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1168 /| | /
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1169 F G |/
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1170 K | | -> K
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1171 | C D |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1172 | |/ |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1173 | B | ...
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1174 |/ |/
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1175 A A
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1176
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1177 Besides, adjust dest according to existing rebase information. For example,
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1178
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1179 B C D B needs to be rebased on top of C, C needs to be rebased on top
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1180 \|/ of D. We will rebase C first.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1181 A
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1182
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1183 C' After rebasing C, when considering B's destination, use C'
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1184 | instead of the original C.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1185 B D
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1186 \ /
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1187 A
33590
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1188 """
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1189 # pick already rebased revs with same dest from state as interesting source
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1190 dest = destmap[rev]
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
1191 source = [s for s, d in state.items()
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
1192 if d > 0 and destmap[s] == dest and s not in skipped]
33849
3ae2eaecb49e rebase: optimize "source" calculation in adjustdest
Jun Wu <quark@fb.com>
parents: 33848
diff changeset
1193
33590
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1194 result = []
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1195 for prev in repo.changelog.parentrevs(rev):
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1196 adjusted = dest
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1197 if prev != nullrev:
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1198 candidate = repo.revs('max(%ld and (::%d))', source, prev).first()
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1199 if candidate is not None:
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1200 adjusted = state[candidate]
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1201 if adjusted == dest and dest in state:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1202 adjusted = state[dest]
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1203 if adjusted == revtodo:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1204 # sortsource should produce an order that makes this impossible
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1205 raise error.ProgrammingError(
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1206 'rev %d should be rebased already at this time' % dest)
33590
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1207 result.append(adjusted)
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1208 return result
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1209
33846
3b04a6ff625c rebase: remove rebaseset from _checkobsrebase
Jun Wu <quark@fb.com>
parents: 33845
diff changeset
1210 def _checkobsrebase(repo, ui, rebaseobsrevs, rebaseobsskipped):
28685
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1211 """
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1212 Abort if rebase will create divergence or rebase is noop because of markers
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1213
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1214 `rebaseobsrevs`: set of obsolete revision in source
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1215 `rebaseobsskipped`: set of revisions from source skipped because they have
35995
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
1216 successors in destination or no non-obsolete successor.
28685
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1217 """
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1218 # Obsolete node with successors not in dest leads to divergence
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1219 divergenceok = ui.configbool('experimental',
34872
29f52e7966dd config: gather allowdivergence under the evolution namespace
Boris Feld <boris.feld@octobus.net>
parents: 34831
diff changeset
1220 'evolution.allowdivergence')
28685
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1221 divergencebasecandidates = rebaseobsrevs - rebaseobsskipped
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1222
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1223 if divergencebasecandidates and not divergenceok:
36475
7b84b737352d py3: replace str() calls with their preferred bytes equivalent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36405
diff changeset
1224 divhashes = (bytes(repo[r])
28685
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1225 for r in divergencebasecandidates)
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1226 msg = _("this rebase will cause "
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1227 "divergences from: %s")
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1228 h = _("to force the rebase please set "
34872
29f52e7966dd config: gather allowdivergence under the evolution namespace
Boris Feld <boris.feld@octobus.net>
parents: 34831
diff changeset
1229 "experimental.evolution.allowdivergence=True")
28685
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1230 raise error.Abort(msg % (",".join(divhashes),), hint=h)
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1231
34095
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34094
diff changeset
1232 def successorrevs(unfi, rev):
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1233 """yield revision numbers for successors of rev"""
34095
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34094
diff changeset
1234 assert unfi.filtername is None
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1235 nodemap = unfi.changelog.nodemap
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1236 for s in obsutil.allsuccessors(unfi.obsstore, [unfi[rev].node()]):
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1237 if s in nodemap:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1238 yield nodemap[s]
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1239
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
1240 def defineparents(repo, rev, destmap, state, skipped, obsskipped):
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1241 """Return new parents and optionally a merge base for rev being rebased
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1242
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1243 The destination specified by "dest" cannot always be used directly because
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1244 previously rebase result could affect destination. For example,
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1245
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1246 D E rebase -r C+D+E -d B
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1247 |/ C will be rebased to C'
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1248 B C D's new destination will be C' instead of B
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1249 |/ E's new destination will be C' instead of B
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1250 A
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1251
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1252 The new parents of a merge is slightly more complicated. See the comment
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1253 block below.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1254 """
34092
8a8e7a94ba07 rebase: do not crash rebasing merge with a parent having hidden successor
Jun Wu <quark@fb.com>
parents: 34009
diff changeset
1255 # use unfiltered changelog since successorrevs may return filtered nodes
34095
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34094
diff changeset
1256 assert repo.filtername is None
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34094
diff changeset
1257 cl = repo.changelog
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1258 def isancestor(a, b):
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1259 # take revision numbers instead of nodes
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1260 if a == b:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1261 return True
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1262 elif a > b:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1263 return False
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1264 return cl.isancestor(cl.node(a), cl.node(b))
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1265
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1266 dest = destmap[rev]
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1267 oldps = repo.changelog.parentrevs(rev) # old parents
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1268 newps = [nullrev, nullrev] # new parents
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
1269 dests = adjustdest(repo, rev, destmap, state, skipped)
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1270 bases = list(oldps) # merge base candidates, initially just old parents
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1271
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1272 if all(r == nullrev for r in oldps[1:]):
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1273 # For non-merge changeset, just move p to adjusted dest as requested.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1274 newps[0] = dests[0]
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1275 else:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1276 # For merge changeset, if we move p to dests[i] unconditionally, both
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1277 # parents may change and the end result looks like "the merge loses a
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1278 # parent", which is a surprise. This is a limit because "--dest" only
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1279 # accepts one dest per src.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1280 #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1281 # Therefore, only move p with reasonable conditions (in this order):
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1282 # 1. use dest, if dest is a descendent of (p or one of p's successors)
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1283 # 2. use p's rebased result, if p is rebased (state[p] > 0)
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1284 #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1285 # Comparing with adjustdest, the logic here does some additional work:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1286 # 1. decide which parents will not be moved towards dest
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1287 # 2. if the above decision is "no", should a parent still be moved
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1288 # because it was rebased?
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1289 #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1290 # For example:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1291 #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1292 # C # "rebase -r C -d D" is an error since none of the parents
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1293 # /| # can be moved. "rebase -r B+C -d D" will move C's parent
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1294 # A B D # B (using rule "2."), since B will be rebased.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1295 #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1296 # The loop tries to be not rely on the fact that a Mercurial node has
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1297 # at most 2 parents.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1298 for i, p in enumerate(oldps):
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1299 np = p # new parent
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1300 if any(isancestor(x, dests[i]) for x in successorrevs(repo, p)):
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1301 np = dests[i]
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1302 elif p in state and state[p] > 0:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1303 np = state[p]
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
1304
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1305 # "bases" only record "special" merge bases that cannot be
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1306 # calculated from changelog DAG (i.e. isancestor(p, np) is False).
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1307 # For example:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1308 #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1309 # B' # rebase -s B -d D, when B was rebased to B'. dest for C
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1310 # | C # is B', but merge base for C is B, instead of
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1311 # D | # changelog.ancestor(C, B') == A. If changelog DAG and
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1312 # | B # "state" edges are merged (so there will be an edge from
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1313 # |/ # B to B'), the merge base is still ancestor(C, B') in
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1314 # A # the merged graph.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1315 #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1316 # Also see https://bz.mercurial-scm.org/show_bug.cgi?id=1950#c8
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1317 # which uses "virtual null merge" to explain this situation.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1318 if isancestor(p, np):
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1319 bases[i] = nullrev
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1320
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1321 # If one parent becomes an ancestor of the other, drop the ancestor
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1322 for j, x in enumerate(newps[:i]):
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1323 if x == nullrev:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1324 continue
33863
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1325 if isancestor(np, x): # CASE-1
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1326 np = nullrev
33863
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1327 elif isancestor(x, np): # CASE-2
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1328 newps[j] = np
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1329 np = nullrev
33863
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1330 # New parents forming an ancestor relationship does not
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1331 # mean the old parents have a similar relationship. Do not
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1332 # set bases[x] to nullrev.
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1333 bases[j], bases[i] = bases[i], bases[j]
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1334
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1335 newps[i] = np
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1336
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1337 # "rebasenode" updates to new p1, and the old p1 will be used as merge
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1338 # base. If only p2 changes, merging using unchanged p1 as merge base is
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1339 # suboptimal. Therefore swap parents to make the merge sane.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1340 if newps[1] != nullrev and oldps[0] == newps[0]:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1341 assert len(newps) == 2 and len(oldps) == 2
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1342 newps.reverse()
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1343 bases.reverse()
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1344
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1345 # No parent change might be an error because we fail to make rev a
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1346 # descendent of requested dest. This can happen, for example:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1347 #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1348 # C # rebase -r C -d D
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1349 # /| # None of A and B will be changed to D and rebase fails.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1350 # A B D
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1351 if set(newps) == set(oldps) and dest not in newps:
33789
19f495fef0a3 rebase: change "result would have 3 parent" error message (BC)
Jun Wu <quark@fb.com>
parents: 33786
diff changeset
1352 raise error.Abort(_('cannot rebase %d:%s without '
19f495fef0a3 rebase: change "result would have 3 parent" error message (BC)
Jun Wu <quark@fb.com>
parents: 33786
diff changeset
1353 'moving at least one of its parents')
19f495fef0a3 rebase: change "result would have 3 parent" error message (BC)
Jun Wu <quark@fb.com>
parents: 33786
diff changeset
1354 % (rev, repo[rev]))
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1355
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1356 # Source should not be ancestor of dest. The check here guarantees it's
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1357 # impossible. With multi-dest, the initial check does not cover complex
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1358 # cases since we don't have abstractions to dry-run rebase cheaply.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1359 if any(p != nullrev and isancestor(rev, p) for p in newps):
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1360 raise error.Abort(_('source is ancestor of destination'))
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1361
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1362 # "rebasenode" updates to new p1, use the corresponding merge base.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1363 if bases[0] != nullrev:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1364 base = bases[0]
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1365 else:
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
1366 base = None
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1367
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1368 # Check if the merge will contain unwanted changes. That may happen if
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1369 # there are multiple special (non-changelog ancestor) merge bases, which
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1370 # cannot be handled well by the 3-way merge algorithm. For example:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1371 #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1372 # F
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1373 # /|
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1374 # D E # "rebase -r D+E+F -d Z", when rebasing F, if "D" was chosen
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1375 # | | # as merge base, the difference between D and F will include
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1376 # B C # C, so the rebased F will contain C surprisingly. If "E" was
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1377 # |/ # chosen, the rebased F will contain B.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1378 # A Z
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1379 #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1380 # But our merge base candidates (D and E in above case) could still be
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1381 # better than the default (ancestor(F, Z) == null). Therefore still
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1382 # pick one (so choose p1 above).
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1383 if sum(1 for b in bases if b != nullrev) > 1:
33863
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1384 unwanted = [None, None] # unwanted[i]: unwanted revs if choose bases[i]
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1385 for i, base in enumerate(bases):
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1386 if base == nullrev:
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1387 continue
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1388 # Revisions in the side (not chosen as merge base) branch that
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1389 # might contain "surprising" contents
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1390 siderevs = list(repo.revs('((%ld-%d) %% (%d+%d))',
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1391 bases, base, base, dest))
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
1392
33863
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1393 # If those revisions are covered by rebaseset, the result is good.
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1394 # A merge in rebaseset would be considered to cover its ancestors.
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1395 if siderevs:
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
1396 rebaseset = [r for r, d in state.items()
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
1397 if d > 0 and r not in obsskipped]
33863
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1398 merges = [r for r in rebaseset
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1399 if cl.parentrevs(r)[1] != nullrev]
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1400 unwanted[i] = list(repo.revs('%ld - (::%ld) - %ld',
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1401 siderevs, merges, rebaseset))
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1402
33863
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1403 # Choose a merge base that has a minimal number of unwanted revs.
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1404 l, i = min((len(revs), i)
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1405 for i, revs in enumerate(unwanted) if revs is not None)
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1406 base = bases[i]
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1407
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1408 # newps[0] should match merge base if possible. Currently, if newps[i]
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1409 # is nullrev, the only case is newps[i] and newps[j] (j < i), one is
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1410 # the other's ancestor. In that case, it's fine to not swap newps here.
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1411 # (see CASE-1 and CASE-2 above)
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1412 if i != 0 and newps[i] != nullrev:
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1413 newps[0], newps[i] = newps[i], newps[0]
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1414
33863
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1415 # The merge will include unwanted revisions. Abort now. Revisit this if
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1416 # we have a more advanced merge algorithm that handles multiple bases.
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1417 if l > 0:
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1418 unwanteddesc = _(' or ').join(
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1419 (', '.join('%d:%s' % (r, repo[r]) for r in revs)
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1420 for revs in unwanted if revs is not None))
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1421 raise error.Abort(
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1422 _('rebasing %d:%s will include unwanted changes from %s')
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1423 % (rev, repo[rev], unwanteddesc))
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1424
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1425 repo.ui.debug(" future parents are %d and %d\n" % tuple(newps))
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1426
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1427 return newps[0], newps[1], base
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1428
7955
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
1429 def isagitpatch(repo, patchname):
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
1430 'Return true if the given patch is in git format'
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
1431 mqpatch = os.path.join(repo.mq.path, patchname)
36394
4bc983568016 py3: replace file() with open()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36299
diff changeset
1432 for line in patch.linereader(open(mqpatch, 'rb')):
7955
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
1433 if line.startswith('diff --git'):
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
1434 return True
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
1435 return False
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
1436
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1437 def updatemq(repo, state, skipped, **opts):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1438 'Update rebased mq patches - finalize and then import them'
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1439 mqrebase = {}
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
1440 mq = repo.mq
14572
8ff2957c1d82 mq: rename full_series to fullseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14509
diff changeset
1441 original_series = mq.fullseries[:]
16531
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
1442 skippedpatches = set()
14497
ea585f2b1adc rebase: restore mq guards after rebasing (issue2107)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 13894
diff changeset
1443
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
1444 for p in mq.applied:
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
1445 rev = repo[p.node].rev()
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
1446 if rev in state:
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9301
diff changeset
1447 repo.ui.debug('revision %d is an mq patch (%s), finalize it.\n' %
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
1448 (rev, p.name))
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
1449 mqrebase[rev] = (p.name, isagitpatch(repo, p.name))
16531
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
1450 else:
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
1451 # Applied but not rebased, not sure this should happen
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
1452 skippedpatches.add(p.name)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1453
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1454 if mqrebase:
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
1455 mq.finish(repo, mqrebase.keys())
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1456
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1457 # We must start import from the newest revision
8210
344751cd8cb8 replace various uses of list.reverse()
Matt Mackall <mpm@selenic.com>
parents: 8209
diff changeset
1458 for rev in sorted(mqrebase, reverse=True):
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1459 if rev not in skipped:
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
1460 name, isgit = mqrebase[rev]
36475
7b84b737352d py3: replace str() calls with their preferred bytes equivalent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36405
diff changeset
1461 repo.ui.note(_('updating mq patch %s to %d:%s\n') %
23520
de143427c499 rebase: show a note for updated mq patches
Mads Kiilerich <mads@kiilerich.com>
parents: 23519
diff changeset
1462 (name, state[rev], repo[state[rev]]))
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
1463 mq.qimport(repo, (), patchname=name, git=isgit,
36475
7b84b737352d py3: replace str() calls with their preferred bytes equivalent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36405
diff changeset
1464 rev=["%d" % state[rev]])
16531
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
1465 else:
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
1466 # Rebased and skipped
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
1467 skippedpatches.add(mqrebase[rev][0])
14497
ea585f2b1adc rebase: restore mq guards after rebasing (issue2107)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 13894
diff changeset
1468
16531
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
1469 # Patches were either applied and rebased and imported in
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
1470 # order, applied and removed or unapplied. Discard the removed
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
1471 # ones while preserving the original series order and guards.
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
1472 newseries = [s for s in original_series
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
1473 if mq.guard_re.split(s, 1)[0] not in skippedpatches]
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
1474 mq.fullseries[:] = newseries
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
1475 mq.seriesdirty = True
14580
92101ea35015 mq: rename save_dirty to savedirty
Adrian Buehlmann <adrian@cadifra.com>
parents: 14572
diff changeset
1476 mq.savedirty()
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1477
28185
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1478 def storecollapsemsg(repo, collapsemsg):
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1479 'Store the collapse message to allow recovery'
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1480 collapsemsg = collapsemsg or ''
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1481 f = repo.vfs("last-message.txt", "w")
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1482 f.write("%s\n" % collapsemsg)
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1483 f.close()
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1484
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1485 def clearcollapsemsg(repo):
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1486 'Remove collapse message file'
31311
f59b6cf663a9 vfs: use repo.vfs.unlinkpath
Mads Kiilerich <mads@kiilerich.com>
parents: 31302
diff changeset
1487 repo.vfs.unlinkpath("last-message.txt", ignoremissing=True)
28185
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1488
31225
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
1489 def restorecollapsemsg(repo, isabort):
28185
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1490 'Restore previously stored collapse message'
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1491 try:
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1492 f = repo.vfs("last-message.txt")
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1493 collapsemsg = f.readline().strip()
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1494 f.close()
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1495 except IOError as err:
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1496 if err.errno != errno.ENOENT:
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1497 raise
31225
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
1498 if isabort:
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
1499 # Oh well, just abort like normal
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
1500 collapsemsg = ''
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
1501 else:
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
1502 raise error.Abort(_('missing .hg/last-message.txt for rebase'))
28185
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1503 return collapsemsg
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1504
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1505 def clearstatus(repo):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1506 'Remove the status files'
33056
2312e70cf78b rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents: 32918
diff changeset
1507 # Make sure the active transaction won't write the state file
2312e70cf78b rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents: 32918
diff changeset
1508 tr = repo.currenttransaction()
2312e70cf78b rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents: 32918
diff changeset
1509 if tr:
2312e70cf78b rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents: 32918
diff changeset
1510 tr.removefilegenerator('rebasestate')
31311
f59b6cf663a9 vfs: use repo.vfs.unlinkpath
Mads Kiilerich <mads@kiilerich.com>
parents: 31302
diff changeset
1511 repo.vfs.unlinkpath("rebasestate", ignoremissing=True)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1512
25070
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
1513 def needupdate(repo, state):
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
1514 '''check whether we should `update --clean` away from a merge, or if
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
1515 somehow the working dir got forcibly updated, e.g. by older hg'''
27167
3fe8cb40c9c5 commands: inline definition of localrepo.parents() and drop the method (API)
Augie Fackler <augie@google.com>
parents: 27146
diff changeset
1516 parents = [p.rev() for p in repo[None].parents()]
25070
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
1517
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
1518 # Are we in a merge state at all?
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
1519 if len(parents) < 2:
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
1520 return False
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
1521
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
1522 # We should be standing on the first as-of-yet unrebased commit.
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
1523 firstunrebased = min([old for old, new in state.iteritems()
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
1524 if new == nullrev])
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
1525 if firstunrebased in parents:
19516
fe78eb7bcca0 rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents: 19496
diff changeset
1526 return True
fe78eb7bcca0 rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents: 19496
diff changeset
1527
fe78eb7bcca0 rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents: 19496
diff changeset
1528 return False
fe78eb7bcca0 rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents: 19496
diff changeset
1529
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1530 def abort(repo, originalwd, destmap, state, activebookmark=None):
24758
d7451adc72f6 rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents: 23970
diff changeset
1531 '''Restore the repository to its original state. Additional args:
d7451adc72f6 rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents: 23970
diff changeset
1532
d7451adc72f6 rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents: 23970
diff changeset
1533 activebookmark: the name of the bookmark that should be active after the
d7451adc72f6 rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents: 23970
diff changeset
1534 restore'''
26677
e9b3d523f2e6 rebase: properly abort when destination is public (issue4896)
Christian Delahousse <cdelahousse@fb.com>
parents: 26675
diff changeset
1535
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
1536 try:
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
1537 # If the first commits in the rebased set get skipped during the rebase,
32248
b47e6b0ba6ca rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents: 32175
diff changeset
1538 # their values within the state mapping will be the dest rev id. The
36980
a046d6890761 rebase: avoid defining two lists with the same contents
Martin von Zweigbergk <martinvonz@google.com>
parents: 35701
diff changeset
1539 # rebased list must must not contain the dest rev (issue4896)
36981
177f3b90335f rebase: on abort, don't strip commits that didn't need rebased (issue5822)
Martin von Zweigbergk <martinvonz@google.com>
parents: 36980
diff changeset
1540 rebased = [s for r, s in state.items()
177f3b90335f rebase: on abort, don't strip commits that didn't need rebased (issue5822)
Martin von Zweigbergk <martinvonz@google.com>
parents: 36980
diff changeset
1541 if s >= 0 and s != r and s != destmap[r]]
36980
a046d6890761 rebase: avoid defining two lists with the same contents
Martin von Zweigbergk <martinvonz@google.com>
parents: 35701
diff changeset
1542 immutable = [d for d in rebased if not repo[d].mutable()]
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
1543 cleanup = True
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
1544 if immutable:
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
1545 repo.ui.warn(_("warning: can't clean up public changesets %s\n")
36475
7b84b737352d py3: replace str() calls with their preferred bytes equivalent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36405
diff changeset
1546 % ', '.join(bytes(repo[r]) for r in immutable),
29966
11604da46982 rebase: use single quotes in use warning
timeless <timeless@mozdev.org>
parents: 29936
diff changeset
1547 hint=_("see 'hg help phases' for details"))
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
1548 cleanup = False
16280
0806823370d8 rebase: properly calculate descendant set when aborting (issue3332)
Matt Mackall <mpm@selenic.com>
parents: 16228
diff changeset
1549
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
1550 descendants = set()
36980
a046d6890761 rebase: avoid defining two lists with the same contents
Martin von Zweigbergk <martinvonz@google.com>
parents: 35701
diff changeset
1551 if rebased:
a046d6890761 rebase: avoid defining two lists with the same contents
Martin von Zweigbergk <martinvonz@google.com>
parents: 35701
diff changeset
1552 descendants = set(repo.changelog.descendants(rebased))
a046d6890761 rebase: avoid defining two lists with the same contents
Martin von Zweigbergk <martinvonz@google.com>
parents: 35701
diff changeset
1553 if descendants - set(rebased):
32249
27e67cfea27f rebase: rename "target" to "destination" in messages
Martin von Zweigbergk <martinvonz@google.com>
parents: 32248
diff changeset
1554 repo.ui.warn(_("warning: new changesets detected on destination "
27e67cfea27f rebase: rename "target" to "destination" in messages
Martin von Zweigbergk <martinvonz@google.com>
parents: 32248
diff changeset
1555 "branch, can't strip\n"))
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
1556 cleanup = False
19518
12843143663d rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents: 19517
diff changeset
1557
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
1558 if cleanup:
27988
61f4d59e9a0b rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents: 27977
diff changeset
1559 shouldupdate = False
61f4d59e9a0b rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents: 27977
diff changeset
1560 if rebased:
61f4d59e9a0b rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents: 27977
diff changeset
1561 strippoints = [
61f4d59e9a0b rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents: 27977
diff changeset
1562 c.node() for c in repo.set('roots(%ld)', rebased)]
31222
56d3e0b499df rebase: clear updatestate during rebase --abort in more cases
Durham Goode <durham@fb.com>
parents: 31023
diff changeset
1563
56d3e0b499df rebase: clear updatestate during rebase --abort in more cases
Durham Goode <durham@fb.com>
parents: 31023
diff changeset
1564 updateifonnodes = set(rebased)
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1565 updateifonnodes.update(destmap.values())
31222
56d3e0b499df rebase: clear updatestate during rebase --abort in more cases
Durham Goode <durham@fb.com>
parents: 31023
diff changeset
1566 updateifonnodes.add(originalwd)
56d3e0b499df rebase: clear updatestate during rebase --abort in more cases
Durham Goode <durham@fb.com>
parents: 31023
diff changeset
1567 shouldupdate = repo['.'].rev() in updateifonnodes
27988
61f4d59e9a0b rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents: 27977
diff changeset
1568
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
1569 # Update away from the rebase if necessary
27988
61f4d59e9a0b rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents: 27977
diff changeset
1570 if shouldupdate or needupdate(repo, state):
30271
0fa1a41d04e4 rebase: rename merge to mergemod
timeless <timeless@mozdev.org>
parents: 30007
diff changeset
1571 mergemod.update(repo, originalwd, False, True)
19516
fe78eb7bcca0 rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents: 19496
diff changeset
1572
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
1573 # Strip from the first rebased revision
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
1574 if rebased:
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
1575 # no backup of rebased cset versions needed
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
1576 repair.strip(repo.ui, repo, strippoints)
19518
12843143663d rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents: 19517
diff changeset
1577
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
1578 if activebookmark and activebookmark in repo._bookmarks:
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
1579 bookmarks.activate(repo, activebookmark)
24758
d7451adc72f6 rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents: 23970
diff changeset
1580
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
1581 finally:
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
1582 clearstatus(repo)
28185
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1583 clearcollapsemsg(repo)
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
1584 repo.ui.warn(_('rebase aborted\n'))
19518
12843143663d rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents: 19517
diff changeset
1585 return 0
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1586
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1587 def sortsource(destmap):
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1588 """yield source revisions in an order that we only rebase things once
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1589
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1590 If source and destination overlaps, we should filter out revisions
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1591 depending on other revisions which hasn't been rebased yet.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1592
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1593 Yield a sorted list of revisions each time.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1594
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1595 For example, when rebasing A to B, B to C. This function yields [B], then
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1596 [A], indicating B needs to be rebased first.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1597
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1598 Raise if there is a cycle so the rebase is impossible.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1599 """
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1600 srcset = set(destmap)
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1601 while srcset:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1602 srclist = sorted(srcset)
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1603 result = []
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1604 for r in srclist:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1605 if destmap[r] not in srcset:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1606 result.append(r)
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1607 if not result:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1608 raise error.Abort(_('source and destination form a cycle'))
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1609 srcset -= set(result)
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1610 yield result
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1611
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
1612 def buildstate(repo, destmap, collapse):
15267
3bfdfefea2fc rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15219
diff changeset
1613 '''Define which revisions are going to be rebased and where
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1614
15267
3bfdfefea2fc rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15219
diff changeset
1615 repo: repo
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1616 destmap: {srcrev: destrev}
17005
50f434510da6 rebase: do not add second parent to rebased changeset (drop detach option) (BC)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 16867
diff changeset
1617 '''
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1618 rebaseset = destmap.keys()
31297
f5c71e98f0f7 rebase: unhide original working directory node as well (issue5219)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31296
diff changeset
1619 originalwd = repo['.'].rev()
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1620
10672
c2e1e637d4da rebase: always check if rebasing onto an applied mq patch.
Greg Ward <greg-hg@gerg.ca>
parents: 10659
diff changeset
1621 # This check isn't strictly necessary, since mq detects commits over an
c2e1e637d4da rebase: always check if rebasing onto an applied mq patch.
Greg Ward <greg-hg@gerg.ca>
parents: 10659
diff changeset
1622 # applied patch. But it prevents messing up the working directory when
c2e1e637d4da rebase: always check if rebasing onto an applied mq patch.
Greg Ward <greg-hg@gerg.ca>
parents: 10659
diff changeset
1623 # a partially completed rebase is blocked by mq.
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1624 if 'qtip' in repo.tags():
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1625 mqapplied = set(repo[s.node].rev() for s in repo.mq.applied)
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1626 if set(destmap.values()) & mqapplied:
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1627 raise error.Abort(_('cannot rebase onto an applied mq patch'))
10672
c2e1e637d4da rebase: always check if rebasing onto an applied mq patch.
Greg Ward <greg-hg@gerg.ca>
parents: 10659
diff changeset
1628
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1629 # Get "cycle" error early by exhausting the generator.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1630 sortedsrc = list(sortsource(destmap)) # a list of sorted revs
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1631 if not sortedsrc:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1632 raise error.Abort(_('no matching revisions'))
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1633
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1634 # Only check the first batch of revisions to rebase not depending on other
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1635 # rebaseset. This means "source is ancestor of destination" for the second
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1636 # (and following) batches of revisions are not checked here. We rely on
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1637 # "defineparents" to do that check.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1638 roots = list(repo.set('roots(%ld)', sortedsrc[0]))
15267
3bfdfefea2fc rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15219
diff changeset
1639 if not roots:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26496
diff changeset
1640 raise error.Abort(_('no matching revisions'))
36271
53be14874ee8 rebase: sort roots by revision
Augie Fackler <augie@google.com>
parents: 36185
diff changeset
1641 def revof(r):
53be14874ee8 rebase: sort roots by revision
Augie Fackler <augie@google.com>
parents: 36185
diff changeset
1642 return r.rev()
53be14874ee8 rebase: sort roots by revision
Augie Fackler <augie@google.com>
parents: 36185
diff changeset
1643 roots = sorted(roots, key=revof)
32175
456b4a32d75f rebase: don't update state dict same way for each root
Martin von Zweigbergk <martinvonz@google.com>
parents: 32084
diff changeset
1644 state = dict.fromkeys(rebaseset, revtodo)
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1645 emptyrebase = (len(sortedsrc) == 1)
18424
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
1646 for root in roots:
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1647 dest = repo[destmap[root.rev()]]
18424
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
1648 commonbase = root.ancestor(dest)
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
1649 if commonbase == root:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26496
diff changeset
1650 raise error.Abort(_('source is ancestor of destination'))
18424
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
1651 if commonbase == dest:
31380
65d93d712777 rebase: allow rebasing children of wd to wd if a new branch has been set (BC)
Mads Kiilerich <mads@kiilerich.com>
parents: 31311
diff changeset
1652 wctx = repo[None]
65d93d712777 rebase: allow rebasing children of wd to wd if a new branch has been set (BC)
Mads Kiilerich <mads@kiilerich.com>
parents: 31311
diff changeset
1653 if dest == wctx.p1():
65d93d712777 rebase: allow rebasing children of wd to wd if a new branch has been set (BC)
Mads Kiilerich <mads@kiilerich.com>
parents: 31311
diff changeset
1654 # when rebasing to '.', it will use the current wd branch name
65d93d712777 rebase: allow rebasing children of wd to wd if a new branch has been set (BC)
Mads Kiilerich <mads@kiilerich.com>
parents: 31311
diff changeset
1655 samebranch = root.branch() == wctx.branch()
65d93d712777 rebase: allow rebasing children of wd to wd if a new branch has been set (BC)
Mads Kiilerich <mads@kiilerich.com>
parents: 31311
diff changeset
1656 else:
65d93d712777 rebase: allow rebasing children of wd to wd if a new branch has been set (BC)
Mads Kiilerich <mads@kiilerich.com>
parents: 31311
diff changeset
1657 samebranch = root.branch() == dest.branch()
32900
07d5a503124c rebase: rewrite "x in y.children()" as "y in x.parents()"
Martin von Zweigbergk <martinvonz@google.com>
parents: 32594
diff changeset
1658 if not collapse and samebranch and dest in root.parents():
32272
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
1659 # mark the revision as done by setting its new revision
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
1660 # equal to its old (current) revisions
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
1661 state[root.rev()] = root.rev()
18424
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
1662 repo.ui.debug('source is a child of destination\n')
32272
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
1663 continue
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1664
32272
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
1665 emptyrebase = False
29936
3e7ded768556 rebase: make debug logging more consistent
Martin von Zweigbergk <martinvonz@google.com>
parents: 29872
diff changeset
1666 repo.ui.debug('rebase onto %s starting from %s\n' % (dest, root))
32272
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
1667 if emptyrebase:
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
1668 return None
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
1669 for rev in sorted(state):
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
1670 parents = [p for p in repo.changelog.parentrevs(rev) if p != nullrev]
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
1671 # if all parents of this revision are done, then so is this revision
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
1672 if parents and all((state.get(p) == p for p in parents)):
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
1673 state[rev] = rev
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1674 return originalwd, destmap, state
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1675
34367
f61f5af5ed31 merge with stable
Martin von Zweigbergk <martinvonz@google.com>
parents: 34290 34354
diff changeset
1676 def clearrebased(ui, repo, destmap, state, skipped, collapsedas=None,
34883
c858afe9c59b rebase: add support to output nodechanges
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34872
diff changeset
1677 keepf=False, fm=None):
17613
aafc521668d8 rebase: properly handle --collapse when creating obsolescence marker
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17612
diff changeset
1678 """dispose of rebased revision at the end of the rebase
aafc521668d8 rebase: properly handle --collapse when creating obsolescence marker
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17612
diff changeset
1679
aafc521668d8 rebase: properly handle --collapse when creating obsolescence marker
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17612
diff changeset
1680 If `collapsedas` is not None, the rebase was a collapse whose result if the
34354
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
1681 `collapsedas` node.
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
1682
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
1683 If `keepf` is not True, the rebase has --keep set and no nodes should be
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
1684 removed (but bookmarks still need to be moved).
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
1685 """
33332
3b7cb3d17137 rebase: use scmutil.cleanupnodes (issue5606) (BC)
Jun Wu <quark@fb.com>
parents: 33157
diff changeset
1686 tonode = repo.changelog.node
34354
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
1687 replacements = {}
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
1688 moves = {}
33333
8bfd10e4c55a rebase: remove "if True"
Jun Wu <quark@fb.com>
parents: 33332
diff changeset
1689 for rev, newrev in sorted(state.items()):
8bfd10e4c55a rebase: remove "if True"
Jun Wu <quark@fb.com>
parents: 33332
diff changeset
1690 if newrev >= 0 and newrev != rev:
34354
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
1691 oldnode = tonode(rev)
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
1692 newnode = collapsedas or tonode(newrev)
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
1693 moves[oldnode] = newnode
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
1694 if not keepf:
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
1695 if rev in skipped:
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
1696 succs = ()
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
1697 else:
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
1698 succs = (newnode,)
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
1699 replacements[oldnode] = succs
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
1700 scmutil.cleanupnodes(repo, replacements, 'rebase', moves)
34883
c858afe9c59b rebase: add support to output nodechanges
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34872
diff changeset
1701 if fm:
35125
f56a30b844aa rebase: use fm.formatlist() and fm.formatdict() to support user template
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35058
diff changeset
1702 hf = fm.hexfunc
f56a30b844aa rebase: use fm.formatlist() and fm.formatdict() to support user template
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35058
diff changeset
1703 fl = fm.formatlist
f56a30b844aa rebase: use fm.formatlist() and fm.formatdict() to support user template
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35058
diff changeset
1704 fd = fm.formatdict
f56a30b844aa rebase: use fm.formatlist() and fm.formatdict() to support user template
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35058
diff changeset
1705 nodechanges = fd({hf(oldn): fl([hf(n) for n in newn], name='node')
f56a30b844aa rebase: use fm.formatlist() and fm.formatdict() to support user template
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35058
diff changeset
1706 for oldn, newn in replacements.iteritems()},
f56a30b844aa rebase: use fm.formatlist() and fm.formatdict() to support user template
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35058
diff changeset
1707 key="oldnode", value="newnodes")
34883
c858afe9c59b rebase: add support to output nodechanges
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34872
diff changeset
1708 fm.data(nodechanges=nodechanges)
17611
910123eac887 rebase: extract final changesets cleanup logic in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17325
diff changeset
1709
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
1710 def pullrebase(orig, ui, repo, *args, **opts):
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1711 'Call rebase after pull if the latter has been invoked with --rebase'
26960
6979fe2a6d75 rebase: add returning value from pullrebase function
liscju <piotr.listkiewicz@gmail.com>
parents: 26811
diff changeset
1712 ret = None
35002
1a07f9187831 py3: handle keyword arguments in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34963
diff changeset
1713 if opts.get(r'rebase'):
31733
ae6bab095c66 rebase: abort hg pull --rebase if rebase.requiredest is set (issue5514)
Ryan McElroy <rmcelroy@fb.com>
parents: 31731
diff changeset
1714 if ui.configbool('commands', 'rebase.requiredest'):
ae6bab095c66 rebase: abort hg pull --rebase if rebase.requiredest is set (issue5514)
Ryan McElroy <rmcelroy@fb.com>
parents: 31731
diff changeset
1715 msg = _('rebase destination required by configuration')
ae6bab095c66 rebase: abort hg pull --rebase if rebase.requiredest is set (issue5514)
Ryan McElroy <rmcelroy@fb.com>
parents: 31731
diff changeset
1716 hint = _('use hg pull followed by hg rebase -d DEST')
ae6bab095c66 rebase: abort hg pull --rebase if rebase.requiredest is set (issue5514)
Ryan McElroy <rmcelroy@fb.com>
parents: 31731
diff changeset
1717 raise error.Abort(msg, hint=hint)
ae6bab095c66 rebase: abort hg pull --rebase if rebase.requiredest is set (issue5514)
Ryan McElroy <rmcelroy@fb.com>
parents: 31731
diff changeset
1718
32918
04c9dd951a41 rebase: use context manager for locking in pullrebase()
Martin von Zweigbergk <martinvonz@google.com>
parents: 32917
diff changeset
1719 with repo.wlock(), repo.lock():
35002
1a07f9187831 py3: handle keyword arguments in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34963
diff changeset
1720 if opts.get(r'update'):
1a07f9187831 py3: handle keyword arguments in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34963
diff changeset
1721 del opts[r'update']
26029
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
1722 ui.debug('--update and --rebase are not compatible, ignoring '
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
1723 'the update flag\n')
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1724
30725
c2bd2f77965b rebase: fail-fast the pull if working dir is not clean (BC)
Valters Vingolds <valters@vingolds.ch>
parents: 30709
diff changeset
1725 cmdutil.checkunfinished(repo)
30755
0fbb3a5c188e rebase: provide detailed hint to abort message if working dir is not clean
Valters Vingolds <valters@vingolds.ch>
parents: 30725
diff changeset
1726 cmdutil.bailifchanged(repo, hint=_('cannot pull with rebase: '
0fbb3a5c188e rebase: provide detailed hint to abort message if working dir is not clean
Valters Vingolds <valters@vingolds.ch>
parents: 30725
diff changeset
1727 'please commit or shelve your changes first'))
30725
c2bd2f77965b rebase: fail-fast the pull if working dir is not clean (BC)
Valters Vingolds <valters@vingolds.ch>
parents: 30709
diff changeset
1728
26029
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
1729 revsprepull = len(repo)
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
1730 origpostincoming = commands.postincoming
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
1731 def _dummy(*args, **kwargs):
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
1732 pass
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
1733 commands.postincoming = _dummy
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
1734 try:
26960
6979fe2a6d75 rebase: add returning value from pullrebase function
liscju <piotr.listkiewicz@gmail.com>
parents: 26811
diff changeset
1735 ret = orig(ui, repo, *args, **opts)
26029
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
1736 finally:
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
1737 commands.postincoming = origpostincoming
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
1738 revspostpull = len(repo)
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
1739 if revspostpull > revsprepull:
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
1740 # --rev option from pull conflict with rebase own --rev
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
1741 # dropping it
35002
1a07f9187831 py3: handle keyword arguments in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34963
diff changeset
1742 if r'rev' in opts:
1a07f9187831 py3: handle keyword arguments in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34963
diff changeset
1743 del opts[r'rev']
26029
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
1744 # positional argument from pull conflicts with rebase's own
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
1745 # --source.
35002
1a07f9187831 py3: handle keyword arguments in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34963
diff changeset
1746 if r'source' in opts:
1a07f9187831 py3: handle keyword arguments in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34963
diff changeset
1747 del opts[r'source']
29044
261c25372959 rebase: restrict rebase destination to the pulled set (issue5214)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29043
diff changeset
1748 # revsprepull is the len of the repo, not revnum of tip.
261c25372959 rebase: restrict rebase destination to the pulled set (issue5214)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29043
diff changeset
1749 destspace = list(repo.changelog.revs(start=revsprepull))
35002
1a07f9187831 py3: handle keyword arguments in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34963
diff changeset
1750 opts[r'_destspace'] = destspace
28189
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
1751 try:
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
1752 rebase(ui, repo, **opts)
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
1753 except error.NoMergeDestAbort:
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
1754 # we can maybe update instead
28118
0e3835c7e1cf rebase: perform update through the 'update' command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28117
diff changeset
1755 rev, _a, _b = destutil.destupdate(repo)
28189
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
1756 if rev == repo['.'].rev():
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
1757 ui.status(_('nothing to rebase\n'))
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
1758 else:
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
1759 ui.status(_('nothing to rebase - updating instead\n'))
28118
0e3835c7e1cf rebase: perform update through the 'update' command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28117
diff changeset
1760 # not passing argument to get the bare update behavior
0e3835c7e1cf rebase: perform update through the 'update' command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28117
diff changeset
1761 # with warning and trumpets
0e3835c7e1cf rebase: perform update through the 'update' command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28117
diff changeset
1762 commands.update(ui, repo)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1763 else:
35002
1a07f9187831 py3: handle keyword arguments in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34963
diff changeset
1764 if opts.get(r'tool'):
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26496
diff changeset
1765 raise error.Abort(_('--tool can only be used with --rebase'))
26960
6979fe2a6d75 rebase: add returning value from pullrebase function
liscju <piotr.listkiewicz@gmail.com>
parents: 26811
diff changeset
1766 ret = orig(ui, repo, *args, **opts)
6979fe2a6d75 rebase: add returning value from pullrebase function
liscju <piotr.listkiewicz@gmail.com>
parents: 26811
diff changeset
1767
6979fe2a6d75 rebase: add returning value from pullrebase function
liscju <piotr.listkiewicz@gmail.com>
parents: 26811
diff changeset
1768 return ret
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1769
27790
2d294dada4f8 rebase: small refactoring to allow better extensibility from extensions
Laurent Charignon <lcharignon@fb.com>
parents: 27746
diff changeset
1770 def _filterobsoleterevs(repo, revs):
2d294dada4f8 rebase: small refactoring to allow better extensibility from extensions
Laurent Charignon <lcharignon@fb.com>
parents: 27746
diff changeset
1771 """returns a set of the obsolete revisions in revs"""
2d294dada4f8 rebase: small refactoring to allow better extensibility from extensions
Laurent Charignon <lcharignon@fb.com>
parents: 27746
diff changeset
1772 return set(r for r in revs if repo[r].obsolete())
2d294dada4f8 rebase: small refactoring to allow better extensibility from extensions
Laurent Charignon <lcharignon@fb.com>
parents: 27746
diff changeset
1773
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1774 def _computeobsoletenotrebased(repo, rebaseobsrevs, destmap):
35058
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35002
diff changeset
1775 """Return (obsoletenotrebased, obsoletewithoutsuccessorindestination).
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35002
diff changeset
1776
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35002
diff changeset
1777 `obsoletenotrebased` is a mapping mapping obsolete => successor for all
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35002
diff changeset
1778 obsolete nodes to be rebased given in `rebaseobsrevs`.
27012
5eac7ab59b95 rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents: 27010
diff changeset
1779
35058
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35002
diff changeset
1780 `obsoletewithoutsuccessorindestination` is a set with obsolete revisions
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35002
diff changeset
1781 without a successor in destination.
35995
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
1782
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
1783 `obsoleteextinctsuccessors` is a set of obsolete revisions with only
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
1784 obsolete successors.
35058
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35002
diff changeset
1785 """
26349
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
1786 obsoletenotrebased = {}
35058
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35002
diff changeset
1787 obsoletewithoutsuccessorindestination = set([])
35995
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
1788 obsoleteextinctsuccessors = set([])
26349
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
1789
34095
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34094
diff changeset
1790 assert repo.filtername is None
26674
fd4a38bd7e49 rebase: use a direct reference to repo.changelog
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26671
diff changeset
1791 cl = repo.changelog
34003
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
1792 nodemap = cl.nodemap
35995
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
1793 extinctnodes = set(cl.node(r) for r in repo.revs('extinct()'))
34003
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
1794 for srcrev in rebaseobsrevs:
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
1795 srcnode = cl.node(srcrev)
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1796 destnode = cl.node(destmap[srcrev])
34003
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
1797 # XXX: more advanced APIs are required to handle split correctly
35997
24f05489377b rebase: make "successors" a set in _computeobsoletenotrebased()
Denis Laxalde <denis@laxalde.org>
parents: 35995
diff changeset
1798 successors = set(obsutil.allsuccessors(repo.obsstore, [srcnode]))
35994
ae0d25071fca rebase: eliminate node from successors early in _computeobsoletenotrebased()
Denis Laxalde <denis@laxalde.org>
parents: 35917
diff changeset
1799 # obsutil.allsuccessors includes node itself
ae0d25071fca rebase: eliminate node from successors early in _computeobsoletenotrebased()
Denis Laxalde <denis@laxalde.org>
parents: 35917
diff changeset
1800 successors.remove(srcnode)
35997
24f05489377b rebase: make "successors" a set in _computeobsoletenotrebased()
Denis Laxalde <denis@laxalde.org>
parents: 35995
diff changeset
1801 if successors.issubset(extinctnodes):
35995
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
1802 # all successors are extinct
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
1803 obsoleteextinctsuccessors.add(srcrev)
35994
ae0d25071fca rebase: eliminate node from successors early in _computeobsoletenotrebased()
Denis Laxalde <denis@laxalde.org>
parents: 35917
diff changeset
1804 if not successors:
ae0d25071fca rebase: eliminate node from successors early in _computeobsoletenotrebased()
Denis Laxalde <denis@laxalde.org>
parents: 35917
diff changeset
1805 # no successor
34003
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
1806 obsoletenotrebased[srcrev] = None
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
1807 else:
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
1808 for succnode in successors:
35994
ae0d25071fca rebase: eliminate node from successors early in _computeobsoletenotrebased()
Denis Laxalde <denis@laxalde.org>
parents: 35917
diff changeset
1809 if succnode not in nodemap:
34003
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
1810 continue
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
1811 if cl.isancestor(succnode, destnode):
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
1812 obsoletenotrebased[srcrev] = nodemap[succnode]
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
1813 break
35058
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35002
diff changeset
1814 else:
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35002
diff changeset
1815 # If 'srcrev' has a successor in rebase set but none in
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35002
diff changeset
1816 # destination (which would be catched above), we shall skip it
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35002
diff changeset
1817 # and its descendants to avoid divergence.
35994
ae0d25071fca rebase: eliminate node from successors early in _computeobsoletenotrebased()
Denis Laxalde <denis@laxalde.org>
parents: 35917
diff changeset
1818 if any(nodemap[s] in destmap for s in successors):
35058
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35002
diff changeset
1819 obsoletewithoutsuccessorindestination.add(srcrev)
27012
5eac7ab59b95 rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents: 27010
diff changeset
1820
35995
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
1821 return (
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
1822 obsoletenotrebased,
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
1823 obsoletewithoutsuccessorindestination,
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
1824 obsoleteextinctsuccessors,
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
1825 )
26349
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
1826
19214
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
1827 def summaryhook(ui, repo):
30709
a932297febb7 rebase: use repo.vfs.exists in 'hg summary' hook
Valters Vingolds <valters@vingolds.ch>
parents: 30674
diff changeset
1828 if not repo.vfs.exists('rebasestate'):
19214
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
1829 return
19849
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
1830 try:
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
1831 rbsrt = rebaseruntime(repo, ui, {})
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
1832 rbsrt.restorestatus()
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
1833 state = rbsrt.state
19849
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
1834 except error.RepoLookupError:
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
1835 # i18n: column positioning for "hg summary"
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
1836 msg = _('rebase: (use "hg rebase --abort" to clear broken state)\n')
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
1837 ui.write(msg)
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
1838 return
23489
fe4157d839ac rebase: use '>= 0' to know is a revision was rebased
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23484
diff changeset
1839 numrebased = len([i for i in state.itervalues() if i >= 0])
19214
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
1840 # i18n: column positioning for "hg summary"
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
1841 ui.write(_('rebase: %s, %s (rebase --continue)\n') %
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
1842 (ui.label(_('%d rebased'), 'rebase.rebased') % numrebased,
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
1843 ui.label(_('%d remaining'), 'rebase.remaining') %
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
1844 (len(state) - numrebased)))
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
1845
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1846 def uisetup(ui):
23970
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
1847 #Replace pull with a decorator to provide --rebase option
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
1848 entry = extensions.wrapcommand(commands.table, 'pull', pullrebase)
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
1849 entry[1].append(('', 'rebase', None,
14444
1f997134a9d1 rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents: 14306
diff changeset
1850 _("rebase working directory to branch head")))
1f997134a9d1 rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents: 14306
diff changeset
1851 entry[1].append(('t', 'tool', '',
1f997134a9d1 rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents: 14306
diff changeset
1852 _("specify merge tool for rebase")))
19214
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
1853 cmdutil.summaryhooks.add('rebase', summaryhook)
19478
e5a5790a3185 rebase: add checkunfinished support (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19477
diff changeset
1854 cmdutil.unfinishedstates.append(
19496
607191a45f8c checkunfinished: accommodate histedit quirk
Matt Mackall <mpm@selenic.com>
parents: 19478
diff changeset
1855 ['rebasestate', False, False, _('rebase in progress'),
19478
e5a5790a3185 rebase: add checkunfinished support (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19477
diff changeset
1856 _("use 'hg rebase --continue' or 'hg rebase --abort'")])
27626
157675d0f600 rebase: hook afterresolvedstates
timeless <timeless@mozdev.org>
parents: 27586
diff changeset
1857 cmdutil.afterresolvedstates.append(
157675d0f600 rebase: hook afterresolvedstates
timeless <timeless@mozdev.org>
parents: 27586
diff changeset
1858 ['rebasestate', _('hg rebase --continue')])