annotate hgext/rebase.py @ 44911:84614212ae39 stable

flags: actually merge flags in simplemerge Since b86fc43e4b73, the local flag were blindly taken. This resulted in bug when rename are involved. exec flag change are now properly merged (when merged from the rename side). Another bug is affecting this when merging from the side without the rename. Differential Revision: https://phab.mercurial-scm.org/D8533
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Sat, 16 May 2020 20:38:19 +0200
parents e7af56a0733e
children b7808443ed6a 1f114c797961
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 )
43085
eef9a2d67051 py3: manually import pycompat.open into files that need it
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43077
diff changeset
27 from mercurial.pycompat import open
29128
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
28 from mercurial import (
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
29 bookmarks,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
30 cmdutil,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
31 commands,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
32 copies,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
33 destutil,
30490
ee2097c560c1 rebase: refer to dirstateguard by its new name
Augie Fackler <augie@google.com>
parents: 30459
diff changeset
34 dirstateguard,
29128
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
35 error,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
36 extensions,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
37 hg,
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,
44239
830eae18b2f3 rebase: abort if the user tries to rebase the working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 44214
diff changeset
40 node as nodemod,
29128
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
41 obsolete,
33145
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33139
diff changeset
42 obsutil,
29128
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
43 patch,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
44 phases,
35002
1a07f9187831 py3: handle keyword arguments in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34963
diff changeset
45 pycompat,
29128
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
46 registrar,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
47 repair,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
48 revset,
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
49 revsetlang,
43934
71fee4564410 rebase: use rewriteutil.precheck() instead of reimplementing it
Martin von Zweigbergk <martinvonz@google.com>
parents: 43932
diff changeset
50 rewriteutil,
29128
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
51 scmutil,
31023
aea06029919e revset: import set classes directly from smartset module
Yuya Nishihara <yuya@tcha.org>
parents: 30865
diff changeset
52 smartset,
38516
7c853edcf4ed rebase: add a stateobj variable to rebaseruntime class
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38515
diff changeset
53 state as statemod,
29128
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
54 util,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
55 )
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
56
26669
07db7e95c464 rebase: added comments
Christian Delahousse <cdelahousse@fb.com>
parents: 26587
diff changeset
57 # 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
58 # their values must be maintained.
07db7e95c464 rebase: added comments
Christian Delahousse <cdelahousse@fb.com>
parents: 26587
diff changeset
59
07db7e95c464 rebase: added comments
Christian Delahousse <cdelahousse@fb.com>
parents: 26587
diff changeset
60 # 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
61 revtodo = -1
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
62 revtodostr = b'-1'
33843
d8d0ef5f5975 rebase: remove revprecursor and revpruned states (BC)
Jun Wu <quark@fb.com>
parents: 33842
diff changeset
63
d8d0ef5f5975 rebase: remove revprecursor and revpruned states (BC)
Jun Wu <quark@fb.com>
parents: 33842
diff changeset
64 # 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
65 # -2: nullmerge, -3: revignored, -4: revprecursor, -5: revpruned
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
66 legacystates = {b'-2', b'-3', b'-4', b'-5'}
10352
66d954e76ffb rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10351
diff changeset
67
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
68 cmdtable = {}
32337
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32327
diff changeset
69 command = registrar.command(cmdtable)
29841
d5883fd055c6 extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents: 29610
diff changeset
70 # 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
71 # 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
72 # 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
73 # leave the attribute unspecified.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
74 testedwith = b'ships-with-hg-core'
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
75
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
76
26671
66dc39cd7d06 rebase: factor out nothing to rebase return code
Ryan McElroy <rmcelroy@fb.com>
parents: 26669
diff changeset
77 def _nothingtorebase():
66dc39cd7d06 rebase: factor out nothing to rebase return code
Ryan McElroy <rmcelroy@fb.com>
parents: 26669
diff changeset
78 return 1
66dc39cd7d06 rebase: factor out nothing to rebase return code
Ryan McElroy <rmcelroy@fb.com>
parents: 26669
diff changeset
79
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
80
27976
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
81 def _savegraft(ctx, extra):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
82 s = ctx.extra().get(b'source', None)
27976
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
83 if s is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
84 extra[b'source'] = s
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
85 s = ctx.extra().get(b'intermediate-source', None)
27976
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
86 if s is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
87 extra[b'intermediate-source'] = s
27976
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
88
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
89
27976
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
90 def _savebranch(ctx, extra):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
91 extra[b'branch'] = ctx.branch()
27976
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
92
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
93
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 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
95 """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
96
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
97 Please wrap destutil.destmerge instead."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
98 return destutil.destmerge(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
99 repo,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
100 action=b'rebase',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
101 sourceset=sourceset,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
102 onheadcheck=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
103 destspace=destspace,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
104 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
105
26717
1755e1d9d1c3 rebase: extra default destination in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26677
diff changeset
106
28394
dcb4209bd30d revset: replace extpredicate by revsetpredicate of registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28280
diff changeset
107 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
108
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
109
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
110 @revsetpredicate(b'_destrebase')
26719
8bed1eae99df rebase: rename and test '_destrebase'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26718
diff changeset
111 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
112 # ``_rebasedefaultdest()``
3f8c5c284c86 rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26165
diff changeset
113
3f8c5c284c86 rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26165
diff changeset
114 # default destination for rebase.
3f8c5c284c86 rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26165
diff changeset
115 # # 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
116 # # 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
117 # 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
118 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
119 if x is not None:
31023
aea06029919e revset: import set classes directly from smartset module
Yuya Nishihara <yuya@tcha.org>
parents: 30865
diff changeset
120 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
121 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
122
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
123
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
124 @revsetpredicate(b'_destautoorphanrebase')
37787
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
125 def _revsetdestautoorphanrebase(repo, subset, x):
42299
80a213f9ed87 rebase: hide help for revisions.Predicates._destautoorphanrebase
timeless <timeless@mozdev.org>
parents: 42108
diff changeset
126 # ``_destautoorphanrebase()``
80a213f9ed87 rebase: hide help for revisions.Predicates._destautoorphanrebase
timeless <timeless@mozdev.org>
parents: 42108
diff changeset
127
80a213f9ed87 rebase: hide help for revisions.Predicates._destautoorphanrebase
timeless <timeless@mozdev.org>
parents: 42108
diff changeset
128 # automatic rebase destination for a single orphan revision.
37787
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
129 unfi = repo.unfiltered()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
130 obsoleted = unfi.revs(b'obsolete()')
37787
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
131
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
132 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
133
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
134 # 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
135 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
136 return smartset.baseset()
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
137 dests = destutil.orphanpossibledestination(repo, src)
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
138 if len(dests) > 1:
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
139 raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
140 _(b"ambiguous automatic rebase: %r could end up on any of %r")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
141 % (src, dests)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
142 )
37787
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
143 # 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
144 return smartset.baseset(dests)
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
145
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
146
33841
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33789
diff changeset
147 def _ctxdesc(ctx):
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33789
diff changeset
148 """short description for a context"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
149 desc = b'%d:%s "%s"' % (
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
150 ctx.rev(),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
151 ctx,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
152 ctx.description().split(b'\n', 1)[0],
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
153 )
33841
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33789
diff changeset
154 repo = ctx.repo()
34290
4f969b9e0cf5 rebase: also include other namespaces in changeset description
Martin von Zweigbergk <martinvonz@google.com>
parents: 34095
diff changeset
155 names = []
43105
649d3ac37a12 py3: define and use pycompat.iteritems() for hgext/
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43104
diff changeset
156 for nsname, ns in pycompat.iteritems(repo.names):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
157 if nsname == b'branches':
34290
4f969b9e0cf5 rebase: also include other namespaces in changeset description
Martin von Zweigbergk <martinvonz@google.com>
parents: 34095
diff changeset
158 continue
4f969b9e0cf5 rebase: also include other namespaces in changeset description
Martin von Zweigbergk <martinvonz@google.com>
parents: 34095
diff changeset
159 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
160 if names:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
161 desc += b' (%s)' % b' '.join(names)
33841
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33789
diff changeset
162 return desc
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33789
diff changeset
163
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
164
29358
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
165 class rebaseruntime(object):
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
166 """This class is a container for rebase runtime state"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
167
35388
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
168 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
169 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
170 opts = {}
adb0d58b8b0b rebase: pass repo, ui and opts objects to the RR class constructor
Kostia Balytskyi <ikostia@fb.com>
parents: 29372
diff changeset
171
34094
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
172 # 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
173 # decides whether "self.repo" is unfiltered or not.
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
174 # 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
175 # 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
176 # unfiltered repo to avoid visibility issues.
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
177 # 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
178 # --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
179 # visibility-dependent revsets are correct.
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
180 self.prepared = False
44346
b42ce825308e rebase: stop relying on having two parents to resume rebase
Martin von Zweigbergk <martinvonz@google.com>
parents: 44341
diff changeset
181 self.resume = False
34094
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
182 self._repo = repo
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
183
29399
adb0d58b8b0b rebase: pass repo, ui and opts objects to the RR class constructor
Kostia Balytskyi <ikostia@fb.com>
parents: 29372
diff changeset
184 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
185 self.opts = opts
29358
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
186 self.originalwd = None
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
187 self.external = nullrev
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
188 # 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
189 # 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
190 # 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
191 self.state = {}
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
192 self.activebookmark = None
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
193 self.destmap = {}
29360
4cbe62ab5c97 rebase: move local variable 'skipped' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29359
diff changeset
194 self.skipped = set()
29358
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
195
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
196 self.collapsef = opts.get(b'collapse', False)
29400
c79da70a4659 rebase: move collapse-related local variables to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29399
diff changeset
197 self.collapsemsg = cmdutil.logmessage(ui, opts)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
198 self.date = opts.get(b'date', None)
29401
87acd047711e rebase: move local variables 'date' and 'extrafns' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29400
diff changeset
199
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
200 e = opts.get(b'extrafn') # internal, used by e.g. hgsubversion
29401
87acd047711e rebase: move local variables 'date' and 'extrafns' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29400
diff changeset
201 self.extrafns = [_savegraft]
87acd047711e rebase: move local variables 'date' and 'extrafns' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29400
diff changeset
202 if e:
87acd047711e rebase: move local variables 'date' and 'extrafns' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29400
diff changeset
203 self.extrafns = [e]
29400
c79da70a4659 rebase: move collapse-related local variables to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29399
diff changeset
204
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
205 self.backupf = ui.configbool(b'rewrite', b'backup-bundle')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
206 self.keepf = opts.get(b'keep', False)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
207 self.keepbranchesf = opts.get(b'keepbranches', False)
29404
591a8069b60e rebase: move local variable 'obsoletenotrebased' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29403
diff changeset
208 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
209 self.obsoletewithoutsuccessorindestination = set()
35388
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
210 self.inmemory = inmemory
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
211 self.stateobj = statemod.cmdstate(repo, b'rebasestate')
29402
7481ffb7ff83 rebase: move local variables related to keeping things unchanged to the RR
Kostia Balytskyi <ikostia@fb.com>
parents: 29401
diff changeset
212
34094
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
213 @property
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
214 def repo(self):
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
215 if self.prepared:
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
216 return self._repo.unfiltered()
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
217 else:
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
218 return self._repo
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
219
31224
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31223
diff changeset
220 def storestatus(self, tr=None):
31223
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
221 """Store the current status to allow recovery"""
31224
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31223
diff changeset
222 if tr:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
223 tr.addfilegenerator(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
224 b'rebasestate',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
225 (b'rebasestate',),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
226 self._writestatus,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
227 location=b'plain',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
228 )
31224
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31223
diff changeset
229 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
230 with self.repo.vfs(b"rebasestate", b"w") as f:
31224
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31223
diff changeset
231 self._writestatus(f)
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31223
diff changeset
232
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31223
diff changeset
233 def _writestatus(self, f):
34095
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34094
diff changeset
234 repo = self.repo
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34094
diff changeset
235 assert repo.filtername is None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
236 f.write(repo[self.originalwd].hex() + b'\n')
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
237 # was "dest". we now write dest per src root below.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
238 f.write(b'\n')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
239 f.write(repo[self.external].hex() + b'\n')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
240 f.write(b'%d\n' % int(self.collapsef))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
241 f.write(b'%d\n' % int(self.keepf))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
242 f.write(b'%d\n' % int(self.keepbranchesf))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
243 f.write(b'%s\n' % (self.activebookmark or b''))
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
244 destmap = self.destmap
43105
649d3ac37a12 py3: define and use pycompat.iteritems() for hgext/
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43104
diff changeset
245 for d, v in pycompat.iteritems(self.state):
31223
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
246 oldrev = repo[d].hex()
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
247 if v >= 0:
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
248 newrev = repo[v].hex()
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
249 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
250 newrev = b"%d" % v
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
251 destnode = repo[destmap[d]].hex()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
252 f.write(b"%s:%s:%s\n" % (oldrev, newrev, destnode))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
253 repo.ui.debug(b'rebase status stored\n')
31223
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
254
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
255 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
256 """Restore a previously stored status"""
38518
cf24f678adda rebase: check whether the rebasestate exists or not a bit early
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38517
diff changeset
257 if not self.stateobj.exists():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
258 cmdutil.wrongtooltocontinue(self.repo, _(b'rebase'))
38518
cf24f678adda rebase: check whether the rebasestate exists or not a bit early
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38517
diff changeset
259
38515
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38508
diff changeset
260 data = self._read()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
261 self.repo.ui.debug(b'rebase status resumed\n')
38515
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38508
diff changeset
262
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
263 self.originalwd = data[b'originalwd']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
264 self.destmap = data[b'destmap']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
265 self.state = data[b'state']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
266 self.skipped = data[b'skipped']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
267 self.collapsef = data[b'collapse']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
268 self.keepf = data[b'keep']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
269 self.keepbranchesf = data[b'keepbranches']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
270 self.external = data[b'external']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
271 self.activebookmark = data[b'activebookmark']
38515
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38508
diff changeset
272
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38508
diff changeset
273 def _read(self):
34094
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
274 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
275 repo = self.repo
34095
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34094
diff changeset
276 assert repo.filtername is None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
277 data = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
278 b'keepbranches': None,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
279 b'collapse': None,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
280 b'activebookmark': None,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
281 b'external': nullrev,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
282 b'keep': None,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
283 b'originalwd': None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
284 }
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
285 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
286 state = {}
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
287 destmap = {}
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
288
38518
cf24f678adda rebase: check whether the rebasestate exists or not a bit early
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38517
diff changeset
289 if True:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
290 f = repo.vfs(b"rebasestate")
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 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
292 if i == 0:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
293 data[b'originalwd'] = 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
294 elif i == 1:
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
295 # 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
296 # clients may still use it
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
297 if l:
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
298 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
299 elif i == 2:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
300 data[b'external'] = 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
301 elif i == 3:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
302 data[b'collapse'] = bool(int(l))
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
303 elif i == 4:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
304 data[b'keep'] = bool(int(l))
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
305 elif i == 5:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
306 data[b'keepbranches'] = bool(int(l))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
307 elif i == 6 and not (len(l) == 81 and b':' in l):
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
308 # 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
309 # 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
310 # oldrev:newrev lines
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
311 data[b'activebookmark'] = l
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
312 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
313 args = l.split(b':')
37377
3dfd7f018c69 rebase: convert "oldrev" to revnum earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 37376
diff changeset
314 oldrev = repo[args[0]].rev()
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
315 newrev = args[1]
33843
d8d0ef5f5975 rebase: remove revprecursor and revpruned states (BC)
Jun Wu <quark@fb.com>
parents: 33842
diff changeset
316 if newrev in legacystates:
d8d0ef5f5975 rebase: remove revprecursor and revpruned states (BC)
Jun Wu <quark@fb.com>
parents: 33842
diff changeset
317 continue
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
318 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
319 destrev = repo[args[2]].rev()
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
320 else:
37376
25940470c7e6 rebase: make "destnode" consistently a revnum and rename it to "destrev"
Martin von Zweigbergk <martinvonz@google.com>
parents: 37332
diff changeset
321 destrev = legacydest
37377
3dfd7f018c69 rebase: convert "oldrev" to revnum earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 37376
diff changeset
322 destmap[oldrev] = destrev
37378
953db9e00eeb rebase: remove unnecessary and incorrect handling of nullid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37377
diff changeset
323 if newrev == revtodostr:
37377
3dfd7f018c69 rebase: convert "oldrev" to revnum earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 37376
diff changeset
324 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
325 # 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
326 else:
37377
3dfd7f018c69 rebase: convert "oldrev" to revnum earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 37376
diff changeset
327 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
328
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
329 if data[b'keepbranches'] is None:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
330 raise error.Abort(_(b'.hg/rebasestate is incomplete'))
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
331
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
332 data[b'destmap'] = destmap
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
333 data[b'state'] = state
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
334 skipped = set()
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
335 # recompute the set of skipped revs
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
336 if not data[b'collapse']:
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
337 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
338 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
339 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
340 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
341 seen.add(new)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
342 data[b'skipped'] = skipped
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
343 repo.ui.debug(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
344 b'computed skipped revs: %s\n'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
345 % (b' '.join(b'%d' % r for r in sorted(skipped)) or b'')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
346 )
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
347
38515
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38508
diff changeset
348 return data
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
349
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
350 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
351 """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
352
5d16ebe7b14f rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents: 29478
diff changeset
353 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
354 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
355 """
5d16ebe7b14f rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents: 29478
diff changeset
356 self.obsoletenotrebased = {}
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
357 if not self.ui.configbool(b'experimental', b'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
358 return
5d16ebe7b14f rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents: 29478
diff changeset
359 obsoleteset = set(obsoleterevs)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
360 (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
361 self.obsoletenotrebased,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
362 self.obsoletewithoutsuccessorindestination,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
363 obsoleteextinctsuccessors,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
364 ) = _computeobsoletenotrebased(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
365 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
366 skippedset.update(self.obsoletewithoutsuccessorindestination)
35995
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
367 skippedset.update(obsoleteextinctsuccessors)
33846
3b04a6ff625c rebase: remove rebaseset from _checkobsrebase
Jun Wu <quark@fb.com>
parents: 33845
diff changeset
368 _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
369
38499
999e5c218daf rebase: suppress warning thrown when aborting rebase in case of dryrun
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38498
diff changeset
370 def _prepareabortorcontinue(self, isabort, backup=True, suppwarns=False):
44346
b42ce825308e rebase: stop relying on having two parents to resume rebase
Martin von Zweigbergk <martinvonz@google.com>
parents: 44341
diff changeset
371 self.resume = True
29472
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
372 try:
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
373 self.restorestatus()
31225
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
374 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
375 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
376 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
377 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
378 clearcollapsemsg(self.repo)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
379 self.repo.ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
380 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
381 b'rebase aborted (no revision is removed,'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
382 b' only broken state is cleared)\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
383 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
384 )
29472
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
385 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
386 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
387 msg = _(b'cannot continue inconsistent rebase')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
388 hint = _(b'use "hg rebase --abort" to clear broken state')
29472
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
389 raise error.Abort(msg, hint=hint)
38816
2b728789edfd rebase: move "backup" flag to rebaseruntime
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38799
diff changeset
390
29472
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
391 if isabort:
38816
2b728789edfd rebase: move "backup" flag to rebaseruntime
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38799
diff changeset
392 backup = backup and self.backupf
40857
2041991f1ce2 rebase: remove now-unnecessary arguments to _abort()
Martin von Zweigbergk <martinvonz@google.com>
parents: 40856
diff changeset
393 return self._abort(backup=backup, suppwarns=suppwarns)
29472
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
394
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
395 def _preparenewrebase(self, destmap):
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
396 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
397 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
398
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
399 rebaseset = destmap.keys()
43934
71fee4564410 rebase: use rewriteutil.precheck() instead of reimplementing it
Martin von Zweigbergk <martinvonz@google.com>
parents: 43932
diff changeset
400 if not self.keepf:
71fee4564410 rebase: use rewriteutil.precheck() instead of reimplementing it
Martin von Zweigbergk <martinvonz@google.com>
parents: 43932
diff changeset
401 try:
71fee4564410 rebase: use rewriteutil.precheck() instead of reimplementing it
Martin von Zweigbergk <martinvonz@google.com>
parents: 43932
diff changeset
402 rewriteutil.precheck(self.repo, rebaseset, action=b'rebase')
71fee4564410 rebase: use rewriteutil.precheck() instead of reimplementing it
Martin von Zweigbergk <martinvonz@google.com>
parents: 43932
diff changeset
403 except error.Abort as e:
71fee4564410 rebase: use rewriteutil.precheck() instead of reimplementing it
Martin von Zweigbergk <martinvonz@google.com>
parents: 43932
diff changeset
404 if e.hint is None:
43940
d77230743968 rebase: restore i18n of a hint message
Martin von Zweigbergk <martinvonz@google.com>
parents: 43934
diff changeset
405 e.hint = _(b'use --keep to keep original changesets')
43934
71fee4564410 rebase: use rewriteutil.precheck() instead of reimplementing it
Martin von Zweigbergk <martinvonz@google.com>
parents: 43932
diff changeset
406 raise e
29473
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
407
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
408 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
409
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
410 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
411 # Empty state built, nothing to rebase
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
412 self.ui.status(_(b'nothing to rebase\n'))
29473
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
413 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
414
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
415 (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
416 if self.collapsef:
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
417 dests = set(self.destmap.values())
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
418 if len(dests) != 1:
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
419 raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
420 _(b'--collapse does not work with multiple destinations')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
421 )
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
422 destrev = next(iter(dests))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
423 destancestors = self.repo.changelog.ancestors(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
424 [destrev], inclusive=True
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
425 )
33847
ddf77c0cc169 rebase: remove self.destancestors
Jun Wu <quark@fb.com>
parents: 33846
diff changeset
426 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
427
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
428 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
429 dest = self.repo[destrev]
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
430 if dest.closesbranch() and not self.keepbranchesf:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
431 self.ui.status(_(b'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
432
34094
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
433 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
434
35333
8dba17546016 rebase: extract _assignworkingcopy
Phil Cohen <phillco@fb.com>
parents: 35332
diff changeset
435 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
436 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
437 from mercurial.context import overlayworkingctx
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
438
35290
482614b3802a rebase: add the --inmemory option flag; assign a wctx object for the rebase
Phil Cohen <phillco@fb.com>
parents: 35287
diff changeset
439 self.wctx = overlayworkingctx(self.repo)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
440 self.repo.ui.debug(b"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
441 else:
482614b3802a rebase: add the --inmemory option flag; assign a wctx object for the rebase
Phil Cohen <phillco@fb.com>
parents: 35287
diff changeset
442 self.wctx = self.repo[None]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
443 self.repo.ui.debug(b"rebasing on disk\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
444 self.repo.ui.log(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
445 b"rebase",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
446 b"using in-memory rebase: %r\n",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
447 self.inmemory,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
448 rebase_imm_used=self.inmemory,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
449 )
35333
8dba17546016 rebase: extract _assignworkingcopy
Phil Cohen <phillco@fb.com>
parents: 35332
diff changeset
450
8dba17546016 rebase: extract _assignworkingcopy
Phil Cohen <phillco@fb.com>
parents: 35332
diff changeset
451 def _performrebase(self, tr):
8dba17546016 rebase: extract _assignworkingcopy
Phil Cohen <phillco@fb.com>
parents: 35332
diff changeset
452 self._assignworkingcopy()
8dba17546016 rebase: extract _assignworkingcopy
Phil Cohen <phillco@fb.com>
parents: 35332
diff changeset
453 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
454 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
455 # 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
456 # 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
457 # desired
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
458 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
459 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
460 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
461 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
462 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
463 if len(branches) > 1:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
464 raise error.Abort(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43105
diff changeset
465 _(b'cannot collapse multiple named branches')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
466 )
29477
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
467
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
468 # Calculate self.obsoletenotrebased
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
469 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
470 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
471
33332
3b7cb3d17137 rebase: use scmutil.cleanupnodes (issue5606) (BC)
Jun Wu <quark@fb.com>
parents: 33157
diff changeset
472 # 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
473 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
474 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
475 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
476
31225
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
477 # 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
478 # 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
479 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
480 if tr:
74f91bec6991 rebase: register status file generator only once when using single transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 37028
diff changeset
481 # 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
482 # commits.
74f91bec6991 rebase: register status file generator only once when using single transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 37028
diff changeset
483 self.storestatus(tr)
31225
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
484
43105
649d3ac37a12 py3: define and use pycompat.iteritems() for hgext/
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43104
diff changeset
485 cands = [k for k, v in pycompat.iteritems(self.state) if v == revtodo]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
486 p = repo.ui.makeprogress(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
487 _(b"rebasing"), unit=_(b'changesets'), total=len(cands)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
488 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
489
36933
61600b024a70 rebase: move constant expressions out of inner loop in _performrebase()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36932
diff changeset
490 def progress(ctx):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
491 p.increment(item=(b"%d:%s" % (ctx.rev(), ctx)))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
492
36933
61600b024a70 rebase: move constant expressions out of inner loop in _performrebase()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36932
diff changeset
493 allowdivergence = self.ui.configbool(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
494 b'experimental', b'evolution.allowdivergence'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
495 )
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
496 for subset in sortsource(self.destmap):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
497 sortedrevs = self.repo.revs(b'sort(%ld, -topo)', subset)
36932
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36931
diff changeset
498 if not allowdivergence:
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36931
diff changeset
499 sortedrevs -= self.repo.revs(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
500 b'descendants(%ld) and not %ld',
36932
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36931
diff changeset
501 self.obsoletewithoutsuccessorindestination,
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36931
diff changeset
502 self.obsoletewithoutsuccessorindestination,
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36931
diff changeset
503 )
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36931
diff changeset
504 for rev in sortedrevs:
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36931
diff changeset
505 self._rebasenode(tr, rev, allowdivergence, progress)
38377
a73eab7d6575 rebase: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38372
diff changeset
506 p.complete()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
507 ui.note(_(b'rebase merging completed\n'))
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
508
44349
cd43cae79f25 rebase: remove some now-unused parent arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 44348
diff changeset
509 def _concludenode(self, rev, p1, editor, commitmsg=None):
37033
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37032
diff changeset
510 '''Commit the wd changes with parents p1 and p2.
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37032
diff changeset
511
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37032
diff changeset
512 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
513 Return node of committed revision.'''
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37032
diff changeset
514 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
515 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
516 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
517 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
518 date = self.date
0b1230a5a958 rebase: look up default date outside of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37040
diff changeset
519 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
520 date = ctx.date()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
521 extra = {b'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
522 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
523 c(ctx, extra)
37038
7db86856f27f rebase: pass in "keepbranch" to conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37037
diff changeset
524 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
525 destphase = max(ctx.phase(), phases.draft)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
526 overrides = {(b'phases', b'new-commit'): destphase}
37039
7616073a4cf1 rebase: pass in entire "overrides" dict to conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37038
diff changeset
527 if keepbranch:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
528 overrides[(b'ui', b'allowemptycommit')] = True
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
529 with repo.ui.configoverride(overrides, b'rebase'):
37040
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
530 if self.inmemory:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
531 newnode = commitmemorynode(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
532 repo,
37040
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
533 wctx=self.wctx,
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
534 extra=extra,
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
535 commitmsg=commitmsg,
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
536 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
537 user=ctx.user(),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
538 date=date,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
539 )
37040
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
540 mergemod.mergestate.clean(repo)
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
541 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
542 newnode = commitnode(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
543 repo,
37040
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
544 extra=extra,
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
545 commitmsg=commitmsg,
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
546 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
547 user=ctx.user(),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
548 date=date,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
549 )
37033
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37032
diff changeset
550
37040
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
551 return newnode
37033
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37032
diff changeset
552
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
553 def _rebasenode(self, tr, rev, allowdivergence, progressfn):
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
554 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
555 dest = self.destmap[rev]
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
556 ctx = repo[rev]
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
557 desc = _ctxdesc(ctx)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
558 if self.state[rev] == rev:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
559 ui.status(_(b'already rebased %s\n') % desc)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
560 elif (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
561 not allowdivergence
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
562 and rev in self.obsoletewithoutsuccessorindestination
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
563 ):
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
564 msg = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
565 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
566 b'note: not rebasing %s and its descendants as '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
567 b'this would cause divergence\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
568 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
569 % desc
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
570 )
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
571 repo.ui.status(msg)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
572 self.skipped.add(rev)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
573 elif rev in self.obsoletenotrebased:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
574 succ = self.obsoletenotrebased[rev]
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
575 if succ is None:
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43105
diff changeset
576 msg = _(b'note: not rebasing %s, it has no successor\n') % desc
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
577 else:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
578 succdesc = _ctxdesc(repo[succ])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
579 msg = _(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43105
diff changeset
580 b'note: not rebasing %s, already in destination as %s\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
581 ) % (desc, succdesc)
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
582 repo.ui.status(msg)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
583 # 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
584 self.skipped.add(rev)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
585 # 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
586 # This helps bookmark and working parent movement.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
587 dest = max(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
588 adjustdest(repo, rev, self.destmap, self.state, self.skipped)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
589 )
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
590 self.state[rev] = dest
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
591 elif self.state[rev] == revtodo:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
592 ui.status(_(b'rebasing %s\n') % desc)
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
593 progressfn(ctx)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
594 p1, p2, base = defineparents(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
595 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
596 rev,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
597 self.destmap,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
598 self.state,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
599 self.skipped,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
600 self.obsoletenotrebased,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
601 )
44346
b42ce825308e rebase: stop relying on having two parents to resume rebase
Martin von Zweigbergk <martinvonz@google.com>
parents: 44341
diff changeset
602 if self.resume and self.wctx.p1().rev() == p1:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
603 repo.ui.debug(b'resuming interrupted rebase\n')
44346
b42ce825308e rebase: stop relying on having two parents to resume rebase
Martin von Zweigbergk <martinvonz@google.com>
parents: 44341
diff changeset
604 self.resume = False
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
605 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
606 overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
607 with ui.configoverride(overrides, b'rebase'):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
608 stats = rebasenode(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
609 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
610 rev,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
611 p1,
44347
9c9cfecd4600 rebase: don't use rebased node as dirstate p2 (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 44346
diff changeset
612 p2,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
613 base,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
614 self.collapsef,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
615 dest,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
616 wctx=self.wctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
617 )
37125
6f570c501e3e merge: deprecate accessing update results by index
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37043
diff changeset
618 if stats.unresolvedcount > 0:
37027
81b35d275a60 rebase: get "inmemory" state directly from rebase runtime
Martin von Zweigbergk <martinvonz@google.com>
parents: 37025
diff changeset
619 if self.inmemory:
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
620 raise error.InMemoryMergeConflictsError()
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
621 else:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
622 raise error.InterventionRequired(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
623 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
624 b'unresolved conflicts (see hg '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
625 b'resolve, then hg rebase --continue)'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
626 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
627 )
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
628 if not self.collapsef:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
629 merging = p2 != nullrev
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
630 editform = cmdutil.mergeeditform(merging, b'rebase')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
631 editor = cmdutil.getcommiteditor(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
632 editform=editform, **pycompat.strkwargs(opts)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
633 )
44666
e7af56a0733e rebase: don't create merge when continuing rebase interrupted by old hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 44556
diff changeset
634 # We need to set parents again here just in case we're continuing
e7af56a0733e rebase: don't create merge when continuing rebase interrupted by old hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 44556
diff changeset
635 # a rebase started with an old hg version (before 9c9cfecd4600),
e7af56a0733e rebase: don't create merge when continuing rebase interrupted by old hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 44556
diff changeset
636 # because those old versions would have left us with two dirstate
e7af56a0733e rebase: don't create merge when continuing rebase interrupted by old hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 44556
diff changeset
637 # parents, and we don't want to create a merge commit here (unless
e7af56a0733e rebase: don't create merge when continuing rebase interrupted by old hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 44556
diff changeset
638 # we're rebasing a merge commit).
e7af56a0733e rebase: don't create merge when continuing rebase interrupted by old hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 44556
diff changeset
639 self.wctx.setparents(repo[p1].node(), repo[p2].node())
44349
cd43cae79f25 rebase: remove some now-unused parent arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 44348
diff changeset
640 newnode = self._concludenode(rev, p1, editor)
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
641 else:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
642 # Skip commit if we are collapsing
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
643 newnode = None
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
644 # Update the state
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
645 if newnode is not None:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
646 self.state[rev] = repo[newnode].rev()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
647 ui.debug(b'rebased as %s\n' % short(newnode))
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
648 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
649 if not self.collapsef:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
650 ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
651 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
652 b'note: not rebasing %s, its destination already '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
653 b'has all its changes\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
654 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
655 % desc
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
656 )
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
657 self.skipped.add(rev)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
658 self.state[rev] = p1
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
659 ui.debug(b'next revision set to %d\n' % p1)
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
660 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
661 ui.status(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
662 _(b'already rebased %s as %s\n') % (desc, repo[self.state[rev]])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
663 )
37032
98663bed146e rebase: store rebase state after each commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 37031
diff changeset
664 if not tr:
98663bed146e rebase: store rebase state after each commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 37031
diff changeset
665 # 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
666 # 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
667 # 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
668 # 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
669 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
670
38816
2b728789edfd rebase: move "backup" flag to rebaseruntime
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38799
diff changeset
671 def _finishrebase(self):
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
672 repo, ui, opts = self.repo, self.ui, self.opts
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
673 fm = ui.formatter(b'rebase', opts)
34883
c858afe9c59b rebase: add support to output nodechanges
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34872
diff changeset
674 fm.startitem()
36771
f7e3fe95b663 rebase: delete obsolete internal "keepopen" option
Martin von Zweigbergk <martinvonz@google.com>
parents: 36478
diff changeset
675 if self.collapsef:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
676 p1, p2, _base = defineparents(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
677 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
678 min(self.state),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
679 self.destmap,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
680 self.state,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
681 self.skipped,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
682 self.obsoletenotrebased,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
683 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
684 editopt = opts.get(b'edit')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
685 editform = b'rebase.collapse'
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
686 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
687 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
688 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
689 commitmsg = b'Collapsed revision'
33622
5a5f600b06ad rebase: sort collapsed revisions in commit message (issue5643)
Yuya Nishihara <yuya@tcha.org>
parents: 33590
diff changeset
690 for rebased in sorted(self.state):
33848
bc9e075133c9 rebase: remove "state >= revtodo" condition
Jun Wu <quark@fb.com>
parents: 33847
diff changeset
691 if rebased not in self.skipped:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
692 commitmsg += b'\n* %s' % repo[rebased].description()
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
693 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
694 editor = cmdutil.getcommiteditor(edit=editopt, editform=editform)
29552
db26925bdbb0 rebase: remove sortedstate-related confusion
Kostia Balytskyi <ikostia@fb.com>
parents: 29551
diff changeset
695 revtoreuse = max(self.state)
33619
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
696
44348
8082a77cc3a2 rebase: remove some redundant setting of dirstate parents
Martin von Zweigbergk <martinvonz@google.com>
parents: 44347
diff changeset
697 self.wctx.setparents(repo[p1].node(), repo[self.external].node())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
698 newnode = self._concludenode(
44349
cd43cae79f25 rebase: remove some now-unused parent arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 44348
diff changeset
699 revtoreuse, p1, editor, commitmsg=commitmsg
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
700 )
36928
9457c395fcbb rebase: fix issue 5494 also with --collapse
Martin von Zweigbergk <martinvonz@google.com>
parents: 36927
diff changeset
701
33864
70354bd4f19b rebase: only change self.state when collapsing in _finishrebase
Jun Wu <quark@fb.com>
parents: 33863
diff changeset
702 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
703 newrev = repo[newnode].rev()
36299
238646784294 py3: use default dict iterator instead of iterkeys
Augie Fackler <augie@google.com>
parents: 36271
diff changeset
704 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
705 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
706
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
707 if b'qtip' in repo.tags():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
708 updatemq(repo, self.state, self.skipped, **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
709
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
710 # 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
711 # (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
712 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
713 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
714 # 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
715 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
716 if newwd not in [c.rev() for c in repo[None].parents()]:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
717 ui.note(_(b"update back to initial working directory parent\n"))
38508
39db5a01cd53 cleanup: pass in overwrite flag to hg.updaterepo() as named argument
Yuya Nishihara <yuya@tcha.org>
parents: 38501
diff changeset
718 hg.updaterepo(repo, newwd, overwrite=False)
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
719
34354
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
720 collapsedas = None
36774
a835bf3fe40a rebase: collapse two nested if-conditions
Martin von Zweigbergk <martinvonz@google.com>
parents: 36773
diff changeset
721 if self.collapsef and not self.keepf:
a835bf3fe40a rebase: collapse two nested if-conditions
Martin von Zweigbergk <martinvonz@google.com>
parents: 36773
diff changeset
722 collapsedas = newnode
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
723 clearrebased(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
724 ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
725 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
726 self.destmap,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
727 self.state,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
728 self.skipped,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
729 collapsedas,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
730 self.keepf,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
731 fm=fm,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
732 backup=self.backupf,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
733 )
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
734
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
735 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
736 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
737
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
738 ui.note(_(b"rebase completed\n"))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
739 util.unlinkpath(repo.sjoin(b'undo'), ignoremissing=True)
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
740 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
741 skippedlen = len(self.skipped)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
742 ui.note(_(b"%d revisions have been skipped\n") % skippedlen)
34883
c858afe9c59b rebase: add support to output nodechanges
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34872
diff changeset
743 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
744
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
745 if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
746 self.activebookmark
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
747 and self.activebookmark in repo._bookmarks
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
748 and repo[b'.'].node() == repo._bookmarks[self.activebookmark]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
749 ):
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
750 bookmarks.activate(repo, self.activebookmark)
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
751
40857
2041991f1ce2 rebase: remove now-unnecessary arguments to _abort()
Martin von Zweigbergk <martinvonz@google.com>
parents: 40856
diff changeset
752 def _abort(self, backup=True, suppwarns=False):
2041991f1ce2 rebase: remove now-unnecessary arguments to _abort()
Martin von Zweigbergk <martinvonz@google.com>
parents: 40856
diff changeset
753 '''Restore the repository to its original state.'''
40856
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
754
40857
2041991f1ce2 rebase: remove now-unnecessary arguments to _abort()
Martin von Zweigbergk <martinvonz@google.com>
parents: 40856
diff changeset
755 repo = self.repo
40856
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
756 try:
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
757 # If the first commits in the rebased set get skipped during the
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
758 # rebase, their values within the state mapping will be the dest
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
759 # rev id. The rebased list must must not contain the dest rev
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
760 # (issue4896)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
761 rebased = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
762 s
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
763 for r, s in self.state.items()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
764 if s >= 0 and s != r and s != self.destmap[r]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
765 ]
40856
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
766 immutable = [d for d in rebased if not repo[d].mutable()]
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
767 cleanup = True
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
768 if immutable:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
769 repo.ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
770 _(b"warning: can't clean up public changesets %s\n")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
771 % b', '.join(bytes(repo[r]) for r in immutable),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
772 hint=_(b"see 'hg help phases' for details"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
773 )
40856
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
774 cleanup = False
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
775
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
776 descendants = set()
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
777 if rebased:
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
778 descendants = set(repo.changelog.descendants(rebased))
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
779 if descendants - set(rebased):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
780 repo.ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
781 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
782 b"warning: new changesets detected on "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
783 b"destination branch, can't strip\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
784 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
785 )
40856
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
786 cleanup = False
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
787
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
788 if cleanup:
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
789 if rebased:
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
790 strippoints = [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
791 c.node() for c in repo.set(b'roots(%ld)', rebased)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
792 ]
40856
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
793
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
794 updateifonnodes = set(rebased)
40857
2041991f1ce2 rebase: remove now-unnecessary arguments to _abort()
Martin von Zweigbergk <martinvonz@google.com>
parents: 40856
diff changeset
795 updateifonnodes.update(self.destmap.values())
2041991f1ce2 rebase: remove now-unnecessary arguments to _abort()
Martin von Zweigbergk <martinvonz@google.com>
parents: 40856
diff changeset
796 updateifonnodes.add(self.originalwd)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
797 shouldupdate = repo[b'.'].rev() in updateifonnodes
40856
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
798
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
799 # Update away from the rebase if necessary
44053
894c91c2e363 rebase: delete seemingly unnecessary needupdate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44051
diff changeset
800 if shouldupdate:
44270
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44239
diff changeset
801 mergemod.clean_update(repo[self.originalwd])
40856
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
802
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
803 # Strip from the first rebased revision
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
804 if rebased:
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
805 repair.strip(repo.ui, repo, strippoints, backup=backup)
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
806
40857
2041991f1ce2 rebase: remove now-unnecessary arguments to _abort()
Martin von Zweigbergk <martinvonz@google.com>
parents: 40856
diff changeset
807 if self.activebookmark and self.activebookmark in repo._bookmarks:
2041991f1ce2 rebase: remove now-unnecessary arguments to _abort()
Martin von Zweigbergk <martinvonz@google.com>
parents: 40856
diff changeset
808 bookmarks.activate(repo, self.activebookmark)
40856
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
809
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
810 finally:
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
811 clearstatus(repo)
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
812 clearcollapsemsg(repo)
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
813 if not suppwarns:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
814 repo.ui.warn(_(b'rebase aborted\n'))
40856
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
815 return 0
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
816
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
817
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
818 @command(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
819 b'rebase',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
820 [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
821 (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
822 b's',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
823 b'source',
44555
05654ea5137c rebase: accept multiple --source arguments (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 44554
diff changeset
824 [],
05654ea5137c rebase: accept multiple --source arguments (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 44554
diff changeset
825 _(b'rebase the specified changesets and their descendants'),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
826 _(b'REV'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
827 ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
828 (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
829 b'b',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
830 b'base',
44556
f63598aa1c4b rebase: accept multiple --base arguments (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 44555
diff changeset
831 [],
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
832 _(b'rebase everything from branching point of specified changeset'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
833 _(b'REV'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
834 ),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
835 (b'r', b'rev', [], _(b'rebase these revisions'), _(b'REV')),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
836 (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
837 b'd',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
838 b'dest',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
839 b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
840 _(b'rebase onto the specified changeset'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
841 _(b'REV'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
842 ),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
843 (b'', b'collapse', False, _(b'collapse the rebased changesets')),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
844 (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
845 b'm',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
846 b'message',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
847 b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
848 _(b'use text as collapse commit message'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
849 _(b'TEXT'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
850 ),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
851 (b'e', b'edit', False, _(b'invoke editor on commit messages')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
852 (
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
853 b'l',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
854 b'logfile',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
855 b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
856 _(b'read collapse commit message from file'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
857 _(b'FILE'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
858 ),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
859 (b'k', b'keep', False, _(b'keep original changesets')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
860 (b'', b'keepbranches', False, _(b'keep original branch names')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
861 (b'D', b'detach', False, _(b'(DEPRECATED)')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
862 (b'i', b'interactive', False, _(b'(DEPRECATED)')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
863 (b't', b'tool', b'', _(b'specify merge tool')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
864 (b'', b'stop', False, _(b'stop interrupted rebase')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
865 (b'c', b'continue', False, _(b'continue an interrupted rebase')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
866 (b'a', b'abort', False, _(b'abort an interrupted rebase')),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
867 (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
868 b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
869 b'auto-orphans',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
870 b'',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
871 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
872 b'automatically rebase orphan revisions '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
873 b'in the specified revset (EXPERIMENTAL)'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
874 ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
875 ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
876 ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
877 + cmdutil.dryrunopts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
878 + cmdutil.formatteropts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
879 + cmdutil.confirmopts,
44556
f63598aa1c4b rebase: accept multiple --base arguments (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 44555
diff changeset
880 _(b'[[-s REV]... | [-b REV]... | [-r REV]...] [-d REV] [OPTION]...'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
881 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
882 )
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
883 def rebase(ui, repo, **opts):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
884 """move changeset (and descendants) to a different branch
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
885
7999
b25110140573 rebase: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7955
diff changeset
886 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
887 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
888 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
889 development tree.
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
890
27454
3e3be524a712 rebase: simplify documentation about public commits
timeless <timeless@mozdev.org>
parents: 27344
diff changeset
891 Published commits cannot be rebased (see :hg:`help phases`).
3e3be524a712 rebase: simplify documentation about public commits
timeless <timeless@mozdev.org>
parents: 27344
diff changeset
892 To copy commits, see :hg:`help graft`.
18516
9fbeb61b8ad2 rebase: mention phases in the help
Kevin Bullock <kbullock@ringworld.org>
parents: 18514
diff changeset
893
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
894 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
895 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
896 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
897 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
898 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
899 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
900 descendants.)
10646
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
901
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
902 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
903
a9a047878e14 rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents: 27454
diff changeset
904 1. Explicitly select them using ``--rev``.
10646
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
905
27455
a9a047878e14 rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents: 27454
diff changeset
906 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
907 descendants.
27455
a9a047878e14 rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents: 27454
diff changeset
908
a9a047878e14 rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents: 27454
diff changeset
909 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
910 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
911
41796
25fc5b96d1c3 rebase: add missing dashes in help text
Manuel Jacob <me@manueljacob.de>
parents: 41206
diff changeset
912 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
913 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
914
35287
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
915 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
916 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
917 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
918 ``ALLSRC`` substituted by all source revisions.
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
919
27456
2337958596e3 rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents: 27455
diff changeset
920 Rebase will destroy original changesets unless you use ``--keep``.
2337958596e3 rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents: 27455
diff changeset
921 It will also move your bookmarks (even if you do).
2337958596e3 rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents: 27455
diff changeset
922
2337958596e3 rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents: 27455
diff changeset
923 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
924 (e.g. merges from the destination branch).
10646
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
925
27457
97cc045f1cfe rebase: simplify documentation about heads
timeless <timeless@mozdev.org>
parents: 27456
diff changeset
926 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
927 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
928 and/or destination.
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
929
28001
ade12bf2bf0e rebase: mention help merge-tools in help
timeless <timeless@mozdev.org>
parents: 27977
diff changeset
930 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
931 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
932 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
933 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
934
27458
d39e743e3578 rebase: mention conflict in documentation instead of merge
timeless <timeless@mozdev.org>
parents: 27457
diff changeset
935 If a rebase is interrupted to manually resolve a conflict, it can be
39095
571361e47137 rebase: include --stop option in documentation
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39094
diff changeset
936 continued with --continue/-c, aborted with --abort/-a, or stopped with
571361e47137 rebase: include --stop option in documentation
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39094
diff changeset
937 --stop.
11205
d26f662bfbf5 rebase: add error codes
Matt Mackall <mpm@selenic.com>
parents: 11204
diff changeset
938
22790
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
939 .. container:: verbose
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
940
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
941 Examples:
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
942
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
943 - move "local changes" (current commit back to branching point)
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
944 to the current branch tip after a pull::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
945
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
946 hg rebase
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
947
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
948 - move a single changeset to the stable branch::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
949
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
950 hg rebase -r 5f493448 -d stable
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
951
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
952 - 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
953
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
954 hg rebase --source c0c3 --dest 4cf9
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
955
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
956 - 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
957 default branch::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
958
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
959 hg rebase --base myfeature --dest default
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
960
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
961 - collapse a sequence of changes into a single commit::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
962
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
963 hg rebase --collapse -r 1520:1525 -d .
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
964
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
965 - move a named branch while preserving its name::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
966
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
967 hg rebase -r "branch(featureX)" -d 1.3 --keepbranches
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
968
35287
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
969 - stabilize orphaned changesets so history looks linear::
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
970
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
971 hg rebase -r 'orphan()-obsolete()'\
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
972 -d 'first(max((successors(max(roots(ALLSRC) & ::SRC)^)-obsolete())::) +\
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
973 max(::((roots(ALLSRC) & ::SRC)^)-obsolete()))'
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
974
31558
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
975 Configuration Options:
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
976
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
977 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
978 option::
31558
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
979
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
980 [commands]
32083
1c911adebf48 rebase: fix incorrect configuration example
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31733
diff changeset
981 rebase.requiredest = True
31558
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
982
33569
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
983 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
984 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
985 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
986 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
987 unexpectedly::
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
988
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
989 [rebase]
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
990 singletransaction = True
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
991
35388
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
992 By default, rebase writes to the working copy, but you can configure it to
42447
cda591d2bfe1 rebase: tweak description of inmemory working even w/ dirty working dir
Kyle Lippincott <spectral@google.com>
parents: 42299
diff changeset
993 run in-memory for better performance. When the rebase is not moving the
cda591d2bfe1 rebase: tweak description of inmemory working even w/ dirty working dir
Kyle Lippincott <spectral@google.com>
parents: 42299
diff changeset
994 parent(s) of the working copy (AKA the "currently checked out changesets"),
cda591d2bfe1 rebase: tweak description of inmemory working even w/ dirty working dir
Kyle Lippincott <spectral@google.com>
parents: 42299
diff changeset
995 this may also allow it to run even if the working copy is dirty::
35388
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
996
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
997 [rebase]
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
998 experimental.inmemory = True
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
999
31558
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
1000 Return Values:
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
1001
19971
2a9bb64faa0b rebase: add description about exit code when there are unresolved conflicts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19969
diff changeset
1002 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
1003 unresolved conflicts.
22790
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
1004
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1005 """
38501
53800d6eed26 rebase: convert opts dict to bytes at once
Yuya Nishihara <yuya@tcha.org>
parents: 38500
diff changeset
1006 opts = pycompat.byteskwargs(opts)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1007 inmemory = ui.configbool(b'rebase', b'experimental.inmemory')
43899
fff21278554b rebase: use cmdutil.check_at_most_one_arg() for action
Martin von Zweigbergk <martinvonz@google.com>
parents: 43874
diff changeset
1008 action = cmdutil.check_at_most_one_arg(opts, b'abort', b'stop', b'continue')
43927
905b21783968 rebase: use cmdutil.check_incompatible_arguments() for action+confirm/dryrun
Martin von Zweigbergk <martinvonz@google.com>
parents: 43926
diff changeset
1009 if action:
905b21783968 rebase: use cmdutil.check_incompatible_arguments() for action+confirm/dryrun
Martin von Zweigbergk <martinvonz@google.com>
parents: 43926
diff changeset
1010 cmdutil.check_incompatible_arguments(
44194
d4c1501225c4 cmdutil: change check_incompatible_arguments() *arg to single iterable
Martin von Zweigbergk <martinvonz@google.com>
parents: 44168
diff changeset
1011 opts, action, [b'confirm', b'dry_run']
43927
905b21783968 rebase: use cmdutil.check_incompatible_arguments() for action+confirm/dryrun
Martin von Zweigbergk <martinvonz@google.com>
parents: 43926
diff changeset
1012 )
43931
8c87cc169946 rebase: use cmdutil.check_at_most_one_arg() for action+revision
Martin von Zweigbergk <martinvonz@google.com>
parents: 43930
diff changeset
1013 cmdutil.check_incompatible_arguments(
44194
d4c1501225c4 cmdutil: change check_incompatible_arguments() *arg to single iterable
Martin von Zweigbergk <martinvonz@google.com>
parents: 44168
diff changeset
1014 opts, action, [b'rev', b'source', b'base', b'dest']
43931
8c87cc169946 rebase: use cmdutil.check_at_most_one_arg() for action+revision
Martin von Zweigbergk <martinvonz@google.com>
parents: 43930
diff changeset
1015 )
43926
daed70e95d60 rebase: use cmdutil.check_at_most_one_arg() for --confirm/--dry-run
Martin von Zweigbergk <martinvonz@google.com>
parents: 43899
diff changeset
1016 cmdutil.check_at_most_one_arg(opts, b'confirm', b'dry_run')
43929
08b8bf4a8516 rebase: use cmdutil.check_at_most_one_arg() for -b/-s/-r
Martin von Zweigbergk <martinvonz@google.com>
parents: 43928
diff changeset
1017 cmdutil.check_at_most_one_arg(opts, b'rev', b'source', b'base')
38372
f4f1fb1cbfb4 rebase: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38239
diff changeset
1018
39101
18cbe2d872d3 rebase: turn off inmemory flag on --stop
Yuya Nishihara <yuya@tcha.org>
parents: 39100
diff changeset
1019 if action or 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
1020 # 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
1021 # (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
1022 # fail the entire transaction.)
35388
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
1023 inmemory = False
35320
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
1024
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1025 if opts.get(b'auto_orphans'):
43930
412f199b4092 rebase: use cmdutil.check_incompatible_arguments() for --auto-orphans
Martin von Zweigbergk <martinvonz@google.com>
parents: 43929
diff changeset
1026 disallowed_opts = set(opts) - {b'auto_orphans'}
412f199b4092 rebase: use cmdutil.check_incompatible_arguments() for --auto-orphans
Martin von Zweigbergk <martinvonz@google.com>
parents: 43929
diff changeset
1027 cmdutil.check_incompatible_arguments(
44194
d4c1501225c4 cmdutil: change check_incompatible_arguments() *arg to single iterable
Martin von Zweigbergk <martinvonz@google.com>
parents: 44168
diff changeset
1028 opts, b'auto_orphans', disallowed_opts
43930
412f199b4092 rebase: use cmdutil.check_incompatible_arguments() for --auto-orphans
Martin von Zweigbergk <martinvonz@google.com>
parents: 43929
diff changeset
1029 )
412f199b4092 rebase: use cmdutil.check_incompatible_arguments() for --auto-orphans
Martin von Zweigbergk <martinvonz@google.com>
parents: 43929
diff changeset
1030
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1031 userrevs = list(repo.revs(opts.get(b'auto_orphans')))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1032 opts[b'rev'] = [revsetlang.formatspec(b'%ld and orphan()', userrevs)]
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1033 opts[b'dest'] = b'_destautoorphanrebase(SRC)'
37787
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
1034
43928
0b769e1cbe89 rebase: inline single-use `dryrun` and `confirm` variables
Martin von Zweigbergk <martinvonz@google.com>
parents: 43927
diff changeset
1035 if opts.get(b'dry_run') or opts.get(b'confirm'):
39100
e9e742bd0501 rebase: use action variable to select things to do
Yuya Nishihara <yuya@tcha.org>
parents: 39099
diff changeset
1036 return _dryrunrebase(ui, repo, action, opts)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1037 elif action == b'stop':
39093
cc37009e95ca rebase: add --stop option to stop rebase at any point (issue5206)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38816
diff changeset
1038 rbsrt = rebaseruntime(repo, ui)
cc37009e95ca rebase: add --stop option to stop rebase at any point (issue5206)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38816
diff changeset
1039 with repo.wlock(), repo.lock():
39116
ffb34ee6de9e rebase: cover restorestatus() by lock to prevent it from being updated
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39101
diff changeset
1040 rbsrt.restorestatus()
ffb34ee6de9e rebase: cover restorestatus() by lock to prevent it from being updated
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39101
diff changeset
1041 if rbsrt.collapsef:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1042 raise error.Abort(_(b"cannot stop in --collapse session"))
39116
ffb34ee6de9e rebase: cover restorestatus() by lock to prevent it from being updated
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39101
diff changeset
1043 allowunstable = obsolete.isenabled(repo, obsolete.allowunstableopt)
ffb34ee6de9e rebase: cover restorestatus() by lock to prevent it from being updated
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39101
diff changeset
1044 if not (rbsrt.keepf or allowunstable):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1045 raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1046 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1047 b"cannot remove original changesets with"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1048 b" unrebased descendants"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1049 ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1050 hint=_(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1051 b'either enable obsmarkers to allow unstable '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1052 b'revisions or use --keep to keep original '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1053 b'changesets'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1054 ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1055 )
44053
894c91c2e363 rebase: delete seemingly unnecessary needupdate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44051
diff changeset
1056 # update to the current working revision
894c91c2e363 rebase: delete seemingly unnecessary needupdate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44051
diff changeset
1057 # to clear interrupted merge
894c91c2e363 rebase: delete seemingly unnecessary needupdate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44051
diff changeset
1058 hg.updaterepo(repo, rbsrt.originalwd, overwrite=True)
39093
cc37009e95ca rebase: add --stop option to stop rebase at any point (issue5206)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38816
diff changeset
1059 rbsrt._finishrebase()
cc37009e95ca rebase: add --stop option to stop rebase at any point (issue5206)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38816
diff changeset
1060 return 0
38372
f4f1fb1cbfb4 rebase: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38239
diff changeset
1061 elif inmemory:
35320
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
1062 try:
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
1063 # 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
1064 # and re-run as an on-disk merge.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1065 overrides = {(b'rebase', b'singletransaction'): True}
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1066 with ui.configoverride(overrides, b'rebase'):
39100
e9e742bd0501 rebase: use action variable to select things to do
Yuya Nishihara <yuya@tcha.org>
parents: 39099
diff changeset
1067 return _dorebase(ui, repo, action, opts, inmemory=inmemory)
35320
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
1068 except error.InMemoryMergeConflictsError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1069 ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1070 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1071 b'hit merge conflicts; re-running rebase without in-memory'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1072 b' merge\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1073 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1074 )
40790
f07d4f94f098 rebase: preserve working copy when redoing in-mem rebase on disk
Martin von Zweigbergk <martinvonz@google.com>
parents: 40366
diff changeset
1075 # TODO: Make in-memory merge not use the on-disk merge state, so
f07d4f94f098 rebase: preserve working copy when redoing in-mem rebase on disk
Martin von Zweigbergk <martinvonz@google.com>
parents: 40366
diff changeset
1076 # we don't have to clean it here
f07d4f94f098 rebase: preserve working copy when redoing in-mem rebase on disk
Martin von Zweigbergk <martinvonz@google.com>
parents: 40366
diff changeset
1077 mergemod.mergestate.clean(repo)
f07d4f94f098 rebase: preserve working copy when redoing in-mem rebase on disk
Martin von Zweigbergk <martinvonz@google.com>
parents: 40366
diff changeset
1078 clearstatus(repo)
f07d4f94f098 rebase: preserve working copy when redoing in-mem rebase on disk
Martin von Zweigbergk <martinvonz@google.com>
parents: 40366
diff changeset
1079 clearcollapsemsg(repo)
39100
e9e742bd0501 rebase: use action variable to select things to do
Yuya Nishihara <yuya@tcha.org>
parents: 39099
diff changeset
1080 return _dorebase(ui, repo, action, opts, inmemory=False)
35320
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
1081 else:
39100
e9e742bd0501 rebase: use action variable to select things to do
Yuya Nishihara <yuya@tcha.org>
parents: 39099
diff changeset
1082 return _dorebase(ui, repo, action, opts)
35320
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
1083
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1084
39100
e9e742bd0501 rebase: use action variable to select things to do
Yuya Nishihara <yuya@tcha.org>
parents: 39099
diff changeset
1085 def _dryrunrebase(ui, repo, action, opts):
38501
53800d6eed26 rebase: convert opts dict to bytes at once
Yuya Nishihara <yuya@tcha.org>
parents: 38500
diff changeset
1086 rbsrt = rebaseruntime(repo, ui, inmemory=True, opts=opts)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1087 confirm = opts.get(b'confirm')
38667
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
1088 if confirm:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1089 ui.status(_(b'starting in-memory rebase\n'))
38667
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
1090 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1091 ui.status(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43105
diff changeset
1092 _(b'starting dry-run rebase; repository will not be changed\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1093 )
38496
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38495
diff changeset
1094 with repo.wlock(), repo.lock():
38667
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
1095 needsabort = True
38496
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38495
diff changeset
1096 try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1097 overrides = {(b'rebase', b'singletransaction'): True}
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1098 with ui.configoverride(overrides, b'rebase'):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1099 _origrebase(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1100 ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1101 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1102 action,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1103 opts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1104 rbsrt,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1105 inmemory=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1106 leaveunfinished=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1107 )
38496
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38495
diff changeset
1108 except error.InMemoryMergeConflictsError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1109 ui.status(_(b'hit a merge conflict\n'))
38496
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38495
diff changeset
1110 return 1
42108
1b5cec8b6a1e rebase: fix bug that prevented dry-run rebases from printing failures
Augie Fackler <augie@google.com>
parents: 42057
diff changeset
1111 except error.Abort:
1b5cec8b6a1e rebase: fix bug that prevented dry-run rebases from printing failures
Augie Fackler <augie@google.com>
parents: 42057
diff changeset
1112 needsabort = False
1b5cec8b6a1e rebase: fix bug that prevented dry-run rebases from printing failures
Augie Fackler <augie@google.com>
parents: 42057
diff changeset
1113 raise
38496
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38495
diff changeset
1114 else:
38667
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
1115 if confirm:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1116 ui.status(_(b'rebase completed successfully\n'))
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43105
diff changeset
1117 if not ui.promptchoice(_(b'apply changes (yn)?$$ &Yes $$ &No')):
38667
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
1118 # finish unfinished rebase
38816
2b728789edfd rebase: move "backup" flag to rebaseruntime
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38799
diff changeset
1119 rbsrt._finishrebase()
38667
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
1120 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1121 rbsrt._prepareabortorcontinue(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1122 isabort=True, backup=False, suppwarns=True
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1123 )
38667
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
1124 needsabort = False
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
1125 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1126 ui.status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1127 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1128 b'dry-run rebase completed successfully; run without'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1129 b' -n/--dry-run to perform this rebase\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1130 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1131 )
38496
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38495
diff changeset
1132 return 0
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38495
diff changeset
1133 finally:
38667
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
1134 if needsabort:
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
1135 # no need to store backup in case of dryrun
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1136 rbsrt._prepareabortorcontinue(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1137 isabort=True, backup=False, suppwarns=True
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1138 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1139
38496
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38495
diff changeset
1140
39100
e9e742bd0501 rebase: use action variable to select things to do
Yuya Nishihara <yuya@tcha.org>
parents: 39099
diff changeset
1141 def _dorebase(ui, repo, action, opts, inmemory=False):
38501
53800d6eed26 rebase: convert opts dict to bytes at once
Yuya Nishihara <yuya@tcha.org>
parents: 38500
diff changeset
1142 rbsrt = rebaseruntime(repo, ui, inmemory, opts)
39100
e9e742bd0501 rebase: use action variable to select things to do
Yuya Nishihara <yuya@tcha.org>
parents: 39099
diff changeset
1143 return _origrebase(ui, repo, action, opts, rbsrt, inmemory=inmemory)
38497
9c3b48fb7ac5 rebase: split _origrebase() for conveniece in dryrun
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38496
diff changeset
1144
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1145
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1146 def _origrebase(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1147 ui, repo, action, opts, rbsrt, inmemory=False, leaveunfinished=False
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1148 ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1149 assert action != b'stop'
32917
070920db8b87 rebase: use context manager for locking in rebase()
Martin von Zweigbergk <martinvonz@google.com>
parents: 32900
diff changeset
1150 with repo.wlock(), repo.lock():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1151 if opts.get(b'interactive'):
26496
b885ab9ca182 rebase: enable histedit for useful help with it
timeless@mozdev.org
parents: 26495
diff changeset
1152 try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1153 if extensions.find(b'histedit'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1154 enablehistedit = b''
26496
b885ab9ca182 rebase: enable histedit for useful help with it
timeless@mozdev.org
parents: 26495
diff changeset
1155 except KeyError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1156 enablehistedit = b" --config extensions.histedit="
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1157 help = b"hg%s help -e histedit" % enablehistedit
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1158 msg = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1159 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1160 b"interactive history editing is supported by the "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1161 b"'histedit' extension (see \"%s\")"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1162 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1163 % help
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1164 )
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26496
diff changeset
1165 raise error.Abort(msg)
22382
d5b04ee8ecf7 rebase: add a deprecated -i/--interactive flag
David Soria Parra <davidsp@fb.com>
parents: 22251
diff changeset
1166
29400
c79da70a4659 rebase: move collapse-related local variables to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29399
diff changeset
1167 if rbsrt.collapsemsg and not rbsrt.collapsef:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1168 raise error.Abort(_(b'message can only be specified with collapse'))
13661
ee349e228835 rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents: 13609
diff changeset
1169
39100
e9e742bd0501 rebase: use action variable to select things to do
Yuya Nishihara <yuya@tcha.org>
parents: 39099
diff changeset
1170 if action:
29400
c79da70a4659 rebase: move collapse-related local variables to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29399
diff changeset
1171 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
1172 raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1173 _(b'cannot use collapse with continue or abort')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1174 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1175 if action == b'abort' and opts.get(b'tool', False):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1176 ui.warn(_(b'tool option will be ignored\n'))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1177 if action == b'continue':
30273
86f4ef63d507 rebase: check for conflicts before continuing
timeless <timeless@mozdev.org>
parents: 30271
diff changeset
1178 ms = mergemod.mergestate.read(repo)
30495
d528ddc11b33 rebase: refer to checkunresolved by its new name
Augie Fackler <augie@google.com>
parents: 30490
diff changeset
1179 mergeutil.checkunresolved(ms)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1180
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1181 retcode = rbsrt._prepareabortorcontinue(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1182 isabort=(action == b'abort')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1183 )
29472
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
1184 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
1185 return retcode
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1186 else:
43932
9fb9f3a5cad7 rebase: inline single-use variables passed to _definedestmap()
Martin von Zweigbergk <martinvonz@google.com>
parents: 43931
diff changeset
1187 # search default destination in this space
9fb9f3a5cad7 rebase: inline single-use variables passed to _definedestmap()
Martin von Zweigbergk <martinvonz@google.com>
parents: 43931
diff changeset
1188 # used in the 'hg pull --rebase' case, see issue 5214.
9fb9f3a5cad7 rebase: inline single-use variables passed to _definedestmap()
Martin von Zweigbergk <martinvonz@google.com>
parents: 43931
diff changeset
1189 destspace = opts.get(b'_destspace')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1190 destmap = _definedestmap(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1191 ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1192 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1193 inmemory,
43932
9fb9f3a5cad7 rebase: inline single-use variables passed to _definedestmap()
Martin von Zweigbergk <martinvonz@google.com>
parents: 43931
diff changeset
1194 opts.get(b'dest', None),
44555
05654ea5137c rebase: accept multiple --source arguments (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 44554
diff changeset
1195 opts.get(b'source', []),
44556
f63598aa1c4b rebase: accept multiple --base arguments (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 44555
diff changeset
1196 opts.get(b'base', []),
43932
9fb9f3a5cad7 rebase: inline single-use variables passed to _definedestmap()
Martin von Zweigbergk <martinvonz@google.com>
parents: 43931
diff changeset
1197 opts.get(b'rev', []),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1198 destspace=destspace,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1199 )
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1200 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
1201 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
1202 return retcode
36775
6dab3bdb1f00 rebase: only store collapse message once
Martin von Zweigbergk <martinvonz@google.com>
parents: 36774
diff changeset
1203 storecollapsemsg(repo, rbsrt.collapsemsg)
21027
25ee5dbebc6b rebase: tell when reopening a closed branch head
Mads Kiilerich <madski@unity3d.com>
parents: 20790
diff changeset
1204
33569
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
1205 tr = None
33619
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
1206
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1207 singletr = ui.configbool(b'rebase', b'singletransaction')
33619
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
1208 if singletr:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1209 tr = repo.transaction(b'rebase')
35480
01b084914a60 rebase: don't take out a dirstate guard for in-memory rebase
Phil Cohen <phillco@fb.com>
parents: 35434
diff changeset
1210
01b084914a60 rebase: don't take out a dirstate guard for in-memory rebase
Phil Cohen <phillco@fb.com>
parents: 35434
diff changeset
1211 # 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
1212 # 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
1213 # 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
1214 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
1215 # 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
1216 # 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
1217 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
1218 if singletr and not inmemory:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1219 dsguard = dirstateguard.dirstateguard(repo, b'rebase')
33619
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
1220 with util.acceptintervention(dsguard):
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
1221 rbsrt._performrebase(tr)
38372
f4f1fb1cbfb4 rebase: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38239
diff changeset
1222 if not leaveunfinished:
38816
2b728789edfd rebase: move "backup" flag to rebaseruntime
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38799
diff changeset
1223 rbsrt._finishrebase()
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1224
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1225
44553
dc25de8117e4 rebase: remove unused defaults argument values from _definedestmap()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44452
diff changeset
1226 def _definedestmap(ui, repo, inmemory, destf, srcf, basef, revf, destspace):
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1227 """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
1228 if revf is None:
406705701c2d rebase: explicitly tests for None
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31395
diff changeset
1229 revf = []
31395
361bccce566a rebase: don't use mutable default argument value
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31380
diff changeset
1230
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
1231 # 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
1232 # 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
1233
43591
b56c6647f65e rebase: check for unfinished ops even when inmemory (issue6214)
Kyle Lippincott <spectral@google.com>
parents: 43567
diff changeset
1234 cmdutil.checkunfinished(repo)
37025
0782ac132a41 rebase: pass "inmemory" directly to _definedestmap()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37021
diff changeset
1235 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
1236 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
1237
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1238 if ui.configbool(b'commands', b'rebase.requiredest') and not destf:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1239 raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1240 _(b'you must specify a destination'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1241 hint=_(b'use: hg rebase -d REV'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1242 )
31731
b5afec71c1f9 rebase: allow destination-free continue and abort (issue5513)
Ryan McElroy <rmcelroy@fb.com>
parents: 31621
diff changeset
1243
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1244 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
1245
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
1246 if revf:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
1247 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
1248 if not rebaseset:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1249 ui.status(_(b'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
1250 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
1251 elif srcf:
44555
05654ea5137c rebase: accept multiple --source arguments (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 44554
diff changeset
1252 src = scmutil.revrange(repo, srcf)
28136
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
1253 if not src:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1254 ui.status(_(b'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
1255 return None
44555
05654ea5137c rebase: accept multiple --source arguments (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 44554
diff changeset
1256 # `+ (%ld)` to work around `wdir()::` being empty
05654ea5137c rebase: accept multiple --source arguments (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 44554
diff changeset
1257 rebaseset = repo.revs(b'(%ld):: + (%ld)', src, src)
28136
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
1258 else:
44556
f63598aa1c4b rebase: accept multiple --base arguments (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 44555
diff changeset
1259 base = scmutil.revrange(repo, basef or [b'.'])
28136
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
1260 if not base:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1261 ui.status(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1262 _(b'empty "base" revision set - ' b"can't compute rebase set\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1263 )
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1264 return None
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1265 if destf:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1266 # --base does not support multiple destinations
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1267 dest = scmutil.revsingle(repo, destf)
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1268 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
1269 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
1270 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
1271
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1272 roots = [] # selected children of branching points
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1273 bpbase = {} # {branchingpoint: [origbase]}
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1274 for b in base: # group bases by branching points
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1275 bp = repo.revs(b'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
1276 bpbase[bp] = bpbase.get(bp, []) + [b]
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
1277 if None in bpbase:
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
1278 # 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
1279 # 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
1280 bpbase.clear()
43105
649d3ac37a12 py3: define and use pycompat.iteritems() for hgext/
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43104
diff changeset
1281 for bp, bs in pycompat.iteritems(bpbase): # calculate roots
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1282 roots += list(repo.revs(b'children(%d) & ancestors(%ld)', bp, bs))
30580
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
1283
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1284 rebaseset = repo.revs(b'%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
1285
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
1286 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
1287 # 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
1288 # 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
1289 # smartset.
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
1290 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
1291 if basef:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1292 ui.status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1293 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1294 b'nothing to rebase - %s is both "base"'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1295 b' and destination\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1296 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1297 % dest
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1298 )
28136
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
1299 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1300 ui.status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1301 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1302 b'nothing to rebase - working directory '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1303 b'parent is also destination\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1304 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1305 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1306 elif not repo.revs(b'%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
1307 if basef:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1308 ui.status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1309 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1310 b'nothing to rebase - "base" %s is '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1311 b'already an ancestor of destination '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1312 b'%s\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1313 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1314 % (b'+'.join(bytes(repo[r]) for r in base), dest)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1315 )
28136
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
1316 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1317 ui.status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1318 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1319 b'nothing to rebase - working '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1320 b'directory parent is already an '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1321 b'ancestor of destination %s\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1322 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1323 % dest
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1324 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1325 else: # can it happen?
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1326 ui.status(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1327 _(b'nothing to rebase from %s to %s\n')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1328 % (b'+'.join(bytes(repo[r]) for r in base), dest)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1329 )
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1330 return None
36975
795eb53f1d3e rebase: allow in-memory merge of the working copy parent
Martin von Zweigbergk <martinvonz@google.com>
parents: 36960
diff changeset
1331
44239
830eae18b2f3 rebase: abort if the user tries to rebase the working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 44214
diff changeset
1332 if nodemod.wdirrev in rebaseset:
830eae18b2f3 rebase: abort if the user tries to rebase the working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 44214
diff changeset
1333 raise error.Abort(_(b'cannot rebase the working copy'))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1334 rebasingwcp = repo[b'.'].rev() in rebaseset
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1335 ui.log(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1336 b"rebase",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1337 b"rebasing working copy parent: %r\n",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1338 rebasingwcp,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1339 rebase_rebasing_wcp=rebasingwcp,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1340 )
37025
0782ac132a41 rebase: pass "inmemory" directly to _definedestmap()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37021
diff changeset
1341 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
1342 # 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
1343 cmdutil.checkunfinished(repo)
03bec089e105 rebase: disable `inmemory` if the rebaseset contains the working copy
Phil Cohen <phillco@fb.com>
parents: 35320
diff changeset
1344 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
1345
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
1346 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
1347 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
1348 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
1349
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1350 allsrc = revsetlang.formatspec(b'%ld', rebaseset)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1351 alias = {b'ALLSRC': allsrc}
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1352
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1353 if dest is None:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1354 try:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1355 # 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
1356 dest = scmutil.revsingle(repo, destf, localalias=alias)
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1357 except error.RepoLookupError:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1358 # 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
1359 destmap = {}
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1360 for r in rebaseset:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1361 alias[b'SRC'] = revsetlang.formatspec(b'%d', r)
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1362 # 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
1363 # 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
1364 destset = repo.anyrevs([destf], user=True, localalias=alias)
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1365 size = len(destset)
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1366 if size == 1:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1367 destmap[r] = destset.first()
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1368 elif size == 0:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1369 ui.note(_(b'skipping %s - empty destination\n') % repo[r])
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1370 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1371 raise error.Abort(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43105
diff changeset
1372 _(b'rebase destination for %s is not unique') % repo[r]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1373 )
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1374
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1375 if dest is not None:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1376 # 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
1377 destrev = dest.rev()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1378 destmap = {r: destrev for r in rebaseset} # {srcrev: destrev}
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1379
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1380 if not destmap:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1381 ui.status(_(b'nothing to rebase - empty destination\n'))
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1382 return None
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1383
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1384 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
1385
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1386
32248
b47e6b0ba6ca rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents: 32175
diff changeset
1387 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
1388 """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
1389 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
1390 Abort if there is more than one parent.
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
1391 """
19955
2160c2e0d7d1 rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents: 19951
diff changeset
1392 parents = set()
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
1393 source = min(state)
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
1394 for rev in state:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
1395 if rev == source:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
1396 continue
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
1397 for p in repo[rev].parents():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1398 if p.rev() not in state 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
1399 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
1400 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
1401 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
1402 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
1403 return parents.pop()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1404 raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1405 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1406 b'unable to collapse on top of %d, there is more '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1407 b'than one external parent: %s'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1408 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1409 % (max(destancestors), b', '.join(b"%d" % p for p in sorted(parents)))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1410 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1411
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
1412
44349
cd43cae79f25 rebase: remove some now-unused parent arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 44348
diff changeset
1413 def commitmemorynode(repo, 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
1414 '''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
1415 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
1416 # Replicates the empty check in ``repo.commit``.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1417 if wctx.isempty() and not repo.ui.configbool(b'ui', b'allowemptycommit'):
37040
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
1418 return None
35319
228916ca12b5 rebase: add concludememorynode(), and call it when rebasing in-memory
Phil Cohen <phillco@fb.com>
parents: 35318
diff changeset
1419
37040
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
1420 # 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
1421 # ``branch`` (used when passing ``--keepbranches``).
44050
2ecbc4ec87d8 overlayworkingctx: default branch to base context's branch
Martin von Zweigbergk <martinvonz@google.com>
parents: 43978
diff changeset
1422 branch = None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1423 if b'branch' in extra:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1424 branch = extra[b'branch']
35319
228916ca12b5 rebase: add concludememorynode(), and call it when rebasing in-memory
Phil Cohen <phillco@fb.com>
parents: 35318
diff changeset
1425
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1426 memctx = wctx.tomemctx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1427 commitmsg,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1428 date=date,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1429 extra=extra,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1430 user=user,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1431 branch=branch,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1432 editor=editor,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1433 )
37040
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
1434 commitres = repo.commitctx(memctx)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1435 wctx.clean() # Might be reused
37040
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
1436 return commitres
35319
228916ca12b5 rebase: add concludememorynode(), and call it when rebasing in-memory
Phil Cohen <phillco@fb.com>
parents: 35318
diff changeset
1437
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1438
44349
cd43cae79f25 rebase: remove some now-unused parent arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 44348
diff changeset
1439 def commitnode(repo, 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
1440 '''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
1441 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
1442 dsguard = util.nullcontextmanager()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1443 if not repo.ui.configbool(b'rebase', b'singletransaction'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1444 dsguard = dirstateguard.dirstateguard(repo, b'rebase')
33619
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
1445 with dsguard:
37040
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
1446 # Commit might fail if unresolved files exist
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1447 newnode = repo.commit(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1448 text=commitmsg, user=user, date=date, extra=extra, editor=editor
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1449 )
22038
021becbf024a rebase: do not retract phase boundary by hand
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22004
diff changeset
1450
33120
b63351f6a246 rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32084
diff changeset
1451 repo.dirstate.setbranch(repo[newnode].branch())
b63351f6a246 rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32084
diff changeset
1452 return newnode
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1453
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1454
44347
9c9cfecd4600 rebase: don't use rebased node as dirstate p2 (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 44346
diff changeset
1455 def rebasenode(repo, rev, p1, p2, base, collapse, dest, wctx):
43787
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43591
diff changeset
1456 """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
1457 # Merge phase
32248
b47e6b0ba6ca rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents: 32175
diff changeset
1458 # Update to destination and merge it with local
44094
521b4e3a42d7 rebase: extract a variable for a repeated `repo[p1]`
Martin von Zweigbergk <martinvonz@google.com>
parents: 44092
diff changeset
1459 p1ctx = repo[p1]
35317
5c25fe7fb1e6 rebase: do not update if IMM; instead, set the overlaywctx's parents
Phil Cohen <phillco@fb.com>
parents: 35316
diff changeset
1460 if wctx.isinmemory():
44094
521b4e3a42d7 rebase: extract a variable for a repeated `repo[p1]`
Martin von Zweigbergk <martinvonz@google.com>
parents: 44092
diff changeset
1461 wctx.setbase(p1ctx)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1462 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1463 if repo[b'.'].rev() != p1:
44094
521b4e3a42d7 rebase: extract a variable for a repeated `repo[p1]`
Martin von Zweigbergk <martinvonz@google.com>
parents: 44092
diff changeset
1464 repo.ui.debug(b" update to %d:%s\n" % (p1, p1ctx))
44270
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44239
diff changeset
1465 mergemod.clean_update(p1ctx)
35317
5c25fe7fb1e6 rebase: do not update if IMM; instead, set the overlaywctx's parents
Phil Cohen <phillco@fb.com>
parents: 35316
diff changeset
1466 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1467 repo.ui.debug(b" already in destination\n")
35410
83014fa95435 rebase: fix for hgsubversion
Phil Cohen <phillco@fb.com>
parents: 35388
diff changeset
1468 # This is, alas, necessary to invalidate workingctx's manifest cache,
83014fa95435 rebase: fix for hgsubversion
Phil Cohen <phillco@fb.com>
parents: 35388
diff changeset
1469 # 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
1470 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
1471 repo.dirstate.write(repo.currenttransaction())
44090
2f0a44c69e07 copies: replace duplicatecopies() by function that takes contexts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44053
diff changeset
1472 ctx = repo[rev]
2f0a44c69e07 copies: replace duplicatecopies() by function that takes contexts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44053
diff changeset
1473 repo.ui.debug(b" merge against %d:%s\n" % (rev, ctx))
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
1474 if base is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1475 repo.ui.debug(b" detach base %d:%s\n" % (base, repo[base]))
44095
e733c59f3c09 rebase: fix bug where `--collapse` would apply diff on missing file
Martin von Zweigbergk <martinvonz@google.com>
parents: 44094
diff changeset
1476
e733c59f3c09 rebase: fix bug where `--collapse` would apply diff on missing file
Martin von Zweigbergk <martinvonz@google.com>
parents: 44094
diff changeset
1477 # See explanation in merge.graft()
e733c59f3c09 rebase: fix bug where `--collapse` would apply diff on missing file
Martin von Zweigbergk <martinvonz@google.com>
parents: 44094
diff changeset
1478 mergeancestor = repo.changelog.isancestor(p1ctx.node(), ctx.node())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1479 stats = mergemod.update(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1480 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1481 rev,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1482 branchmerge=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1483 force=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1484 ancestor=base,
44095
e733c59f3c09 rebase: fix bug where `--collapse` would apply diff on missing file
Martin von Zweigbergk <martinvonz@google.com>
parents: 44094
diff changeset
1485 mergeancestor=mergeancestor,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1486 labels=[b'dest', b'source'],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1487 wc=wctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1488 )
44347
9c9cfecd4600 rebase: don't use rebased node as dirstate p2 (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 44346
diff changeset
1489 wctx.setparents(p1ctx.node(), repo[p2].node())
22905
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
1490 if collapse:
44092
833210fbd900 graftcopies: remove `skip` and `repo` arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 44090
diff changeset
1491 copies.graftcopies(wctx, ctx, repo[dest])
22905
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
1492 else:
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
1493 # 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
1494 # duplicate copies between the revision we're
44092
833210fbd900 graftcopies: remove `skip` and `repo` arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 44090
diff changeset
1495 # rebasing and its first parent.
833210fbd900 graftcopies: remove `skip` and `repo` arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 44090
diff changeset
1496 copies.graftcopies(wctx, ctx, ctx.p1())
22905
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
1497 return stats
6923
ebf1462f2145 strip trailing whitespace, replace tabs by spaces
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6906
diff changeset
1498
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1499
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
1500 def adjustdest(repo, rev, destmap, state, skipped):
41533
0f64091cc851 global: make some docstrings raw strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41365
diff changeset
1501 r"""adjust rebase destination given the current rebase state
33590
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1502
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1503 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
1504 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
1505 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
1506
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1507 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
1508 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
1509
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1510 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
1511 |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1512 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
1513 |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1514 | 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
1515 | |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1516 | 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
1517 | |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1518 | 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
1519 | |
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1520 | 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
1521 | |
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1522 | B <- rebased as B1 C'
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1523 |/ |
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
1524 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
1525
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1526 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
1527 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
1528 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
1529
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1530 H C1 G1
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1531 /| | /
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1532 F G |/
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1533 K | | -> K
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1534 | C D |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1535 | |/ |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1536 | B | ...
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1537 |/ |/
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1538 A A
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1539
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1540 Besides, adjust dest according to existing rebase information. For example,
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1541
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1542 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
1543 \|/ of D. We will rebase C first.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1544 A
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1545
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1546 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
1547 | instead of the original C.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1548 B D
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1549 \ /
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1550 A
33590
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1551 """
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1552 # 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
1553 dest = destmap[rev]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1554 source = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1555 s
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1556 for s, d in state.items()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1557 if d > 0 and destmap[s] == dest and s not in skipped
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1558 ]
33849
3ae2eaecb49e rebase: optimize "source" calculation in adjustdest
Jun Wu <quark@fb.com>
parents: 33848
diff changeset
1559
33590
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1560 result = []
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1561 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
1562 adjusted = dest
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1563 if prev != nullrev:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1564 candidate = repo.revs(b'max(%ld and (::%d))', source, prev).first()
33590
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1565 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
1566 adjusted = state[candidate]
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1567 if adjusted == dest and dest in state:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1568 adjusted = state[dest]
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1569 if adjusted == revtodo:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1570 # sortsource should produce an order that makes this impossible
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1571 raise error.ProgrammingError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1572 b'rev %d should be rebased already at this time' % dest
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1573 )
33590
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1574 result.append(adjusted)
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1575 return result
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
1576
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1577
33846
3b04a6ff625c rebase: remove rebaseset from _checkobsrebase
Jun Wu <quark@fb.com>
parents: 33845
diff changeset
1578 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
1579 """
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1580 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
1581
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1582 `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
1583 `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
1584 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
1585 """
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1586 # Obsolete node with successors not in dest leads to divergence
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1587 divergenceok = ui.configbool(b'experimental', b'evolution.allowdivergence')
28685
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1588 divergencebasecandidates = rebaseobsrevs - rebaseobsskipped
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1589
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1590 if divergencebasecandidates and not divergenceok:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1591 divhashes = (bytes(repo[r]) for r in divergencebasecandidates)
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43105
diff changeset
1592 msg = _(b"this rebase will cause divergences from: %s")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1593 h = _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1594 b"to force the rebase please set "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1595 b"experimental.evolution.allowdivergence=True"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1596 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1597 raise error.Abort(msg % (b",".join(divhashes),), hint=h)
28685
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
1598
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1599
34095
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34094
diff changeset
1600 def successorrevs(unfi, rev):
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1601 """yield revision numbers for successors of rev"""
34095
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34094
diff changeset
1602 assert unfi.filtername is None
43566
054846d213ba index: use `index.get_rev` in `rebase.successorrevs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43506
diff changeset
1603 get_rev = unfi.changelog.index.get_rev
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1604 for s in obsutil.allsuccessors(unfi.obsstore, [unfi[rev].node()]):
43566
054846d213ba index: use `index.get_rev` in `rebase.successorrevs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43506
diff changeset
1605 r = get_rev(s)
054846d213ba index: use `index.get_rev` in `rebase.successorrevs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43506
diff changeset
1606 if r is not None:
054846d213ba index: use `index.get_rev` in `rebase.successorrevs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43506
diff changeset
1607 yield r
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1608
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1609
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
1610 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
1611 """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
1612
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1613 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
1614 previously rebase result could affect destination. For example,
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1615
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1616 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
1617 |/ C will be rebased to C'
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1618 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
1619 |/ 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
1620 A
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1621
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1622 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
1623 block below.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1624 """
34092
8a8e7a94ba07 rebase: do not crash rebasing merge with a parent having hidden successor
Jun Wu <quark@fb.com>
parents: 34009
diff changeset
1625 # 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
1626 assert repo.filtername is None
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34094
diff changeset
1627 cl = repo.changelog
38666
a06b2b032557 revlog: introduce a isancestorrev() and use it in rebase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38546
diff changeset
1628 isancestor = cl.isancestorrev
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1629
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1630 dest = destmap[rev]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1631 oldps = repo.changelog.parentrevs(rev) # old parents
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1632 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
1633 dests = adjustdest(repo, rev, destmap, state, skipped)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1634 bases = list(oldps) # merge base candidates, initially just old parents
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1635
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1636 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
1637 # 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
1638 newps[0] = dests[0]
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1639 else:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1640 # 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
1641 # 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
1642 # 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
1643 # accepts one dest per src.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1644 #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1645 # 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
1646 # 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
1647 # 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
1648 #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1649 # 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
1650 # 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
1651 # 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
1652 # because it was rebased?
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1653 #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1654 # For example:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1655 #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1656 # 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
1657 # /| # 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
1658 # 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
1659 #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1660 # 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
1661 # at most 2 parents.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1662 for i, p in enumerate(oldps):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1663 np = p # new parent
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1664 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
1665 np = dests[i]
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1666 elif p in state and state[p] > 0:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1667 np = state[p]
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
1668
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1669 # 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
1670 for j, x in enumerate(newps[:i]):
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1671 if x == nullrev:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1672 continue
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1673 if isancestor(np, x): # CASE-1
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1674 np = nullrev
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1675 elif isancestor(x, np): # CASE-2
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1676 newps[j] = np
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1677 np = nullrev
33863
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1678 # 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
1679 # 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
1680 # set bases[x] to nullrev.
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1681 bases[j], bases[i] = bases[i], bases[j]
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1682
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1683 newps[i] = np
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1684
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1685 # "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
1686 # 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
1687 # 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
1688 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
1689 assert len(newps) == 2 and len(oldps) == 2
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1690 newps.reverse()
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1691 bases.reverse()
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1692
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1693 # 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
1694 # 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
1695 #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1696 # C # rebase -r C -d D
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1697 # /| # 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
1698 # A B D
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1699 if set(newps) == set(oldps) and dest not in newps:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1700 raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1701 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1702 b'cannot rebase %d:%s without '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1703 b'moving at least one of its parents'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1704 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1705 % (rev, repo[rev])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1706 )
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1707
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1708 # 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
1709 # 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
1710 # 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
1711 if any(p != nullrev and isancestor(rev, p) for p in newps):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1712 raise error.Abort(_(b'source is ancestor of destination'))
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1713
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1714 # 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
1715 # 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
1716 # 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
1717 #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1718 # F
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1719 # /|
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1720 # 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
1721 # | | # 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
1722 # 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
1723 # |/ # chosen, the rebased F will contain B.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1724 # A Z
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1725 #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1726 # 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
1727 # 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
1728 # pick one (so choose p1 above).
44341
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
1729 if sum(1 for b in set(bases) if b != nullrev and b not in newps) > 1:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1730 unwanted = [None, None] # unwanted[i]: unwanted revs if choose bases[i]
33863
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1731 for i, base in enumerate(bases):
44341
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
1732 if base == nullrev or base in newps:
33863
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1733 continue
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1734 # 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
1735 # might contain "surprising" contents
44167
4263aaab651d rebase: clarify a little by calculating a set in Python instead of in revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 44095
diff changeset
1736 other_bases = set(bases) - {base}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1737 siderevs = list(
44167
4263aaab651d rebase: clarify a little by calculating a set in Python instead of in revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 44095
diff changeset
1738 repo.revs(b'(%ld %% (%d+%d))', other_bases, base, dest)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1739 )
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
1740
33863
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1741 # 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
1742 # 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
1743 if siderevs:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1744 rebaseset = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1745 r for r, d in state.items() if d > 0 and r not in obsskipped
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1746 ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1747 merges = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1748 r for r in rebaseset if cl.parentrevs(r)[1] != nullrev
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1749 ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1750 unwanted[i] = list(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1751 repo.revs(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1752 b'%ld - (::%ld) - %ld', siderevs, merges, rebaseset
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1753 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1754 )
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1755
44341
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
1756 if any(revs is not None for revs in unwanted):
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
1757 # Choose a merge base that has a minimal number of unwanted revs.
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
1758 l, i = min(
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
1759 (len(revs), i)
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
1760 for i, revs in enumerate(unwanted)
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
1761 if revs is not None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1762 )
33863
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
1763
44341
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
1764 # The merge will include unwanted revisions. Abort now. Revisit this if
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
1765 # we have a more advanced merge algorithm that handles multiple bases.
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
1766 if l > 0:
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
1767 unwanteddesc = _(b' or ').join(
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
1768 (
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
1769 b', '.join(b'%d:%s' % (r, repo[r]) for r in revs)
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
1770 for revs in unwanted
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
1771 if revs is not None
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
1772 )
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
1773 )
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
1774 raise error.Abort(
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
1775 _(b'rebasing %d:%s will include unwanted changes from %s')
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
1776 % (rev, repo[rev], unwanteddesc)
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
1777 )
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
1778
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
1779 # newps[0] should match merge base if possible. Currently, if newps[i]
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
1780 # is nullrev, the only case is newps[i] and newps[j] (j < i), one is
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
1781 # the other's ancestor. In that case, it's fine to not swap newps here.
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
1782 # (see CASE-1 and CASE-2 above)
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
1783 if i != 0:
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
1784 if newps[i] != nullrev:
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
1785 newps[0], newps[i] = newps[i], newps[0]
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
1786 bases[0], bases[i] = bases[i], bases[0]
44214
3d2de64c49d2 rebase: define base in only place in defineparents()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44194
diff changeset
1787
3d2de64c49d2 rebase: define base in only place in defineparents()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44194
diff changeset
1788 # "rebasenode" updates to new p1, use the corresponding merge base.
44341
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
1789 base = bases[0]
44168
1cb7ae9b0071 rebase: move some variables after an error cases where they're not needed
Martin von Zweigbergk <martinvonz@google.com>
parents: 44167
diff changeset
1790
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1791 repo.ui.debug(b" 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
1792
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
1793 return newps[0], newps[1], base
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1794
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1795
7955
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
1796 def isagitpatch(repo, patchname):
43787
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43591
diff changeset
1797 """Return true if the given patch is in git format"""
7955
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
1798 mqpatch = os.path.join(repo.mq.path, patchname)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1799 for line in patch.linereader(open(mqpatch, b'rb')):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1800 if line.startswith(b'diff --git'):
7955
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
1801 return True
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
1802 return False
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
1803
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1804
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1805 def updatemq(repo, state, skipped, **opts):
43787
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43591
diff changeset
1806 """Update rebased mq patches - finalize and then import them"""
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1807 mqrebase = {}
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
1808 mq = repo.mq
14572
8ff2957c1d82 mq: rename full_series to fullseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14509
diff changeset
1809 original_series = mq.fullseries[:]
16531
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
1810 skippedpatches = set()
14497
ea585f2b1adc rebase: restore mq guards after rebasing (issue2107)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 13894
diff changeset
1811
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
1812 for p in mq.applied:
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
1813 rev = repo[p.node].rev()
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
1814 if rev in state:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1815 repo.ui.debug(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1816 b'revision %d is an mq patch (%s), finalize it.\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1817 % (rev, p.name)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1818 )
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
1819 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
1820 else:
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
1821 # 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
1822 skippedpatches.add(p.name)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1823
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1824 if mqrebase:
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
1825 mq.finish(repo, mqrebase.keys())
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1826
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1827 # 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
1828 for rev in sorted(mqrebase, reverse=True):
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1829 if rev not in skipped:
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
1830 name, isgit = mqrebase[rev]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1831 repo.ui.note(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1832 _(b'updating mq patch %s to %d:%s\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1833 % (name, state[rev], repo[state[rev]])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1834 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1835 mq.qimport(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1836 repo,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1837 (),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1838 patchname=name,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1839 git=isgit,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1840 rev=[b"%d" % state[rev]],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1841 )
16531
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
1842 else:
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
1843 # Rebased and skipped
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
1844 skippedpatches.add(mqrebase[rev][0])
14497
ea585f2b1adc rebase: restore mq guards after rebasing (issue2107)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 13894
diff changeset
1845
16531
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
1846 # 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
1847 # 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
1848 # ones while preserving the original series order and guards.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1849 newseries = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1850 s
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1851 for s in original_series
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1852 if mq.guard_re.split(s, 1)[0] not in skippedpatches
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1853 ]
16531
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
1854 mq.fullseries[:] = newseries
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
1855 mq.seriesdirty = True
14580
92101ea35015 mq: rename save_dirty to savedirty
Adrian Buehlmann <adrian@cadifra.com>
parents: 14572
diff changeset
1856 mq.savedirty()
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1857
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1858
28185
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1859 def storecollapsemsg(repo, collapsemsg):
43787
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43591
diff changeset
1860 """Store the collapse message to allow recovery"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1861 collapsemsg = collapsemsg or b''
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1862 f = repo.vfs(b"last-message.txt", b"w")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1863 f.write(b"%s\n" % collapsemsg)
28185
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1864 f.close()
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1865
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1866
28185
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1867 def clearcollapsemsg(repo):
43787
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43591
diff changeset
1868 """Remove collapse message file"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1869 repo.vfs.unlinkpath(b"last-message.txt", ignoremissing=True)
28185
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1870
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1871
31225
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
1872 def restorecollapsemsg(repo, isabort):
43787
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43591
diff changeset
1873 """Restore previously stored collapse message"""
28185
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1874 try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1875 f = repo.vfs(b"last-message.txt")
28185
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1876 collapsemsg = f.readline().strip()
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1877 f.close()
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1878 except IOError as err:
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1879 if err.errno != errno.ENOENT:
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1880 raise
31225
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
1881 if isabort:
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
1882 # Oh well, just abort like normal
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1883 collapsemsg = b''
31225
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
1884 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1885 raise error.Abort(_(b'missing .hg/last-message.txt for rebase'))
28185
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1886 return collapsemsg
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
1887
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1888
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1889 def clearstatus(repo):
43787
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43591
diff changeset
1890 """Remove the status files"""
33056
2312e70cf78b rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents: 32918
diff changeset
1891 # 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
1892 tr = repo.currenttransaction()
2312e70cf78b rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents: 32918
diff changeset
1893 if tr:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1894 tr.removefilegenerator(b'rebasestate')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1895 repo.vfs.unlinkpath(b"rebasestate", ignoremissing=True)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1896
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1897
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1898 def sortsource(destmap):
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1899 """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
1900
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1901 If source and destination overlaps, we should filter out revisions
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1902 depending on other revisions which hasn't been rebased yet.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1903
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1904 Yield a sorted list of revisions each time.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1905
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1906 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
1907 [A], indicating B needs to be rebased first.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1908
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1909 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
1910 """
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1911 srcset = set(destmap)
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1912 while srcset:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1913 srclist = sorted(srcset)
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1914 result = []
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1915 for r in srclist:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1916 if destmap[r] not in srcset:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1917 result.append(r)
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1918 if not result:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1919 raise error.Abort(_(b'source and destination form a cycle'))
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1920 srcset -= set(result)
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1921 yield result
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1922
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1923
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
1924 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
1925 '''Define which revisions are going to be rebased and where
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1926
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
1927 repo: repo
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1928 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
1929 '''
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1930 rebaseset = destmap.keys()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1931 originalwd = repo[b'.'].rev()
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1932
10672
c2e1e637d4da rebase: always check if rebasing onto an applied mq patch.
Greg Ward <greg-hg@gerg.ca>
parents: 10659
diff changeset
1933 # 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
1934 # 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
1935 # a partially completed rebase is blocked by mq.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1936 if b'qtip' in repo.tags():
44452
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44438
diff changeset
1937 mqapplied = {repo[s.node].rev() for s in repo.mq.applied}
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1938 if set(destmap.values()) & mqapplied:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1939 raise error.Abort(_(b'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
1940
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1941 # Get "cycle" error early by exhausting the generator.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1942 sortedsrc = list(sortsource(destmap)) # a list of sorted revs
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1943 if not sortedsrc:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1944 raise error.Abort(_(b'no matching revisions'))
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1945
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
1946 # 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
1947 # 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
1948 # (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
1949 # "defineparents" to do that check.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1950 roots = list(repo.set(b'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
1951 if not roots:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1952 raise error.Abort(_(b'no matching revisions'))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1953
36271
53be14874ee8 rebase: sort roots by revision
Augie Fackler <augie@google.com>
parents: 36185
diff changeset
1954 def revof(r):
53be14874ee8 rebase: sort roots by revision
Augie Fackler <augie@google.com>
parents: 36185
diff changeset
1955 return r.rev()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1956
36271
53be14874ee8 rebase: sort roots by revision
Augie Fackler <augie@google.com>
parents: 36185
diff changeset
1957 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
1958 state = dict.fromkeys(rebaseset, revtodo)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1959 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
1960 for root in roots:
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1961 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
1962 commonbase = root.ancestor(dest)
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
1963 if commonbase == root:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1964 raise error.Abort(_(b'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
1965 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
1966 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
1967 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
1968 # 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
1969 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
1970 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
1971 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
1972 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
1973 # 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
1974 # 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
1975 state[root.rev()] = root.rev()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1976 repo.ui.debug(b'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
1977 continue
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1978
32272
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
1979 emptyrebase = False
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1980 repo.ui.debug(b'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
1981 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
1982 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
1983 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
1984 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
1985 # 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
1986 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
1987 state[rev] = rev
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
1988 return originalwd, destmap, state
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1989
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1990
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1991 def clearrebased(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1992 ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1993 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1994 destmap,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1995 state,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1996 skipped,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1997 collapsedas=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1998 keepf=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
1999 fm=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
2000 backup=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
2001 ):
17613
aafc521668d8 rebase: properly handle --collapse when creating obsolescence marker
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17612
diff changeset
2002 """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
2003
aafc521668d8 rebase: properly handle --collapse when creating obsolescence marker
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17612
diff changeset
2004 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
2005 `collapsedas` node.
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
2006
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
2007 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
2008 removed (but bookmarks still need to be moved).
38799
2002c193f2bc rebase: support "history-editing-backup" config option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38681
diff changeset
2009
2002c193f2bc rebase: support "history-editing-backup" config option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38681
diff changeset
2010 If `backup` is False, no backup will be stored when stripping rebased
2002c193f2bc rebase: support "history-editing-backup" config option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38681
diff changeset
2011 revisions.
34354
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
2012 """
33332
3b7cb3d17137 rebase: use scmutil.cleanupnodes (issue5606) (BC)
Jun Wu <quark@fb.com>
parents: 33157
diff changeset
2013 tonode = repo.changelog.node
34354
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
2014 replacements = {}
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
2015 moves = {}
39915
7198cdbbbde1 rebase: don't try to prune obsolete changeset already in the destination
Boris Feld <boris.feld@octobus.net>
parents: 39328
diff changeset
2016 stripcleanup = not obsolete.isenabled(repo, obsolete.createmarkersopt)
39919
0428feb1f0d7 rebase: explicitly track collapses as fold
Boris Feld <boris.feld@octobus.net>
parents: 39918
diff changeset
2017
0428feb1f0d7 rebase: explicitly track collapses as fold
Boris Feld <boris.feld@octobus.net>
parents: 39918
diff changeset
2018 collapsednodes = []
33333
8bfd10e4c55a rebase: remove "if True"
Jun Wu <quark@fb.com>
parents: 33332
diff changeset
2019 for rev, newrev in sorted(state.items()):
8bfd10e4c55a rebase: remove "if True"
Jun Wu <quark@fb.com>
parents: 33332
diff changeset
2020 if newrev >= 0 and newrev != rev:
34354
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
2021 oldnode = tonode(rev)
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
2022 newnode = collapsedas or tonode(newrev)
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
2023 moves[oldnode] = newnode
42975
43c84b816445 rebase: track new nodes when --keep is set
Paul Gossman <pgossman@janestreet.com>
parents: 42613
diff changeset
2024 succs = None
43c84b816445 rebase: track new nodes when --keep is set
Paul Gossman <pgossman@janestreet.com>
parents: 42613
diff changeset
2025 if rev in skipped:
43c84b816445 rebase: track new nodes when --keep is set
Paul Gossman <pgossman@janestreet.com>
parents: 42613
diff changeset
2026 if stripcleanup or not repo[rev].obsolete():
43c84b816445 rebase: track new nodes when --keep is set
Paul Gossman <pgossman@janestreet.com>
parents: 42613
diff changeset
2027 succs = ()
43c84b816445 rebase: track new nodes when --keep is set
Paul Gossman <pgossman@janestreet.com>
parents: 42613
diff changeset
2028 elif collapsedas:
43c84b816445 rebase: track new nodes when --keep is set
Paul Gossman <pgossman@janestreet.com>
parents: 42613
diff changeset
2029 collapsednodes.append(oldnode)
43c84b816445 rebase: track new nodes when --keep is set
Paul Gossman <pgossman@janestreet.com>
parents: 42613
diff changeset
2030 else:
43c84b816445 rebase: track new nodes when --keep is set
Paul Gossman <pgossman@janestreet.com>
parents: 42613
diff changeset
2031 succs = (newnode,)
43c84b816445 rebase: track new nodes when --keep is set
Paul Gossman <pgossman@janestreet.com>
parents: 42613
diff changeset
2032 if succs is not None:
43c84b816445 rebase: track new nodes when --keep is set
Paul Gossman <pgossman@janestreet.com>
parents: 42613
diff changeset
2033 replacements[(oldnode,)] = succs
39919
0428feb1f0d7 rebase: explicitly track collapses as fold
Boris Feld <boris.feld@octobus.net>
parents: 39918
diff changeset
2034 if collapsednodes:
0428feb1f0d7 rebase: explicitly track collapses as fold
Boris Feld <boris.feld@octobus.net>
parents: 39918
diff changeset
2035 replacements[tuple(collapsednodes)] = (collapsedas,)
34883
c858afe9c59b rebase: add support to output nodechanges
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34872
diff changeset
2036 if fm:
35125
f56a30b844aa rebase: use fm.formatlist() and fm.formatdict() to support user template
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35058
diff changeset
2037 hf = fm.hexfunc
f56a30b844aa rebase: use fm.formatlist() and fm.formatdict() to support user template
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35058
diff changeset
2038 fl = fm.formatlist
f56a30b844aa rebase: use fm.formatlist() and fm.formatdict() to support user template
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35058
diff changeset
2039 fd = fm.formatdict
39917
a8ccd9523d40 rebase: expand a long "one-liner"
Boris Feld <boris.feld@octobus.net>
parents: 39915
diff changeset
2040 changes = {}
43105
649d3ac37a12 py3: define and use pycompat.iteritems() for hgext/
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43104
diff changeset
2041 for oldns, newn in pycompat.iteritems(replacements):
39918
a8318c9cb2ad rebase: use tuple as `replacement` keys
Boris Feld <boris.feld@octobus.net>
parents: 39917
diff changeset
2042 for oldn in oldns:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2043 changes[hf(oldn)] = fl([hf(n) for n in newn], name=b'node')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2044 nodechanges = fd(changes, key=b"oldnode", value=b"newnodes")
34883
c858afe9c59b rebase: add support to output nodechanges
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34872
diff changeset
2045 fm.data(nodechanges=nodechanges)
42975
43c84b816445 rebase: track new nodes when --keep is set
Paul Gossman <pgossman@janestreet.com>
parents: 42613
diff changeset
2046 if keepf:
43c84b816445 rebase: track new nodes when --keep is set
Paul Gossman <pgossman@janestreet.com>
parents: 42613
diff changeset
2047 replacements = {}
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2048 scmutil.cleanupnodes(repo, replacements, b'rebase', moves, backup=backup)
17611
910123eac887 rebase: extract final changesets cleanup logic in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17325
diff changeset
2049
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
2050
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
2051 def pullrebase(orig, ui, repo, *args, **opts):
43787
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43591
diff changeset
2052 """Call rebase after pull if the latter has been invoked with --rebase"""
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
2053 if opts.get('rebase'):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2054 if ui.configbool(b'commands', b'rebase.requiredest'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2055 msg = _(b'rebase destination required by configuration')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2056 hint = _(b'use hg pull followed by hg rebase -d DEST')
31733
ae6bab095c66 rebase: abort hg pull --rebase if rebase.requiredest is set (issue5514)
Ryan McElroy <rmcelroy@fb.com>
parents: 31731
diff changeset
2057 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
2058
32918
04c9dd951a41 rebase: use context manager for locking in pullrebase()
Martin von Zweigbergk <martinvonz@google.com>
parents: 32917
diff changeset
2059 with repo.wlock(), repo.lock():
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
2060 if opts.get('update'):
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
2061 del opts['update']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
2062 ui.debug(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2063 b'--update and --rebase are not compatible, ignoring '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2064 b'the update flag\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
2065 )
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
2066
42532
12243f15d53e statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents: 42530
diff changeset
2067 cmdutil.checkunfinished(repo, skipmerge=True)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
2068 cmdutil.bailifchanged(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
2069 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
2070 hint=_(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2071 b'cannot pull with rebase: '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2072 b'please commit or shelve your changes first'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
2073 ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
2074 )
30725
c2bd2f77965b rebase: fail-fast the pull if working dir is not clean (BC)
Valters Vingolds <valters@vingolds.ch>
parents: 30709
diff changeset
2075
26029
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
2076 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
2077 origpostincoming = commands.postincoming
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
2078
26029
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
2079 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
2080 pass
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
2081
26029
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
2082 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
2083 try:
26960
6979fe2a6d75 rebase: add returning value from pullrebase function
liscju <piotr.listkiewicz@gmail.com>
parents: 26811
diff changeset
2084 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
2085 finally:
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
2086 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
2087 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
2088 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
2089 # --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
2090 # dropping it
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
2091 if 'rev' in opts:
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
2092 del opts['rev']
26029
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
2093 # 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
2094 # --source.
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
2095 if 'source' in opts:
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
2096 del opts['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
2097 # 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
2098 destspace = list(repo.changelog.revs(start=revsprepull))
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
2099 opts['_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
2100 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
2101 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
2102 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
2103 # 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
2104 rev, _a, _b = destutil.destupdate(repo)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2105 if rev == repo[b'.'].rev():
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2106 ui.status(_(b'nothing to rebase\n'))
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
2107 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2108 ui.status(_(b'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
2109 # 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
2110 # with warning and trumpets
0e3835c7e1cf rebase: perform update through the 'update' command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28117
diff changeset
2111 commands.update(ui, repo)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
2112 else:
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
2113 if opts.get('tool'):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2114 raise error.Abort(_(b'--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
2115 ret = orig(ui, repo, *args, **opts)
6979fe2a6d75 rebase: add returning value from pullrebase function
liscju <piotr.listkiewicz@gmail.com>
parents: 26811
diff changeset
2116
6979fe2a6d75 rebase: add returning value from pullrebase function
liscju <piotr.listkiewicz@gmail.com>
parents: 26811
diff changeset
2117 return ret
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
2118
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
2119
27790
2d294dada4f8 rebase: small refactoring to allow better extensibility from extensions
Laurent Charignon <lcharignon@fb.com>
parents: 27746
diff changeset
2120 def _filterobsoleterevs(repo, revs):
2d294dada4f8 rebase: small refactoring to allow better extensibility from extensions
Laurent Charignon <lcharignon@fb.com>
parents: 27746
diff changeset
2121 """returns a set of the obsolete revisions in revs"""
44452
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44438
diff changeset
2122 return {r for r in revs if repo[r].obsolete()}
27790
2d294dada4f8 rebase: small refactoring to allow better extensibility from extensions
Laurent Charignon <lcharignon@fb.com>
parents: 27746
diff changeset
2123
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
2124
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
2125 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
2126 """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
2127
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35002
diff changeset
2128 `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
2129 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
2130
35058
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35002
diff changeset
2131 `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
2132 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
2133
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
2134 `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
2135 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
2136 """
26349
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
2137 obsoletenotrebased = {}
42057
566daffc607d cleanup: use set literals where possible
Martin von Zweigbergk <martinvonz@google.com>
parents: 41817
diff changeset
2138 obsoletewithoutsuccessorindestination = set()
566daffc607d cleanup: use set literals where possible
Martin von Zweigbergk <martinvonz@google.com>
parents: 41817
diff changeset
2139 obsoleteextinctsuccessors = set()
26349
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
2140
34095
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34094
diff changeset
2141 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
2142 cl = repo.changelog
43567
0fea03924990 index: use `index.get_rev` in `rebase._computeobsoletenotrebased`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43566
diff changeset
2143 get_rev = cl.index.get_rev
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2144 extinctrevs = set(repo.revs(b'extinct()'))
34003
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
2145 for srcrev in rebaseobsrevs:
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
2146 srcnode = cl.node(srcrev)
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
2147 # 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
2148 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
2149 # obsutil.allsuccessors includes node itself
ae0d25071fca rebase: eliminate node from successors early in _computeobsoletenotrebased()
Denis Laxalde <denis@laxalde.org>
parents: 35917
diff changeset
2150 successors.remove(srcnode)
43567
0fea03924990 index: use `index.get_rev` in `rebase._computeobsoletenotrebased`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43566
diff changeset
2151 succrevs = {get_rev(s) for s in successors}
0fea03924990 index: use `index.get_rev` in `rebase._computeobsoletenotrebased`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43566
diff changeset
2152 succrevs.discard(None)
38673
20a30bb8f276 rebase: use revnums (not nodes) for set of extinct revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 38672
diff changeset
2153 if succrevs.issubset(extinctrevs):
35995
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
2154 # all successors are extinct
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
2155 obsoleteextinctsuccessors.add(srcrev)
35994
ae0d25071fca rebase: eliminate node from successors early in _computeobsoletenotrebased()
Denis Laxalde <denis@laxalde.org>
parents: 35917
diff changeset
2156 if not successors:
ae0d25071fca rebase: eliminate node from successors early in _computeobsoletenotrebased()
Denis Laxalde <denis@laxalde.org>
parents: 35917
diff changeset
2157 # no successor
34003
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
2158 obsoletenotrebased[srcrev] = None
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
2159 else:
38672
0f8599afb92f rebase: avoid converting from nodes to revnums twice
Martin von Zweigbergk <martinvonz@google.com>
parents: 38671
diff changeset
2160 dstrev = destmap[srcrev]
0f8599afb92f rebase: avoid converting from nodes to revnums twice
Martin von Zweigbergk <martinvonz@google.com>
parents: 38671
diff changeset
2161 for succrev in succrevs:
0f8599afb92f rebase: avoid converting from nodes to revnums twice
Martin von Zweigbergk <martinvonz@google.com>
parents: 38671
diff changeset
2162 if cl.isancestorrev(succrev, dstrev):
0f8599afb92f rebase: avoid converting from nodes to revnums twice
Martin von Zweigbergk <martinvonz@google.com>
parents: 38671
diff changeset
2163 obsoletenotrebased[srcrev] = succrev
34003
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
2164 break
35058
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35002
diff changeset
2165 else:
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35002
diff changeset
2166 # 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
2167 # 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
2168 # and its descendants to avoid divergence.
39328
94a4980695f8 rebase: skip extinct revisions even if it has no successor in rebase set
Martin von Zweigbergk <martinvonz@google.com>
parents: 39135
diff changeset
2169 if srcrev in extinctrevs or any(s in destmap for s in succrevs):
35058
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35002
diff changeset
2170 obsoletewithoutsuccessorindestination.add(srcrev)
27012
5eac7ab59b95 rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents: 27010
diff changeset
2171
35995
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
2172 return (
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
2173 obsoletenotrebased,
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
2174 obsoletewithoutsuccessorindestination,
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
2175 obsoleteextinctsuccessors,
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
2176 )
26349
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
2177
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
2178
42583
b9bc47211cf5 abort: added support for rebase
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
2179 def abortrebase(ui, repo):
b9bc47211cf5 abort: added support for rebase
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
2180 with repo.wlock(), repo.lock():
b9bc47211cf5 abort: added support for rebase
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
2181 rbsrt = rebaseruntime(repo, ui)
b9bc47211cf5 abort: added support for rebase
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
2182 rbsrt._prepareabortorcontinue(isabort=True)
b9bc47211cf5 abort: added support for rebase
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
2183
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
2184
42613
35ebdbb38efb continue: added support for rebase
Taapas Agrawal <taapas2897@gmail.com>
parents: 42583
diff changeset
2185 def continuerebase(ui, repo):
35ebdbb38efb continue: added support for rebase
Taapas Agrawal <taapas2897@gmail.com>
parents: 42583
diff changeset
2186 with repo.wlock(), repo.lock():
35ebdbb38efb continue: added support for rebase
Taapas Agrawal <taapas2897@gmail.com>
parents: 42583
diff changeset
2187 rbsrt = rebaseruntime(repo, ui)
35ebdbb38efb continue: added support for rebase
Taapas Agrawal <taapas2897@gmail.com>
parents: 42583
diff changeset
2188 ms = mergemod.mergestate.read(repo)
35ebdbb38efb continue: added support for rebase
Taapas Agrawal <taapas2897@gmail.com>
parents: 42583
diff changeset
2189 mergeutil.checkunresolved(ms)
35ebdbb38efb continue: added support for rebase
Taapas Agrawal <taapas2897@gmail.com>
parents: 42583
diff changeset
2190 retcode = rbsrt._prepareabortorcontinue(isabort=False)
35ebdbb38efb continue: added support for rebase
Taapas Agrawal <taapas2897@gmail.com>
parents: 42583
diff changeset
2191 if retcode is not None:
35ebdbb38efb continue: added support for rebase
Taapas Agrawal <taapas2897@gmail.com>
parents: 42583
diff changeset
2192 return retcode
35ebdbb38efb continue: added support for rebase
Taapas Agrawal <taapas2897@gmail.com>
parents: 42583
diff changeset
2193 rbsrt._performrebase(None)
35ebdbb38efb continue: added support for rebase
Taapas Agrawal <taapas2897@gmail.com>
parents: 42583
diff changeset
2194 rbsrt._finishrebase()
35ebdbb38efb continue: added support for rebase
Taapas Agrawal <taapas2897@gmail.com>
parents: 42583
diff changeset
2195
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
2196
19214
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
2197 def summaryhook(ui, repo):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2198 if not repo.vfs.exists(b'rebasestate'):
19214
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
2199 return
19849
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
2200 try:
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
2201 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
2202 rbsrt.restorestatus()
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
2203 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
2204 except error.RepoLookupError:
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
2205 # i18n: column positioning for "hg summary"
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2206 msg = _(b'rebase: (use "hg rebase --abort" to clear broken state)\n')
19849
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
2207 ui.write(msg)
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
2208 return
43104
74802979dd9d py3: define and use pycompat.itervalues()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43085
diff changeset
2209 numrebased = len([i for i in pycompat.itervalues(state) if i >= 0])
19214
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
2210 # i18n: column positioning for "hg summary"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
2211 ui.write(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2212 _(b'rebase: %s, %s (rebase --continue)\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
2213 % (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2214 ui.label(_(b'%d rebased'), b'rebase.rebased') % numrebased,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2215 ui.label(_(b'%d remaining'), b'rebase.remaining')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
2216 % (len(state) - numrebased),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
2217 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
2218 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
2219
19214
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
2220
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
2221 def uisetup(ui):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
2222 # Replace pull with a decorator to provide --rebase option
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2223 entry = extensions.wrapcommand(commands.table, b'pull', pullrebase)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
2224 entry[1].append(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2225 (b'', b'rebase', None, _(b"rebase working directory to branch head"))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
2226 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2227 entry[1].append((b't', b'tool', b'', _(b"specify merge tool for rebase")))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2228 cmdutil.summaryhooks.add(b'rebase', summaryhook)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
2229 statemod.addunfinished(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2230 b'rebase',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
2231 fname=b'rebasestate',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
2232 stopflag=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
2233 continueflag=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
2234 abortfunc=abortrebase,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
2235 continuefunc=continuerebase,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
2236 )