annotate hgext/rebase.py @ 38496:c92fdc27cbdd

rebase: extract dryrun as a function To avoid more number of indented blocks and make it easier to add additional functionality in dryrun, extracted as a function. Differential Revision: https://phab.mercurial-scm.org/D3855
author Sushil khanchi <sushilkhanchi97@gmail.com>
date Thu, 28 Jun 2018 23:57:15 +0530
parents ba6d2c32f34a
children 9c3b48fb7ac5
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]
38377
a73eab7d6575 rebase: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38372
diff changeset
436 p = repo.ui.makeprogress(_("rebasing"), unit=_('changesets'),
a73eab7d6575 rebase: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38372
diff changeset
437 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
438 def progress(ctx):
38377
a73eab7d6575 rebase: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38372
diff changeset
439 p.increment(item=("%d:%s" % (ctx.rev(), ctx)))
36933
61600b024a70 rebase: move constant expressions out of inner loop in _performrebase()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36932
diff changeset
440 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
441 'experimental', 'evolution.allowdivergence')
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
442 for subset in sortsource(self.destmap):
36932
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36931
diff changeset
443 sortedrevs = self.repo.revs('sort(%ld, -topo)', subset)
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36931
diff changeset
444 if not allowdivergence:
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36931
diff changeset
445 sortedrevs -= self.repo.revs(
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36931
diff changeset
446 'descendants(%ld) and not %ld',
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36931
diff changeset
447 self.obsoletewithoutsuccessorindestination,
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36931
diff changeset
448 self.obsoletewithoutsuccessorindestination,
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36931
diff changeset
449 )
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36931
diff changeset
450 for rev in sortedrevs:
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36931
diff changeset
451 self._rebasenode(tr, rev, allowdivergence, progress)
38377
a73eab7d6575 rebase: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38372
diff changeset
452 p.complete()
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
453 ui.note(_('rebase merging completed\n'))
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
454
37033
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37032
diff changeset
455 def _concludenode(self, rev, p1, p2, editor, commitmsg=None):
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37032
diff changeset
456 '''Commit the wd changes with parents p1 and p2.
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37032
diff changeset
457
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37032
diff changeset
458 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
459 Return node of committed revision.'''
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37032
diff changeset
460 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
461 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
462 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
463 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
464 date = self.date
0b1230a5a958 rebase: look up default date outside of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37040
diff changeset
465 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
466 date = ctx.date()
37036
0ab0d94ead72 rebase: pass in "extra" itself into conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37035
diff changeset
467 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
468 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
469 c(ctx, extra)
37038
7db86856f27f rebase: pass in "keepbranch" to conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37037
diff changeset
470 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
471 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
472 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
473 if keepbranch:
7616073a4cf1 rebase: pass in entire "overrides" dict to conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37038
diff changeset
474 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
475 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
476 if self.inmemory:
37043
a8d8cdafe29c rebase: rename conclude[memory]node() to commit[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
477 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
478 wctx=self.wctx,
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
479 extra=extra,
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
480 commitmsg=commitmsg,
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
481 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
482 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
483 date=date)
37040
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
484 mergemod.mergestate.clean(repo)
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
485 else:
37043
a8d8cdafe29c rebase: rename conclude[memory]node() to commit[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
486 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
487 extra=extra,
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
488 commitmsg=commitmsg,
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
489 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
490 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
491 date=date)
37033
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37032
diff changeset
492
37040
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
493 if newnode is None:
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
494 # 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
495 # 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
496 # here. Fix issue5494
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
497 mergemod.mergestate.clean(repo)
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
498 return newnode
37033
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37032
diff changeset
499
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
500 def _rebasenode(self, tr, rev, allowdivergence, progressfn):
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
501 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
502 dest = self.destmap[rev]
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
503 ctx = repo[rev]
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
504 desc = _ctxdesc(ctx)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
505 if self.state[rev] == rev:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
506 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
507 elif (not allowdivergence
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
508 and rev in self.obsoletewithoutsuccessorindestination):
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
509 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
510 '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
511 repo.ui.status(msg)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
512 self.skipped.add(rev)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
513 elif rev in self.obsoletenotrebased:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
514 succ = self.obsoletenotrebased[rev]
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
515 if succ is None:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
516 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
517 'successor\n') % desc
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
518 else:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
519 succdesc = _ctxdesc(repo[succ])
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
520 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
521 '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
522 repo.ui.status(msg)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
523 # 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
524 self.skipped.add(rev)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
525 # 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
526 # 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
527 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
528 self.skipped))
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
529 self.state[rev] = dest
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
530 elif self.state[rev] == revtodo:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
531 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
532 progressfn(ctx)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
533 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
534 self.state, self.skipped,
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
535 self.obsoletenotrebased)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
536 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
537 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
538 else:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
539 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
540 with ui.configoverride(overrides, 'rebase'):
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
541 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
542 dest, wctx=self.wctx)
37125
6f570c501e3e merge: deprecate accessing update results by index
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37043
diff changeset
543 if stats.unresolvedcount > 0:
37027
81b35d275a60 rebase: get "inmemory" state directly from rebase runtime
Martin von Zweigbergk <martinvonz@google.com>
parents: 37025
diff changeset
544 if self.inmemory:
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
545 raise error.InMemoryMergeConflictsError()
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
546 else:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
547 raise error.InterventionRequired(
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
548 _('unresolved conflicts (see hg '
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
549 'resolve, then hg rebase --continue)'))
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
550 if not self.collapsef:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
551 merging = p2 != nullrev
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
552 editform = cmdutil.mergeeditform(merging, 'rebase')
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
553 editor = cmdutil.getcommiteditor(editform=editform,
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
554 **pycompat.strkwargs(opts))
37033
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37032
diff changeset
555 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
556 else:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
557 # 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
558 if self.inmemory:
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
559 self.wctx.setbase(repo[p1])
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
560 else:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
561 repo.setparents(repo[p1].node())
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
562 newnode = None
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
563 # Update the state
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
564 if newnode is not None:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
565 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
566 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
567 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
568 if not self.collapsef:
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
569 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
570 'to commit\n') % (rev, ctx))
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
571 self.skipped.add(rev)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
572 self.state[rev] = p1
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
573 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
574 else:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
575 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
576 (desc, repo[self.state[rev]]))
37032
98663bed146e rebase: store rebase state after each commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 37031
diff changeset
577 if not tr:
98663bed146e rebase: store rebase state after each commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 37031
diff changeset
578 # 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
579 # 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
580 # 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
581 # 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
582 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
583
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
584 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
585 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
586 fm = ui.formatter('rebase', opts)
c858afe9c59b rebase: add support to output nodechanges
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34872
diff changeset
587 fm.startitem()
36771
f7e3fe95b663 rebase: delete obsolete internal "keepopen" option
Martin von Zweigbergk <martinvonz@google.com>
parents: 36478
diff changeset
588 if self.collapsef:
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
589 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
590 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
591 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
592 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
593 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
594 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
595 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
596 else:
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
597 commitmsg = 'Collapsed revision'
33622
5a5f600b06ad rebase: sort collapsed revisions in commit message (issue5643)
Yuya Nishihara <yuya@tcha.org>
parents: 33590
diff changeset
598 for rebased in sorted(self.state):
33848
bc9e075133c9 rebase: remove "state >= revtodo" condition
Jun Wu <quark@fb.com>
parents: 33847
diff changeset
599 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
600 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
601 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
602 editor = cmdutil.getcommiteditor(edit=editopt, editform=editform)
29552
db26925bdbb0 rebase: remove sortedstate-related confusion
Kostia Balytskyi <ikostia@fb.com>
parents: 29551
diff changeset
603 revtoreuse = max(self.state)
33619
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
604
37033
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37032
diff changeset
605 newnode = self._concludenode(revtoreuse, p1, self.external,
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37032
diff changeset
606 editor, commitmsg=commitmsg)
36928
9457c395fcbb rebase: fix issue 5494 also with --collapse
Martin von Zweigbergk <martinvonz@google.com>
parents: 36927
diff changeset
607
33864
70354bd4f19b rebase: only change self.state when collapsing in _finishrebase
Jun Wu <quark@fb.com>
parents: 33863
diff changeset
608 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
609 newrev = repo[newnode].rev()
36299
238646784294 py3: use default dict iterator instead of iterkeys
Augie Fackler <augie@google.com>
parents: 36271
diff changeset
610 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
611 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
612
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
613 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
614 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
615 **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
616
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
617 # 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
618 # (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
619 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
620 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
621 # 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
622 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
623 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
624 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
625 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
626
34354
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
627 collapsedas = None
36774
a835bf3fe40a rebase: collapse two nested if-conditions
Martin von Zweigbergk <martinvonz@google.com>
parents: 36773
diff changeset
628 if self.collapsef and not self.keepf:
a835bf3fe40a rebase: collapse two nested if-conditions
Martin von Zweigbergk <martinvonz@google.com>
parents: 36773
diff changeset
629 collapsedas = newnode
34367
f61f5af5ed31 merge with stable
Martin von Zweigbergk <martinvonz@google.com>
parents: 34290 34354
diff changeset
630 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
631 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
632
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
633 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
634 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
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 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
637 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
638 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
639 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
640 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
641 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
642
33332
3b7cb3d17137 rebase: use scmutil.cleanupnodes (issue5606) (BC)
Jun Wu <quark@fb.com>
parents: 33157
diff changeset
643 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
644 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
645 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
646
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
647 @command('rebase',
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
648 [('s', 'source', '',
22789
5f4934487382 rebase: attempt to clarify --base
Matt Mackall <mpm@selenic.com>
parents: 22405
diff changeset
649 _('rebase the specified changeset and descendants'), _('REV')),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
650 ('b', 'base', '',
22789
5f4934487382 rebase: attempt to clarify --base
Matt Mackall <mpm@selenic.com>
parents: 22405
diff changeset
651 _('rebase everything from branching point of specified changeset'),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
652 _('REV')),
15270
6cb6064f1d50 rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15269
diff changeset
653 ('r', 'rev', [],
6cb6064f1d50 rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15269
diff changeset
654 _('rebase these revisions'),
6cb6064f1d50 rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15269
diff changeset
655 _('REV')),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
656 ('d', 'dest', '',
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
657 _('rebase onto the specified changeset'), _('REV')),
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
658 ('', 'collapse', False, _('collapse the rebased changesets')),
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
659 ('m', 'message', '',
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
660 _('use text as collapse commit message'), _('TEXT')),
15219
9d58569a8b92 rebase: add --edit switch
Matt Mackall <mpm@selenic.com>
parents: 15214
diff changeset
661 ('e', 'edit', False, _('invoke editor on commit messages')),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
662 ('l', 'logfile', '',
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
663 _('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
664 ('k', 'keep', False, _('keep original changesets')),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
665 ('', '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
666 ('D', 'detach', False, _('(DEPRECATED)')),
22382
d5b04ee8ecf7 rebase: add a deprecated -i/--interactive flag
David Soria Parra <davidsp@fb.com>
parents: 22251
diff changeset
667 ('i', 'interactive', False, _('(DEPRECATED)')),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
668 ('t', 'tool', '', _('specify merge tool')),
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
669 ('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
670 ('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
671 ('', 'auto-orphans', '', _('automatically rebase orphan revisions '
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
672 'in the specified revset (EXPERIMENTAL)')),
38372
f4f1fb1cbfb4 rebase: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38239
diff changeset
673 ] + cmdutil.dryrunopts + cmdutil.formatteropts,
17325
e4db509c08ec rebase: remove second broken synopsis line (issue3172)
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
674 _('[-s REV | -b REV] [-d REV] [OPTION]'))
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
675 def rebase(ui, repo, **opts):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
676 """move changeset (and descendants) to a different branch
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
677
7999
b25110140573 rebase: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7955
diff changeset
678 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
679 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
680 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
681 development tree.
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
682
27454
3e3be524a712 rebase: simplify documentation about public commits
timeless <timeless@mozdev.org>
parents: 27344
diff changeset
683 Published commits cannot be rebased (see :hg:`help phases`).
3e3be524a712 rebase: simplify documentation about public commits
timeless <timeless@mozdev.org>
parents: 27344
diff changeset
684 To copy commits, see :hg:`help graft`.
18516
9fbeb61b8ad2 rebase: mention phases in the help
Kevin Bullock <kbullock@ringworld.org>
parents: 18514
diff changeset
685
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
686 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
687 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
688 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
689 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
690 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
691 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
692 descendants.)
10646
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
693
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
694 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
695
a9a047878e14 rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents: 27454
diff changeset
696 1. Explicitly select them using ``--rev``.
10646
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
697
27455
a9a047878e14 rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents: 27454
diff changeset
698 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
699 descendants.
27455
a9a047878e14 rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents: 27454
diff changeset
700
a9a047878e14 rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents: 27454
diff changeset
701 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
702 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
703
27932
6bc2299cc12f rebase: restore help for rebase w/o args (issue5059)
timeless <timeless@mozdev.org>
parents: 27866
diff changeset
704 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
705 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
706
35287
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
707 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
708 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
709 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
710 ``ALLSRC`` substituted by all source revisions.
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
711
27456
2337958596e3 rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents: 27455
diff changeset
712 Rebase will destroy original changesets unless you use ``--keep``.
2337958596e3 rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents: 27455
diff changeset
713 It will also move your bookmarks (even if you do).
2337958596e3 rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents: 27455
diff changeset
714
2337958596e3 rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents: 27455
diff changeset
715 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
716 (e.g. merges from the destination branch).
10646
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
717
27457
97cc045f1cfe rebase: simplify documentation about heads
timeless <timeless@mozdev.org>
parents: 27456
diff changeset
718 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
719 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
720 and/or destination.
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
721
28001
ade12bf2bf0e rebase: mention help merge-tools in help
timeless <timeless@mozdev.org>
parents: 27977
diff changeset
722 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
723 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
724 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
725 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
726
27458
d39e743e3578 rebase: mention conflict in documentation instead of merge
timeless <timeless@mozdev.org>
parents: 27457
diff changeset
727 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
728 continued with --continue/-c or aborted with --abort/-a.
11205
d26f662bfbf5 rebase: add error codes
Matt Mackall <mpm@selenic.com>
parents: 11204
diff changeset
729
22790
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
730 .. container:: verbose
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
731
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
732 Examples:
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
733
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
734 - move "local changes" (current commit back to branching point)
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
735 to the current branch tip after a pull::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
736
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
737 hg rebase
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
738
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
739 - move a single changeset to the stable branch::
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 -r 5f493448 -d stable
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 - 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
744
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
745 hg rebase --source c0c3 --dest 4cf9
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 - 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
748 default branch::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
749
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
750 hg rebase --base myfeature --dest default
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
751
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
752 - collapse a sequence of changes into a single commit::
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 --collapse -r 1520:1525 -d .
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 - move a named branch while preserving its name::
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 -r "branch(featureX)" -d 1.3 --keepbranches
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
759
35287
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
760 - stabilize orphaned changesets so history looks linear::
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
761
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
762 hg rebase -r 'orphan()-obsolete()'\
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
763 -d 'first(max((successors(max(roots(ALLSRC) & ::SRC)^)-obsolete())::) +\
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
764 max(::((roots(ALLSRC) & ::SRC)^)-obsolete()))'
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
765
31558
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
766 Configuration Options:
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
767
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
768 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
769 option::
31558
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
770
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
771 [commands]
32083
1c911adebf48 rebase: fix incorrect configuration example
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31733
diff changeset
772 rebase.requiredest = True
31558
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
773
33569
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
774 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
775 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
776 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
777 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
778 unexpectedly::
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
779
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
780 [rebase]
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
781 singletransaction = True
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
782
35388
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
783 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
784 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
785 working copy is dirty::
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
786
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
787 [rebase]
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
788 experimental.inmemory = True
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
789
31558
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
790 Return Values:
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
791
19971
2a9bb64faa0b rebase: add description about exit code when there are unresolved conflicts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19969
diff changeset
792 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
793 unresolved conflicts.
22790
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
794
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
795 """
35388
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
796 inmemory = ui.configbool('rebase', 'experimental.inmemory')
38372
f4f1fb1cbfb4 rebase: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38239
diff changeset
797 dryrun = opts.get(r'dry_run')
f4f1fb1cbfb4 rebase: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38239
diff changeset
798 if dryrun:
f4f1fb1cbfb4 rebase: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38239
diff changeset
799 if opts.get(r'abort'):
f4f1fb1cbfb4 rebase: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38239
diff changeset
800 raise error.Abort(_('cannot specify both --dry-run and --abort'))
f4f1fb1cbfb4 rebase: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38239
diff changeset
801 if opts.get(r'continue'):
f4f1fb1cbfb4 rebase: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38239
diff changeset
802 raise error.Abort(_('cannot specify both --dry-run and --continue'))
f4f1fb1cbfb4 rebase: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38239
diff changeset
803
38064
46e8abc4eb04 py3: fix kwargs handling in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 37787
diff changeset
804 if (opts.get(r'continue') or opts.get(r'abort') or
35701
c5d220a621e7 rebase: don't run IMM if running rebase in a transaction
Phil Cohen <phillco@fb.com>
parents: 35487
diff changeset
805 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
806 # 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
807 # (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
808 # fail the entire transaction.)
35388
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
809 inmemory = False
35320
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
810
38064
46e8abc4eb04 py3: fix kwargs handling in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 37787
diff changeset
811 if opts.get(r'auto_orphans'):
37787
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
812 for key in opts:
38064
46e8abc4eb04 py3: fix kwargs handling in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 37787
diff changeset
813 if key != r'auto_orphans' and opts.get(key):
37787
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
814 raise error.Abort(_('--auto-orphans is incompatible with %s') %
38065
64280cd4b454 py3: use pycompat.bytestr() to convert str into bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38064
diff changeset
815 ('--' + pycompat.bytestr(key)))
38064
46e8abc4eb04 py3: fix kwargs handling in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 37787
diff changeset
816 userrevs = list(repo.revs(opts.get(r'auto_orphans')))
46e8abc4eb04 py3: fix kwargs handling in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 37787
diff changeset
817 opts[r'rev'] = [revsetlang.formatspec('%ld and orphan()', userrevs)]
46e8abc4eb04 py3: fix kwargs handling in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 37787
diff changeset
818 opts[r'dest'] = '_destautoorphanrebase(SRC)'
37787
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
819
38372
f4f1fb1cbfb4 rebase: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38239
diff changeset
820 if dryrun:
38496
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38495
diff changeset
821 return _dryrunrebase(ui, repo, **opts)
38372
f4f1fb1cbfb4 rebase: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38239
diff changeset
822 elif inmemory:
35320
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
823 try:
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
824 # 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
825 # 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
826 overrides = {('rebase', 'singletransaction'): True}
b48b7b130d08 rebase: use single transaction when running in memory
Martin von Zweigbergk <martinvonz@google.com>
parents: 37125
diff changeset
827 with ui.configoverride(overrides, 'rebase'):
b48b7b130d08 rebase: use single transaction when running in memory
Martin von Zweigbergk <martinvonz@google.com>
parents: 37125
diff changeset
828 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
829 except error.InMemoryMergeConflictsError:
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
830 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
831 ' merge\n'))
38372
f4f1fb1cbfb4 rebase: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38239
diff changeset
832 _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
833 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
834 else:
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
835 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
836
38496
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38495
diff changeset
837 def _dryrunrebase(ui, repo, **opts):
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38495
diff changeset
838 rbsrt = rebaseruntime(repo, ui, inmemory=True,
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38495
diff changeset
839 opts=pycompat.byteskwargs(opts))
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38495
diff changeset
840 with repo.wlock(), repo.lock():
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38495
diff changeset
841 try:
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38495
diff changeset
842 overrides = {('rebase', 'singletransaction'): True}
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38495
diff changeset
843 with ui.configoverride(overrides, 'rebase'):
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38495
diff changeset
844 _origrebase(ui, repo, inmemory=True, rbsrt=rbsrt,
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38495
diff changeset
845 leaveunfinished=True, **opts)
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38495
diff changeset
846 except error.InMemoryMergeConflictsError:
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38495
diff changeset
847 ui.status(_('hit a merge conflict\n'))
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38495
diff changeset
848 return 1
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38495
diff changeset
849 else:
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38495
diff changeset
850 ui.status(_('there will be no conflict, you can rebase\n'))
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38495
diff changeset
851 return 0
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38495
diff changeset
852 finally:
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38495
diff changeset
853 rbsrt._prepareabortorcontinue(isabort=True)
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38495
diff changeset
854
38485
56b2074114b1 rebase: refactor dryrun implementation
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38443
diff changeset
855 def _origrebase(ui, repo, inmemory=False, leaveunfinished=False, rbsrt=None,
56b2074114b1 rebase: refactor dryrun implementation
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38443
diff changeset
856 **opts):
35002
1a07f9187831 py3: handle keyword arguments in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34963
diff changeset
857 opts = pycompat.byteskwargs(opts)
38485
56b2074114b1 rebase: refactor dryrun implementation
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38443
diff changeset
858 if not rbsrt:
56b2074114b1 rebase: refactor dryrun implementation
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38443
diff changeset
859 rbsrt = rebaseruntime(repo, ui, inmemory, opts)
15219
9d58569a8b92 rebase: add --edit switch
Matt Mackall <mpm@selenic.com>
parents: 15214
diff changeset
860
32917
070920db8b87 rebase: use context manager for locking in rebase()
Martin von Zweigbergk <martinvonz@google.com>
parents: 32900
diff changeset
861 with repo.wlock(), repo.lock():
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
862 # Validate input and define rebasing points
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
863 destf = opts.get('dest', None)
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
864 srcf = opts.get('source', None)
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
865 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
866 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
867 # 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
868 # 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
869 destspace = opts.get('_destspace')
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
870 contf = opts.get('continue')
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
871 abortf = opts.get('abort')
22382
d5b04ee8ecf7 rebase: add a deprecated -i/--interactive flag
David Soria Parra <davidsp@fb.com>
parents: 22251
diff changeset
872 if opts.get('interactive'):
26496
b885ab9ca182 rebase: enable histedit for useful help with it
timeless@mozdev.org
parents: 26495
diff changeset
873 try:
b885ab9ca182 rebase: enable histedit for useful help with it
timeless@mozdev.org
parents: 26495
diff changeset
874 if extensions.find('histedit'):
b885ab9ca182 rebase: enable histedit for useful help with it
timeless@mozdev.org
parents: 26495
diff changeset
875 enablehistedit = ''
b885ab9ca182 rebase: enable histedit for useful help with it
timeless@mozdev.org
parents: 26495
diff changeset
876 except KeyError:
b885ab9ca182 rebase: enable histedit for useful help with it
timeless@mozdev.org
parents: 26495
diff changeset
877 enablehistedit = " --config extensions.histedit="
b885ab9ca182 rebase: enable histedit for useful help with it
timeless@mozdev.org
parents: 26495
diff changeset
878 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
879 msg = _("interactive history editing is supported by the "
26494
832f40d2af53 rebase: factor out histedit help command
timeless@mozdev.org
parents: 26421
diff changeset
880 "'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
881 raise error.Abort(msg)
22382
d5b04ee8ecf7 rebase: add a deprecated -i/--interactive flag
David Soria Parra <davidsp@fb.com>
parents: 22251
diff changeset
882
29400
c79da70a4659 rebase: move collapse-related local variables to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29399
diff changeset
883 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
884 raise error.Abort(
13661
ee349e228835 rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents: 13609
diff changeset
885 _('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
886
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
887 if contf or abortf:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
888 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
889 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
890 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
891 raise error.Abort(
11285
f118029e534c rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents: 11205
diff changeset
892 _('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
893 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
894 raise error.Abort(
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
895 _('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
896 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
897 ui.warn(_('tool option will be ignored\n'))
30273
86f4ef63d507 rebase: check for conflicts before continuing
timeless <timeless@mozdev.org>
parents: 30271
diff changeset
898 if contf:
86f4ef63d507 rebase: check for conflicts before continuing
timeless <timeless@mozdev.org>
parents: 30271
diff changeset
899 ms = mergemod.mergestate.read(repo)
30495
d528ddc11b33 rebase: refer to checkunresolved by its new name
Augie Fackler <augie@google.com>
parents: 30490
diff changeset
900 mergeutil.checkunresolved(ms)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
901
29472
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
902 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
903 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
904 return retcode
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
905 else:
37025
0782ac132a41 rebase: pass "inmemory" directly to _definedestmap()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37021
diff changeset
906 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
907 revf, destspace=destspace)
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
908 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
909 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
910 return retcode
36775
6dab3bdb1f00 rebase: only store collapse message once
Martin von Zweigbergk <martinvonz@google.com>
parents: 36774
diff changeset
911 storecollapsemsg(repo, rbsrt.collapsemsg)
21027
25ee5dbebc6b rebase: tell when reopening a closed branch head
Mads Kiilerich <madski@unity3d.com>
parents: 20790
diff changeset
912
33569
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
913 tr = None
33619
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
914
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
915 singletr = ui.configbool('rebase', 'singletransaction')
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
916 if singletr:
33569
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
917 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
918
01b084914a60 rebase: don't take out a dirstate guard for in-memory rebase
Phil Cohen <phillco@fb.com>
parents: 35434
diff changeset
919 # 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
920 # 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
921 # 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
922 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
923 # 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
924 # 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
925 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
926 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
927 dsguard = dirstateguard.dirstateguard(repo, 'rebase')
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
928 with util.acceptintervention(dsguard):
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
929 rbsrt._performrebase(tr)
38372
f4f1fb1cbfb4 rebase: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38239
diff changeset
930 if not leaveunfinished:
f4f1fb1cbfb4 rebase: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38239
diff changeset
931 rbsrt._finishrebase()
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
932
37025
0782ac132a41 rebase: pass "inmemory" directly to _definedestmap()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37021
diff changeset
933 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
934 revf=None, destspace=None):
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
935 """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
936 if revf is None:
406705701c2d rebase: explicitly tests for None
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31395
diff changeset
937 revf = []
31395
361bccce566a rebase: don't use mutable default argument value
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31380
diff changeset
938
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
939 # 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
940 # 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
941 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
942 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
943 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
944 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
945 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
946 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
947
37025
0782ac132a41 rebase: pass "inmemory" directly to _definedestmap()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37021
diff changeset
948 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
949 cmdutil.checkunfinished(repo)
aa660c1203a9 rebase: do not bail on uncomitted changes if rebasing in-memory
Phil Cohen <phillco@fb.com>
parents: 35290
diff changeset
950 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
951
31731
b5afec71c1f9 rebase: allow destination-free continue and abort (issue5513)
Ryan McElroy <rmcelroy@fb.com>
parents: 31621
diff changeset
952 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
953 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
954 hint=_('use: hg rebase -d REV'))
b5afec71c1f9 rebase: allow destination-free continue and abort (issue5513)
Ryan McElroy <rmcelroy@fb.com>
parents: 31621
diff changeset
955
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
956 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
957
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
958 if revf:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
959 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
960 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
961 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
962 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
963 elif srcf:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
964 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
965 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
966 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
967 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
968 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
969 assert rebaseset
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
970 else:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
971 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
972 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
973 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
974 "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
975 return None
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
976 if destf:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
977 # --base does not support multiple destinations
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
978 dest = scmutil.revsingle(repo, destf)
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
979 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
980 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
981 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
982
30580
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
983 roots = [] # selected children of branching points
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
984 bpbase = {} # {branchingpoint: [origbase]}
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
985 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
986 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
987 bpbase[bp] = bpbase.get(bp, []) + [b]
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
988 if None in bpbase:
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
989 # 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
990 # 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
991 bpbase.clear()
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
992 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
993 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
994
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
995 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
996
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
997 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
998 # 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
999 # 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
1000 # smartset.
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
1001 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
1002 if basef:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
1003 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
1004 ' 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
1005 else:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
1006 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
1007 '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
1008 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
1009 if basef:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
1010 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
1011 '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
1012 '%s\n') %
36475
7b84b737352d py3: replace str() calls with their preferred bytes equivalent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36405
diff changeset
1013 ('+'.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
1014 dest))
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
1015 else:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
1016 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
1017 '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
1018 '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
1019 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
1020 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
1021 ('+'.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
1022 return None
36975
795eb53f1d3e rebase: allow in-memory merge of the working copy parent
Martin von Zweigbergk <martinvonz@google.com>
parents: 36960
diff changeset
1023
35332
03bec089e105 rebase: disable `inmemory` if the rebaseset contains the working copy
Phil Cohen <phillco@fb.com>
parents: 35320
diff changeset
1024 rebasingwcp = repo['.'].rev() in rebaseset
35487
bf556bd2f589 rebase: switch ui.log calls to common style
Phil Cohen <phillco@fb.com>
parents: 35480
diff changeset
1025 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
1026 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
1027 # 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
1028 cmdutil.checkunfinished(repo)
03bec089e105 rebase: disable `inmemory` if the rebaseset contains the working copy
Phil Cohen <phillco@fb.com>
parents: 35320
diff changeset
1029 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
1030
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
1031 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
1032 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
1033 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
1034
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1035 allsrc = revsetlang.formatspec('%ld', rebaseset)
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1036 alias = {'ALLSRC': allsrc}
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 dest is None:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1039 try:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1040 # 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
1041 dest = scmutil.revsingle(repo, destf, localalias=alias)
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1042 except error.RepoLookupError:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1043 # 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
1044 destmap = {}
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1045 for r in rebaseset:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1046 alias['SRC'] = revsetlang.formatspec('%d', r)
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1047 # 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
1048 # 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
1049 destset = repo.anyrevs([destf], user=True, localalias=alias)
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1050 size = len(destset)
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1051 if size == 1:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1052 destmap[r] = destset.first()
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1053 elif size == 0:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1054 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
1055 else:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1056 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
1057 'unique') % repo[r])
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1058
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1059 if dest is not None:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1060 # 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
1061 destrev = dest.rev()
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1062 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
1063
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1064 if not destmap:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1065 ui.status(_('nothing to rebase - empty destination\n'))
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1066 return None
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1067
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1068 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
1069
32248
b47e6b0ba6ca rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents: 32175
diff changeset
1070 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
1071 """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
1072 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
1073 Abort if there is more than one parent.
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
1074 """
19955
2160c2e0d7d1 rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents: 19951
diff changeset
1075 parents = set()
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
1076 source = min(state)
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
1077 for rev in state:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
1078 if rev == source:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
1079 continue
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
1080 for p in repo[rev].parents():
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
1081 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
1082 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
1083 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
1084 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
1085 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
1086 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
1087 return parents.pop()
36478
a6e9a360ccd8 py3: use '%d' for integers instead of b'%s'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36475
diff changeset
1088 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
1089 '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
1090 (max(destancestors),
36475
7b84b737352d py3: replace str() calls with their preferred bytes equivalent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36405
diff changeset
1091 ', '.join("%d" % p for p in sorted(parents))))
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
1092
37043
a8d8cdafe29c rebase: rename conclude[memory]node() to commit[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
1093 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
1094 '''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
1095 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
1096 # 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
1097 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
1098 return None
35319
228916ca12b5 rebase: add concludememorynode(), and call it when rebasing in-memory
Phil Cohen <phillco@fb.com>
parents: 35318
diff changeset
1099
37040
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
1100 # 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
1101 # ``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
1102 branch = repo[p1].branch()
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
1103 if 'branch' in extra:
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
1104 branch = extra['branch']
35319
228916ca12b5 rebase: add concludememorynode(), and call it when rebasing in-memory
Phil Cohen <phillco@fb.com>
parents: 35318
diff changeset
1105
37040
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
1106 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
1107 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
1108 commitres = repo.commitctx(memctx)
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
1109 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
1110 return commitres
35319
228916ca12b5 rebase: add concludememorynode(), and call it when rebasing in-memory
Phil Cohen <phillco@fb.com>
parents: 35318
diff changeset
1111
37043
a8d8cdafe29c rebase: rename conclude[memory]node() to commit[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
1112 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
1113 '''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
1114 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
1115 dsguard = util.nullcontextmanager()
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
1116 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
1117 dsguard = dirstateguard.dirstateguard(repo, 'rebase')
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
1118 with dsguard:
33120
b63351f6a246 rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32084
diff changeset
1119 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
1120
37040
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
1121 # 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
1122 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
1123 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
1124
33120
b63351f6a246 rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32084
diff changeset
1125 repo.dirstate.setbranch(repo[newnode].branch())
b63351f6a246 rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32084
diff changeset
1126 return newnode
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1127
36772
0f3116c08e65 rebase: remove unused argument "state" from rebasenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36771
diff changeset
1128 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
1129 '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
1130 # Merge phase
32248
b47e6b0ba6ca rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents: 32175
diff changeset
1131 # 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
1132 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
1133 wctx.setbase(repo[p1])
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1134 else:
35317
5c25fe7fb1e6 rebase: do not update if IMM; instead, set the overlaywctx's parents
Phil Cohen <phillco@fb.com>
parents: 35316
diff changeset
1135 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
1136 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
1137 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
1138 else:
5c25fe7fb1e6 rebase: do not update if IMM; instead, set the overlaywctx's parents
Phil Cohen <phillco@fb.com>
parents: 35316
diff changeset
1139 repo.ui.debug(" already in destination\n")
35410
83014fa95435 rebase: fix for hgsubversion
Phil Cohen <phillco@fb.com>
parents: 35388
diff changeset
1140 # This is, alas, necessary to invalidate workingctx's manifest cache,
83014fa95435 rebase: fix for hgsubversion
Phil Cohen <phillco@fb.com>
parents: 35388
diff changeset
1141 # 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
1142 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
1143 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
1144 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
1145 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
1146 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
1147 # 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
1148 # have to allow merging with it.
30271
0fa1a41d04e4 rebase: rename merge to mergemod
timeless <timeless@mozdev.org>
parents: 30007
diff changeset
1149 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
1150 labels=['dest', 'source'], wc=wctx)
22905
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
1151 if collapse:
34787
754b5117622f context: add workingfilectx.markcopied
Phil Cohen <phillco@fb.com>
parents: 34614
diff changeset
1152 copies.duplicatecopies(repo, wctx, rev, dest)
22905
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
1153 else:
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
1154 # 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
1155 # duplicate copies between the revision we're
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
1156 # rebasing and its first parent, but *not*
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
1157 # duplicate any copies that have already been
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
1158 # performed in the destination.
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
1159 p1rev = repo[rev].p1().rev()
34787
754b5117622f context: add workingfilectx.markcopied
Phil Cohen <phillco@fb.com>
parents: 34614
diff changeset
1160 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
1161 return stats
6923
ebf1462f2145 strip trailing whitespace, replace tabs by spaces
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6906
diff changeset
1162
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
1163 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
1164 """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
1165
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1166 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
1167 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
1168 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
1169
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1170 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
1171 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
1172
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1173 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
1174 |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1175 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
1176 |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1177 | 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
1178 | |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1179 | 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
1180 | |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1181 | 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
1182 | |
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1183 | 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
1184 | |
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1185 | B <- rebased as B1 C'
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1186 |/ |
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1187 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
1188
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1189 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
1190 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
1191 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
1192
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1193 H C1 G1
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1194 /| | /
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1195 F G |/
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1196 K | | -> K
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1197 | C D |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1198 | |/ |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1199 | B | ...
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1200 |/ |/
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1201 A A
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1202
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1203 Besides, adjust dest according to existing rebase information. For example,
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1204
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1205 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
1206 \|/ of D. We will rebase C first.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1207 A
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1208
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1209 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
1210 | instead of the original C.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1211 B D
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1212 \ /
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1213 A
33590
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1214 """
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1215 # 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
1216 dest = destmap[rev]
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
1217 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
1218 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
1219
33590
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1220 result = []
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1221 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
1222 adjusted = dest
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1223 if prev != nullrev:
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1224 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
1225 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
1226 adjusted = state[candidate]
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1227 if adjusted == dest and dest in state:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1228 adjusted = state[dest]
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1229 if adjusted == revtodo:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1230 # sortsource should produce an order that makes this impossible
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1231 raise error.ProgrammingError(
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1232 '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
1233 result.append(adjusted)
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1234 return result
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1235
33846
3b04a6ff625c rebase: remove rebaseset from _checkobsrebase
Jun Wu <quark@fb.com>
parents: 33845
diff changeset
1236 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
1237 """
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1238 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
1239
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1240 `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
1241 `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
1242 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
1243 """
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1244 # 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
1245 divergenceok = ui.configbool('experimental',
34872
29f52e7966dd config: gather allowdivergence under the evolution namespace
Boris Feld <boris.feld@octobus.net>
parents: 34831
diff changeset
1246 'evolution.allowdivergence')
28685
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1247 divergencebasecandidates = rebaseobsrevs - rebaseobsskipped
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1248
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1249 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
1250 divhashes = (bytes(repo[r])
28685
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1251 for r in divergencebasecandidates)
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1252 msg = _("this rebase will cause "
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1253 "divergences from: %s")
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1254 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
1255 "experimental.evolution.allowdivergence=True")
28685
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1256 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
1257
34095
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34094
diff changeset
1258 def successorrevs(unfi, rev):
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1259 """yield revision numbers for successors of rev"""
34095
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34094
diff changeset
1260 assert unfi.filtername is None
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1261 nodemap = unfi.changelog.nodemap
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1262 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
1263 if s in nodemap:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1264 yield nodemap[s]
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1265
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
1266 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
1267 """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
1268
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1269 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
1270 previously rebase result could affect destination. For example,
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 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
1273 |/ C will be rebased to C'
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1274 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
1275 |/ 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
1276 A
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1277
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1278 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
1279 block below.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1280 """
34092
8a8e7a94ba07 rebase: do not crash rebasing merge with a parent having hidden successor
Jun Wu <quark@fb.com>
parents: 34009
diff changeset
1281 # 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
1282 assert repo.filtername is None
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34094
diff changeset
1283 cl = repo.changelog
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1284 def isancestor(a, b):
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1285 # take revision numbers instead of nodes
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1286 if a == b:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1287 return True
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1288 elif a > b:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1289 return False
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1290 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
1291
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1292 dest = destmap[rev]
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1293 oldps = repo.changelog.parentrevs(rev) # old parents
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1294 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
1295 dests = adjustdest(repo, rev, destmap, state, skipped)
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1296 bases = list(oldps) # merge base candidates, initially just old parents
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1297
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1298 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
1299 # 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
1300 newps[0] = dests[0]
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1301 else:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1302 # 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
1303 # 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
1304 # 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
1305 # accepts one dest per src.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1306 #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1307 # 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
1308 # 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
1309 # 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
1310 #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1311 # 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
1312 # 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
1313 # 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
1314 # because it was rebased?
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 # For example:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1317 #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1318 # 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
1319 # /| # 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
1320 # 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
1321 #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1322 # 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
1323 # at most 2 parents.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1324 for i, p in enumerate(oldps):
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1325 np = p # new parent
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1326 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
1327 np = dests[i]
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1328 elif p in state and state[p] > 0:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1329 np = state[p]
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
1330
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1331 # "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
1332 # 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
1333 # For example:
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 # 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
1336 # | 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
1337 # 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
1338 # | 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
1339 # |/ # 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
1340 # A # the merged graph.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1341 #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1342 # 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
1343 # 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
1344 if isancestor(p, np):
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1345 bases[i] = nullrev
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1346
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1347 # 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
1348 for j, x in enumerate(newps[:i]):
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1349 if x == nullrev:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1350 continue
33863
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1351 if isancestor(np, x): # CASE-1
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1352 np = nullrev
33863
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1353 elif isancestor(x, np): # CASE-2
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1354 newps[j] = np
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1355 np = nullrev
33863
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1356 # 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
1357 # 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
1358 # set bases[x] to nullrev.
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1359 bases[j], bases[i] = bases[i], bases[j]
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1360
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1361 newps[i] = np
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1362
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1363 # "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
1364 # 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
1365 # 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
1366 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
1367 assert len(newps) == 2 and len(oldps) == 2
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1368 newps.reverse()
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1369 bases.reverse()
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1370
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1371 # 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
1372 # 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
1373 #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1374 # C # rebase -r C -d D
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1375 # /| # 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
1376 # A B D
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1377 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
1378 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
1379 '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
1380 % (rev, repo[rev]))
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1381
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1382 # 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
1383 # 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
1384 # 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
1385 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
1386 raise error.Abort(_('source is ancestor of destination'))
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1387
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1388 # "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
1389 if bases[0] != nullrev:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1390 base = bases[0]
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1391 else:
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
1392 base = None
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1393
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1394 # 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
1395 # 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
1396 # 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
1397 #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1398 # F
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1399 # /|
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1400 # 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
1401 # | | # 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
1402 # 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
1403 # |/ # chosen, the rebased F will contain B.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1404 # A Z
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1405 #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1406 # 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
1407 # 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
1408 # pick one (so choose p1 above).
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1409 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
1410 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
1411 for i, base in enumerate(bases):
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1412 if base == nullrev:
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1413 continue
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1414 # 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
1415 # might contain "surprising" contents
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1416 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
1417 bases, base, base, dest))
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
1418
33863
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1419 # 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
1420 # 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
1421 if siderevs:
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
1422 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
1423 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
1424 merges = [r for r in rebaseset
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1425 if cl.parentrevs(r)[1] != nullrev]
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1426 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
1427 siderevs, merges, rebaseset))
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1428
33863
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1429 # 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
1430 l, i = min((len(revs), i)
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1431 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
1432 base = bases[i]
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1433
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1434 # 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
1435 # 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
1436 # 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
1437 # (see CASE-1 and CASE-2 above)
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1438 if i != 0 and newps[i] != nullrev:
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1439 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
1440
33863
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1441 # 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
1442 # 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
1443 if l > 0:
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1444 unwanteddesc = _(' or ').join(
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1445 (', '.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
1446 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
1447 raise error.Abort(
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1448 _('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
1449 % (rev, repo[rev], unwanteddesc))
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1450
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1451 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
1452
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1453 return newps[0], newps[1], base
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1454
7955
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
1455 def isagitpatch(repo, patchname):
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
1456 '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
1457 mqpatch = os.path.join(repo.mq.path, patchname)
36394
4bc983568016 py3: replace file() with open()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36299
diff changeset
1458 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
1459 if line.startswith('diff --git'):
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
1460 return True
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
1461 return False
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
1462
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1463 def updatemq(repo, state, skipped, **opts):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1464 'Update rebased mq patches - finalize and then import them'
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1465 mqrebase = {}
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
1466 mq = repo.mq
14572
8ff2957c1d82 mq: rename full_series to fullseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14509
diff changeset
1467 original_series = mq.fullseries[:]
16531
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
1468 skippedpatches = set()
14497
ea585f2b1adc rebase: restore mq guards after rebasing (issue2107)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 13894
diff changeset
1469
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
1470 for p in mq.applied:
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
1471 rev = repo[p.node].rev()
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
1472 if rev in state:
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9301
diff changeset
1473 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
1474 (rev, p.name))
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
1475 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
1476 else:
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
1477 # 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
1478 skippedpatches.add(p.name)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1479
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1480 if mqrebase:
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
1481 mq.finish(repo, mqrebase.keys())
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1482
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1483 # 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
1484 for rev in sorted(mqrebase, reverse=True):
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1485 if rev not in skipped:
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
1486 name, isgit = mqrebase[rev]
36475
7b84b737352d py3: replace str() calls with their preferred bytes equivalent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36405
diff changeset
1487 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
1488 (name, state[rev], repo[state[rev]]))
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
1489 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
1490 rev=["%d" % state[rev]])
16531
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
1491 else:
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
1492 # Rebased and skipped
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
1493 skippedpatches.add(mqrebase[rev][0])
14497
ea585f2b1adc rebase: restore mq guards after rebasing (issue2107)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 13894
diff changeset
1494
16531
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
1495 # 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
1496 # 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
1497 # 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
1498 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
1499 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
1500 mq.fullseries[:] = newseries
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
1501 mq.seriesdirty = True
14580
92101ea35015 mq: rename save_dirty to savedirty
Adrian Buehlmann <adrian@cadifra.com>
parents: 14572
diff changeset
1502 mq.savedirty()
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1503
28185
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1504 def storecollapsemsg(repo, collapsemsg):
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1505 'Store the collapse message to allow recovery'
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1506 collapsemsg = collapsemsg or ''
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1507 f = repo.vfs("last-message.txt", "w")
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1508 f.write("%s\n" % collapsemsg)
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1509 f.close()
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1510
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1511 def clearcollapsemsg(repo):
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1512 'Remove collapse message file'
31311
f59b6cf663a9 vfs: use repo.vfs.unlinkpath
Mads Kiilerich <mads@kiilerich.com>
parents: 31302
diff changeset
1513 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
1514
31225
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
1515 def restorecollapsemsg(repo, isabort):
28185
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1516 'Restore previously stored collapse message'
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1517 try:
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1518 f = repo.vfs("last-message.txt")
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1519 collapsemsg = f.readline().strip()
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1520 f.close()
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1521 except IOError as err:
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1522 if err.errno != errno.ENOENT:
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1523 raise
31225
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
1524 if isabort:
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
1525 # 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
1526 collapsemsg = ''
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
1527 else:
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
1528 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
1529 return collapsemsg
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1530
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1531 def clearstatus(repo):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1532 'Remove the status files'
33056
2312e70cf78b rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents: 32918
diff changeset
1533 # 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
1534 tr = repo.currenttransaction()
2312e70cf78b rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents: 32918
diff changeset
1535 if tr:
2312e70cf78b rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents: 32918
diff changeset
1536 tr.removefilegenerator('rebasestate')
31311
f59b6cf663a9 vfs: use repo.vfs.unlinkpath
Mads Kiilerich <mads@kiilerich.com>
parents: 31302
diff changeset
1537 repo.vfs.unlinkpath("rebasestate", ignoremissing=True)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1538
25070
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
1539 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
1540 '''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
1541 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
1542 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
1543
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
1544 # 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
1545 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
1546 return False
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
1547
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
1548 # 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
1549 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
1550 if new == nullrev])
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
1551 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
1552 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
1553
fe78eb7bcca0 rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents: 19496
diff changeset
1554 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
1555
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1556 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
1557 '''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
1558
d7451adc72f6 rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents: 23970
diff changeset
1559 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
1560 restore'''
26677
e9b3d523f2e6 rebase: properly abort when destination is public (issue4896)
Christian Delahousse <cdelahousse@fb.com>
parents: 26675
diff changeset
1561
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
1562 try:
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
1563 # 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
1564 # 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
1565 # 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
1566 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
1567 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
1568 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
1569 cleanup = True
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
1570 if immutable:
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
1571 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
1572 % ', '.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
1573 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
1574 cleanup = False
16280
0806823370d8 rebase: properly calculate descendant set when aborting (issue3332)
Matt Mackall <mpm@selenic.com>
parents: 16228
diff changeset
1575
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
1576 descendants = set()
36980
a046d6890761 rebase: avoid defining two lists with the same contents
Martin von Zweigbergk <martinvonz@google.com>
parents: 35701
diff changeset
1577 if rebased:
a046d6890761 rebase: avoid defining two lists with the same contents
Martin von Zweigbergk <martinvonz@google.com>
parents: 35701
diff changeset
1578 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
1579 if descendants - set(rebased):
32249
27e67cfea27f rebase: rename "target" to "destination" in messages
Martin von Zweigbergk <martinvonz@google.com>
parents: 32248
diff changeset
1580 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
1581 "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
1582 cleanup = False
19518
12843143663d rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents: 19517
diff changeset
1583
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
1584 if cleanup:
27988
61f4d59e9a0b rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents: 27977
diff changeset
1585 shouldupdate = False
61f4d59e9a0b rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents: 27977
diff changeset
1586 if rebased:
61f4d59e9a0b rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents: 27977
diff changeset
1587 strippoints = [
61f4d59e9a0b rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents: 27977
diff changeset
1588 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
1589
56d3e0b499df rebase: clear updatestate during rebase --abort in more cases
Durham Goode <durham@fb.com>
parents: 31023
diff changeset
1590 updateifonnodes = set(rebased)
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1591 updateifonnodes.update(destmap.values())
31222
56d3e0b499df rebase: clear updatestate during rebase --abort in more cases
Durham Goode <durham@fb.com>
parents: 31023
diff changeset
1592 updateifonnodes.add(originalwd)
56d3e0b499df rebase: clear updatestate during rebase --abort in more cases
Durham Goode <durham@fb.com>
parents: 31023
diff changeset
1593 shouldupdate = repo['.'].rev() in updateifonnodes
27988
61f4d59e9a0b rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents: 27977
diff changeset
1594
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
1595 # Update away from the rebase if necessary
27988
61f4d59e9a0b rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents: 27977
diff changeset
1596 if shouldupdate or needupdate(repo, state):
30271
0fa1a41d04e4 rebase: rename merge to mergemod
timeless <timeless@mozdev.org>
parents: 30007
diff changeset
1597 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
1598
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
1599 # 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
1600 if rebased:
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
1601 repair.strip(repo.ui, repo, strippoints)
19518
12843143663d rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents: 19517
diff changeset
1602
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
1603 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
1604 bookmarks.activate(repo, activebookmark)
24758
d7451adc72f6 rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents: 23970
diff changeset
1605
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
1606 finally:
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
1607 clearstatus(repo)
28185
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1608 clearcollapsemsg(repo)
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
1609 repo.ui.warn(_('rebase aborted\n'))
19518
12843143663d rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents: 19517
diff changeset
1610 return 0
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1611
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1612 def sortsource(destmap):
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1613 """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
1614
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1615 If source and destination overlaps, we should filter out revisions
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1616 depending on other revisions which hasn't been rebased yet.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1617
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1618 Yield a sorted list of revisions each time.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1619
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1620 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
1621 [A], indicating B needs to be rebased first.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1622
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1623 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
1624 """
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1625 srcset = set(destmap)
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1626 while srcset:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1627 srclist = sorted(srcset)
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1628 result = []
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1629 for r in srclist:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1630 if destmap[r] not in srcset:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1631 result.append(r)
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1632 if not result:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1633 raise error.Abort(_('source and destination form a cycle'))
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1634 srcset -= set(result)
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1635 yield result
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1636
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
1637 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
1638 '''Define which revisions are going to be rebased and where
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1639
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
1640 repo: repo
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1641 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
1642 '''
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1643 rebaseset = destmap.keys()
31297
f5c71e98f0f7 rebase: unhide original working directory node as well (issue5219)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31296
diff changeset
1644 originalwd = repo['.'].rev()
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1645
10672
c2e1e637d4da rebase: always check if rebasing onto an applied mq patch.
Greg Ward <greg-hg@gerg.ca>
parents: 10659
diff changeset
1646 # 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
1647 # 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
1648 # 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
1649 if 'qtip' in repo.tags():
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1650 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
1651 if set(destmap.values()) & mqapplied:
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1652 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
1653
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1654 # Get "cycle" error early by exhausting the generator.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1655 sortedsrc = list(sortsource(destmap)) # a list of sorted revs
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1656 if not sortedsrc:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1657 raise error.Abort(_('no matching revisions'))
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1658
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1659 # 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
1660 # 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
1661 # (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
1662 # "defineparents" to do that check.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1663 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
1664 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
1665 raise error.Abort(_('no matching revisions'))
36271
53be14874ee8 rebase: sort roots by revision
Augie Fackler <augie@google.com>
parents: 36185
diff changeset
1666 def revof(r):
53be14874ee8 rebase: sort roots by revision
Augie Fackler <augie@google.com>
parents: 36185
diff changeset
1667 return r.rev()
53be14874ee8 rebase: sort roots by revision
Augie Fackler <augie@google.com>
parents: 36185
diff changeset
1668 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
1669 state = dict.fromkeys(rebaseset, revtodo)
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1670 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
1671 for root in roots:
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1672 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
1673 commonbase = root.ancestor(dest)
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
1674 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
1675 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
1676 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
1677 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
1678 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
1679 # 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
1680 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
1681 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
1682 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
1683 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
1684 # 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
1685 # 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
1686 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
1687 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
1688 continue
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1689
32272
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
1690 emptyrebase = False
29936
3e7ded768556 rebase: make debug logging more consistent
Martin von Zweigbergk <martinvonz@google.com>
parents: 29872
diff changeset
1691 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
1692 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
1693 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
1694 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
1695 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
1696 # 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
1697 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
1698 state[rev] = rev
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1699 return originalwd, destmap, state
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1700
34367
f61f5af5ed31 merge with stable
Martin von Zweigbergk <martinvonz@google.com>
parents: 34290 34354
diff changeset
1701 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
1702 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
1703 """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
1704
aafc521668d8 rebase: properly handle --collapse when creating obsolescence marker
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17612
diff changeset
1705 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
1706 `collapsedas` node.
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
1707
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
1708 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
1709 removed (but bookmarks still need to be moved).
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
1710 """
33332
3b7cb3d17137 rebase: use scmutil.cleanupnodes (issue5606) (BC)
Jun Wu <quark@fb.com>
parents: 33157
diff changeset
1711 tonode = repo.changelog.node
34354
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
1712 replacements = {}
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
1713 moves = {}
33333
8bfd10e4c55a rebase: remove "if True"
Jun Wu <quark@fb.com>
parents: 33332
diff changeset
1714 for rev, newrev in sorted(state.items()):
8bfd10e4c55a rebase: remove "if True"
Jun Wu <quark@fb.com>
parents: 33332
diff changeset
1715 if newrev >= 0 and newrev != rev:
34354
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
1716 oldnode = tonode(rev)
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
1717 newnode = collapsedas or tonode(newrev)
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
1718 moves[oldnode] = newnode
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
1719 if not keepf:
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
1720 if rev in skipped:
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
1721 succs = ()
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
1722 else:
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
1723 succs = (newnode,)
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
1724 replacements[oldnode] = succs
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
1725 scmutil.cleanupnodes(repo, replacements, 'rebase', moves)
34883
c858afe9c59b rebase: add support to output nodechanges
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34872
diff changeset
1726 if fm:
35125
f56a30b844aa rebase: use fm.formatlist() and fm.formatdict() to support user template
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35058
diff changeset
1727 hf = fm.hexfunc
f56a30b844aa rebase: use fm.formatlist() and fm.formatdict() to support user template
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35058
diff changeset
1728 fl = fm.formatlist
f56a30b844aa rebase: use fm.formatlist() and fm.formatdict() to support user template
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35058
diff changeset
1729 fd = fm.formatdict
f56a30b844aa rebase: use fm.formatlist() and fm.formatdict() to support user template
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35058
diff changeset
1730 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
1731 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
1732 key="oldnode", value="newnodes")
34883
c858afe9c59b rebase: add support to output nodechanges
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34872
diff changeset
1733 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
1734
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
1735 def pullrebase(orig, ui, repo, *args, **opts):
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1736 '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
1737 ret = None
35002
1a07f9187831 py3: handle keyword arguments in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34963
diff changeset
1738 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
1739 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
1740 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
1741 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
1742 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
1743
32918
04c9dd951a41 rebase: use context manager for locking in pullrebase()
Martin von Zweigbergk <martinvonz@google.com>
parents: 32917
diff changeset
1744 with repo.wlock(), repo.lock():
35002
1a07f9187831 py3: handle keyword arguments in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34963
diff changeset
1745 if opts.get(r'update'):
1a07f9187831 py3: handle keyword arguments in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34963
diff changeset
1746 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
1747 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
1748 'the update flag\n')
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1749
30725
c2bd2f77965b rebase: fail-fast the pull if working dir is not clean (BC)
Valters Vingolds <valters@vingolds.ch>
parents: 30709
diff changeset
1750 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
1751 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
1752 '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
1753
26029
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
1754 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
1755 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
1756 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
1757 pass
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
1758 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
1759 try:
26960
6979fe2a6d75 rebase: add returning value from pullrebase function
liscju <piotr.listkiewicz@gmail.com>
parents: 26811
diff changeset
1760 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
1761 finally:
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
1762 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
1763 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
1764 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
1765 # --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
1766 # dropping it
35002
1a07f9187831 py3: handle keyword arguments in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34963
diff changeset
1767 if r'rev' in opts:
1a07f9187831 py3: handle keyword arguments in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34963
diff changeset
1768 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
1769 # 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
1770 # --source.
35002
1a07f9187831 py3: handle keyword arguments in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34963
diff changeset
1771 if r'source' in opts:
1a07f9187831 py3: handle keyword arguments in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34963
diff changeset
1772 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
1773 # 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
1774 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
1775 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
1776 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
1777 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
1778 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
1779 # 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
1780 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
1781 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
1782 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
1783 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
1784 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
1785 # 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
1786 # with warning and trumpets
0e3835c7e1cf rebase: perform update through the 'update' command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28117
diff changeset
1787 commands.update(ui, repo)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1788 else:
35002
1a07f9187831 py3: handle keyword arguments in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34963
diff changeset
1789 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
1790 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
1791 ret = orig(ui, repo, *args, **opts)
6979fe2a6d75 rebase: add returning value from pullrebase function
liscju <piotr.listkiewicz@gmail.com>
parents: 26811
diff changeset
1792
6979fe2a6d75 rebase: add returning value from pullrebase function
liscju <piotr.listkiewicz@gmail.com>
parents: 26811
diff changeset
1793 return ret
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1794
27790
2d294dada4f8 rebase: small refactoring to allow better extensibility from extensions
Laurent Charignon <lcharignon@fb.com>
parents: 27746
diff changeset
1795 def _filterobsoleterevs(repo, revs):
2d294dada4f8 rebase: small refactoring to allow better extensibility from extensions
Laurent Charignon <lcharignon@fb.com>
parents: 27746
diff changeset
1796 """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
1797 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
1798
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1799 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
1800 """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
1801
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35002
diff changeset
1802 `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
1803 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
1804
35058
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35002
diff changeset
1805 `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
1806 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
1807
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
1808 `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
1809 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
1810 """
26349
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
1811 obsoletenotrebased = {}
35058
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35002
diff changeset
1812 obsoletewithoutsuccessorindestination = set([])
35995
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
1813 obsoleteextinctsuccessors = set([])
26349
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
1814
34095
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34094
diff changeset
1815 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
1816 cl = repo.changelog
34003
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
1817 nodemap = cl.nodemap
35995
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
1818 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
1819 for srcrev in rebaseobsrevs:
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
1820 srcnode = cl.node(srcrev)
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1821 destnode = cl.node(destmap[srcrev])
34003
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
1822 # 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
1823 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
1824 # obsutil.allsuccessors includes node itself
ae0d25071fca rebase: eliminate node from successors early in _computeobsoletenotrebased()
Denis Laxalde <denis@laxalde.org>
parents: 35917
diff changeset
1825 successors.remove(srcnode)
35997
24f05489377b rebase: make "successors" a set in _computeobsoletenotrebased()
Denis Laxalde <denis@laxalde.org>
parents: 35995
diff changeset
1826 if successors.issubset(extinctnodes):
35995
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
1827 # all successors are extinct
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
1828 obsoleteextinctsuccessors.add(srcrev)
35994
ae0d25071fca rebase: eliminate node from successors early in _computeobsoletenotrebased()
Denis Laxalde <denis@laxalde.org>
parents: 35917
diff changeset
1829 if not successors:
ae0d25071fca rebase: eliminate node from successors early in _computeobsoletenotrebased()
Denis Laxalde <denis@laxalde.org>
parents: 35917
diff changeset
1830 # no successor
34003
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
1831 obsoletenotrebased[srcrev] = None
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
1832 else:
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
1833 for succnode in successors:
35994
ae0d25071fca rebase: eliminate node from successors early in _computeobsoletenotrebased()
Denis Laxalde <denis@laxalde.org>
parents: 35917
diff changeset
1834 if succnode not in nodemap:
34003
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
1835 continue
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
1836 if cl.isancestor(succnode, destnode):
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
1837 obsoletenotrebased[srcrev] = nodemap[succnode]
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
1838 break
35058
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35002
diff changeset
1839 else:
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35002
diff changeset
1840 # 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
1841 # 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
1842 # and its descendants to avoid divergence.
38183
69d1cafe75f2 rebase: avoid RevlogError when computing obsoletenotrebased (issue5907)
Matt Harbison <matt_harbison@yahoo.com>
parents: 37787
diff changeset
1843 if any(nodemap[s] in destmap for s in successors
69d1cafe75f2 rebase: avoid RevlogError when computing obsoletenotrebased (issue5907)
Matt Harbison <matt_harbison@yahoo.com>
parents: 37787
diff changeset
1844 if s in nodemap):
35058
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35002
diff changeset
1845 obsoletewithoutsuccessorindestination.add(srcrev)
27012
5eac7ab59b95 rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents: 27010
diff changeset
1846
35995
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
1847 return (
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
1848 obsoletenotrebased,
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
1849 obsoletewithoutsuccessorindestination,
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
1850 obsoleteextinctsuccessors,
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
1851 )
26349
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
1852
19214
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
1853 def summaryhook(ui, repo):
30709
a932297febb7 rebase: use repo.vfs.exists in 'hg summary' hook
Valters Vingolds <valters@vingolds.ch>
parents: 30674
diff changeset
1854 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
1855 return
19849
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
1856 try:
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
1857 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
1858 rbsrt.restorestatus()
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
1859 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
1860 except error.RepoLookupError:
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
1861 # 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
1862 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
1863 ui.write(msg)
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
1864 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
1865 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
1866 # i18n: column positioning for "hg summary"
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
1867 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
1868 (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
1869 ui.label(_('%d remaining'), 'rebase.remaining') %
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
1870 (len(state) - numrebased)))
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
1871
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1872 def uisetup(ui):
23970
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
1873 #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
1874 entry = extensions.wrapcommand(commands.table, 'pull', pullrebase)
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
1875 entry[1].append(('', 'rebase', None,
14444
1f997134a9d1 rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents: 14306
diff changeset
1876 _("rebase working directory to branch head")))
1f997134a9d1 rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents: 14306
diff changeset
1877 entry[1].append(('t', 'tool', '',
1f997134a9d1 rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents: 14306
diff changeset
1878 _("specify merge tool for rebase")))
19214
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
1879 cmdutil.summaryhooks.add('rebase', summaryhook)
19478
e5a5790a3185 rebase: add checkunfinished support (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19477
diff changeset
1880 cmdutil.unfinishedstates.append(
19496
607191a45f8c checkunfinished: accommodate histedit quirk
Matt Mackall <mpm@selenic.com>
parents: 19478
diff changeset
1881 ['rebasestate', False, False, _('rebase in progress'),
19478
e5a5790a3185 rebase: add checkunfinished support (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19477
diff changeset
1882 _("use 'hg rebase --continue' or 'hg rebase --abort'")])
27626
157675d0f600 rebase: hook afterresolvedstates
timeless <timeless@mozdev.org>
parents: 27586
diff changeset
1883 cmdutil.afterresolvedstates.append(
157675d0f600 rebase: hook afterresolvedstates
timeless <timeless@mozdev.org>
parents: 27586
diff changeset
1884 ['rebasestate', _('hg rebase --continue')])