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