Mercurial > public > mercurial-scm > hg
annotate hgext/rebase.py @ 28117:41a0fb2b4bbc
rebase: 'hg pull --rebase' now update only if there was nothing to rebase
I recently discovered that 'hg pull --rebase' was also running an update. And it
was running it in all cases as long as the update would move the working copy
somewhere else...
This felt wrong and it actually is. This 'update' call is introduced in
92455c1d6f83. In that commit the intent is very clear. The update should happen
only when there was nothing to rebase. The implementation did not check if a
rebase was performed because, at that time, rebase would always leave you on the
top most changeset. Being on that top most changeset result in a no-op update
and the step was skipped.
However 9c78ed396075f changed rebase behavior to preserve the working copy
parent, so if we are not on a head at pull time, the code performs both a rebase
and an update.
This changeset introduce a test for this case and restore the intended behavior.
There are other issues with this custom update code but they will be addressed
in later changeset (eg: own destination logic, lack of heads warning).
I'm not super happy with the explicitly comparison 'rebase(...) == 1' but a
later series will have a cleaner way to handle it anyway (while making 'rebase'
pick its default destination like 'merge').
author | Pierre-Yves David <pierre-yves.david@fb.com> |
---|---|
date | Sat, 13 Feb 2016 16:59:32 +0000 |
parents | a036e1ae1fbe |
children | 0e3835c7e1cf |
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 |
14884
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
17 from mercurial import hg, util, repair, merge, cmdutil, commands, bookmarks |
18933
42b620fc89e2
rebase: switch from util.Abort to util.InterventionRequired where appropriate (bc)
Augie Fackler <raf@durin42.com>
parents:
18764
diff
changeset
|
18 from mercurial import extensions, patch, scmutil, phases, obsolete, error |
26301
3f8c5c284c86
rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26165
diff
changeset
|
19 from mercurial import copies, repoview, revset |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
20 from mercurial.commands import templateopts |
23517
4f18e80d9c30
rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents:
23491
diff
changeset
|
21 from mercurial.node import nullrev, nullid, hex, short |
8112
6ee71f78497c
switch lock releasing in the extensions from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
8076
diff
changeset
|
22 from mercurial.lock import release |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
23 from mercurial.i18n import _ |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
24 import os, errno |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
25 |
26669
07db7e95c464
rebase: added comments
Christian Delahousse <cdelahousse@fb.com>
parents:
26587
diff
changeset
|
26 # 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
|
27 # their values must be maintained. |
07db7e95c464
rebase: added comments
Christian Delahousse <cdelahousse@fb.com>
parents:
26587
diff
changeset
|
28 |
07db7e95c464
rebase: added comments
Christian Delahousse <cdelahousse@fb.com>
parents:
26587
diff
changeset
|
29 # 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
|
30 revtodo = -1 |
10352
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
31 nullmerge = -2 |
18447
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
32 revignored = -3 |
27013
e97132eb841c
rebase: remove an unused todo
Laurent Charignon <lcharignon@fb.com>
parents:
27012
diff
changeset
|
33 # successor in rebase destination |
26349
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
34 revprecursor = -4 |
27013
e97132eb841c
rebase: remove an unused todo
Laurent Charignon <lcharignon@fb.com>
parents:
27012
diff
changeset
|
35 # plain prune (no successor) |
27012
5eac7ab59b95
rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents:
27010
diff
changeset
|
36 revpruned = -5 |
27014
4223fc58f952
rebase: refactoring to avoid repetition of expression
Laurent Charignon <lcharignon@fb.com>
parents:
27013
diff
changeset
|
37 revskipped = (revignored, revprecursor, revpruned) |
10352
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
38 |
14306
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
39 cmdtable = {} |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
40 command = cmdutil.command(cmdtable) |
25186
80c5b2666a96
extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents:
25102
diff
changeset
|
41 # Note for extension authors: ONLY specify testedwith = 'internal' for |
80c5b2666a96
extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents:
25102
diff
changeset
|
42 # 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
|
43 # 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
|
44 # leave the attribute unspecified. |
16743
38caf405d010
hgext: mark all first-party extensions as such
Augie Fackler <raf@durin42.com>
parents:
16696
diff
changeset
|
45 testedwith = 'internal' |
14306
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
46 |
26671
66dc39cd7d06
rebase: factor out nothing to rebase return code
Ryan McElroy <rmcelroy@fb.com>
parents:
26669
diff
changeset
|
47 def _nothingtorebase(): |
66dc39cd7d06
rebase: factor out nothing to rebase return code
Ryan McElroy <rmcelroy@fb.com>
parents:
26669
diff
changeset
|
48 return 1 |
66dc39cd7d06
rebase: factor out nothing to rebase return code
Ryan McElroy <rmcelroy@fb.com>
parents:
26669
diff
changeset
|
49 |
27976
8f4d3eeb5198
rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents:
27975
diff
changeset
|
50 def _savegraft(ctx, extra): |
8f4d3eeb5198
rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents:
27975
diff
changeset
|
51 s = ctx.extra().get('source', None) |
8f4d3eeb5198
rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents:
27975
diff
changeset
|
52 if s is not None: |
8f4d3eeb5198
rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents:
27975
diff
changeset
|
53 extra['source'] = s |
8f4d3eeb5198
rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents:
27975
diff
changeset
|
54 s = ctx.extra().get('intermediate-source', None) |
8f4d3eeb5198
rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents:
27975
diff
changeset
|
55 if s is not None: |
8f4d3eeb5198
rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents:
27975
diff
changeset
|
56 extra['intermediate-source'] = s |
8f4d3eeb5198
rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents:
27975
diff
changeset
|
57 |
8f4d3eeb5198
rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents:
27975
diff
changeset
|
58 def _savebranch(ctx, extra): |
8f4d3eeb5198
rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents:
27975
diff
changeset
|
59 extra['branch'] = ctx.branch() |
8f4d3eeb5198
rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents:
27975
diff
changeset
|
60 |
19860
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
61 def _makeextrafn(copiers): |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
62 """make an extrafn out of the given copy-functions. |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
63 |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
64 A copy function takes a context and an extra dict, and mutates the |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
65 extra dict as needed based on the given context. |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
66 """ |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
67 def extrafn(ctx, extra): |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
68 for c in copiers: |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
69 c(ctx, extra) |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
70 return extrafn |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
71 |
26717
1755e1d9d1c3
rebase: extra default destination in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26677
diff
changeset
|
72 def _destrebase(repo): |
1755e1d9d1c3
rebase: extra default destination in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26677
diff
changeset
|
73 # Destination defaults to the latest revision in the |
1755e1d9d1c3
rebase: extra default destination in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26677
diff
changeset
|
74 # current branch |
1755e1d9d1c3
rebase: extra default destination in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26677
diff
changeset
|
75 branch = repo[None].branch() |
1755e1d9d1c3
rebase: extra default destination in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26677
diff
changeset
|
76 return repo[branch].rev() |
1755e1d9d1c3
rebase: extra default destination in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26677
diff
changeset
|
77 |
27586
42910f9fffeb
revset: use delayregistrar to register predicate in extension easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
27577
diff
changeset
|
78 revsetpredicate = revset.extpredicate() |
42910f9fffeb
revset: use delayregistrar to register predicate in extension easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
27577
diff
changeset
|
79 |
42910f9fffeb
revset: use delayregistrar to register predicate in extension easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
27577
diff
changeset
|
80 @revsetpredicate('_destrebase') |
26719
8bed1eae99df
rebase: rename and test '_destrebase'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26718
diff
changeset
|
81 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
|
82 # ``_rebasedefaultdest()`` |
3f8c5c284c86
rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26165
diff
changeset
|
83 |
3f8c5c284c86
rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26165
diff
changeset
|
84 # default destination for rebase. |
3f8c5c284c86
rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26165
diff
changeset
|
85 # # 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
|
86 # # XXX: - taking rev as arguments, |
3f8c5c284c86
rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26165
diff
changeset
|
87 # # 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
|
88 # # XXX: - probably merging with the merge destination. |
3f8c5c284c86
rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26165
diff
changeset
|
89 # i18n: "_rebasedefaultdest" is a keyword |
3f8c5c284c86
rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26165
diff
changeset
|
90 revset.getargs(x, 0, 0, _("_rebasedefaultdest takes no arguments")) |
26717
1755e1d9d1c3
rebase: extra default destination in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26677
diff
changeset
|
91 return subset & revset.baseset([_destrebase(repo)]) |
26301
3f8c5c284c86
rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26165
diff
changeset
|
92 |
14306
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
93 @command('rebase', |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
94 [('s', 'source', '', |
22789
5f4934487382
rebase: attempt to clarify --base
Matt Mackall <mpm@selenic.com>
parents:
22405
diff
changeset
|
95 _('rebase the specified changeset and descendants'), _('REV')), |
14306
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
96 ('b', 'base', '', |
22789
5f4934487382
rebase: attempt to clarify --base
Matt Mackall <mpm@selenic.com>
parents:
22405
diff
changeset
|
97 _('rebase everything from branching point of specified changeset'), |
14306
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
98 _('REV')), |
15270
6cb6064f1d50
rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15269
diff
changeset
|
99 ('r', 'rev', [], |
6cb6064f1d50
rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15269
diff
changeset
|
100 _('rebase these revisions'), |
6cb6064f1d50
rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15269
diff
changeset
|
101 _('REV')), |
14306
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
102 ('d', 'dest', '', |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
103 _('rebase onto the specified changeset'), _('REV')), |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
104 ('', 'collapse', False, _('collapse the rebased changesets')), |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
105 ('m', 'message', '', |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
106 _('use text as collapse commit message'), _('TEXT')), |
15219 | 107 ('e', 'edit', False, _('invoke editor on commit messages')), |
14306
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
108 ('l', 'logfile', '', |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
109 _('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
|
110 ('k', 'keep', False, _('keep original changesets')), |
14306
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
111 ('', '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
|
112 ('D', 'detach', False, _('(DEPRECATED)')), |
22382
d5b04ee8ecf7
rebase: add a deprecated -i/--interactive flag
David Soria Parra <davidsp@fb.com>
parents:
22251
diff
changeset
|
113 ('i', 'interactive', False, _('(DEPRECATED)')), |
14306
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
114 ('t', 'tool', '', _('specify merge tool')), |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
115 ('c', 'continue', False, _('continue an interrupted rebase')), |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
116 ('a', 'abort', False, _('abort an interrupted rebase'))] + |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
117 templateopts, |
17325
e4db509c08ec
rebase: remove second broken synopsis line (issue3172)
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
118 _('[-s REV | -b REV] [-d REV] [OPTION]')) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
119 def rebase(ui, repo, **opts): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
120 """move changeset (and descendants) to a different branch |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
121 |
7999
b25110140573
rebase: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents:
7955
diff
changeset
|
122 Rebase uses repeated merging to graft changesets from one part of |
10646 | 123 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
|
124 useful for linearizing *local* changes relative to a master |
10646 | 125 development tree. |
126 | |
27454
3e3be524a712
rebase: simplify documentation about public commits
timeless <timeless@mozdev.org>
parents:
27344
diff
changeset
|
127 Published commits cannot be rebased (see :hg:`help phases`). |
3e3be524a712
rebase: simplify documentation about public commits
timeless <timeless@mozdev.org>
parents:
27344
diff
changeset
|
128 To copy commits, see :hg:`help graft`. |
18516
9fbeb61b8ad2
rebase: mention phases in the help
Kevin Bullock <kbullock@ringworld.org>
parents:
18514
diff
changeset
|
129 |
10646 | 130 If you don't specify a destination changeset (``-d/--dest``), |
19398
f7bcc2e56279
rebase: simplify references to branch tips
Matt Mackall <mpm@selenic.com>
parents:
19214
diff
changeset
|
131 rebase uses the current branch tip as the destination. (The |
f7bcc2e56279
rebase: simplify references to branch tips
Matt Mackall <mpm@selenic.com>
parents:
19214
diff
changeset
|
132 destination changeset is not modified by rebasing, but new |
f7bcc2e56279
rebase: simplify references to branch tips
Matt Mackall <mpm@selenic.com>
parents:
19214
diff
changeset
|
133 changesets are added as its descendants.) |
10646 | 134 |
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
|
135 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
|
136 |
a9a047878e14
rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents:
27454
diff
changeset
|
137 1. Explicitly select them using ``--rev``. |
10646 | 138 |
27455
a9a047878e14
rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents:
27454
diff
changeset
|
139 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
|
140 descendants. |
27455
a9a047878e14
rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents:
27454
diff
changeset
|
141 |
a9a047878e14
rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents:
27454
diff
changeset
|
142 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
|
143 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
|
144 |
27932
6bc2299cc12f
rebase: restore help for rebase w/o args (issue5059)
timeless <timeless@mozdev.org>
parents:
27866
diff
changeset
|
145 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
|
146 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
|
147 |
27456
2337958596e3
rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents:
27455
diff
changeset
|
148 Rebase will destroy original changesets unless you use ``--keep``. |
2337958596e3
rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents:
27455
diff
changeset
|
149 It will also move your bookmarks (even if you do). |
2337958596e3
rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents:
27455
diff
changeset
|
150 |
2337958596e3
rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents:
27455
diff
changeset
|
151 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
|
152 (e.g. merges from the destination branch). |
10646 | 153 |
27457
97cc045f1cfe
rebase: simplify documentation about heads
timeless <timeless@mozdev.org>
parents:
27456
diff
changeset
|
154 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
|
155 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
|
156 and/or destination. |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
157 |
28001
ade12bf2bf0e
rebase: mention help merge-tools in help
timeless <timeless@mozdev.org>
parents:
27977
diff
changeset
|
158 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
|
159 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
|
160 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
|
161 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
|
162 |
27458
d39e743e3578
rebase: mention conflict in documentation instead of merge
timeless <timeless@mozdev.org>
parents:
27457
diff
changeset
|
163 If a rebase is interrupted to manually resolve a conflict, it can be |
8076
5ec526c1a32f
help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents:
8031
diff
changeset
|
164 continued with --continue/-c or aborted with --abort/-a. |
11205 | 165 |
22790 | 166 .. container:: verbose |
167 | |
168 Examples: | |
169 | |
170 - move "local changes" (current commit back to branching point) | |
171 to the current branch tip after a pull:: | |
172 | |
173 hg rebase | |
174 | |
175 - move a single changeset to the stable branch:: | |
176 | |
177 hg rebase -r 5f493448 -d stable | |
178 | |
179 - splice a commit and all its descendants onto another part of history:: | |
180 | |
181 hg rebase --source c0c3 --dest 4cf9 | |
182 | |
183 - rebase everything on a branch marked by a bookmark onto the | |
184 default branch:: | |
185 | |
186 hg rebase --base myfeature --dest default | |
187 | |
188 - collapse a sequence of changes into a single commit:: | |
189 | |
190 hg rebase --collapse -r 1520:1525 -d . | |
191 | |
192 - move a named branch while preserving its name:: | |
193 | |
194 hg rebase -r "branch(featureX)" -d 1.3 --keepbranches | |
195 | |
19971
2a9bb64faa0b
rebase: add description about exit code when there are unresolved conflicts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19969
diff
changeset
|
196 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
|
197 unresolved conflicts. |
22790 | 198 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
199 """ |
7280
810ca383da9c
remove unused variables
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7216
diff
changeset
|
200 originalwd = target = None |
18755
72412afe4c28
rebase: restore active bookmark after rebase --continue
Durham Goode <durham@fb.com>
parents:
18549
diff
changeset
|
201 activebookmark = None |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
202 external = nullrev |
26781
1aee2ab0f902
spelling: trivial spell checking
Mads Kiilerich <madski@unity3d.com>
parents:
26748
diff
changeset
|
203 # Mapping between the old revision id and either what is the new rebased |
1aee2ab0f902
spelling: trivial spell checking
Mads Kiilerich <madski@unity3d.com>
parents:
26748
diff
changeset
|
204 # revision or what needs to be done with the old revision. The state dict |
26669
07db7e95c464
rebase: added comments
Christian Delahousse <cdelahousse@fb.com>
parents:
26587
diff
changeset
|
205 # will be what contains most of the rebase progress state. |
8454
6d4bf1c1a003
rebase: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8270
diff
changeset
|
206 state = {} |
6d4bf1c1a003
rebase: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8270
diff
changeset
|
207 skipped = set() |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
208 targetancestors = set() |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
209 |
15219 | 210 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
211 lock = wlock = None |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
212 try: |
15874
2305baff673f
rebase: take locks in the right order
Mads Kiilerich <mads@kiilerich.com>
parents:
15801
diff
changeset
|
213 wlock = repo.wlock() |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
214 lock = repo.lock() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
215 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
216 # Validate input and define rebasing points |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
217 destf = opts.get('dest', None) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
218 srcf = opts.get('source', None) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
219 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
|
220 revf = opts.get('rev', []) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
221 contf = opts.get('continue') |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
222 abortf = opts.get('abort') |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
223 collapsef = opts.get('collapse', False) |
14635
217b7d83afc3
cmdutil, logmessage: use ui.fin when reading from '-'
Idan Kamara <idankk86@gmail.com>
parents:
14599
diff
changeset
|
224 collapsemsg = cmdutil.logmessage(ui, opts) |
26869
412e8c5e38b4
rebase: pass date parameter to concludenode
Stanislau Hlebik <stash@fb.com>
parents:
26868
diff
changeset
|
225 date = opts.get('date', None) |
19860
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
226 e = opts.get('extrafn') # internal, used by e.g. hgsubversion |
27976
8f4d3eeb5198
rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents:
27975
diff
changeset
|
227 extrafns = [_savegraft] |
19860
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
228 if e: |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
229 extrafns = [e] |
7952
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
230 keepf = opts.get('keep', False) |
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
231 keepbranchesf = opts.get('keepbranches', False) |
10677
f2558a8228be
rebase: add option to not commit after a collapsing
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10676
diff
changeset
|
232 # keepopen is not meant for use on the command line, but by |
f2558a8228be
rebase: add option to not commit after a collapsing
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10676
diff
changeset
|
233 # other extensions |
f2558a8228be
rebase: add option to not commit after a collapsing
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10676
diff
changeset
|
234 keepopen = opts.get('keepopen', False) |
7468
3e5db4228f8f
rebase: add support to keep branch names
Augie Fackler <durin42@gmail.com>
parents:
7298
diff
changeset
|
235 |
22382
d5b04ee8ecf7
rebase: add a deprecated -i/--interactive flag
David Soria Parra <davidsp@fb.com>
parents:
22251
diff
changeset
|
236 if opts.get('interactive'): |
26496
b885ab9ca182
rebase: enable histedit for useful help with it
timeless@mozdev.org
parents:
26495
diff
changeset
|
237 try: |
b885ab9ca182
rebase: enable histedit for useful help with it
timeless@mozdev.org
parents:
26495
diff
changeset
|
238 if extensions.find('histedit'): |
b885ab9ca182
rebase: enable histedit for useful help with it
timeless@mozdev.org
parents:
26495
diff
changeset
|
239 enablehistedit = '' |
b885ab9ca182
rebase: enable histedit for useful help with it
timeless@mozdev.org
parents:
26495
diff
changeset
|
240 except KeyError: |
b885ab9ca182
rebase: enable histedit for useful help with it
timeless@mozdev.org
parents:
26495
diff
changeset
|
241 enablehistedit = " --config extensions.histedit=" |
b885ab9ca182
rebase: enable histedit for useful help with it
timeless@mozdev.org
parents:
26495
diff
changeset
|
242 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
|
243 msg = _("interactive history editing is supported by the " |
26494
832f40d2af53
rebase: factor out histedit help command
timeless@mozdev.org
parents:
26421
diff
changeset
|
244 "'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
|
245 raise error.Abort(msg) |
22382
d5b04ee8ecf7
rebase: add a deprecated -i/--interactive flag
David Soria Parra <davidsp@fb.com>
parents:
22251
diff
changeset
|
246 |
13661
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
247 if collapsemsg and not collapsef: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26496
diff
changeset
|
248 raise error.Abort( |
13661
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
249 _('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
|
250 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
251 if contf or abortf: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
252 if contf and abortf: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26496
diff
changeset
|
253 raise error.Abort(_('cannot use both abort and continue')) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
254 if collapsef: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26496
diff
changeset
|
255 raise error.Abort( |
11285
f118029e534c
rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents:
11205
diff
changeset
|
256 _('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
|
257 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
|
258 raise error.Abort( |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
259 _('abort and continue do not allow specifying revisions')) |
26165
927c0d84e09f
rebase: fix warning about ignoring tool option on rebase continue (issue4698)
liscju <piotr.listkiewicz@gmail.com>
parents:
26029
diff
changeset
|
260 if abortf and opts.get('tool', False): |
13856
0995eee8ffe4
rebase: add --tool argument for specifying merge tool
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
13778
diff
changeset
|
261 ui.warn(_('tool option will be ignored\n')) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
262 |
19848
577f4c562d52
rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19641
diff
changeset
|
263 try: |
577f4c562d52
rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19641
diff
changeset
|
264 (originalwd, target, state, skipped, collapsef, keepf, |
577f4c562d52
rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19641
diff
changeset
|
265 keepbranchesf, external, activebookmark) = restorestatus(repo) |
577f4c562d52
rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19641
diff
changeset
|
266 except error.RepoLookupError: |
577f4c562d52
rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19641
diff
changeset
|
267 if abortf: |
577f4c562d52
rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19641
diff
changeset
|
268 clearstatus(repo) |
577f4c562d52
rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19641
diff
changeset
|
269 repo.ui.warn(_('rebase aborted (no revision is removed,' |
577f4c562d52
rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19641
diff
changeset
|
270 ' only broken state is cleared)\n')) |
577f4c562d52
rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19641
diff
changeset
|
271 return 0 |
577f4c562d52
rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19641
diff
changeset
|
272 else: |
577f4c562d52
rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19641
diff
changeset
|
273 msg = _('cannot continue inconsistent rebase') |
20313
dcd65ce87260
hgext: fix one typo in rebase
Simon Heimberg <simohe@besonet.ch>
parents:
20250
diff
changeset
|
274 hint = _('use "hg rebase --abort" to clear broken state') |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26496
diff
changeset
|
275 raise error.Abort(msg, hint=hint) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
276 if abortf: |
24758
d7451adc72f6
rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents:
23970
diff
changeset
|
277 return abort(repo, originalwd, target, state, |
d7451adc72f6
rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents:
23970
diff
changeset
|
278 activebookmark=activebookmark) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
279 else: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
280 if srcf and basef: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26496
diff
changeset
|
281 raise error.Abort(_('cannot specify both a ' |
15270
6cb6064f1d50
rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15269
diff
changeset
|
282 'source and a base')) |
6cb6064f1d50
rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15269
diff
changeset
|
283 if revf and basef: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26496
diff
changeset
|
284 raise error.Abort(_('cannot specify both a ' |
11285
f118029e534c
rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents:
11205
diff
changeset
|
285 'revision and a base')) |
15270
6cb6064f1d50
rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15269
diff
changeset
|
286 if revf and srcf: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26496
diff
changeset
|
287 raise error.Abort(_('cannot specify both a ' |
15270
6cb6064f1d50
rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15269
diff
changeset
|
288 'revision and a source')) |
10352
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
289 |
19478
e5a5790a3185
rebase: add checkunfinished support (issue3955)
Matt Mackall <mpm@selenic.com>
parents:
19477
diff
changeset
|
290 cmdutil.checkunfinished(repo) |
14289
d68ddccf276b
cmdutil: bail_if_changed to bailifchanged
Matt Mackall <mpm@selenic.com>
parents:
13895
diff
changeset
|
291 cmdutil.bailifchanged(repo) |
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
|
292 |
26718
806ca3a37858
rebase: directly use '_destrebase'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26717
diff
changeset
|
293 if destf: |
806ca3a37858
rebase: directly use '_destrebase'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26717
diff
changeset
|
294 dest = scmutil.revsingle(repo, destf) |
806ca3a37858
rebase: directly use '_destrebase'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26717
diff
changeset
|
295 else: |
806ca3a37858
rebase: directly use '_destrebase'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26717
diff
changeset
|
296 dest = repo[_destrebase(repo)] |
806ca3a37858
rebase: directly use '_destrebase'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26717
diff
changeset
|
297 destf = str(dest) |
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
|
298 |
15271
84d4a4ce45fd
rebase: simplify set generation
Matt Mackall <mpm@selenic.com>
parents:
15270
diff
changeset
|
299 if revf: |
19641
5528c31c629c
rebase: handle bookmarks matching revset function names (issue3950)
Bryan O'Sullivan <bryano@fb.com>
parents:
19518
diff
changeset
|
300 rebaseset = scmutil.revrange(repo, revf) |
20247
a259f7b488ab
rebase: improve error message for empty --rev set
Mads Kiilerich <madski@unity3d.com>
parents:
19986
diff
changeset
|
301 if not rebaseset: |
21197
cb4223c65f79
rebase: don't abort if we're asked to rebase an empty revset
Julien Cristau <julien.cristau@logilab.fr>
parents:
21027
diff
changeset
|
302 ui.status(_('empty "rev" revision set - ' |
cb4223c65f79
rebase: don't abort if we're asked to rebase an empty revset
Julien Cristau <julien.cristau@logilab.fr>
parents:
21027
diff
changeset
|
303 'nothing to rebase\n')) |
26671
66dc39cd7d06
rebase: factor out nothing to rebase return code
Ryan McElroy <rmcelroy@fb.com>
parents:
26669
diff
changeset
|
304 return _nothingtorebase() |
15271
84d4a4ce45fd
rebase: simplify set generation
Matt Mackall <mpm@selenic.com>
parents:
15270
diff
changeset
|
305 elif srcf: |
15800
e4fc0f0b4f7e
rebase: reinstate old-style rev spec support for the source and base (issue3181)
Steven Brown <StevenGBrown@gmail.com>
parents:
15469
diff
changeset
|
306 src = scmutil.revrange(repo, [srcf]) |
20248
3bff26f67169
rebase: improve error message for empty --source set
Mads Kiilerich <madski@unity3d.com>
parents:
20247
diff
changeset
|
307 if not src: |
21210
799c494189a9
rebase: empty revset should be a gentle no-op with exit code 1, not an error
Mads Kiilerich <madski@unity3d.com>
parents:
21197
diff
changeset
|
308 ui.status(_('empty "source" revision set - ' |
799c494189a9
rebase: empty revset should be a gentle no-op with exit code 1, not an error
Mads Kiilerich <madski@unity3d.com>
parents:
21197
diff
changeset
|
309 'nothing to rebase\n')) |
26671
66dc39cd7d06
rebase: factor out nothing to rebase return code
Ryan McElroy <rmcelroy@fb.com>
parents:
26669
diff
changeset
|
310 return _nothingtorebase() |
15801 | 311 rebaseset = repo.revs('(%ld)::', src) |
20248
3bff26f67169
rebase: improve error message for empty --source set
Mads Kiilerich <madski@unity3d.com>
parents:
20247
diff
changeset
|
312 assert rebaseset |
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
|
313 else: |
15800
e4fc0f0b4f7e
rebase: reinstate old-style rev spec support for the source and base (issue3181)
Steven Brown <StevenGBrown@gmail.com>
parents:
15469
diff
changeset
|
314 base = scmutil.revrange(repo, [basef or '.']) |
20249
dc5157841361
rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents:
20248
diff
changeset
|
315 if not base: |
21210
799c494189a9
rebase: empty revset should be a gentle no-op with exit code 1, not an error
Mads Kiilerich <madski@unity3d.com>
parents:
21197
diff
changeset
|
316 ui.status(_('empty "base" revision set - ' |
799c494189a9
rebase: empty revset should be a gentle no-op with exit code 1, not an error
Mads Kiilerich <madski@unity3d.com>
parents:
21197
diff
changeset
|
317 "can't compute rebase set\n")) |
26671
66dc39cd7d06
rebase: factor out nothing to rebase return code
Ryan McElroy <rmcelroy@fb.com>
parents:
26669
diff
changeset
|
318 return _nothingtorebase() |
23072
d583f1cfca96
rebase: improve base revset performance
Durham Goode <durham@fb.com>
parents:
22952
diff
changeset
|
319 commonanc = repo.revs('ancestor(%ld, %d)', base, dest).first() |
23246
643c58303fb0
rebase: fix rebase with no common ancestors (issue4446)
Durham Goode <durham@fb.com>
parents:
23072
diff
changeset
|
320 if commonanc is not None: |
643c58303fb0
rebase: fix rebase with no common ancestors (issue4446)
Durham Goode <durham@fb.com>
parents:
23072
diff
changeset
|
321 rebaseset = repo.revs('(%d::(%ld) - %d)::', |
643c58303fb0
rebase: fix rebase with no common ancestors (issue4446)
Durham Goode <durham@fb.com>
parents:
23072
diff
changeset
|
322 commonanc, base, commonanc) |
643c58303fb0
rebase: fix rebase with no common ancestors (issue4446)
Durham Goode <durham@fb.com>
parents:
23072
diff
changeset
|
323 else: |
643c58303fb0
rebase: fix rebase with no common ancestors (issue4446)
Durham Goode <durham@fb.com>
parents:
23072
diff
changeset
|
324 rebaseset = [] |
643c58303fb0
rebase: fix rebase with no common ancestors (issue4446)
Durham Goode <durham@fb.com>
parents:
23072
diff
changeset
|
325 |
20249
dc5157841361
rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents:
20248
diff
changeset
|
326 if not rebaseset: |
22823
18ac67b0814c
rebase: transform the smartset to a list before comparing with a list
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22820
diff
changeset
|
327 # transform to list because smartsets are not comparable to |
23139
e53f6b72a0e4
spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents:
23072
diff
changeset
|
328 # lists. This should be improved to honor laziness of |
22823
18ac67b0814c
rebase: transform the smartset to a list before comparing with a list
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22820
diff
changeset
|
329 # smartset. |
18ac67b0814c
rebase: transform the smartset to a list before comparing with a list
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22820
diff
changeset
|
330 if list(base) == [dest.rev()]: |
20249
dc5157841361
rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents:
20248
diff
changeset
|
331 if basef: |
dc5157841361
rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents:
20248
diff
changeset
|
332 ui.status(_('nothing to rebase - %s is both "base"' |
dc5157841361
rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents:
20248
diff
changeset
|
333 ' and destination\n') % dest) |
dc5157841361
rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents:
20248
diff
changeset
|
334 else: |
dc5157841361
rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents:
20248
diff
changeset
|
335 ui.status(_('nothing to rebase - working directory ' |
dc5157841361
rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents:
20248
diff
changeset
|
336 'parent is also destination\n')) |
dc5157841361
rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents:
20248
diff
changeset
|
337 elif not repo.revs('%ld - ::%d', base, dest): |
dc5157841361
rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents:
20248
diff
changeset
|
338 if basef: |
dc5157841361
rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents:
20248
diff
changeset
|
339 ui.status(_('nothing to rebase - "base" %s is ' |
dc5157841361
rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents:
20248
diff
changeset
|
340 'already an ancestor of destination ' |
dc5157841361
rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents:
20248
diff
changeset
|
341 '%s\n') % |
dc5157841361
rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents:
20248
diff
changeset
|
342 ('+'.join(str(repo[r]) for r in base), |
dc5157841361
rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents:
20248
diff
changeset
|
343 dest)) |
dc5157841361
rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents:
20248
diff
changeset
|
344 else: |
dc5157841361
rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents:
20248
diff
changeset
|
345 ui.status(_('nothing to rebase - working ' |
dc5157841361
rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents:
20248
diff
changeset
|
346 'directory parent is already an ' |
dc5157841361
rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents:
20248
diff
changeset
|
347 'ancestor of destination %s\n') % dest) |
dc5157841361
rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents:
20248
diff
changeset
|
348 else: # can it happen? |
dc5157841361
rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents:
20248
diff
changeset
|
349 ui.status(_('nothing to rebase from %s to %s\n') % |
dc5157841361
rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents:
20248
diff
changeset
|
350 ('+'.join(str(repo[r]) for r in base), dest)) |
26671
66dc39cd7d06
rebase: factor out nothing to rebase return code
Ryan McElroy <rmcelroy@fb.com>
parents:
26669
diff
changeset
|
351 return _nothingtorebase() |
15271
84d4a4ce45fd
rebase: simplify set generation
Matt Mackall <mpm@selenic.com>
parents:
15270
diff
changeset
|
352 |
22952
8792ac090e3b
obsolete: add allowunstable option
Durham Goode <durham@fb.com>
parents:
22951
diff
changeset
|
353 allowunstable = obsolete.isenabled(repo, obsolete.allowunstableopt) |
8792ac090e3b
obsolete: add allowunstable option
Durham Goode <durham@fb.com>
parents:
22951
diff
changeset
|
354 if (not (keepf or allowunstable) |
18269
9454e40e047b
clfilter: drop unnecessary explicit filtering on rebase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18164
diff
changeset
|
355 and repo.revs('first(children(%ld) - %ld)', |
18164
bacf55bd8f90
rebase: allow non-head rebase-set when obsolete is enabled
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18093
diff
changeset
|
356 rebaseset, rebaseset)): |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26496
diff
changeset
|
357 raise error.Abort( |
15272
2889d4574726
rebase: simplify check for orphaned descendants
Matt Mackall <mpm@selenic.com>
parents:
15271
diff
changeset
|
358 _("can't remove original changesets with" |
2889d4574726
rebase: simplify check for orphaned descendants
Matt Mackall <mpm@selenic.com>
parents:
15271
diff
changeset
|
359 " unrebased descendants"), |
2889d4574726
rebase: simplify check for orphaned descendants
Matt Mackall <mpm@selenic.com>
parents:
15271
diff
changeset
|
360 hint=_('use --keep to keep original changesets')) |
2889d4574726
rebase: simplify check for orphaned descendants
Matt Mackall <mpm@selenic.com>
parents:
15271
diff
changeset
|
361 |
26349
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
362 obsoletenotrebased = {} |
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
363 if ui.configbool('experimental', 'rebaseskipobsolete'): |
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
364 rebasesetrevs = set(rebaseset) |
27790
2d294dada4f8
rebase: small refactoring to allow better extensibility from extensions
Laurent Charignon <lcharignon@fb.com>
parents:
27746
diff
changeset
|
365 rebaseobsrevs = _filterobsoleterevs(repo, rebasesetrevs) |
26349
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
366 obsoletenotrebased = _computeobsoletenotrebased(repo, |
27744
f2b8b4e2de20
rebase: minor refactoring of _computeobsoletenotrebased
Laurent Charignon <lcharignon@fb.com>
parents:
27626
diff
changeset
|
367 rebaseobsrevs, |
26349
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
368 dest) |
27745
d3a128e8604a
rebase: create a new variable to make the next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents:
27744
diff
changeset
|
369 rebaseobsskipped = set(obsoletenotrebased) |
26349
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
370 |
27746
f0e9f38d250f
rebase: prevent creating divergence
Laurent Charignon <lcharignon@fb.com>
parents:
27745
diff
changeset
|
371 # Obsolete node with successors not in dest leads to divergence |
f0e9f38d250f
rebase: prevent creating divergence
Laurent Charignon <lcharignon@fb.com>
parents:
27745
diff
changeset
|
372 divergenceok = ui.configbool('rebase', |
f0e9f38d250f
rebase: prevent creating divergence
Laurent Charignon <lcharignon@fb.com>
parents:
27745
diff
changeset
|
373 'allowdivergence') |
f0e9f38d250f
rebase: prevent creating divergence
Laurent Charignon <lcharignon@fb.com>
parents:
27745
diff
changeset
|
374 divergencebasecandidates = rebaseobsrevs - rebaseobsskipped |
f0e9f38d250f
rebase: prevent creating divergence
Laurent Charignon <lcharignon@fb.com>
parents:
27745
diff
changeset
|
375 |
f0e9f38d250f
rebase: prevent creating divergence
Laurent Charignon <lcharignon@fb.com>
parents:
27745
diff
changeset
|
376 if divergencebasecandidates and not divergenceok: |
f0e9f38d250f
rebase: prevent creating divergence
Laurent Charignon <lcharignon@fb.com>
parents:
27745
diff
changeset
|
377 msg = _("this rebase will cause divergence") |
f0e9f38d250f
rebase: prevent creating divergence
Laurent Charignon <lcharignon@fb.com>
parents:
27745
diff
changeset
|
378 h = _("to force the rebase please set " |
f0e9f38d250f
rebase: prevent creating divergence
Laurent Charignon <lcharignon@fb.com>
parents:
27745
diff
changeset
|
379 "rebase.allowdivergence=True") |
f0e9f38d250f
rebase: prevent creating divergence
Laurent Charignon <lcharignon@fb.com>
parents:
27745
diff
changeset
|
380 raise error.Abort(msg, hint=h) |
f0e9f38d250f
rebase: prevent creating divergence
Laurent Charignon <lcharignon@fb.com>
parents:
27745
diff
changeset
|
381 |
26349
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
382 # - plain prune (no successor) changesets are rebased |
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
383 # - split changesets are not rebased if at least one of the |
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
384 # changeset resulting from the split is an ancestor of dest |
27745
d3a128e8604a
rebase: create a new variable to make the next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents:
27744
diff
changeset
|
385 rebaseset = rebasesetrevs - rebaseobsskipped |
27577
f9e755736b0e
rebase: better error message when rebased changes are all in destination
Laurent Charignon <lcharignon@fb.com>
parents:
27458
diff
changeset
|
386 if rebasesetrevs and not rebaseset: |
f9e755736b0e
rebase: better error message when rebased changes are all in destination
Laurent Charignon <lcharignon@fb.com>
parents:
27458
diff
changeset
|
387 msg = _('all requested changesets have equivalents ' |
f9e755736b0e
rebase: better error message when rebased changes are all in destination
Laurent Charignon <lcharignon@fb.com>
parents:
27458
diff
changeset
|
388 'or were marked as obsolete') |
f9e755736b0e
rebase: better error message when rebased changes are all in destination
Laurent Charignon <lcharignon@fb.com>
parents:
27458
diff
changeset
|
389 hint = _('to force the rebase, set the config ' |
f9e755736b0e
rebase: better error message when rebased changes are all in destination
Laurent Charignon <lcharignon@fb.com>
parents:
27458
diff
changeset
|
390 'experimental.rebaseskipobsolete to False') |
f9e755736b0e
rebase: better error message when rebased changes are all in destination
Laurent Charignon <lcharignon@fb.com>
parents:
27458
diff
changeset
|
391 raise error.Abort(msg, hint=hint) |
f9e755736b0e
rebase: better error message when rebased changes are all in destination
Laurent Charignon <lcharignon@fb.com>
parents:
27458
diff
changeset
|
392 |
26349
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
393 result = buildstate(repo, dest, rebaseset, collapsef, |
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
394 obsoletenotrebased) |
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
395 |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
396 if not result: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
397 # Empty state built, nothing to rebase |
8615
94ca38e63576
use ui instead of repo.ui when the former is in scope
Martin Geisler <mg@lazybytes.net>
parents:
8454
diff
changeset
|
398 ui.status(_('nothing to rebase\n')) |
26671
66dc39cd7d06
rebase: factor out nothing to rebase return code
Ryan McElroy <rmcelroy@fb.com>
parents:
26669
diff
changeset
|
399 return _nothingtorebase() |
20250
f380b191e085
rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents:
20249
diff
changeset
|
400 |
f380b191e085
rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents:
20249
diff
changeset
|
401 root = min(rebaseset) |
f380b191e085
rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents:
20249
diff
changeset
|
402 if not keepf and not repo[root].mutable(): |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26496
diff
changeset
|
403 raise error.Abort(_("can't rebase public changeset %s") |
19059
53eadcb814fd
rebase: check no-op before checking phase (issue3891)
Siddharth Agarwal <sid0@fb.com>
parents:
18933
diff
changeset
|
404 % repo[root], |
23917
3cbb5bf4035d
messages: quote "hg help" hints consistently
Wagner Bruna <wbruna@yahoo.com>
parents:
23877
diff
changeset
|
405 hint=_('see "hg help phases" for details')) |
20250
f380b191e085
rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents:
20249
diff
changeset
|
406 |
f380b191e085
rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents:
20249
diff
changeset
|
407 originalwd, target, state = result |
f380b191e085
rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents:
20249
diff
changeset
|
408 if collapsef: |
f380b191e085
rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents:
20249
diff
changeset
|
409 targetancestors = repo.changelog.ancestors([target], |
f380b191e085
rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents:
20249
diff
changeset
|
410 inclusive=True) |
f380b191e085
rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents:
20249
diff
changeset
|
411 external = externalparent(repo, state, targetancestors) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
412 |
21027
25ee5dbebc6b
rebase: tell when reopening a closed branch head
Mads Kiilerich <madski@unity3d.com>
parents:
20790
diff
changeset
|
413 if dest.closesbranch() and not keepbranchesf: |
25ee5dbebc6b
rebase: tell when reopening a closed branch head
Mads Kiilerich <madski@unity3d.com>
parents:
20790
diff
changeset
|
414 ui.status(_('reopening closed branch head %s\n') % dest) |
25ee5dbebc6b
rebase: tell when reopening a closed branch head
Mads Kiilerich <madski@unity3d.com>
parents:
20790
diff
changeset
|
415 |
27975
6f92d6bd2972
rebase: backout changeset 986d04b9fedd
Siddharth Agarwal <sid0@fb.com>
parents:
27963
diff
changeset
|
416 if keepbranchesf: |
27976
8f4d3eeb5198
rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents:
27975
diff
changeset
|
417 # insert _savebranch at the start of extrafns so if |
8f4d3eeb5198
rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents:
27975
diff
changeset
|
418 # there's a user-provided extrafn it can clobber branch if |
8f4d3eeb5198
rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents:
27975
diff
changeset
|
419 # desired |
8f4d3eeb5198
rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents:
27975
diff
changeset
|
420 extrafns.insert(0, _savebranch) |
27975
6f92d6bd2972
rebase: backout changeset 986d04b9fedd
Siddharth Agarwal <sid0@fb.com>
parents:
27963
diff
changeset
|
421 if collapsef: |
6f92d6bd2972
rebase: backout changeset 986d04b9fedd
Siddharth Agarwal <sid0@fb.com>
parents:
27963
diff
changeset
|
422 branches = set() |
6f92d6bd2972
rebase: backout changeset 986d04b9fedd
Siddharth Agarwal <sid0@fb.com>
parents:
27963
diff
changeset
|
423 for rev in state: |
6f92d6bd2972
rebase: backout changeset 986d04b9fedd
Siddharth Agarwal <sid0@fb.com>
parents:
27963
diff
changeset
|
424 branches.add(repo[rev].branch()) |
6f92d6bd2972
rebase: backout changeset 986d04b9fedd
Siddharth Agarwal <sid0@fb.com>
parents:
27963
diff
changeset
|
425 if len(branches) > 1: |
6f92d6bd2972
rebase: backout changeset 986d04b9fedd
Siddharth Agarwal <sid0@fb.com>
parents:
27963
diff
changeset
|
426 raise error.Abort(_('cannot collapse multiple named ' |
6f92d6bd2972
rebase: backout changeset 986d04b9fedd
Siddharth Agarwal <sid0@fb.com>
parents:
27963
diff
changeset
|
427 'branches')) |
14897
b9daa5b7a3af
rebase: block collapse with keepbranches on multiple named branches (issue2112)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14884
diff
changeset
|
428 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
429 # Rebase |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
430 if not targetancestors: |
18093
9c76da468a19
rebase: use lazy ancestor membership testing
Siddharth Agarwal <sid0@fb.com>
parents:
17989
diff
changeset
|
431 targetancestors = repo.changelog.ancestors([target], inclusive=True) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
432 |
14884
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
433 # Keep track of the current bookmarks in order to reset them later |
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
434 currentbookmarks = repo._bookmarks.copy() |
24947
a02d293a1079
bookmarks: rename bookmarkcurrent to activebookmark (API)
Ryan McElroy <rmcelroy@fb.com>
parents:
24945
diff
changeset
|
435 activebookmark = activebookmark or repo._activebookmark |
17046
4116504d1ec4
bookmarks: correctly update current bookmarks on rebase (issue2277)
David Schleimer <dschleimer@fb.com>
parents:
17026
diff
changeset
|
436 if activebookmark: |
24944
08ec11e3ae4c
bookmarks: rename unsetcurrent to deactivate (API)
Ryan McElroy <rmcelroy@fb.com>
parents:
24870
diff
changeset
|
437 bookmarks.deactivate(repo) |
14884
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
438 |
19860
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
439 extrafn = _makeextrafn(extrafns) |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
440 |
11729
c91b86a291b0
rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents:
11546
diff
changeset
|
441 sortedstate = sorted(state) |
c91b86a291b0
rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents:
11546
diff
changeset
|
442 total = len(sortedstate) |
c91b86a291b0
rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents:
11546
diff
changeset
|
443 pos = 0 |
c91b86a291b0
rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents:
11546
diff
changeset
|
444 for rev in sortedstate: |
23517
4f18e80d9c30
rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents:
23491
diff
changeset
|
445 ctx = repo[rev] |
4f18e80d9c30
rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents:
23491
diff
changeset
|
446 desc = '%d:%s "%s"' % (ctx.rev(), ctx, |
4f18e80d9c30
rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents:
23491
diff
changeset
|
447 ctx.description().split('\n', 1)[0]) |
4f18e80d9c30
rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents:
23491
diff
changeset
|
448 names = repo.nodetags(ctx.node()) + repo.nodebookmarks(ctx.node()) |
4f18e80d9c30
rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents:
23491
diff
changeset
|
449 if names: |
4f18e80d9c30
rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents:
23491
diff
changeset
|
450 desc += ' (%s)' % ' '.join(names) |
11729
c91b86a291b0
rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents:
11546
diff
changeset
|
451 pos += 1 |
23490
102f144f6e02
rebase: add a 'revtodo' constant
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23489
diff
changeset
|
452 if state[rev] == revtodo: |
23517
4f18e80d9c30
rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents:
23491
diff
changeset
|
453 ui.status(_('rebasing %s\n') % desc) |
4f18e80d9c30
rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents:
23491
diff
changeset
|
454 ui.progress(_("rebasing"), pos, ("%d:%s" % (rev, ctx)), |
12744
0793d763e413
progress: dropping superfluous space from units
timeless <timeless@gmail.com>
parents:
12062
diff
changeset
|
455 _('changesets'), total) |
23484
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
456 p1, p2, base = defineparents(repo, rev, target, state, |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
457 targetancestors) |
7952
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
458 storestatus(repo, originalwd, target, state, collapsef, keepf, |
18755
72412afe4c28
rebase: restore active bookmark after rebase --continue
Durham Goode <durham@fb.com>
parents:
18549
diff
changeset
|
459 keepbranchesf, external, activebookmark) |
27167
3fe8cb40c9c5
commands: inline definition of localrepo.parents() and drop the method (API)
Augie Fackler <augie@google.com>
parents:
27146
diff
changeset
|
460 if len(repo[None].parents()) == 2: |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
461 repo.ui.debug('resuming interrupted rebase\n') |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
462 else: |
13856
0995eee8ffe4
rebase: add --tool argument for specifying merge tool
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
13778
diff
changeset
|
463 try: |
20790
49f2d5644f04
config: set a 'source' in most cases where config don't come from file but code
Mads Kiilerich <madski@unity3d.com>
parents:
20773
diff
changeset
|
464 ui.setconfig('ui', 'forcemerge', opts.get('tool', ''), |
49f2d5644f04
config: set a 'source' in most cases where config don't come from file but code
Mads Kiilerich <madski@unity3d.com>
parents:
20773
diff
changeset
|
465 'rebase') |
23484
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
466 stats = rebasenode(repo, rev, p1, base, state, |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
467 collapsef, target) |
13856
0995eee8ffe4
rebase: add --tool argument for specifying merge tool
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
13778
diff
changeset
|
468 if stats and stats[3] > 0: |
18933
42b620fc89e2
rebase: switch from util.Abort to util.InterventionRequired where appropriate (bc)
Augie Fackler <raf@durin42.com>
parents:
18764
diff
changeset
|
469 raise error.InterventionRequired( |
42b620fc89e2
rebase: switch from util.Abort to util.InterventionRequired where appropriate (bc)
Augie Fackler <raf@durin42.com>
parents:
18764
diff
changeset
|
470 _('unresolved conflicts (see hg ' |
42b620fc89e2
rebase: switch from util.Abort to util.InterventionRequired where appropriate (bc)
Augie Fackler <raf@durin42.com>
parents:
18764
diff
changeset
|
471 'resolve, then hg rebase --continue)')) |
13856
0995eee8ffe4
rebase: add --tool argument for specifying merge tool
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
13778
diff
changeset
|
472 finally: |
20790
49f2d5644f04
config: set a 'source' in most cases where config don't come from file but code
Mads Kiilerich <madski@unity3d.com>
parents:
20773
diff
changeset
|
473 ui.setconfig('ui', 'forcemerge', '', 'rebase') |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
474 if not collapsef: |
23461
ffef6d503ab2
rebase: avoid redundant repo[rev].rev() - just keep working in rev space
Mads Kiilerich <madski@unity3d.com>
parents:
23460
diff
changeset
|
475 merging = p2 != nullrev |
22251
d0d3e5c6eb3c
rebase: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22206
diff
changeset
|
476 editform = cmdutil.mergeeditform(merging, 'rebase') |
d0d3e5c6eb3c
rebase: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22206
diff
changeset
|
477 editor = cmdutil.getcommiteditor(editform=editform, **opts) |
23459
2e047b1558a5
rebase: clarify naming of variables holding node hashes - don't call them rev
Mads Kiilerich <madski@unity3d.com>
parents:
23457
diff
changeset
|
478 newnode = concludenode(repo, rev, p1, p2, extrafn=extrafn, |
26360
b2415e94b2f5
rebase: avoid losing branch commits with --keepbranch (issue4835)
timeless@mozdev.org
parents:
26349
diff
changeset
|
479 editor=editor, |
26869
412e8c5e38b4
rebase: pass date parameter to concludenode
Stanislau Hlebik <stash@fb.com>
parents:
26868
diff
changeset
|
480 keepbranches=keepbranchesf, |
412e8c5e38b4
rebase: pass date parameter to concludenode
Stanislau Hlebik <stash@fb.com>
parents:
26868
diff
changeset
|
481 date=date) |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
482 else: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
483 # Skip commit if we are collapsing |
22405
6f63c47cbb86
dirstate: wrap setparent calls with begin/endparentchange (issue4353)
Durham Goode <durham@fb.com>
parents:
22388
diff
changeset
|
484 repo.dirstate.beginparentchange() |
16551
ebf6d38c9063
localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents:
16531
diff
changeset
|
485 repo.setparents(repo[p1].node()) |
22405
6f63c47cbb86
dirstate: wrap setparent calls with begin/endparentchange (issue4353)
Durham Goode <durham@fb.com>
parents:
22388
diff
changeset
|
486 repo.dirstate.endparentchange() |
23459
2e047b1558a5
rebase: clarify naming of variables holding node hashes - don't call them rev
Mads Kiilerich <madski@unity3d.com>
parents:
23457
diff
changeset
|
487 newnode = None |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
488 # Update the state |
23459
2e047b1558a5
rebase: clarify naming of variables holding node hashes - don't call them rev
Mads Kiilerich <madski@unity3d.com>
parents:
23457
diff
changeset
|
489 if newnode is not None: |
2e047b1558a5
rebase: clarify naming of variables holding node hashes - don't call them rev
Mads Kiilerich <madski@unity3d.com>
parents:
23457
diff
changeset
|
490 state[rev] = repo[newnode].rev() |
23519
8872d1bf30da
rebase: improve debug messages while processing the list of rebases
Mads Kiilerich <madski@unity3d.com>
parents:
23518
diff
changeset
|
491 ui.debug('rebased as %s\n' % short(newnode)) |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
492 else: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
493 if not collapsef: |
26811
d1561a422748
rebase: fix wrong 'no changes to commit' when using --collapse
Mads Kiilerich <madski@unity3d.com>
parents:
26781
diff
changeset
|
494 ui.warn(_('note: rebase of %d:%s created no changes ' |
d1561a422748
rebase: fix wrong 'no changes to commit' when using --collapse
Mads Kiilerich <madski@unity3d.com>
parents:
26781
diff
changeset
|
495 'to commit\n') % (rev, ctx)) |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
496 skipped.add(rev) |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
497 state[rev] = p1 |
23519
8872d1bf30da
rebase: improve debug messages while processing the list of rebases
Mads Kiilerich <madski@unity3d.com>
parents:
23518
diff
changeset
|
498 ui.debug('next revision set to %s\n' % p1) |
23517
4f18e80d9c30
rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents:
23491
diff
changeset
|
499 elif state[rev] == nullmerge: |
23519
8872d1bf30da
rebase: improve debug messages while processing the list of rebases
Mads Kiilerich <madski@unity3d.com>
parents:
23518
diff
changeset
|
500 ui.debug('ignoring null merge rebase of %s\n' % rev) |
23517
4f18e80d9c30
rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents:
23491
diff
changeset
|
501 elif state[rev] == revignored: |
4f18e80d9c30
rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents:
23491
diff
changeset
|
502 ui.status(_('not rebasing ignored %s\n') % desc) |
26349
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
503 elif state[rev] == revprecursor: |
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
504 targetctx = repo[obsoletenotrebased[rev]] |
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
505 desctarget = '%d:%s "%s"' % (targetctx.rev(), targetctx, |
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
506 targetctx.description().split('\n', 1)[0]) |
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
507 msg = _('note: not rebasing %s, already in destination as %s\n') |
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
508 ui.status(msg % (desc, desctarget)) |
27012
5eac7ab59b95
rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents:
27010
diff
changeset
|
509 elif state[rev] == revpruned: |
5eac7ab59b95
rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents:
27010
diff
changeset
|
510 msg = _('note: not rebasing %s, it has no successor\n') |
5eac7ab59b95
rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents:
27010
diff
changeset
|
511 ui.status(msg % desc) |
23517
4f18e80d9c30
rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents:
23491
diff
changeset
|
512 else: |
4f18e80d9c30
rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents:
23491
diff
changeset
|
513 ui.status(_('already rebased %s as %s\n') % |
4f18e80d9c30
rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents:
23491
diff
changeset
|
514 (desc, repo[state[rev]])) |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
515 |
11729
c91b86a291b0
rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents:
11546
diff
changeset
|
516 ui.progress(_('rebasing'), None) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
517 ui.note(_('rebase merging completed\n')) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
518 |
10677
f2558a8228be
rebase: add option to not commit after a collapsing
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10676
diff
changeset
|
519 if collapsef and not keepopen: |
23484
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
520 p1, p2, _base = defineparents(repo, min(state), target, |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
521 state, targetancestors) |
22206
6122ad50e38f
rebase: use "rebase.collapse" as "editform" for "--collapse" always
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22038
diff
changeset
|
522 editopt = opts.get('edit') |
6122ad50e38f
rebase: use "rebase.collapse" as "editform" for "--collapse" always
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22038
diff
changeset
|
523 editform = 'rebase.collapse' |
13661
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
524 if collapsemsg: |
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
525 commitmsg = collapsemsg |
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
526 else: |
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
527 commitmsg = 'Collapsed revision' |
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
528 for rebased in state: |
18446
c83d36b81df1
rebase: lose the comparison to `nullmerge`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18444
diff
changeset
|
529 if rebased not in skipped and state[rebased] > nullmerge: |
13661
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
530 commitmsg += '\n* %s' % repo[rebased].description() |
22206
6122ad50e38f
rebase: use "rebase.collapse" as "editform" for "--collapse" always
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22038
diff
changeset
|
531 editopt = True |
6122ad50e38f
rebase: use "rebase.collapse" as "editform" for "--collapse" always
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22038
diff
changeset
|
532 editor = cmdutil.getcommiteditor(edit=editopt, editform=editform) |
23459
2e047b1558a5
rebase: clarify naming of variables holding node hashes - don't call them rev
Mads Kiilerich <madski@unity3d.com>
parents:
23457
diff
changeset
|
533 newnode = concludenode(repo, rev, p1, external, commitmsg=commitmsg, |
26360
b2415e94b2f5
rebase: avoid losing branch commits with --keepbranch (issue4835)
timeless@mozdev.org
parents:
26349
diff
changeset
|
534 extrafn=extrafn, editor=editor, |
26869
412e8c5e38b4
rebase: pass date parameter to concludenode
Stanislau Hlebik <stash@fb.com>
parents:
26868
diff
changeset
|
535 keepbranches=keepbranchesf, |
412e8c5e38b4
rebase: pass date parameter to concludenode
Stanislau Hlebik <stash@fb.com>
parents:
26868
diff
changeset
|
536 date=date) |
23460
8dc45c905989
rebase: always store rev in state, also when collapsing
Mads Kiilerich <madski@unity3d.com>
parents:
23459
diff
changeset
|
537 if newnode is None: |
8dc45c905989
rebase: always store rev in state, also when collapsing
Mads Kiilerich <madski@unity3d.com>
parents:
23459
diff
changeset
|
538 newrev = target |
8dc45c905989
rebase: always store rev in state, also when collapsing
Mads Kiilerich <madski@unity3d.com>
parents:
23459
diff
changeset
|
539 else: |
8dc45c905989
rebase: always store rev in state, also when collapsing
Mads Kiilerich <madski@unity3d.com>
parents:
23459
diff
changeset
|
540 newrev = repo[newnode].rev() |
19986
ea81f8b2364e
rebase: fix working copy location after a --collapse (issue4080)
Durham Goode <durham@fb.com>
parents:
19984
diff
changeset
|
541 for oldrev in state.iterkeys(): |
ea81f8b2364e
rebase: fix working copy location after a --collapse (issue4080)
Durham Goode <durham@fb.com>
parents:
19984
diff
changeset
|
542 if state[oldrev] > nullmerge: |
23460
8dc45c905989
rebase: always store rev in state, also when collapsing
Mads Kiilerich <madski@unity3d.com>
parents:
23459
diff
changeset
|
543 state[oldrev] = newrev |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
544 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
545 if 'qtip' in repo.tags(): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
546 updatemq(repo, state, skipped, **opts) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
547 |
14884
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
548 if currentbookmarks: |
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
549 # Nodeids are needed to reset bookmarks |
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
550 nstate = {} |
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
551 for k, v in state.iteritems(): |
18446
c83d36b81df1
rebase: lose the comparison to `nullmerge`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18444
diff
changeset
|
552 if v > nullmerge: |
14884
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
553 nstate[repo[k].node()] = repo[v].node() |
18549
12de53323e59
rebase: derive node from target rev (issue3802)
Siddharth Agarwal <sid0@fb.com>
parents:
18518
diff
changeset
|
554 # XXX this is the same as dest.node() for the non-continue path -- |
12de53323e59
rebase: derive node from target rev (issue3802)
Siddharth Agarwal <sid0@fb.com>
parents:
18518
diff
changeset
|
555 # this should probably be cleaned up |
12de53323e59
rebase: derive node from target rev (issue3802)
Siddharth Agarwal <sid0@fb.com>
parents:
18518
diff
changeset
|
556 targetnode = repo[target].node() |
14884
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
557 |
19925
9c78ed396075
rebase: preserve working directory parent (BC)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19861
diff
changeset
|
558 # restore original working directory |
9c78ed396075
rebase: preserve working directory parent (BC)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19861
diff
changeset
|
559 # (we do this before stripping) |
9c78ed396075
rebase: preserve working directory parent (BC)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19861
diff
changeset
|
560 newwd = state.get(originalwd, originalwd) |
23440
57d35d3c1cf1
rebase: ignore negative state when updating back to original wc parent
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23246
diff
changeset
|
561 if newwd < 0: |
57d35d3c1cf1
rebase: ignore negative state when updating back to original wc parent
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23246
diff
changeset
|
562 # original directory is a parent of rebase set root or ignored |
57d35d3c1cf1
rebase: ignore negative state when updating back to original wc parent
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23246
diff
changeset
|
563 newwd = originalwd |
19925
9c78ed396075
rebase: preserve working directory parent (BC)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19861
diff
changeset
|
564 if newwd not in [c.rev() for c in repo[None].parents()]: |
9c78ed396075
rebase: preserve working directory parent (BC)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19861
diff
changeset
|
565 ui.note(_("update back to initial working directory parent\n")) |
9c78ed396075
rebase: preserve working directory parent (BC)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19861
diff
changeset
|
566 hg.updaterepo(repo, newwd, False) |
9c78ed396075
rebase: preserve working directory parent (BC)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19861
diff
changeset
|
567 |
7952
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
568 if not keepf: |
17613
aafc521668d8
rebase: properly handle --collapse when creating obsolescence marker
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17612
diff
changeset
|
569 collapsedas = None |
aafc521668d8
rebase: properly handle --collapse when creating obsolescence marker
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17612
diff
changeset
|
570 if collapsef: |
23459
2e047b1558a5
rebase: clarify naming of variables holding node hashes - don't call them rev
Mads Kiilerich <madski@unity3d.com>
parents:
23457
diff
changeset
|
571 collapsedas = newnode |
18444
55aff0c2b73c
rebase: do not invent successor to skipped changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18424
diff
changeset
|
572 clearrebased(ui, repo, state, skipped, collapsedas) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
573 |
27866
f54bf1f41566
with: use context manager for transaction in rebase
Bryan O'Sullivan <bryano@fb.com>
parents:
27790
diff
changeset
|
574 with repo.transaction('bookmark') as tr: |
27058
616ea95c8f11
rebase: indentation change to make the next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents:
27014
diff
changeset
|
575 if currentbookmarks: |
27059
405320cd6198
rebase: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents:
27058
diff
changeset
|
576 updatebookmarks(repo, targetnode, nstate, currentbookmarks, tr) |
27058
616ea95c8f11
rebase: indentation change to make the next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents:
27014
diff
changeset
|
577 if activebookmark not in repo._bookmarks: |
616ea95c8f11
rebase: indentation change to make the next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents:
27014
diff
changeset
|
578 # active bookmark was divergent one and has been deleted |
616ea95c8f11
rebase: indentation change to make the next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents:
27014
diff
changeset
|
579 activebookmark = None |
27229
40a2f972f26d
rebase: only clear rebase status after the rebase transaction has completed
Laurent Charignon <lcharignon@fb.com>
parents:
27167
diff
changeset
|
580 clearstatus(repo) |
14884
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
581 |
11203
7a9cf012dddc
rebase: only show "rebase completed" message with -v
Matt Mackall <mpm@selenic.com>
parents:
11201
diff
changeset
|
582 ui.note(_("rebase completed\n")) |
18386
03442135dff4
refactoring: use unlinkpath with ignoremissing
Mads Kiilerich <madski@unity3d.com>
parents:
18269
diff
changeset
|
583 util.unlinkpath(repo.sjoin('undo'), ignoremissing=True) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
584 if skipped: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
585 ui.note(_("%d revisions have been skipped\n") % len(skipped)) |
17046
4116504d1ec4
bookmarks: correctly update current bookmarks on rebase (issue2277)
David Schleimer <dschleimer@fb.com>
parents:
17026
diff
changeset
|
586 |
4116504d1ec4
bookmarks: correctly update current bookmarks on rebase (issue2277)
David Schleimer <dschleimer@fb.com>
parents:
17026
diff
changeset
|
587 if (activebookmark and |
19926
0f99747202f9
rebase: preserve active bookmark when not at head (issue3813)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19925
diff
changeset
|
588 repo['.'].node() == repo._bookmarks[activebookmark]): |
24945
e0b0fbd47491
bookmarks: rename setcurrent to activate (API)
Ryan McElroy <rmcelroy@fb.com>
parents:
24944
diff
changeset
|
589 bookmarks.activate(repo, activebookmark) |
17046
4116504d1ec4
bookmarks: correctly update current bookmarks on rebase (issue2277)
David Schleimer <dschleimer@fb.com>
parents:
17026
diff
changeset
|
590 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
591 finally: |
8112
6ee71f78497c
switch lock releasing in the extensions from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
8076
diff
changeset
|
592 release(lock, wlock) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
593 |
19955
2160c2e0d7d1
rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents:
19951
diff
changeset
|
594 def externalparent(repo, state, targetancestors): |
2160c2e0d7d1
rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents:
19951
diff
changeset
|
595 """Return the revision that should be used as the second parent |
2160c2e0d7d1
rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents:
19951
diff
changeset
|
596 when the revisions in state is collapsed on top of targetancestors. |
2160c2e0d7d1
rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents:
19951
diff
changeset
|
597 Abort if there is more than one parent. |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
598 """ |
19955
2160c2e0d7d1
rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents:
19951
diff
changeset
|
599 parents = set() |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
600 source = min(state) |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
601 for rev in state: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
602 if rev == source: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
603 continue |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
604 for p in repo[rev].parents(): |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
605 if (p.rev() not in state |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
606 and p.rev() not in targetancestors): |
19955
2160c2e0d7d1
rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents:
19951
diff
changeset
|
607 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
|
608 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
|
609 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
|
610 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
|
611 return parents.pop() |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26496
diff
changeset
|
612 raise error.Abort(_('unable to collapse on top of %s, there is more ' |
19956
78ab0f85e249
rebase: improve error message for more than one external parent
Mads Kiilerich <madski@unity3d.com>
parents:
19955
diff
changeset
|
613 'than one external parent: %s') % |
78ab0f85e249
rebase: improve error message for more than one external parent
Mads Kiilerich <madski@unity3d.com>
parents:
19955
diff
changeset
|
614 (max(targetancestors), |
78ab0f85e249
rebase: improve error message for more than one external parent
Mads Kiilerich <madski@unity3d.com>
parents:
19955
diff
changeset
|
615 ', '.join(str(p) for p in sorted(parents)))) |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
616 |
26360
b2415e94b2f5
rebase: avoid losing branch commits with --keepbranch (issue4835)
timeless@mozdev.org
parents:
26349
diff
changeset
|
617 def concludenode(repo, rev, p1, p2, commitmsg=None, editor=None, extrafn=None, |
26868
a2aa39a725a1
rebase: add date parameter to concludenode function
Stanislau Hlebik <stash@fb.com>
parents:
26811
diff
changeset
|
618 keepbranches=False, date=None): |
23484
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
619 '''Commit the wd changes with parents p1 and p2. Reuse commit info from rev |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
620 but also store useful information in extra. |
23459
2e047b1558a5
rebase: clarify naming of variables holding node hashes - don't call them rev
Mads Kiilerich <madski@unity3d.com>
parents:
23457
diff
changeset
|
621 Return node of committed revision.''' |
24998
c8a97fa742b7
rebase: use dirstateguard instead of dirstate.invalidate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24947
diff
changeset
|
622 dsguard = cmdutil.dirstateguard(repo, 'rebase') |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
623 try: |
16551
ebf6d38c9063
localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents:
16531
diff
changeset
|
624 repo.setparents(repo[p1].node(), repo[p2].node()) |
11537
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
625 ctx = repo[rev] |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
626 if commitmsg is None: |
11537
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
627 commitmsg = ctx.description() |
26360
b2415e94b2f5
rebase: avoid losing branch commits with --keepbranch (issue4835)
timeless@mozdev.org
parents:
26349
diff
changeset
|
628 keepbranch = keepbranches and repo[p1].branch() != ctx.branch() |
27977
b698abf971e7
rebase: don't preserve most extra fields
Siddharth Agarwal <sid0@fb.com>
parents:
27976
diff
changeset
|
629 extra = {'rebase_source': ctx.hex()} |
10762
129e96f7a87a
rebase: fix --collapse with --keepbranches (issue2100)
Patrick Mezard <pmezard@gmail.com>
parents:
10672
diff
changeset
|
630 if extrafn: |
129e96f7a87a
rebase: fix --collapse with --keepbranches (issue2100)
Patrick Mezard <pmezard@gmail.com>
parents:
10672
diff
changeset
|
631 extrafn(ctx, extra) |
22038
021becbf024a
rebase: do not retract phase boundary by hand
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22004
diff
changeset
|
632 |
021becbf024a
rebase: do not retract phase boundary by hand
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22004
diff
changeset
|
633 backup = repo.ui.backupconfig('phases', 'new-commit') |
021becbf024a
rebase: do not retract phase boundary by hand
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22004
diff
changeset
|
634 try: |
021becbf024a
rebase: do not retract phase boundary by hand
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22004
diff
changeset
|
635 targetphase = max(ctx.phase(), phases.draft) |
021becbf024a
rebase: do not retract phase boundary by hand
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22004
diff
changeset
|
636 repo.ui.setconfig('phases', 'new-commit', targetphase, 'rebase') |
26360
b2415e94b2f5
rebase: avoid losing branch commits with --keepbranch (issue4835)
timeless@mozdev.org
parents:
26349
diff
changeset
|
637 if keepbranch: |
b2415e94b2f5
rebase: avoid losing branch commits with --keepbranch (issue4835)
timeless@mozdev.org
parents:
26349
diff
changeset
|
638 repo.ui.setconfig('ui', 'allowemptycommit', True) |
22038
021becbf024a
rebase: do not retract phase boundary by hand
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22004
diff
changeset
|
639 # Commit might fail if unresolved files exist |
26868
a2aa39a725a1
rebase: add date parameter to concludenode function
Stanislau Hlebik <stash@fb.com>
parents:
26811
diff
changeset
|
640 if date is None: |
a2aa39a725a1
rebase: add date parameter to concludenode function
Stanislau Hlebik <stash@fb.com>
parents:
26811
diff
changeset
|
641 date = ctx.date() |
23459
2e047b1558a5
rebase: clarify naming of variables holding node hashes - don't call them rev
Mads Kiilerich <madski@unity3d.com>
parents:
23457
diff
changeset
|
642 newnode = repo.commit(text=commitmsg, user=ctx.user(), |
26868
a2aa39a725a1
rebase: add date parameter to concludenode function
Stanislau Hlebik <stash@fb.com>
parents:
26811
diff
changeset
|
643 date=date, 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
|
644 finally: |
021becbf024a
rebase: do not retract phase boundary by hand
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22004
diff
changeset
|
645 repo.ui.restoreconfig(backup) |
021becbf024a
rebase: do not retract phase boundary by hand
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22004
diff
changeset
|
646 |
23459
2e047b1558a5
rebase: clarify naming of variables holding node hashes - don't call them rev
Mads Kiilerich <madski@unity3d.com>
parents:
23457
diff
changeset
|
647 repo.dirstate.setbranch(repo[newnode].branch()) |
24998
c8a97fa742b7
rebase: use dirstateguard instead of dirstate.invalidate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24947
diff
changeset
|
648 dsguard.close() |
23459
2e047b1558a5
rebase: clarify naming of variables holding node hashes - don't call them rev
Mads Kiilerich <madski@unity3d.com>
parents:
23457
diff
changeset
|
649 return newnode |
24998
c8a97fa742b7
rebase: use dirstateguard instead of dirstate.invalidate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24947
diff
changeset
|
650 finally: |
c8a97fa742b7
rebase: use dirstateguard instead of dirstate.invalidate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
24947
diff
changeset
|
651 release(dsguard) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
652 |
23484
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
653 def rebasenode(repo, rev, p1, base, state, collapse, target): |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
654 '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
|
655 # Merge phase |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
656 # Update to target and merge it with local |
23461
ffef6d503ab2
rebase: avoid redundant repo[rev].rev() - just keep working in rev space
Mads Kiilerich <madski@unity3d.com>
parents:
23460
diff
changeset
|
657 if repo['.'].rev() != p1: |
ffef6d503ab2
rebase: avoid redundant repo[rev].rev() - just keep working in rev space
Mads Kiilerich <madski@unity3d.com>
parents:
23460
diff
changeset
|
658 repo.ui.debug(" update to %d:%s\n" % (p1, repo[p1])) |
27344
43c00ca887d1
merge: have merge.update use a matcher instead of partial fn
Augie Fackler <augie@google.com>
parents:
27261
diff
changeset
|
659 merge.update(repo, p1, False, True) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
660 else: |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
661 repo.ui.debug(" already in target\n") |
26748
5ba0a99ff27f
dirstate: make dirstate.write() callers pass transaction object to it
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
26745
diff
changeset
|
662 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
|
663 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
|
664 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
|
665 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
|
666 # 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
|
667 # have to allow merging with it. |
27344
43c00ca887d1
merge: have merge.update use a matcher instead of partial fn
Augie Fackler <augie@google.com>
parents:
27261
diff
changeset
|
668 stats = merge.update(repo, rev, True, True, base, collapse, |
21526
3b40e32e88c3
rebase: specify custom conflict marker labels for rebase (BC)
Durham Goode <durham@fb.com>
parents:
21410
diff
changeset
|
669 labels=['dest', 'source']) |
22905
63e889cc610d
rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents:
22901
diff
changeset
|
670 if collapse: |
63e889cc610d
rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents:
22901
diff
changeset
|
671 copies.duplicatecopies(repo, rev, target) |
63e889cc610d
rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents:
22901
diff
changeset
|
672 else: |
63e889cc610d
rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents:
22901
diff
changeset
|
673 # 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
|
674 # duplicate copies between the revision we're |
63e889cc610d
rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents:
22901
diff
changeset
|
675 # rebasing and its first parent, but *not* |
63e889cc610d
rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents:
22901
diff
changeset
|
676 # duplicate any copies that have already been |
63e889cc610d
rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents:
22901
diff
changeset
|
677 # performed in the destination. |
63e889cc610d
rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents:
22901
diff
changeset
|
678 p1rev = repo[rev].p1().rev() |
63e889cc610d
rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents:
22901
diff
changeset
|
679 copies.duplicatecopies(repo, rev, p1rev, skiprev=target) |
63e889cc610d
rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents:
22901
diff
changeset
|
680 return stats |
6923
ebf1462f2145
strip trailing whitespace, replace tabs by spaces
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6906
diff
changeset
|
681 |
18447
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
682 def nearestrebased(repo, rev, state): |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
683 """return the nearest ancestors of rev in the rebase result""" |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
684 rebased = [r for r in state if state[r] > nullmerge] |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
685 candidates = repo.revs('max(%ld and (::%d))', rebased, rev) |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
686 if candidates: |
22820
103dcfbb385f
rebase: use `last` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22790
diff
changeset
|
687 return state[candidates.first()] |
18447
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
688 else: |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
689 return None |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
690 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
691 def defineparents(repo, rev, target, state, targetancestors): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
692 'Return the new parent relationship of the revision that will be rebased' |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
693 parents = repo[rev].parents() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
694 p1 = p2 = nullrev |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
695 |
22906
75d0edb68b41
rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents:
22905
diff
changeset
|
696 p1n = parents[0].rev() |
75d0edb68b41
rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents:
22905
diff
changeset
|
697 if p1n in targetancestors: |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
698 p1 = target |
22906
75d0edb68b41
rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents:
22905
diff
changeset
|
699 elif p1n in state: |
75d0edb68b41
rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents:
22905
diff
changeset
|
700 if state[p1n] == nullmerge: |
10352
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
701 p1 = target |
27014
4223fc58f952
rebase: refactoring to avoid repetition of expression
Laurent Charignon <lcharignon@fb.com>
parents:
27013
diff
changeset
|
702 elif state[p1n] in revskipped: |
22906
75d0edb68b41
rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents:
22905
diff
changeset
|
703 p1 = nearestrebased(repo, p1n, state) |
18447
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
704 if p1 is None: |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
705 p1 = target |
10352
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
706 else: |
22906
75d0edb68b41
rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents:
22905
diff
changeset
|
707 p1 = state[p1n] |
75d0edb68b41
rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents:
22905
diff
changeset
|
708 else: # p1n external |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
709 p1 = target |
22906
75d0edb68b41
rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents:
22905
diff
changeset
|
710 p2 = p1n |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
711 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
712 if len(parents) == 2 and parents[1].rev() not in targetancestors: |
22906
75d0edb68b41
rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents:
22905
diff
changeset
|
713 p2n = parents[1].rev() |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
714 # interesting second parent |
22906
75d0edb68b41
rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents:
22905
diff
changeset
|
715 if p2n in state: |
75d0edb68b41
rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents:
22905
diff
changeset
|
716 if p1 == target: # p1n in targetancestors or external |
75d0edb68b41
rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents:
22905
diff
changeset
|
717 p1 = state[p2n] |
27014
4223fc58f952
rebase: refactoring to avoid repetition of expression
Laurent Charignon <lcharignon@fb.com>
parents:
27013
diff
changeset
|
718 elif state[p2n] in revskipped: |
22906
75d0edb68b41
rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents:
22905
diff
changeset
|
719 p2 = nearestrebased(repo, p2n, state) |
18447
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
720 if p2 is None: |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
721 # no ancestors rebased yet, detach |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
722 p2 = target |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
723 else: |
22906
75d0edb68b41
rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents:
22905
diff
changeset
|
724 p2 = state[p2n] |
75d0edb68b41
rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents:
22905
diff
changeset
|
725 else: # p2n external |
75d0edb68b41
rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents:
22905
diff
changeset
|
726 if p2 != nullrev: # p1n external too => rev is a merged revision |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26496
diff
changeset
|
727 raise error.Abort(_('cannot use revision %d as base, result ' |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
728 'would have 3 parents') % rev) |
22906
75d0edb68b41
rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents:
22905
diff
changeset
|
729 p2 = p2n |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
730 repo.ui.debug(" future parents are %d and %d\n" % |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
731 (repo[p1].rev(), repo[p2].rev())) |
23484
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
732 |
27963
07a5de79ec30
rebase: better way to detect non-detaching revisions (issue5044)
Martijn Pieters <mj@zopatista.com>
parents:
27959
diff
changeset
|
733 if not any(p.rev() in state for p in parents): |
07a5de79ec30
rebase: better way to detect non-detaching revisions (issue5044)
Martijn Pieters <mj@zopatista.com>
parents:
27959
diff
changeset
|
734 # Case (1) root changeset of a non-detaching rebase set. |
23484
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
735 # Let the merge mechanism find the base itself. |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
736 base = None |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
737 elif not repo[rev].p2(): |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
738 # Case (2) detaching the node with a single parent, use this parent |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
739 base = repo[rev].p1().rev() |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
740 else: |
23732
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
741 # Assuming there is a p1, this is the case where there also is a p2. |
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
742 # We are thus rebasing a merge and need to pick the right merge base. |
23484
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
743 # |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
744 # Imagine we have: |
23732
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
745 # - M: current rebase revision in this step |
23484
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
746 # - A: one parent of M |
23732
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
747 # - B: other parent of M |
23484
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
748 # - D: destination of this merge step (p1 var) |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
749 # |
23732
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
750 # Consider the case where D is a descendant of A or B and the other is |
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
751 # 'outside'. In this case, the right merge base is the D ancestor. |
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
752 # |
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
753 # An informal proof, assuming A is 'outside' and B is the D ancestor: |
23484
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
754 # |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
755 # If we pick B as the base, the merge involves: |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
756 # - changes from B to M (actual changeset payload) |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
757 # - changes from B to D (induced by rebase) as D is a rebased |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
758 # version of B) |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
759 # Which exactly represent the rebase operation. |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
760 # |
23732
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
761 # If we pick A as the base, the merge involves: |
23484
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
762 # - changes from A to M (actual changeset payload) |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
763 # - changes from A to D (with include changes between unrelated A and B |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
764 # plus changes induced by rebase) |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
765 # Which does not represent anything sensible and creates a lot of |
23732
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
766 # conflicts. A is thus not the right choice - B is. |
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
767 # |
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
768 # Note: The base found in this 'proof' is only correct in the specified |
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
769 # case. This base does not make sense if is not D a descendant of A or B |
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
770 # or if the other is not parent 'outside' (especially not if the other |
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
771 # parent has been rebased). The current implementation does not |
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
772 # make it feasible to consider different cases separately. In these |
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
773 # other cases we currently just leave it to the user to correctly |
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
774 # resolve an impossible merge using a wrong ancestor. |
23484
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
775 for p in repo[rev].parents(): |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
776 if state.get(p.rev()) == p1: |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
777 base = p.rev() |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
778 break |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
779 else: # fallback when base not found |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
780 base = None |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
781 |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
782 # Raise because this function is called wrong (see issue 4106) |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
783 raise AssertionError('no base found to rebase on ' |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
784 '(defineparents called wrong)') |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
785 return p1, p2, base |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
786 |
7955
c3d4ff03ec72
rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7954
diff
changeset
|
787 def isagitpatch(repo, patchname): |
c3d4ff03ec72
rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7954
diff
changeset
|
788 '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
|
789 mqpatch = os.path.join(repo.mq.path, patchname) |
c3d4ff03ec72
rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7954
diff
changeset
|
790 for line in patch.linereader(file(mqpatch, 'rb')): |
c3d4ff03ec72
rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7954
diff
changeset
|
791 if line.startswith('diff --git'): |
c3d4ff03ec72
rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7954
diff
changeset
|
792 return True |
c3d4ff03ec72
rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7954
diff
changeset
|
793 return False |
c3d4ff03ec72
rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7954
diff
changeset
|
794 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
795 def updatemq(repo, state, skipped, **opts): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
796 'Update rebased mq patches - finalize and then import them' |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
797 mqrebase = {} |
11537
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
798 mq = repo.mq |
14572
8ff2957c1d82
mq: rename full_series to fullseries
Adrian Buehlmann <adrian@cadifra.com>
parents:
14509
diff
changeset
|
799 original_series = mq.fullseries[:] |
16531
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
800 skippedpatches = set() |
14497
ea585f2b1adc
rebase: restore mq guards after rebasing (issue2107)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
13894
diff
changeset
|
801 |
11537
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
802 for p in mq.applied: |
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
803 rev = repo[p.node].rev() |
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
804 if rev in state: |
9467
4c041f1ee1b4
do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents:
9301
diff
changeset
|
805 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
|
806 (rev, p.name)) |
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
807 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
|
808 else: |
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
809 # 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
|
810 skippedpatches.add(p.name) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
811 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
812 if mqrebase: |
11537
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
813 mq.finish(repo, mqrebase.keys()) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
814 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
815 # 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
|
816 for rev in sorted(mqrebase, reverse=True): |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
817 if rev not in skipped: |
11537
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
818 name, isgit = mqrebase[rev] |
23520
de143427c499
rebase: show a note for updated mq patches
Mads Kiilerich <mads@kiilerich.com>
parents:
23519
diff
changeset
|
819 repo.ui.note(_('updating mq patch %s to %s:%s\n') % |
de143427c499
rebase: show a note for updated mq patches
Mads Kiilerich <mads@kiilerich.com>
parents:
23519
diff
changeset
|
820 (name, state[rev], repo[state[rev]])) |
11537
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
821 mq.qimport(repo, (), patchname=name, git=isgit, |
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
822 rev=[str(state[rev])]) |
16531
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
823 else: |
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
824 # Rebased and skipped |
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
825 skippedpatches.add(mqrebase[rev][0]) |
14497
ea585f2b1adc
rebase: restore mq guards after rebasing (issue2107)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
13894
diff
changeset
|
826 |
16531
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
827 # 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
|
828 # 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
|
829 # 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
|
830 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
|
831 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
|
832 mq.fullseries[:] = newseries |
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
833 mq.seriesdirty = True |
14580
92101ea35015
mq: rename save_dirty to savedirty
Adrian Buehlmann <adrian@cadifra.com>
parents:
14572
diff
changeset
|
834 mq.savedirty() |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
835 |
27059
405320cd6198
rebase: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents:
27058
diff
changeset
|
836 def updatebookmarks(repo, targetnode, nstate, originalbookmarks, tr): |
18514
2a1fac3650a5
rebase: delete divergent bookmarks on destination (issue3685)
Siddharth Agarwal <sid0@fb.com>
parents:
18512
diff
changeset
|
837 'Move bookmarks to their correct changesets, and delete divergent ones' |
17922
7f5dab94e48c
bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents:
17615
diff
changeset
|
838 marks = repo._bookmarks |
14884
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
839 for k, v in originalbookmarks.iteritems(): |
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
840 if v in nstate: |
18512
22978b82ab4b
rebase: remove bogus nullmerge check in updatebookmarks
Siddharth Agarwal <sid0@fb.com>
parents:
18447
diff
changeset
|
841 # update the bookmarks for revs that have moved |
22978b82ab4b
rebase: remove bogus nullmerge check in updatebookmarks
Siddharth Agarwal <sid0@fb.com>
parents:
18447
diff
changeset
|
842 marks[k] = nstate[v] |
18549
12de53323e59
rebase: derive node from target rev (issue3802)
Siddharth Agarwal <sid0@fb.com>
parents:
18518
diff
changeset
|
843 bookmarks.deletedivergent(repo, [targetnode], k) |
27059
405320cd6198
rebase: use bookmarks.recordchange instead of bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents:
27058
diff
changeset
|
844 marks.recordchange(tr) |
14884
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
845 |
7952
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
846 def storestatus(repo, originalwd, target, state, collapse, keep, keepbranches, |
18755
72412afe4c28
rebase: restore active bookmark after rebase --continue
Durham Goode <durham@fb.com>
parents:
18549
diff
changeset
|
847 external, activebookmark): |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
848 'Store the current status to allow recovery' |
23877
7cc77030c557
localrepo: remove all external users of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
23732
diff
changeset
|
849 f = repo.vfs("rebasestate", "w") |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
850 f.write(repo[originalwd].hex() + '\n') |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
851 f.write(repo[target].hex() + '\n') |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
852 f.write(repo[external].hex() + '\n') |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
853 f.write('%d\n' % int(collapse)) |
7952
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
854 f.write('%d\n' % int(keep)) |
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
855 f.write('%d\n' % int(keepbranches)) |
18755
72412afe4c28
rebase: restore active bookmark after rebase --continue
Durham Goode <durham@fb.com>
parents:
18549
diff
changeset
|
856 f.write('%s\n' % (activebookmark or '')) |
7622
4dd7b28003d2
use dict.iteritems() rather than dict.items()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7599
diff
changeset
|
857 for d, v in state.iteritems(): |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
858 oldrev = repo[d].hex() |
23491
9972758ab4c5
rebase: handle revtodo as a special value when storing/restoring state
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23490
diff
changeset
|
859 if v >= 0: |
15464
3411a83e232a
rebase: treat nullmerge as a special case in rebasestate (issue3046)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
15289
diff
changeset
|
860 newrev = repo[v].hex() |
23491
9972758ab4c5
rebase: handle revtodo as a special value when storing/restoring state
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23490
diff
changeset
|
861 elif v == revtodo: |
9972758ab4c5
rebase: handle revtodo as a special value when storing/restoring state
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23490
diff
changeset
|
862 # To maintain format compatibility, we have to use nullid. |
9972758ab4c5
rebase: handle revtodo as a special value when storing/restoring state
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23490
diff
changeset
|
863 # Please do remove this special case when upgrading the format. |
9972758ab4c5
rebase: handle revtodo as a special value when storing/restoring state
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23490
diff
changeset
|
864 newrev = hex(nullid) |
15464
3411a83e232a
rebase: treat nullmerge as a special case in rebasestate (issue3046)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
15289
diff
changeset
|
865 else: |
3411a83e232a
rebase: treat nullmerge as a special case in rebasestate (issue3046)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
15289
diff
changeset
|
866 newrev = v |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
867 f.write("%s:%s\n" % (oldrev, newrev)) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
868 f.close() |
9467
4c041f1ee1b4
do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents:
9301
diff
changeset
|
869 repo.ui.debug('rebase status stored\n') |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
870 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
871 def clearstatus(repo): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
872 'Remove the status files' |
23970
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
873 _clearrebasesetvisibiliy(repo) |
18386
03442135dff4
refactoring: use unlinkpath with ignoremissing
Mads Kiilerich <madski@unity3d.com>
parents:
18269
diff
changeset
|
874 util.unlinkpath(repo.join("rebasestate"), ignoremissing=True) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
875 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
876 def restorestatus(repo): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
877 'Restore a previously stored status' |
26745
8af610bce239
rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents:
26744
diff
changeset
|
878 keepbranches = None |
8af610bce239
rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents:
26744
diff
changeset
|
879 target = None |
8af610bce239
rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents:
26744
diff
changeset
|
880 collapse = False |
8af610bce239
rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents:
26744
diff
changeset
|
881 external = nullrev |
8af610bce239
rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents:
26744
diff
changeset
|
882 activebookmark = None |
8af610bce239
rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents:
26744
diff
changeset
|
883 state = {} |
8af610bce239
rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents:
26744
diff
changeset
|
884 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
885 try: |
23877
7cc77030c557
localrepo: remove all external users of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents:
23732
diff
changeset
|
886 f = repo.vfs("rebasestate") |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
887 for i, l in enumerate(f.read().splitlines()): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
888 if i == 0: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
889 originalwd = repo[l].rev() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
890 elif i == 1: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
891 target = repo[l].rev() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
892 elif i == 2: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
893 external = repo[l].rev() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
894 elif i == 3: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
895 collapse = bool(int(l)) |
7952
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
896 elif i == 4: |
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
897 keep = bool(int(l)) |
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
898 elif i == 5: |
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
899 keepbranches = bool(int(l)) |
18755
72412afe4c28
rebase: restore active bookmark after rebase --continue
Durham Goode <durham@fb.com>
parents:
18549
diff
changeset
|
900 elif i == 6 and not (len(l) == 81 and ':' in l): |
72412afe4c28
rebase: restore active bookmark after rebase --continue
Durham Goode <durham@fb.com>
parents:
18549
diff
changeset
|
901 # line 6 is a recent addition, so for backwards compatibility |
72412afe4c28
rebase: restore active bookmark after rebase --continue
Durham Goode <durham@fb.com>
parents:
18549
diff
changeset
|
902 # check that the line doesn't look like the oldrev:newrev lines |
72412afe4c28
rebase: restore active bookmark after rebase --continue
Durham Goode <durham@fb.com>
parents:
18549
diff
changeset
|
903 activebookmark = l |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
904 else: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
905 oldrev, newrev = l.split(':') |
26349
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
906 if newrev in (str(nullmerge), str(revignored), |
27012
5eac7ab59b95
rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents:
27010
diff
changeset
|
907 str(revprecursor), str(revpruned)): |
18447
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
908 state[repo[oldrev].rev()] = int(newrev) |
23491
9972758ab4c5
rebase: handle revtodo as a special value when storing/restoring state
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23490
diff
changeset
|
909 elif newrev == nullid: |
9972758ab4c5
rebase: handle revtodo as a special value when storing/restoring state
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23490
diff
changeset
|
910 state[repo[oldrev].rev()] = revtodo |
9972758ab4c5
rebase: handle revtodo as a special value when storing/restoring state
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23490
diff
changeset
|
911 # Legacy compat special case |
18447
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
912 else: |
15464
3411a83e232a
rebase: treat nullmerge as a special case in rebasestate (issue3046)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
15289
diff
changeset
|
913 state[repo[oldrev].rev()] = repo[newrev].rev() |
20327
46c2331fc750
rebase: abort cleanly when we encounter a damaged rebasestate (issue4155)
Matt Mackall <mpm@selenic.com>
parents:
20313
diff
changeset
|
914 |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25411
diff
changeset
|
915 except IOError as err: |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
916 if err.errno != errno.ENOENT: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
917 raise |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26496
diff
changeset
|
918 raise error.Abort(_('no rebase in progress')) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
919 |
26745
8af610bce239
rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents:
26744
diff
changeset
|
920 if keepbranches is None: |
8af610bce239
rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents:
26744
diff
changeset
|
921 raise error.Abort(_('.hg/rebasestate is incomplete')) |
8af610bce239
rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents:
26744
diff
changeset
|
922 |
8af610bce239
rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents:
26744
diff
changeset
|
923 skipped = set() |
8af610bce239
rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents:
26744
diff
changeset
|
924 # recompute the set of skipped revs |
8af610bce239
rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents:
26744
diff
changeset
|
925 if not collapse: |
8af610bce239
rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents:
26744
diff
changeset
|
926 seen = set([target]) |
8af610bce239
rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents:
26744
diff
changeset
|
927 for old, new in sorted(state.items()): |
8af610bce239
rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents:
26744
diff
changeset
|
928 if new != revtodo and new in seen: |
8af610bce239
rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents:
26744
diff
changeset
|
929 skipped.add(old) |
8af610bce239
rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents:
26744
diff
changeset
|
930 seen.add(new) |
8af610bce239
rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents:
26744
diff
changeset
|
931 repo.ui.debug('computed skipped revs: %s\n' % |
8af610bce239
rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents:
26744
diff
changeset
|
932 (' '.join(str(r) for r in sorted(skipped)) or None)) |
8af610bce239
rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents:
26744
diff
changeset
|
933 repo.ui.debug('rebase status resumed\n') |
8af610bce239
rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents:
26744
diff
changeset
|
934 _setrebasesetvisibility(repo, state.keys()) |
8af610bce239
rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents:
26744
diff
changeset
|
935 return (originalwd, target, state, skipped, |
8af610bce239
rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents:
26744
diff
changeset
|
936 collapse, keep, keepbranches, external, activebookmark) |
8af610bce239
rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents:
26744
diff
changeset
|
937 |
25070
bd98d073a34f
rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents:
24870
diff
changeset
|
938 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
|
939 '''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
|
940 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
|
941 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
|
942 |
bd98d073a34f
rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents:
24870
diff
changeset
|
943 # 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
|
944 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
|
945 return False |
bd98d073a34f
rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents:
24870
diff
changeset
|
946 |
bd98d073a34f
rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents:
24870
diff
changeset
|
947 # 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
|
948 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
|
949 if new == nullrev]) |
bd98d073a34f
rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents:
24870
diff
changeset
|
950 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
|
951 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
|
952 |
fe78eb7bcca0
rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents:
19496
diff
changeset
|
953 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
|
954 |
24758
d7451adc72f6
rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents:
23970
diff
changeset
|
955 def abort(repo, originalwd, target, state, activebookmark=None): |
d7451adc72f6
rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents:
23970
diff
changeset
|
956 '''Restore the repository to its original state. Additional args: |
d7451adc72f6
rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents:
23970
diff
changeset
|
957 |
d7451adc72f6
rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents:
23970
diff
changeset
|
958 activebookmark: the name of the bookmark that should be active after the |
d7451adc72f6
rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents:
23970
diff
changeset
|
959 restore''' |
26677
e9b3d523f2e6
rebase: properly abort when destination is public (issue4896)
Christian Delahousse <cdelahousse@fb.com>
parents:
26675
diff
changeset
|
960 |
26744
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
961 try: |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
962 # If the first commits in the rebased set get skipped during the rebase, |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
963 # their values within the state mapping will be the target rev id. The |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
964 # dstates list must must not contain the target rev (issue4896) |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
965 dstates = [s for s in state.values() if s >= 0 and s != target] |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
966 immutable = [d for d in dstates if not repo[d].mutable()] |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
967 cleanup = True |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
968 if immutable: |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
969 repo.ui.warn(_("warning: can't clean up public changesets %s\n") |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
970 % ', '.join(str(repo[r]) for r in immutable), |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
971 hint=_('see "hg help phases" for details')) |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
972 cleanup = False |
16280
0806823370d8
rebase: properly calculate descendant set when aborting (issue3332)
Matt Mackall <mpm@selenic.com>
parents:
16228
diff
changeset
|
973 |
26744
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
974 descendants = set() |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
975 if dstates: |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
976 descendants = set(repo.changelog.descendants(dstates)) |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
977 if descendants - set(dstates): |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
978 repo.ui.warn(_("warning: new changesets detected on target branch, " |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
979 "can't strip\n")) |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
980 cleanup = False |
19518
12843143663d
rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents:
19517
diff
changeset
|
981 |
26744
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
982 if cleanup: |
27988
61f4d59e9a0b
rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents:
27977
diff
changeset
|
983 shouldupdate = False |
61f4d59e9a0b
rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents:
27977
diff
changeset
|
984 rebased = filter(lambda x: x >= 0 and x != target, state.values()) |
61f4d59e9a0b
rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents:
27977
diff
changeset
|
985 if rebased: |
61f4d59e9a0b
rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents:
27977
diff
changeset
|
986 strippoints = [ |
61f4d59e9a0b
rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents:
27977
diff
changeset
|
987 c.node() for c in repo.set('roots(%ld)', rebased)] |
61f4d59e9a0b
rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents:
27977
diff
changeset
|
988 shouldupdate = len([ |
61f4d59e9a0b
rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents:
27977
diff
changeset
|
989 c.node() for c in repo.set('. & (%ld)', rebased)]) > 0 |
61f4d59e9a0b
rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents:
27977
diff
changeset
|
990 |
26744
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
991 # Update away from the rebase if necessary |
27988
61f4d59e9a0b
rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents:
27977
diff
changeset
|
992 if shouldupdate or needupdate(repo, state): |
27344
43c00ca887d1
merge: have merge.update use a matcher instead of partial fn
Augie Fackler <augie@google.com>
parents:
27261
diff
changeset
|
993 merge.update(repo, originalwd, False, True) |
19516
fe78eb7bcca0
rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents:
19496
diff
changeset
|
994 |
26744
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
995 # Strip from the first rebased revision |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
996 if rebased: |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
997 # no backup of rebased cset versions needed |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
998 repair.strip(repo.ui, repo, strippoints) |
19518
12843143663d
rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents:
19517
diff
changeset
|
999 |
26744
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
1000 if activebookmark and activebookmark in repo._bookmarks: |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
1001 bookmarks.activate(repo, activebookmark) |
24758
d7451adc72f6
rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents:
23970
diff
changeset
|
1002 |
26744
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
1003 finally: |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
1004 clearstatus(repo) |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
1005 repo.ui.warn(_('rebase aborted\n')) |
19518
12843143663d
rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents:
19517
diff
changeset
|
1006 return 0 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1007 |
26349
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
1008 def buildstate(repo, dest, rebaseset, collapse, obsoletenotrebased): |
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
|
1009 '''Define which revisions are going to be rebased and where |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1010 |
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
|
1011 repo: repo |
3bfdfefea2fc
rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15219
diff
changeset
|
1012 dest: context |
3bfdfefea2fc
rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15219
diff
changeset
|
1013 rebaseset: set of rev |
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
|
1014 ''' |
23970
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1015 _setrebasesetvisibility(repo, rebaseset) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1016 |
10672
c2e1e637d4da
rebase: always check if rebasing onto an applied mq patch.
Greg Ward <greg-hg@gerg.ca>
parents:
10659
diff
changeset
|
1017 # 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
|
1018 # 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
|
1019 # a partially completed rebase is blocked by mq. |
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
|
1020 if 'qtip' in repo.tags() and (dest.node() in |
10678
da2a0c9c895d
mq: avoid many hex/bin conversions, keep the binary node when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10677
diff
changeset
|
1021 [s.node for s in repo.mq.applied]): |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26496
diff
changeset
|
1022 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
|
1023 |
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
|
1024 roots = list(repo.set('roots(%ld)', rebaseset)) |
3bfdfefea2fc
rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15219
diff
changeset
|
1025 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
|
1026 raise error.Abort(_('no matching revisions')) |
18424
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1027 roots.sort() |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1028 state = {} |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1029 detachset = set() |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1030 for root in roots: |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1031 commonbase = root.ancestor(dest) |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1032 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
|
1033 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
|
1034 if commonbase == dest: |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1035 samebranch = root.branch() == dest.branch() |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1036 if not collapse and samebranch and root in dest.children(): |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1037 repo.ui.debug('source is a child of destination\n') |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1038 return None |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1039 |
20545
5936058f6bad
rebase: fix 'rebase onto %d starting from %s' - show root instead of list repr
Mads Kiilerich <madski@unity3d.com>
parents:
20523
diff
changeset
|
1040 repo.ui.debug('rebase onto %d starting from %s\n' % (dest, root)) |
23490
102f144f6e02
rebase: add a 'revtodo' constant
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23489
diff
changeset
|
1041 state.update(dict.fromkeys(rebaseset, revtodo)) |
18424
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1042 # Rebase tries to turn <dest> into a parent of <root> while |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1043 # preserving the number of parents of rebased changesets: |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1044 # |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1045 # - A changeset with a single parent will always be rebased as a |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1046 # changeset with a single parent. |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1047 # |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1048 # - A merge will be rebased as merge unless its parents are both |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1049 # ancestors of <dest> or are themselves in the rebased set and |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1050 # pruned while rebased. |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1051 # |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1052 # If one parent of <root> is an ancestor of <dest>, the rebased |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1053 # version of this parent will be <dest>. This is always true with |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1054 # --base option. |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1055 # |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1056 # Otherwise, we need to *replace* the original parents with |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1057 # <dest>. This "detaches" the rebased set from its former location |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1058 # and rebases it onto <dest>. Changes introduced by ancestors of |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1059 # <root> not common with <dest> (the detachset, marked as |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1060 # nullmerge) are "removed" from the rebased changesets. |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1061 # |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1062 # - If <root> has a single parent, set it to <dest>. |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1063 # |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1064 # - If <root> is a merge, we cannot decide which parent to |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1065 # replace, the rebase operation is not clearly defined. |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1066 # |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1067 # The table below sums up this behavior: |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1068 # |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1069 # +------------------+----------------------+-------------------------+ |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1070 # | | one parent | merge | |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1071 # +------------------+----------------------+-------------------------+ |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1072 # | parent in | new parent is <dest> | parents in ::<dest> are | |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1073 # | ::<dest> | | remapped to <dest> | |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1074 # +------------------+----------------------+-------------------------+ |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1075 # | unrelated source | new parent is <dest> | ambiguous, abort | |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1076 # +------------------+----------------------+-------------------------+ |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1077 # |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1078 # The actual abort is handled by `defineparents` |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1079 if len(root.parents()) <= 1: |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1080 # ancestors of <root> not ancestors of <dest> |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1081 detachset.update(repo.changelog.findmissingrevs([commonbase.rev()], |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1082 [root.rev()])) |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1083 for r in detachset: |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1084 if r not in state: |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1085 state[r] = nullmerge |
18447
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
1086 if len(roots) > 1: |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
1087 # If we have multiple roots, we may have "hole" in the rebase set. |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
1088 # Rebase roots that descend from those "hole" should not be detached as |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
1089 # other root are. We use the special `revignored` to inform rebase that |
18644
3e92772d5383
spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents:
18549
diff
changeset
|
1090 # the revision should be ignored but that `defineparents` should search |
3e92772d5383
spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents:
18549
diff
changeset
|
1091 # a rebase destination that make sense regarding rebased topology. |
18447
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
1092 rebasedomain = set(repo.revs('%ld::%ld', rebaseset, rebaseset)) |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
1093 for ignored in set(rebasedomain) - set(rebaseset): |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
1094 state[ignored] = revignored |
26349
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
1095 for r in obsoletenotrebased: |
27012
5eac7ab59b95
rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents:
27010
diff
changeset
|
1096 if obsoletenotrebased[r] is None: |
5eac7ab59b95
rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents:
27010
diff
changeset
|
1097 state[r] = revpruned |
5eac7ab59b95
rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents:
27010
diff
changeset
|
1098 else: |
5eac7ab59b95
rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents:
27010
diff
changeset
|
1099 state[r] = revprecursor |
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
|
1100 return repo['.'].rev(), dest.rev(), state |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1101 |
18444
55aff0c2b73c
rebase: do not invent successor to skipped changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18424
diff
changeset
|
1102 def clearrebased(ui, repo, state, skipped, collapsedas=None): |
17613
aafc521668d8
rebase: properly handle --collapse when creating obsolescence marker
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17612
diff
changeset
|
1103 """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
|
1104 |
aafc521668d8
rebase: properly handle --collapse when creating obsolescence marker
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17612
diff
changeset
|
1105 If `collapsedas` is not None, the rebase was a collapse whose result if the |
aafc521668d8
rebase: properly handle --collapse when creating obsolescence marker
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17612
diff
changeset
|
1106 `collapsedas` node.""" |
22951
6c86c673dde6
obsolete: add createmarkers option
Durham Goode <durham@fb.com>
parents:
22906
diff
changeset
|
1107 if obsolete.isenabled(repo, obsolete.createmarkersopt): |
17612
fc2a6114f0a0
rebase: allow creation obsolescence relation instead of stripping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17611
diff
changeset
|
1108 markers = [] |
fc2a6114f0a0
rebase: allow creation obsolescence relation instead of stripping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17611
diff
changeset
|
1109 for rev, newrev in sorted(state.items()): |
fc2a6114f0a0
rebase: allow creation obsolescence relation instead of stripping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17611
diff
changeset
|
1110 if newrev >= 0: |
18444
55aff0c2b73c
rebase: do not invent successor to skipped changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18424
diff
changeset
|
1111 if rev in skipped: |
55aff0c2b73c
rebase: do not invent successor to skipped changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18424
diff
changeset
|
1112 succs = () |
55aff0c2b73c
rebase: do not invent successor to skipped changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18424
diff
changeset
|
1113 elif collapsedas is not None: |
55aff0c2b73c
rebase: do not invent successor to skipped changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18424
diff
changeset
|
1114 succs = (repo[collapsedas],) |
55aff0c2b73c
rebase: do not invent successor to skipped changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18424
diff
changeset
|
1115 else: |
55aff0c2b73c
rebase: do not invent successor to skipped changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18424
diff
changeset
|
1116 succs = (repo[newrev],) |
55aff0c2b73c
rebase: do not invent successor to skipped changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18424
diff
changeset
|
1117 markers.append((repo[rev], succs)) |
17612
fc2a6114f0a0
rebase: allow creation obsolescence relation instead of stripping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17611
diff
changeset
|
1118 if markers: |
fc2a6114f0a0
rebase: allow creation obsolescence relation instead of stripping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17611
diff
changeset
|
1119 obsolete.createmarkers(repo, markers) |
fc2a6114f0a0
rebase: allow creation obsolescence relation instead of stripping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17611
diff
changeset
|
1120 else: |
18446
c83d36b81df1
rebase: lose the comparison to `nullmerge`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18444
diff
changeset
|
1121 rebased = [rev for rev in state if state[rev] > nullmerge] |
17612
fc2a6114f0a0
rebase: allow creation obsolescence relation instead of stripping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17611
diff
changeset
|
1122 if rebased: |
18424
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1123 stripped = [] |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1124 for root in repo.set('roots(%ld)', rebased): |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1125 if set(repo.changelog.descendants([root.rev()])) - set(state): |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1126 ui.warn(_("warning: new changesets detected " |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1127 "on source branch, not stripping\n")) |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1128 else: |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1129 stripped.append(root.node()) |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1130 if stripped: |
17612
fc2a6114f0a0
rebase: allow creation obsolescence relation instead of stripping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17611
diff
changeset
|
1131 # backup the old csets by default |
18424
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1132 repair.strip(ui, repo, stripped, "all") |
17611
910123eac887
rebase: extract final changesets cleanup logic in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17325
diff
changeset
|
1133 |
910123eac887
rebase: extract final changesets cleanup logic in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17325
diff
changeset
|
1134 |
7216
292fb2ad2846
extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents:
7213
diff
changeset
|
1135 def pullrebase(orig, ui, repo, *args, **opts): |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1136 'Call rebase after pull if the latter has been invoked with --rebase' |
26960
6979fe2a6d75
rebase: add returning value from pullrebase function
liscju <piotr.listkiewicz@gmail.com>
parents:
26811
diff
changeset
|
1137 ret = None |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1138 if opts.get('rebase'): |
26029
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1139 wlock = lock = None |
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1140 try: |
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1141 wlock = repo.wlock() |
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1142 lock = repo.lock() |
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1143 if opts.get('update'): |
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1144 del opts['update'] |
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1145 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
|
1146 'the update flag\n') |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1147 |
26029
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1148 movemarkfrom = repo['.'].node() |
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1149 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
|
1150 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
|
1151 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
|
1152 pass |
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1153 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
|
1154 try: |
26960
6979fe2a6d75
rebase: add returning value from pullrebase function
liscju <piotr.listkiewicz@gmail.com>
parents:
26811
diff
changeset
|
1155 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
|
1156 finally: |
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1157 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
|
1158 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
|
1159 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
|
1160 # --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
|
1161 # dropping it |
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1162 if 'rev' in opts: |
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1163 del opts['rev'] |
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1164 # 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
|
1165 # --source. |
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1166 if 'source' in opts: |
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1167 del opts['source'] |
28117
41a0fb2b4bbc
rebase: 'hg pull --rebase' now update only if there was nothing to rebase
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28015
diff
changeset
|
1168 if rebase(ui, repo, **opts) == _nothingtorebase(): |
41a0fb2b4bbc
rebase: 'hg pull --rebase' now update only if there was nothing to rebase
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28015
diff
changeset
|
1169 branch = repo[None].branch() |
41a0fb2b4bbc
rebase: 'hg pull --rebase' now update only if there was nothing to rebase
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28015
diff
changeset
|
1170 dest = repo[branch].rev() |
41a0fb2b4bbc
rebase: 'hg pull --rebase' now update only if there was nothing to rebase
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28015
diff
changeset
|
1171 if dest != repo['.'].rev(): |
41a0fb2b4bbc
rebase: 'hg pull --rebase' now update only if there was nothing to rebase
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28015
diff
changeset
|
1172 # there was nothing to rebase we force an update |
41a0fb2b4bbc
rebase: 'hg pull --rebase' now update only if there was nothing to rebase
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28015
diff
changeset
|
1173 hg.update(repo, dest) |
41a0fb2b4bbc
rebase: 'hg pull --rebase' now update only if there was nothing to rebase
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28015
diff
changeset
|
1174 if bookmarks.update(repo, [movemarkfrom], |
41a0fb2b4bbc
rebase: 'hg pull --rebase' now update only if there was nothing to rebase
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28015
diff
changeset
|
1175 repo['.'].node()): |
41a0fb2b4bbc
rebase: 'hg pull --rebase' now update only if there was nothing to rebase
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28015
diff
changeset
|
1176 ui.status(_("updating bookmark %s\n") |
41a0fb2b4bbc
rebase: 'hg pull --rebase' now update only if there was nothing to rebase
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28015
diff
changeset
|
1177 % repo._activebookmark) |
10628
6227c8d669d5
rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents:
10436
diff
changeset
|
1178 finally: |
26029
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1179 release(lock, wlock) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1180 else: |
14444
1f997134a9d1
rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents:
14306
diff
changeset
|
1181 if opts.get('tool'): |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26496
diff
changeset
|
1182 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
|
1183 ret = orig(ui, repo, *args, **opts) |
6979fe2a6d75
rebase: add returning value from pullrebase function
liscju <piotr.listkiewicz@gmail.com>
parents:
26811
diff
changeset
|
1184 |
6979fe2a6d75
rebase: add returning value from pullrebase function
liscju <piotr.listkiewicz@gmail.com>
parents:
26811
diff
changeset
|
1185 return ret |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1186 |
23970
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1187 def _setrebasesetvisibility(repo, revs): |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1188 """store the currently rebased set on the repo object |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1189 |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1190 This is used by another function to prevent rebased revision to because |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1191 hidden (see issue4505)""" |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1192 repo = repo.unfiltered() |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1193 revs = set(revs) |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1194 repo._rebaseset = revs |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1195 # invalidate cache if visibility changes |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1196 hiddens = repo.filteredrevcache.get('visible', set()) |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1197 if revs & hiddens: |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1198 repo.invalidatevolatilesets() |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1199 |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1200 def _clearrebasesetvisibiliy(repo): |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1201 """remove rebaseset data from the repo""" |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1202 repo = repo.unfiltered() |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1203 if '_rebaseset' in vars(repo): |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1204 del repo._rebaseset |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1205 |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1206 def _rebasedvisible(orig, repo): |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1207 """ensure rebased revs stay visible (see issue4505)""" |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1208 blockers = orig(repo) |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1209 blockers.update(getattr(repo, '_rebaseset', ())) |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1210 return blockers |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1211 |
27790
2d294dada4f8
rebase: small refactoring to allow better extensibility from extensions
Laurent Charignon <lcharignon@fb.com>
parents:
27746
diff
changeset
|
1212 def _filterobsoleterevs(repo, revs): |
2d294dada4f8
rebase: small refactoring to allow better extensibility from extensions
Laurent Charignon <lcharignon@fb.com>
parents:
27746
diff
changeset
|
1213 """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
|
1214 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
|
1215 |
27744
f2b8b4e2de20
rebase: minor refactoring of _computeobsoletenotrebased
Laurent Charignon <lcharignon@fb.com>
parents:
27626
diff
changeset
|
1216 def _computeobsoletenotrebased(repo, rebaseobsrevs, dest): |
26349
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
1217 """return a mapping obsolete => successor for all obsolete nodes to be |
27012
5eac7ab59b95
rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents:
27010
diff
changeset
|
1218 rebased that have a successors in the destination |
5eac7ab59b95
rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents:
27010
diff
changeset
|
1219 |
5eac7ab59b95
rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents:
27010
diff
changeset
|
1220 obsolete => None entries in the mapping indicate nodes with no succesor""" |
26349
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
1221 obsoletenotrebased = {} |
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
1222 |
26781
1aee2ab0f902
spelling: trivial spell checking
Mads Kiilerich <madski@unity3d.com>
parents:
26748
diff
changeset
|
1223 # Build a mapping successor => obsolete nodes for the obsolete |
26349
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
1224 # nodes to be rebased |
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
1225 allsuccessors = {} |
26674
fd4a38bd7e49
rebase: use a direct reference to repo.changelog
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26671
diff
changeset
|
1226 cl = repo.changelog |
27744
f2b8b4e2de20
rebase: minor refactoring of _computeobsoletenotrebased
Laurent Charignon <lcharignon@fb.com>
parents:
27626
diff
changeset
|
1227 for r in rebaseobsrevs: |
f2b8b4e2de20
rebase: minor refactoring of _computeobsoletenotrebased
Laurent Charignon <lcharignon@fb.com>
parents:
27626
diff
changeset
|
1228 node = cl.node(r) |
f2b8b4e2de20
rebase: minor refactoring of _computeobsoletenotrebased
Laurent Charignon <lcharignon@fb.com>
parents:
27626
diff
changeset
|
1229 for s in obsolete.allsuccessors(repo.obsstore, [node]): |
f2b8b4e2de20
rebase: minor refactoring of _computeobsoletenotrebased
Laurent Charignon <lcharignon@fb.com>
parents:
27626
diff
changeset
|
1230 try: |
f2b8b4e2de20
rebase: minor refactoring of _computeobsoletenotrebased
Laurent Charignon <lcharignon@fb.com>
parents:
27626
diff
changeset
|
1231 allsuccessors[cl.rev(s)] = cl.rev(node) |
f2b8b4e2de20
rebase: minor refactoring of _computeobsoletenotrebased
Laurent Charignon <lcharignon@fb.com>
parents:
27626
diff
changeset
|
1232 except LookupError: |
f2b8b4e2de20
rebase: minor refactoring of _computeobsoletenotrebased
Laurent Charignon <lcharignon@fb.com>
parents:
27626
diff
changeset
|
1233 pass |
26349
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
1234 |
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
1235 if allsuccessors: |
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
1236 # Look for successors of obsolete nodes to be rebased among |
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
1237 # the ancestors of dest |
26674
fd4a38bd7e49
rebase: use a direct reference to repo.changelog
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26671
diff
changeset
|
1238 ancs = cl.ancestors([repo[dest].rev()], |
fd4a38bd7e49
rebase: use a direct reference to repo.changelog
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26671
diff
changeset
|
1239 stoprev=min(allsuccessors), |
fd4a38bd7e49
rebase: use a direct reference to repo.changelog
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26671
diff
changeset
|
1240 inclusive=True) |
26349
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
1241 for s in allsuccessors: |
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
1242 if s in ancs: |
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
1243 obsoletenotrebased[allsuccessors[s]] = s |
27012
5eac7ab59b95
rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents:
27010
diff
changeset
|
1244 elif (s == allsuccessors[s] and |
5eac7ab59b95
rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents:
27010
diff
changeset
|
1245 allsuccessors.values().count(s) == 1): |
5eac7ab59b95
rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents:
27010
diff
changeset
|
1246 # plain prune |
5eac7ab59b95
rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents:
27010
diff
changeset
|
1247 obsoletenotrebased[s] = None |
5eac7ab59b95
rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents:
27010
diff
changeset
|
1248 |
26349
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
1249 return obsoletenotrebased |
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
1250 |
19214
0250047a365e
summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents:
19059
diff
changeset
|
1251 def summaryhook(ui, repo): |
0250047a365e
summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents:
19059
diff
changeset
|
1252 if not os.path.exists(repo.join('rebasestate')): |
0250047a365e
summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents:
19059
diff
changeset
|
1253 return |
19849
e7fa36d2ad3a
rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19848
diff
changeset
|
1254 try: |
e7fa36d2ad3a
rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19848
diff
changeset
|
1255 state = restorestatus(repo)[2] |
e7fa36d2ad3a
rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19848
diff
changeset
|
1256 except error.RepoLookupError: |
e7fa36d2ad3a
rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19848
diff
changeset
|
1257 # 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
|
1258 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
|
1259 ui.write(msg) |
e7fa36d2ad3a
rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19848
diff
changeset
|
1260 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
|
1261 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
|
1262 # i18n: column positioning for "hg summary" |
0250047a365e
summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents:
19059
diff
changeset
|
1263 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
|
1264 (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
|
1265 ui.label(_('%d remaining'), 'rebase.remaining') % |
0250047a365e
summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents:
19059
diff
changeset
|
1266 (len(state) - numrebased))) |
0250047a365e
summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents:
19059
diff
changeset
|
1267 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1268 def uisetup(ui): |
23970
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1269 #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
|
1270 entry = extensions.wrapcommand(commands.table, 'pull', pullrebase) |
292fb2ad2846
extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents:
7213
diff
changeset
|
1271 entry[1].append(('', 'rebase', None, |
14444
1f997134a9d1
rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents:
14306
diff
changeset
|
1272 _("rebase working directory to branch head"))) |
1f997134a9d1
rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents:
14306
diff
changeset
|
1273 entry[1].append(('t', 'tool', '', |
1f997134a9d1
rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents:
14306
diff
changeset
|
1274 _("specify merge tool for rebase"))) |
19214
0250047a365e
summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents:
19059
diff
changeset
|
1275 cmdutil.summaryhooks.add('rebase', summaryhook) |
19478
e5a5790a3185
rebase: add checkunfinished support (issue3955)
Matt Mackall <mpm@selenic.com>
parents:
19477
diff
changeset
|
1276 cmdutil.unfinishedstates.append( |
19496
607191a45f8c
checkunfinished: accommodate histedit quirk
Matt Mackall <mpm@selenic.com>
parents:
19478
diff
changeset
|
1277 ['rebasestate', False, False, _('rebase in progress'), |
19478
e5a5790a3185
rebase: add checkunfinished support (issue3955)
Matt Mackall <mpm@selenic.com>
parents:
19477
diff
changeset
|
1278 _("use 'hg rebase --continue' or 'hg rebase --abort'")]) |
27626
157675d0f600
rebase: hook afterresolvedstates
timeless <timeless@mozdev.org>
parents:
27586
diff
changeset
|
1279 cmdutil.afterresolvedstates.append( |
157675d0f600
rebase: hook afterresolvedstates
timeless <timeless@mozdev.org>
parents:
27586
diff
changeset
|
1280 ['rebasestate', _('hg rebase --continue')]) |
23970
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1281 # ensure rebased rev are not hidden |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1282 extensions.wrapfunction(repoview, '_getdynamicblockers', _rebasedvisible) |
27586
42910f9fffeb
revset: use delayregistrar to register predicate in extension easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
27577
diff
changeset
|
1283 revsetpredicate.setup() |