annotate hgext/rebase.py @ 25191:08d1ef09ed37

revset: optimize not public revset This patvh speeds up the computation of the not public() changeset and incidentally speed up the computation of divergents() changeset on our big repo by 100x from 50% to 0.5% of the time spent in smartlog with evolve. In this patch we optimize not public() to _notpublic() (new revset) and use the work on phaseset (from the previous commit) to be able to compute _notpublic() quickly. We use a non-lazy approach making the assumption the number of notpublic change will not be in the order of magnitude of the repo size. Adopting a lazy approach gives a speedup of 5x (vs 100x) only due to the overhead of the code for lazy generation.
author Laurent Charignon <lcharignon@fb.com>
date Fri, 24 Apr 2015 14:30:30 -0700
parents 80c5b2666a96
children d298805fb639
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1 # rebase.py - rebasing feature for mercurial
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
2 #
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
3 # Copyright 2008 Stefano Tortarolo <stefano.tortarolo at gmail dot com>
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
4 #
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8222
diff changeset
5 # This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9815
diff changeset
6 # GNU General Public License version 2 or any later version.
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
7
8934
9dda4c73fc3b extensions: change descriptions for extensions providing a few commands
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8706
diff changeset
8 '''command to move sets of revisions to a different ancestor
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
9
7999
b25110140573 rebase: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7955
diff changeset
10 This extension lets you rebase changesets in an existing Mercurial
b25110140573 rebase: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7955
diff changeset
11 repository.
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
12
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
13 For more information:
9301
ad4501d20214 rebase: link to RebaseExtension
Martin Geisler <mg@lazybytes.net>
parents: 9271
diff changeset
14 http://mercurial.selenic.com/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
23970
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
19 from mercurial import copies, repoview
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
23490
102f144f6e02 rebase: add a 'revtodo' constant
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23489
diff changeset
26 revtodo = -1
10352
66d954e76ffb rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10351
diff changeset
27 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
28 revignored = -3
10352
66d954e76ffb rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10351
diff changeset
29
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
30 cmdtable = {}
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
31 command = cmdutil.command(cmdtable)
25186
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 25102
diff changeset
32 # 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
33 # 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
34 # 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
35 # leave the attribute unspecified.
16743
38caf405d010 hgext: mark all first-party extensions as such
Augie Fackler <raf@durin42.com>
parents: 16696
diff changeset
36 testedwith = 'internal'
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
37
19861
a69a77a80900 rebase: preserve metadata from grafts of changes (issue4001)
Augie Fackler <raf@durin42.com>
parents: 19860
diff changeset
38 def _savegraft(ctx, extra):
a69a77a80900 rebase: preserve metadata from grafts of changes (issue4001)
Augie Fackler <raf@durin42.com>
parents: 19860
diff changeset
39 s = ctx.extra().get('source', None)
a69a77a80900 rebase: preserve metadata from grafts of changes (issue4001)
Augie Fackler <raf@durin42.com>
parents: 19860
diff changeset
40 if s is not None:
a69a77a80900 rebase: preserve metadata from grafts of changes (issue4001)
Augie Fackler <raf@durin42.com>
parents: 19860
diff changeset
41 extra['source'] = s
a69a77a80900 rebase: preserve metadata from grafts of changes (issue4001)
Augie Fackler <raf@durin42.com>
parents: 19860
diff changeset
42
19860
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
43 def _savebranch(ctx, extra):
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
44 extra['branch'] = ctx.branch()
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
45
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
46 def _makeextrafn(copiers):
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
47 """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
48
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
49 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
50 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
51 """
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
52 def extrafn(ctx, extra):
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
53 for c in copiers:
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
54 c(ctx, extra)
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
55 return extrafn
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
56
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
57 @command('rebase',
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
58 [('s', 'source', '',
22789
5f4934487382 rebase: attempt to clarify --base
Matt Mackall <mpm@selenic.com>
parents: 22405
diff changeset
59 _('rebase the specified changeset and descendants'), _('REV')),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
60 ('b', 'base', '',
22789
5f4934487382 rebase: attempt to clarify --base
Matt Mackall <mpm@selenic.com>
parents: 22405
diff changeset
61 _('rebase everything from branching point of specified changeset'),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
62 _('REV')),
15270
6cb6064f1d50 rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15269
diff changeset
63 ('r', 'rev', [],
6cb6064f1d50 rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15269
diff changeset
64 _('rebase these revisions'),
6cb6064f1d50 rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15269
diff changeset
65 _('REV')),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
66 ('d', 'dest', '',
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
67 _('rebase onto the specified changeset'), _('REV')),
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
68 ('', 'collapse', False, _('collapse the rebased changesets')),
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
69 ('m', 'message', '',
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
70 _('use text as collapse commit message'), _('TEXT')),
15219
9d58569a8b92 rebase: add --edit switch
Matt Mackall <mpm@selenic.com>
parents: 15214
diff changeset
71 ('e', 'edit', False, _('invoke editor on commit messages')),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
72 ('l', 'logfile', '',
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
73 _('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
74 ('k', 'keep', False, _('keep original changesets')),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
75 ('', '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
76 ('D', 'detach', False, _('(DEPRECATED)')),
22382
d5b04ee8ecf7 rebase: add a deprecated -i/--interactive flag
David Soria Parra <davidsp@fb.com>
parents: 22251
diff changeset
77 ('i', 'interactive', False, _('(DEPRECATED)')),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
78 ('t', 'tool', '', _('specify merge tool')),
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
79 ('c', 'continue', False, _('continue an interrupted rebase')),
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
80 ('a', 'abort', False, _('abort an interrupted rebase'))] +
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
81 templateopts,
17325
e4db509c08ec rebase: remove second broken synopsis line (issue3172)
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
82 _('[-s REV | -b REV] [-d REV] [OPTION]'))
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
83 def rebase(ui, repo, **opts):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
84 """move changeset (and descendants) to a different branch
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
85
7999
b25110140573 rebase: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7955
diff changeset
86 Rebase uses repeated merging to graft changesets from one part of
10646
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
87 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
88 useful for linearizing *local* changes relative to a master
10646
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
89 development tree.
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
90
11188
b5c0f6a11430 rebase: stress that only local changesets should be rebased
Martin Geisler <mg@lazybytes.net>
parents: 10762
diff changeset
91 You should not rebase changesets that have already been shared
b5c0f6a11430 rebase: stress that only local changesets should be rebased
Martin Geisler <mg@lazybytes.net>
parents: 10762
diff changeset
92 with others. Doing so will force everybody else to perform the
b5c0f6a11430 rebase: stress that only local changesets should be rebased
Martin Geisler <mg@lazybytes.net>
parents: 10762
diff changeset
93 same rebase or they will end up with duplicated changesets after
b5c0f6a11430 rebase: stress that only local changesets should be rebased
Martin Geisler <mg@lazybytes.net>
parents: 10762
diff changeset
94 pulling in your rebased changesets.
b5c0f6a11430 rebase: stress that only local changesets should be rebased
Martin Geisler <mg@lazybytes.net>
parents: 10762
diff changeset
95
18516
9fbeb61b8ad2 rebase: mention phases in the help
Kevin Bullock <kbullock@ringworld.org>
parents: 18514
diff changeset
96 In its default configuration, Mercurial will prevent you from
9fbeb61b8ad2 rebase: mention phases in the help
Kevin Bullock <kbullock@ringworld.org>
parents: 18514
diff changeset
97 rebasing published changes. See :hg:`help phases` for details.
9fbeb61b8ad2 rebase: mention phases in the help
Kevin Bullock <kbullock@ringworld.org>
parents: 18514
diff changeset
98
10646
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
99 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
100 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
101 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
102 changesets are added as its descendants.)
10646
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
103
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
104 You can specify which changesets to rebase in two ways: as a
10659
19c0ff5606e1 rebase: remove unnecessary \" from help string
Martin Geisler <mg@lazybytes.net>
parents: 10646
diff changeset
105 "source" changeset or as a "base" changeset. Both are shorthand
19c0ff5606e1 rebase: remove unnecessary \" from help string
Martin Geisler <mg@lazybytes.net>
parents: 10646
diff changeset
106 for a topologically related set of changesets (the "source
19c0ff5606e1 rebase: remove unnecessary \" from help string
Martin Geisler <mg@lazybytes.net>
parents: 10646
diff changeset
107 branch"). If you specify source (``-s/--source``), rebase will
19c0ff5606e1 rebase: remove unnecessary \" from help string
Martin Geisler <mg@lazybytes.net>
parents: 10646
diff changeset
108 rebase that changeset and all of its descendants onto dest. If you
19c0ff5606e1 rebase: remove unnecessary \" from help string
Martin Geisler <mg@lazybytes.net>
parents: 10646
diff changeset
109 specify base (``-b/--base``), rebase will select ancestors of base
19c0ff5606e1 rebase: remove unnecessary \" from help string
Martin Geisler <mg@lazybytes.net>
parents: 10646
diff changeset
110 back to but not including the common ancestor with dest. Thus,
19c0ff5606e1 rebase: remove unnecessary \" from help string
Martin Geisler <mg@lazybytes.net>
parents: 10646
diff changeset
111 ``-b`` is less precise but more convenient than ``-s``: you can
19c0ff5606e1 rebase: remove unnecessary \" from help string
Martin Geisler <mg@lazybytes.net>
parents: 10646
diff changeset
112 specify any changeset in the source branch, and rebase will select
19c0ff5606e1 rebase: remove unnecessary \" from help string
Martin Geisler <mg@lazybytes.net>
parents: 10646
diff changeset
113 the whole branch. If you specify neither ``-s`` nor ``-b``, rebase
19c0ff5606e1 rebase: remove unnecessary \" from help string
Martin Geisler <mg@lazybytes.net>
parents: 10646
diff changeset
114 uses the parent of the working directory as the base.
10646
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
115
18518
0324a1d88a53 rebase: mention --rev in the help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18516
diff changeset
116 For advanced usage, a third way is available through the ``--rev``
0324a1d88a53 rebase: mention --rev in the help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18516
diff changeset
117 option. It allows you to specify an arbitrary set of changesets to
0324a1d88a53 rebase: mention --rev in the help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18516
diff changeset
118 rebase. Descendants of revs you specify with this option are not
0324a1d88a53 rebase: mention --rev in the help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18516
diff changeset
119 automatically included in the rebase.
0324a1d88a53 rebase: mention --rev in the help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18516
diff changeset
120
10646
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
121 By default, rebase recreates the changesets in the source branch
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
122 as descendants of dest and then destroys the originals. Use
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
123 ``--keep`` to preserve the original source changesets. Some
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
124 changesets in the source branch (e.g. merges from the destination
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
125 branch) may be dropped if they no longer contribute any change.
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
126
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
127 One result of the rules for selecting the destination changeset
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
128 and source branch is that, unlike ``merge``, rebase will do
19398
f7bcc2e56279 rebase: simplify references to branch tips
Matt Mackall <mpm@selenic.com>
parents: 19214
diff changeset
129 nothing if you are at the branch tip of a named branch
10646
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
130 with two heads. You need to explicitly specify source and/or
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
131 destination (or ``update`` to the other head, if it's the head of
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
132 the intended source branch).
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
133
7999
b25110140573 rebase: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7955
diff changeset
134 If a rebase is interrupted to manually resolve a merge, it can be
8076
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8031
diff changeset
135 continued with --continue/-c or aborted with --abort/-a.
11205
d26f662bfbf5 rebase: add error codes
Matt Mackall <mpm@selenic.com>
parents: 11204
diff changeset
136
22790
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
137 .. container:: verbose
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
138
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
139 Examples:
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
140
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
141 - move "local changes" (current commit back to branching point)
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
142 to the current branch tip after a pull::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
143
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
144 hg rebase
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
145
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
146 - move a single changeset to the stable branch::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
147
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
148 hg rebase -r 5f493448 -d stable
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
149
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
150 - splice a commit and all its descendants onto another part of history::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
151
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
152 hg rebase --source c0c3 --dest 4cf9
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
153
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
154 - rebase everything on a branch marked by a bookmark onto the
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
155 default branch::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
156
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
157 hg rebase --base myfeature --dest default
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
158
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
159 - collapse a sequence of changes into a single commit::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
160
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
161 hg rebase --collapse -r 1520:1525 -d .
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
162
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
163 - move a named branch while preserving its name::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
164
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
165 hg rebase -r "branch(featureX)" -d 1.3 --keepbranches
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
166
19971
2a9bb64faa0b rebase: add description about exit code when there are unresolved conflicts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19969
diff changeset
167 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
168 unresolved conflicts.
22790
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
169
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
170 """
7280
810ca383da9c remove unused variables
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7216
diff changeset
171 originalwd = target = None
18755
72412afe4c28 rebase: restore active bookmark after rebase --continue
Durham Goode <durham@fb.com>
parents: 18549
diff changeset
172 activebookmark = None
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
173 external = nullrev
8454
6d4bf1c1a003 rebase: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8270
diff changeset
174 state = {}
6d4bf1c1a003 rebase: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8270
diff changeset
175 skipped = set()
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
176 targetancestors = set()
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
177
15219
9d58569a8b92 rebase: add --edit switch
Matt Mackall <mpm@selenic.com>
parents: 15214
diff changeset
178
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
179 lock = wlock = None
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
180 try:
15874
2305baff673f rebase: take locks in the right order
Mads Kiilerich <mads@kiilerich.com>
parents: 15801
diff changeset
181 wlock = repo.wlock()
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
182 lock = repo.lock()
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
183
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
184 # Validate input and define rebasing points
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
185 destf = opts.get('dest', None)
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
186 srcf = opts.get('source', None)
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
187 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
188 revf = opts.get('rev', [])
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
189 contf = opts.get('continue')
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
190 abortf = opts.get('abort')
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
191 collapsef = opts.get('collapse', False)
14635
217b7d83afc3 cmdutil, logmessage: use ui.fin when reading from '-'
Idan Kamara <idankk86@gmail.com>
parents: 14599
diff changeset
192 collapsemsg = cmdutil.logmessage(ui, opts)
19860
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
193 e = opts.get('extrafn') # internal, used by e.g. hgsubversion
19861
a69a77a80900 rebase: preserve metadata from grafts of changes (issue4001)
Augie Fackler <raf@durin42.com>
parents: 19860
diff changeset
194 extrafns = [_savegraft]
19860
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
195 if e:
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
196 extrafns = [e]
7952
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
197 keepf = opts.get('keep', False)
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
198 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
199 # 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
200 # other extensions
f2558a8228be rebase: add option to not commit after a collapsing
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10676
diff changeset
201 keepopen = opts.get('keepopen', False)
7468
3e5db4228f8f rebase: add support to keep branch names
Augie Fackler <durin42@gmail.com>
parents: 7298
diff changeset
202
22382
d5b04ee8ecf7 rebase: add a deprecated -i/--interactive flag
David Soria Parra <davidsp@fb.com>
parents: 22251
diff changeset
203 if opts.get('interactive'):
d5b04ee8ecf7 rebase: add a deprecated -i/--interactive flag
David Soria Parra <davidsp@fb.com>
parents: 22251
diff changeset
204 msg = _("interactive history editing is supported by the "
23917
3cbb5bf4035d messages: quote "hg help" hints consistently
Wagner Bruna <wbruna@yahoo.com>
parents: 23877
diff changeset
205 "'histedit' extension (see \"hg help histedit\")")
22382
d5b04ee8ecf7 rebase: add a deprecated -i/--interactive flag
David Soria Parra <davidsp@fb.com>
parents: 22251
diff changeset
206 raise util.Abort(msg)
d5b04ee8ecf7 rebase: add a deprecated -i/--interactive flag
David Soria Parra <davidsp@fb.com>
parents: 22251
diff changeset
207
13661
ee349e228835 rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents: 13609
diff changeset
208 if collapsemsg and not collapsef:
ee349e228835 rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents: 13609
diff changeset
209 raise util.Abort(
ee349e228835 rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents: 13609
diff changeset
210 _('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
211
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
212 if contf or abortf:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
213 if contf and abortf:
11285
f118029e534c rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents: 11205
diff changeset
214 raise util.Abort(_('cannot use both abort and continue'))
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
215 if collapsef:
11285
f118029e534c rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents: 11205
diff changeset
216 raise util.Abort(
f118029e534c rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents: 11205
diff changeset
217 _('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
218 if srcf or basef or destf:
11285
f118029e534c rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents: 11205
diff changeset
219 raise util.Abort(
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
220 _('abort and continue do not allow specifying revisions'))
13856
0995eee8ffe4 rebase: add --tool argument for specifying merge tool
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 13778
diff changeset
221 if opts.get('tool', False):
0995eee8ffe4 rebase: add --tool argument for specifying merge tool
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 13778
diff changeset
222 ui.warn(_('tool option will be ignored\n'))
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
223
19848
577f4c562d52 rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19641
diff changeset
224 try:
577f4c562d52 rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19641
diff changeset
225 (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
226 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
227 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
228 if abortf:
577f4c562d52 rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19641
diff changeset
229 clearstatus(repo)
577f4c562d52 rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19641
diff changeset
230 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
231 ' 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
232 return 0
577f4c562d52 rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19641
diff changeset
233 else:
577f4c562d52 rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19641
diff changeset
234 msg = _('cannot continue inconsistent rebase')
20313
dcd65ce87260 hgext: fix one typo in rebase
Simon Heimberg <simohe@besonet.ch>
parents: 20250
diff changeset
235 hint = _('use "hg rebase --abort" to clear broken state')
19848
577f4c562d52 rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19641
diff changeset
236 raise util.Abort(msg, hint=hint)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
237 if abortf:
24758
d7451adc72f6 rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents: 23970
diff changeset
238 return abort(repo, originalwd, target, state,
d7451adc72f6 rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents: 23970
diff changeset
239 activebookmark=activebookmark)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
240 else:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
241 if srcf and basef:
11285
f118029e534c rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents: 11205
diff changeset
242 raise util.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
243 'source and a base'))
6cb6064f1d50 rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15269
diff changeset
244 if revf and basef:
15289
9cec4b24615b rebase: fix typos
Wagner Bruna <wbruna@softwareexpress.com.br>
parents: 15272
diff changeset
245 raise util.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
246 '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
247 if revf and srcf:
15289
9cec4b24615b rebase: fix typos
Wagner Bruna <wbruna@softwareexpress.com.br>
parents: 15272
diff changeset
248 raise util.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
249 '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
250
19478
e5a5790a3185 rebase: add checkunfinished support (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19477
diff changeset
251 cmdutil.checkunfinished(repo)
14289
d68ddccf276b cmdutil: bail_if_changed to bailifchanged
Matt Mackall <mpm@selenic.com>
parents: 13895
diff changeset
252 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
253
3bfdfefea2fc rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15219
diff changeset
254 if not destf:
15270
6cb6064f1d50 rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15269
diff changeset
255 # Destination defaults to the latest revision in the
6cb6064f1d50 rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15269
diff changeset
256 # current branch
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
257 branch = repo[None].branch()
3bfdfefea2fc rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15219
diff changeset
258 dest = repo[branch]
3bfdfefea2fc rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15219
diff changeset
259 else:
16566
ae6dddffe4f1 rebase: make --dest understand revsets
Patrick Mezard <patrick@mezard.eu>
parents: 16565
diff changeset
260 dest = scmutil.revsingle(repo, destf)
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
261
15271
84d4a4ce45fd rebase: simplify set generation
Matt Mackall <mpm@selenic.com>
parents: 15270
diff changeset
262 if revf:
19641
5528c31c629c rebase: handle bookmarks matching revset function names (issue3950)
Bryan O'Sullivan <bryano@fb.com>
parents: 19518
diff changeset
263 rebaseset = scmutil.revrange(repo, revf)
20247
a259f7b488ab rebase: improve error message for empty --rev set
Mads Kiilerich <madski@unity3d.com>
parents: 19986
diff changeset
264 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
265 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
266 'nothing to rebase\n'))
cb4223c65f79 rebase: don't abort if we're asked to rebase an empty revset
Julien Cristau <julien.cristau@logilab.fr>
parents: 21027
diff changeset
267 return 1
15271
84d4a4ce45fd rebase: simplify set generation
Matt Mackall <mpm@selenic.com>
parents: 15270
diff changeset
268 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
269 src = scmutil.revrange(repo, [srcf])
20248
3bff26f67169 rebase: improve error message for empty --source set
Mads Kiilerich <madski@unity3d.com>
parents: 20247
diff changeset
270 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
271 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
272 'nothing to rebase\n'))
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
273 return 1
15801
bfd3ce759682 merge with stable
Matt Mackall <mpm@selenic.com>
parents: 15777 15800
diff changeset
274 rebaseset = repo.revs('(%ld)::', src)
20248
3bff26f67169 rebase: improve error message for empty --source set
Mads Kiilerich <madski@unity3d.com>
parents: 20247
diff changeset
275 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
276 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
277 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
278 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
279 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
280 "can't compute rebase set\n"))
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
281 return 1
23072
d583f1cfca96 rebase: improve base revset performance
Durham Goode <durham@fb.com>
parents: 22952
diff changeset
282 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
283 if commonanc is not None:
643c58303fb0 rebase: fix rebase with no common ancestors (issue4446)
Durham Goode <durham@fb.com>
parents: 23072
diff changeset
284 rebaseset = repo.revs('(%d::(%ld) - %d)::',
643c58303fb0 rebase: fix rebase with no common ancestors (issue4446)
Durham Goode <durham@fb.com>
parents: 23072
diff changeset
285 commonanc, base, commonanc)
643c58303fb0 rebase: fix rebase with no common ancestors (issue4446)
Durham Goode <durham@fb.com>
parents: 23072
diff changeset
286 else:
643c58303fb0 rebase: fix rebase with no common ancestors (issue4446)
Durham Goode <durham@fb.com>
parents: 23072
diff changeset
287 rebaseset = []
643c58303fb0 rebase: fix rebase with no common ancestors (issue4446)
Durham Goode <durham@fb.com>
parents: 23072
diff changeset
288
20249
dc5157841361 rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents: 20248
diff changeset
289 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
290 # 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
291 # 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
292 # 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
293 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
294 if basef:
dc5157841361 rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents: 20248
diff changeset
295 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
296 ' 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
297 else:
dc5157841361 rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents: 20248
diff changeset
298 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
299 '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
300 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
301 if basef:
dc5157841361 rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents: 20248
diff changeset
302 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
303 '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
304 '%s\n') %
dc5157841361 rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents: 20248
diff changeset
305 ('+'.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
306 dest))
dc5157841361 rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents: 20248
diff changeset
307 else:
dc5157841361 rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents: 20248
diff changeset
308 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
309 '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
310 '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
311 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
312 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
313 ('+'.join(str(repo[r]) for r in base), dest))
dc5157841361 rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents: 20248
diff changeset
314 return 1
15271
84d4a4ce45fd rebase: simplify set generation
Matt Mackall <mpm@selenic.com>
parents: 15270
diff changeset
315
22952
8792ac090e3b obsolete: add allowunstable option
Durham Goode <durham@fb.com>
parents: 22951
diff changeset
316 allowunstable = obsolete.isenabled(repo, obsolete.allowunstableopt)
8792ac090e3b obsolete: add allowunstable option
Durham Goode <durham@fb.com>
parents: 22951
diff changeset
317 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
318 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
319 rebaseset, rebaseset)):
15272
2889d4574726 rebase: simplify check for orphaned descendants
Matt Mackall <mpm@selenic.com>
parents: 15271
diff changeset
320 raise util.Abort(
2889d4574726 rebase: simplify check for orphaned descendants
Matt Mackall <mpm@selenic.com>
parents: 15271
diff changeset
321 _("can't remove original changesets with"
2889d4574726 rebase: simplify check for orphaned descendants
Matt Mackall <mpm@selenic.com>
parents: 15271
diff changeset
322 " unrebased descendants"),
2889d4574726 rebase: simplify check for orphaned descendants
Matt Mackall <mpm@selenic.com>
parents: 15271
diff changeset
323 hint=_('use --keep to keep original changesets'))
2889d4574726 rebase: simplify check for orphaned descendants
Matt Mackall <mpm@selenic.com>
parents: 15271
diff changeset
324
20250
f380b191e085 rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents: 20249
diff changeset
325 result = buildstate(repo, dest, rebaseset, collapsef)
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
326 if not result:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
327 # 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
328 ui.status(_('nothing to rebase\n'))
11205
d26f662bfbf5 rebase: add error codes
Matt Mackall <mpm@selenic.com>
parents: 11204
diff changeset
329 return 1
20250
f380b191e085 rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents: 20249
diff changeset
330
f380b191e085 rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents: 20249
diff changeset
331 root = min(rebaseset)
f380b191e085 rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents: 20249
diff changeset
332 if not keepf and not repo[root].mutable():
19059
53eadcb814fd rebase: check no-op before checking phase (issue3891)
Siddharth Agarwal <sid0@fb.com>
parents: 18933
diff changeset
333 raise util.Abort(_("can't rebase immutable changeset %s")
53eadcb814fd rebase: check no-op before checking phase (issue3891)
Siddharth Agarwal <sid0@fb.com>
parents: 18933
diff changeset
334 % repo[root],
23917
3cbb5bf4035d messages: quote "hg help" hints consistently
Wagner Bruna <wbruna@yahoo.com>
parents: 23877
diff changeset
335 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
336
f380b191e085 rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents: 20249
diff changeset
337 originalwd, target, state = result
f380b191e085 rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents: 20249
diff changeset
338 if collapsef:
f380b191e085 rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents: 20249
diff changeset
339 targetancestors = repo.changelog.ancestors([target],
f380b191e085 rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents: 20249
diff changeset
340 inclusive=True)
f380b191e085 rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents: 20249
diff changeset
341 external = externalparent(repo, state, targetancestors)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
342
21027
25ee5dbebc6b rebase: tell when reopening a closed branch head
Mads Kiilerich <madski@unity3d.com>
parents: 20790
diff changeset
343 if dest.closesbranch() and not keepbranchesf:
25ee5dbebc6b rebase: tell when reopening a closed branch head
Mads Kiilerich <madski@unity3d.com>
parents: 20790
diff changeset
344 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
345
7952
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
346 if keepbranchesf:
19860
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
347 # insert _savebranch at the start of extrafns so if
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
348 # there's a user-provided extrafn it can clobber branch if
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
349 # desired
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
350 extrafns.insert(0, _savebranch)
14897
b9daa5b7a3af rebase: block collapse with keepbranches on multiple named branches (issue2112)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14884
diff changeset
351 if collapsef:
b9daa5b7a3af rebase: block collapse with keepbranches on multiple named branches (issue2112)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14884
diff changeset
352 branches = set()
b9daa5b7a3af rebase: block collapse with keepbranches on multiple named branches (issue2112)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14884
diff changeset
353 for rev in state:
b9daa5b7a3af rebase: block collapse with keepbranches on multiple named branches (issue2112)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14884
diff changeset
354 branches.add(repo[rev].branch())
b9daa5b7a3af rebase: block collapse with keepbranches on multiple named branches (issue2112)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14884
diff changeset
355 if len(branches) > 1:
14917
2957b8b1e809 rebase: remove trailing whitespace found by check-code
Augie Fackler <durin42@gmail.com>
parents: 14897
diff changeset
356 raise util.Abort(_('cannot collapse multiple named '
14897
b9daa5b7a3af rebase: block collapse with keepbranches on multiple named branches (issue2112)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14884
diff changeset
357 'branches'))
b9daa5b7a3af rebase: block collapse with keepbranches on multiple named branches (issue2112)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14884
diff changeset
358
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
359 # Rebase
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
360 if not targetancestors:
18093
9c76da468a19 rebase: use lazy ancestor membership testing
Siddharth Agarwal <sid0@fb.com>
parents: 17989
diff changeset
361 targetancestors = repo.changelog.ancestors([target], inclusive=True)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
362
14884
c0ccd70df52c rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14635
diff changeset
363 # 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
364 currentbookmarks = repo._bookmarks.copy()
24947
a02d293a1079 bookmarks: rename bookmarkcurrent to activebookmark (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24945
diff changeset
365 activebookmark = activebookmark or repo._activebookmark
17046
4116504d1ec4 bookmarks: correctly update current bookmarks on rebase (issue2277)
David Schleimer <dschleimer@fb.com>
parents: 17026
diff changeset
366 if activebookmark:
24944
08ec11e3ae4c bookmarks: rename unsetcurrent to deactivate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24870
diff changeset
367 bookmarks.deactivate(repo)
14884
c0ccd70df52c rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14635
diff changeset
368
19860
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
369 extrafn = _makeextrafn(extrafns)
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
370
11729
c91b86a291b0 rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents: 11546
diff changeset
371 sortedstate = sorted(state)
c91b86a291b0 rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents: 11546
diff changeset
372 total = len(sortedstate)
c91b86a291b0 rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents: 11546
diff changeset
373 pos = 0
c91b86a291b0 rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents: 11546
diff changeset
374 for rev in sortedstate:
23517
4f18e80d9c30 rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents: 23491
diff changeset
375 ctx = repo[rev]
4f18e80d9c30 rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents: 23491
diff changeset
376 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
377 ctx.description().split('\n', 1)[0])
4f18e80d9c30 rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents: 23491
diff changeset
378 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
379 if names:
4f18e80d9c30 rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents: 23491
diff changeset
380 desc += ' (%s)' % ' '.join(names)
11729
c91b86a291b0 rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents: 11546
diff changeset
381 pos += 1
23490
102f144f6e02 rebase: add a 'revtodo' constant
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23489
diff changeset
382 if state[rev] == revtodo:
23517
4f18e80d9c30 rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents: 23491
diff changeset
383 ui.status(_('rebasing %s\n') % desc)
4f18e80d9c30 rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents: 23491
diff changeset
384 ui.progress(_("rebasing"), pos, ("%d:%s" % (rev, ctx)),
12744
0793d763e413 progress: dropping superfluous space from units
timeless <timeless@gmail.com>
parents: 12062
diff changeset
385 _('changesets'), total)
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
386 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
387 targetancestors)
7952
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
388 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
389 keepbranchesf, external, activebookmark)
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
390 if len(repo.parents()) == 2:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
391 repo.ui.debug('resuming interrupted rebase\n')
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
392 else:
13856
0995eee8ffe4 rebase: add --tool argument for specifying merge tool
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 13778
diff changeset
393 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
394 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
395 'rebase')
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
396 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
397 collapsef, target)
13856
0995eee8ffe4 rebase: add --tool argument for specifying merge tool
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 13778
diff changeset
398 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
399 raise error.InterventionRequired(
42b620fc89e2 rebase: switch from util.Abort to util.InterventionRequired where appropriate (bc)
Augie Fackler <raf@durin42.com>
parents: 18764
diff changeset
400 _('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
401 '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
402 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
403 ui.setconfig('ui', 'forcemerge', '', 'rebase')
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
404 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
405 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
406 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
407 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
408 newnode = concludenode(repo, rev, p1, p2, extrafn=extrafn,
2e047b1558a5 rebase: clarify naming of variables holding node hashes - don't call them rev
Mads Kiilerich <madski@unity3d.com>
parents: 23457
diff changeset
409 editor=editor)
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
410 else:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
411 # 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
412 repo.dirstate.beginparentchange()
16551
ebf6d38c9063 localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents: 16531
diff changeset
413 repo.setparents(repo[p1].node())
22405
6f63c47cbb86 dirstate: wrap setparent calls with begin/endparentchange (issue4353)
Durham Goode <durham@fb.com>
parents: 22388
diff changeset
414 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
415 newnode = None
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
416 # 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
417 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
418 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
419 ui.debug('rebased as %s\n' % short(newnode))
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
420 else:
23518
2fb0504b8175 rebase: show warning when rebase creates no changes to commit
Mads Kiilerich <madski@unity3d.com>
parents: 23517
diff changeset
421 ui.warn(_('note: rebase of %d:%s created no changes '
2fb0504b8175 rebase: show warning when rebase creates no changes to commit
Mads Kiilerich <madski@unity3d.com>
parents: 23517
diff changeset
422 'to commit\n') % (rev, ctx))
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
423 if not collapsef:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
424 skipped.add(rev)
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
425 state[rev] = p1
23519
8872d1bf30da rebase: improve debug messages while processing the list of rebases
Mads Kiilerich <madski@unity3d.com>
parents: 23518
diff changeset
426 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
427 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
428 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
429 elif state[rev] == revignored:
4f18e80d9c30 rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents: 23491
diff changeset
430 ui.status(_('not rebasing ignored %s\n') % desc)
4f18e80d9c30 rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents: 23491
diff changeset
431 else:
4f18e80d9c30 rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents: 23491
diff changeset
432 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
433 (desc, repo[state[rev]]))
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
434
11729
c91b86a291b0 rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents: 11546
diff changeset
435 ui.progress(_('rebasing'), None)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
436 ui.note(_('rebase merging completed\n'))
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
437
10677
f2558a8228be rebase: add option to not commit after a collapsing
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10676
diff changeset
438 if collapsef and not keepopen:
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
439 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
440 state, targetancestors)
22206
6122ad50e38f rebase: use "rebase.collapse" as "editform" for "--collapse" always
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22038
diff changeset
441 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
442 editform = 'rebase.collapse'
13661
ee349e228835 rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents: 13609
diff changeset
443 if collapsemsg:
ee349e228835 rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents: 13609
diff changeset
444 commitmsg = collapsemsg
ee349e228835 rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents: 13609
diff changeset
445 else:
ee349e228835 rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents: 13609
diff changeset
446 commitmsg = 'Collapsed revision'
ee349e228835 rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents: 13609
diff changeset
447 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
448 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
449 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
450 editopt = True
6122ad50e38f rebase: use "rebase.collapse" as "editform" for "--collapse" always
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22038
diff changeset
451 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
452 newnode = concludenode(repo, rev, p1, external, commitmsg=commitmsg,
2e047b1558a5 rebase: clarify naming of variables holding node hashes - don't call them rev
Mads Kiilerich <madski@unity3d.com>
parents: 23457
diff changeset
453 extrafn=extrafn, editor=editor)
23460
8dc45c905989 rebase: always store rev in state, also when collapsing
Mads Kiilerich <madski@unity3d.com>
parents: 23459
diff changeset
454 if newnode is None:
8dc45c905989 rebase: always store rev in state, also when collapsing
Mads Kiilerich <madski@unity3d.com>
parents: 23459
diff changeset
455 newrev = target
8dc45c905989 rebase: always store rev in state, also when collapsing
Mads Kiilerich <madski@unity3d.com>
parents: 23459
diff changeset
456 else:
8dc45c905989 rebase: always store rev in state, also when collapsing
Mads Kiilerich <madski@unity3d.com>
parents: 23459
diff changeset
457 newrev = repo[newnode].rev()
19986
ea81f8b2364e rebase: fix working copy location after a --collapse (issue4080)
Durham Goode <durham@fb.com>
parents: 19984
diff changeset
458 for oldrev in state.iterkeys():
ea81f8b2364e rebase: fix working copy location after a --collapse (issue4080)
Durham Goode <durham@fb.com>
parents: 19984
diff changeset
459 if state[oldrev] > nullmerge:
23460
8dc45c905989 rebase: always store rev in state, also when collapsing
Mads Kiilerich <madski@unity3d.com>
parents: 23459
diff changeset
460 state[oldrev] = newrev
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
461
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
462 if 'qtip' in repo.tags():
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
463 updatemq(repo, state, skipped, **opts)
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
464
14884
c0ccd70df52c rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14635
diff changeset
465 if currentbookmarks:
c0ccd70df52c rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14635
diff changeset
466 # Nodeids are needed to reset bookmarks
c0ccd70df52c rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14635
diff changeset
467 nstate = {}
c0ccd70df52c rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14635
diff changeset
468 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
469 if v > nullmerge:
14884
c0ccd70df52c rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14635
diff changeset
470 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
471 # 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
472 # this should probably be cleaned up
12de53323e59 rebase: derive node from target rev (issue3802)
Siddharth Agarwal <sid0@fb.com>
parents: 18518
diff changeset
473 targetnode = repo[target].node()
14884
c0ccd70df52c rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14635
diff changeset
474
19925
9c78ed396075 rebase: preserve working directory parent (BC)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19861
diff changeset
475 # restore original working directory
9c78ed396075 rebase: preserve working directory parent (BC)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19861
diff changeset
476 # (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
477 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
478 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
479 # 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
480 newwd = originalwd
19925
9c78ed396075 rebase: preserve working directory parent (BC)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19861
diff changeset
481 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
482 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
483 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
484
7952
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
485 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
486 collapsedas = None
aafc521668d8 rebase: properly handle --collapse when creating obsolescence marker
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17612
diff changeset
487 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
488 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
489 clearrebased(ui, repo, state, skipped, collapsedas)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
490
14884
c0ccd70df52c rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14635
diff changeset
491 if currentbookmarks:
18549
12de53323e59 rebase: derive node from target rev (issue3802)
Siddharth Agarwal <sid0@fb.com>
parents: 18518
diff changeset
492 updatebookmarks(repo, targetnode, nstate, currentbookmarks)
20523
f2a0a0e76b4c rebase: do not try to reactivate deleted divergent bookmark
Yuya Nishihara <yuya@tcha.org>
parents: 20327
diff changeset
493 if activebookmark not in repo._bookmarks:
f2a0a0e76b4c rebase: do not try to reactivate deleted divergent bookmark
Yuya Nishihara <yuya@tcha.org>
parents: 20327
diff changeset
494 # active bookmark was divergent one and has been deleted
f2a0a0e76b4c rebase: do not try to reactivate deleted divergent bookmark
Yuya Nishihara <yuya@tcha.org>
parents: 20327
diff changeset
495 activebookmark = None
14884
c0ccd70df52c rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14635
diff changeset
496
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
497 clearstatus(repo)
11203
7a9cf012dddc rebase: only show "rebase completed" message with -v
Matt Mackall <mpm@selenic.com>
parents: 11201
diff changeset
498 ui.note(_("rebase completed\n"))
18386
03442135dff4 refactoring: use unlinkpath with ignoremissing
Mads Kiilerich <madski@unity3d.com>
parents: 18269
diff changeset
499 util.unlinkpath(repo.sjoin('undo'), ignoremissing=True)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
500 if skipped:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
501 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
502
4116504d1ec4 bookmarks: correctly update current bookmarks on rebase (issue2277)
David Schleimer <dschleimer@fb.com>
parents: 17026
diff changeset
503 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
504 repo['.'].node() == repo._bookmarks[activebookmark]):
24945
e0b0fbd47491 bookmarks: rename setcurrent to activate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24944
diff changeset
505 bookmarks.activate(repo, activebookmark)
17046
4116504d1ec4 bookmarks: correctly update current bookmarks on rebase (issue2277)
David Schleimer <dschleimer@fb.com>
parents: 17026
diff changeset
506
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
507 finally:
8112
6ee71f78497c switch lock releasing in the extensions from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8076
diff changeset
508 release(lock, wlock)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
509
19955
2160c2e0d7d1 rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents: 19951
diff changeset
510 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
511 """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
512 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
513 Abort if there is more than one parent.
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
514 """
19955
2160c2e0d7d1 rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents: 19951
diff changeset
515 parents = set()
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
516 source = min(state)
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
517 for rev in state:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
518 if rev == source:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
519 continue
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
520 for p in repo[rev].parents():
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
521 if (p.rev() not in state
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
522 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
523 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
524 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
525 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
526 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
527 return parents.pop()
19956
78ab0f85e249 rebase: improve error message for more than one external parent
Mads Kiilerich <madski@unity3d.com>
parents: 19955
diff changeset
528 raise util.Abort(_('unable to collapse on top of %s, there is more '
78ab0f85e249 rebase: improve error message for more than one external parent
Mads Kiilerich <madski@unity3d.com>
parents: 19955
diff changeset
529 '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
530 (max(targetancestors),
78ab0f85e249 rebase: improve error message for more than one external parent
Mads Kiilerich <madski@unity3d.com>
parents: 19955
diff changeset
531 ', '.join(str(p) for p in sorted(parents))))
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
532
15219
9d58569a8b92 rebase: add --edit switch
Matt Mackall <mpm@selenic.com>
parents: 15214
diff changeset
533 def concludenode(repo, rev, p1, p2, commitmsg=None, editor=None, extrafn=None):
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
534 '''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
535 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
536 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
537 dsguard = cmdutil.dirstateguard(repo, 'rebase')
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
538 try:
16551
ebf6d38c9063 localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents: 16531
diff changeset
539 repo.setparents(repo[p1].node(), repo[p2].node())
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
540 ctx = repo[rev]
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
541 if commitmsg is None:
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
542 commitmsg = ctx.description()
10762
129e96f7a87a rebase: fix --collapse with --keepbranches (issue2100)
Patrick Mezard <pmezard@gmail.com>
parents: 10672
diff changeset
543 extra = {'rebase_source': ctx.hex()}
129e96f7a87a rebase: fix --collapse with --keepbranches (issue2100)
Patrick Mezard <pmezard@gmail.com>
parents: 10672
diff changeset
544 if extrafn:
129e96f7a87a rebase: fix --collapse with --keepbranches (issue2100)
Patrick Mezard <pmezard@gmail.com>
parents: 10672
diff changeset
545 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
546
021becbf024a rebase: do not retract phase boundary by hand
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22004
diff changeset
547 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
548 try:
021becbf024a rebase: do not retract phase boundary by hand
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22004
diff changeset
549 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
550 repo.ui.setconfig('phases', 'new-commit', targetphase, 'rebase')
021becbf024a rebase: do not retract phase boundary by hand
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22004
diff changeset
551 # Commit might fail if unresolved files exist
23459
2e047b1558a5 rebase: clarify naming of variables holding node hashes - don't call them rev
Mads Kiilerich <madski@unity3d.com>
parents: 23457
diff changeset
552 newnode = repo.commit(text=commitmsg, user=ctx.user(),
2e047b1558a5 rebase: clarify naming of variables holding node hashes - don't call them rev
Mads Kiilerich <madski@unity3d.com>
parents: 23457
diff changeset
553 date=ctx.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
554 finally:
021becbf024a rebase: do not retract phase boundary by hand
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22004
diff changeset
555 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
556
23459
2e047b1558a5 rebase: clarify naming of variables holding node hashes - don't call them rev
Mads Kiilerich <madski@unity3d.com>
parents: 23457
diff changeset
557 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
558 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
559 return newnode
24998
c8a97fa742b7 rebase: use dirstateguard instead of dirstate.invalidate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24947
diff changeset
560 finally:
c8a97fa742b7 rebase: use dirstateguard instead of dirstate.invalidate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24947
diff changeset
561 release(dsguard)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
562
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
563 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
564 '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
565 # Merge phase
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
566 # 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
567 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
568 repo.ui.debug(" update to %d:%s\n" % (p1, repo[p1]))
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
569 merge.update(repo, p1, False, True, False)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
570 else:
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
571 repo.ui.debug(" already in target\n")
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
572 repo.dirstate.write()
23461
ffef6d503ab2 rebase: avoid redundant repo[rev].rev() - just keep working in rev space
Mads Kiilerich <madski@unity3d.com>
parents: 23460
diff changeset
573 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
574 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
575 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
576 # 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
577 # have to allow merging with it.
22905
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
578 stats = merge.update(repo, rev, True, True, False, base, collapse,
21526
3b40e32e88c3 rebase: specify custom conflict marker labels for rebase (BC)
Durham Goode <durham@fb.com>
parents: 21410
diff changeset
579 labels=['dest', 'source'])
22905
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
580 if collapse:
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
581 copies.duplicatecopies(repo, rev, target)
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
582 else:
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
583 # 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
584 # duplicate copies between the revision we're
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
585 # rebasing and its first parent, but *not*
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
586 # duplicate any copies that have already been
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
587 # performed in the destination.
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
588 p1rev = repo[rev].p1().rev()
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
589 copies.duplicatecopies(repo, rev, p1rev, skiprev=target)
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
590 return stats
6923
ebf1462f2145 strip trailing whitespace, replace tabs by spaces
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6906
diff changeset
591
18447
7159426c8d13 rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18446
diff changeset
592 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
593 """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
594 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
595 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
596 if candidates:
22820
103dcfbb385f rebase: use `last` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22790
diff changeset
597 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
598 else:
7159426c8d13 rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18446
diff changeset
599 return None
7159426c8d13 rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18446
diff changeset
600
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
601 def defineparents(repo, rev, target, state, targetancestors):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
602 '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
603 parents = repo[rev].parents()
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
604 p1 = p2 = nullrev
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
605
22906
75d0edb68b41 rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents: 22905
diff changeset
606 p1n = parents[0].rev()
75d0edb68b41 rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents: 22905
diff changeset
607 if p1n in targetancestors:
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
608 p1 = target
22906
75d0edb68b41 rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents: 22905
diff changeset
609 elif p1n in state:
75d0edb68b41 rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents: 22905
diff changeset
610 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
611 p1 = target
22906
75d0edb68b41 rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents: 22905
diff changeset
612 elif state[p1n] == revignored:
75d0edb68b41 rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents: 22905
diff changeset
613 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
614 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
615 p1 = target
10352
66d954e76ffb rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10351
diff changeset
616 else:
22906
75d0edb68b41 rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents: 22905
diff changeset
617 p1 = state[p1n]
75d0edb68b41 rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents: 22905
diff changeset
618 else: # p1n external
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
619 p1 = target
22906
75d0edb68b41 rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents: 22905
diff changeset
620 p2 = p1n
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
621
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
622 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
623 p2n = parents[1].rev()
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
624 # interesting second parent
22906
75d0edb68b41 rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents: 22905
diff changeset
625 if p2n in state:
75d0edb68b41 rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents: 22905
diff changeset
626 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
627 p1 = state[p2n]
75d0edb68b41 rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents: 22905
diff changeset
628 elif state[p2n] == revignored:
75d0edb68b41 rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents: 22905
diff changeset
629 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
630 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
631 # 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
632 p2 = target
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
633 else:
22906
75d0edb68b41 rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents: 22905
diff changeset
634 p2 = state[p2n]
75d0edb68b41 rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents: 22905
diff changeset
635 else: # p2n external
75d0edb68b41 rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents: 22905
diff changeset
636 if p2 != nullrev: # p1n external too => rev is a merged revision
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
637 raise util.Abort(_('cannot use revision %d as base, result '
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
638 'would have 3 parents') % rev)
22906
75d0edb68b41 rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents: 22905
diff changeset
639 p2 = p2n
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
640 repo.ui.debug(" future parents are %d and %d\n" %
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
641 (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
642
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
643 if rev == min(state):
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
644 # Case (1) initial changeset of a non-detaching rebase.
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
645 # 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
646 base = None
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
647 elif not repo[rev].p2():
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
648 # 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
649 base = repo[rev].p1().rev()
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
650 else:
23732
c51d6c043bb1 rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents: 23520
diff changeset
651 # 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
652 # 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
653 #
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
654 # Imagine we have:
23732
c51d6c043bb1 rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents: 23520
diff changeset
655 # - 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
656 # - 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
657 # - B: other parent of M
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
658 # - 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
659 #
23732
c51d6c043bb1 rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents: 23520
diff changeset
660 # 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
661 # '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
662 #
c51d6c043bb1 rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents: 23520
diff changeset
663 # 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
664 #
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
665 # 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
666 # - 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
667 # - 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
668 # version of B)
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
669 # Which exactly represent the rebase operation.
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
670 #
23732
c51d6c043bb1 rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents: 23520
diff changeset
671 # 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
672 # - 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
673 # - 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
674 # plus changes induced by rebase)
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
675 # 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
676 # 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
677 #
c51d6c043bb1 rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents: 23520
diff changeset
678 # 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
679 # 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
680 # 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
681 # 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
682 # 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
683 # 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
684 # 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
685 for p in repo[rev].parents():
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
686 if state.get(p.rev()) == p1:
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
687 base = p.rev()
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
688 break
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
689 else: # fallback when base not found
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
690 base = None
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
691
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
692 # 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
693 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
694 '(defineparents called wrong)')
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
695 return p1, p2, base
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
696
7955
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
697 def isagitpatch(repo, patchname):
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
698 '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
699 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
700 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
701 if line.startswith('diff --git'):
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
702 return True
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
703 return False
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
704
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
705 def updatemq(repo, state, skipped, **opts):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
706 'Update rebased mq patches - finalize and then import them'
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
707 mqrebase = {}
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
708 mq = repo.mq
14572
8ff2957c1d82 mq: rename full_series to fullseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14509
diff changeset
709 original_series = mq.fullseries[:]
16531
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
710 skippedpatches = set()
14497
ea585f2b1adc rebase: restore mq guards after rebasing (issue2107)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 13894
diff changeset
711
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
712 for p in mq.applied:
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
713 rev = repo[p.node].rev()
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
714 if rev in state:
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9301
diff changeset
715 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
716 (rev, p.name))
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
717 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
718 else:
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
719 # 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
720 skippedpatches.add(p.name)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
721
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
722 if mqrebase:
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
723 mq.finish(repo, mqrebase.keys())
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
724
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
725 # 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
726 for rev in sorted(mqrebase, reverse=True):
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
727 if rev not in skipped:
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
728 name, isgit = mqrebase[rev]
23520
de143427c499 rebase: show a note for updated mq patches
Mads Kiilerich <mads@kiilerich.com>
parents: 23519
diff changeset
729 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
730 (name, state[rev], repo[state[rev]]))
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
731 mq.qimport(repo, (), patchname=name, git=isgit,
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
732 rev=[str(state[rev])])
16531
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
733 else:
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
734 # Rebased and skipped
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
735 skippedpatches.add(mqrebase[rev][0])
14497
ea585f2b1adc rebase: restore mq guards after rebasing (issue2107)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 13894
diff changeset
736
16531
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
737 # 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
738 # 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
739 # 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
740 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
741 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
742 mq.fullseries[:] = newseries
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
743 mq.seriesdirty = True
14580
92101ea35015 mq: rename save_dirty to savedirty
Adrian Buehlmann <adrian@cadifra.com>
parents: 14572
diff changeset
744 mq.savedirty()
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
745
18549
12de53323e59 rebase: derive node from target rev (issue3802)
Siddharth Agarwal <sid0@fb.com>
parents: 18518
diff changeset
746 def updatebookmarks(repo, targetnode, nstate, originalbookmarks):
18514
2a1fac3650a5 rebase: delete divergent bookmarks on destination (issue3685)
Siddharth Agarwal <sid0@fb.com>
parents: 18512
diff changeset
747 '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
748 marks = repo._bookmarks
14884
c0ccd70df52c rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14635
diff changeset
749 for k, v in originalbookmarks.iteritems():
c0ccd70df52c rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14635
diff changeset
750 if v in nstate:
18512
22978b82ab4b rebase: remove bogus nullmerge check in updatebookmarks
Siddharth Agarwal <sid0@fb.com>
parents: 18447
diff changeset
751 # 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
752 marks[k] = nstate[v]
18549
12de53323e59 rebase: derive node from target rev (issue3802)
Siddharth Agarwal <sid0@fb.com>
parents: 18518
diff changeset
753 bookmarks.deletedivergent(repo, [targetnode], k)
14884
c0ccd70df52c rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14635
diff changeset
754
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17615
diff changeset
755 marks.write()
14884
c0ccd70df52c rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14635
diff changeset
756
7952
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
757 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
758 external, activebookmark):
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
759 '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
760 f = repo.vfs("rebasestate", "w")
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
761 f.write(repo[originalwd].hex() + '\n')
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
762 f.write(repo[target].hex() + '\n')
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
763 f.write(repo[external].hex() + '\n')
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
764 f.write('%d\n' % int(collapse))
7952
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
765 f.write('%d\n' % int(keep))
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
766 f.write('%d\n' % int(keepbranches))
18755
72412afe4c28 rebase: restore active bookmark after rebase --continue
Durham Goode <durham@fb.com>
parents: 18549
diff changeset
767 f.write('%s\n' % (activebookmark or ''))
7622
4dd7b28003d2 use dict.iteritems() rather than dict.items()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7599
diff changeset
768 for d, v in state.iteritems():
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
769 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
770 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
771 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
772 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
773 # 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
774 # 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
775 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
776 else:
3411a83e232a rebase: treat nullmerge as a special case in rebasestate (issue3046)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 15289
diff changeset
777 newrev = v
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
778 f.write("%s:%s\n" % (oldrev, newrev))
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
779 f.close()
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9301
diff changeset
780 repo.ui.debug('rebase status stored\n')
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
781
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
782 def clearstatus(repo):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
783 '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
784 _clearrebasesetvisibiliy(repo)
18386
03442135dff4 refactoring: use unlinkpath with ignoremissing
Mads Kiilerich <madski@unity3d.com>
parents: 18269
diff changeset
785 util.unlinkpath(repo.join("rebasestate"), ignoremissing=True)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
786
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
787 def restorestatus(repo):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
788 'Restore a previously stored status'
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
789 try:
20327
46c2331fc750 rebase: abort cleanly when we encounter a damaged rebasestate (issue4155)
Matt Mackall <mpm@selenic.com>
parents: 20313
diff changeset
790 keepbranches = None
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
791 target = None
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
792 collapse = False
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
793 external = nullrev
18755
72412afe4c28 rebase: restore active bookmark after rebase --continue
Durham Goode <durham@fb.com>
parents: 18549
diff changeset
794 activebookmark = None
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
795 state = {}
23877
7cc77030c557 localrepo: remove all external users of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23732
diff changeset
796 f = repo.vfs("rebasestate")
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
797 for i, l in enumerate(f.read().splitlines()):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
798 if i == 0:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
799 originalwd = repo[l].rev()
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
800 elif i == 1:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
801 target = repo[l].rev()
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
802 elif i == 2:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
803 external = repo[l].rev()
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
804 elif i == 3:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
805 collapse = bool(int(l))
7952
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
806 elif i == 4:
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
807 keep = bool(int(l))
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
808 elif i == 5:
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
809 keepbranches = bool(int(l))
18755
72412afe4c28 rebase: restore active bookmark after rebase --continue
Durham Goode <durham@fb.com>
parents: 18549
diff changeset
810 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
811 # 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
812 # 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
813 activebookmark = l
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
814 else:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
815 oldrev, newrev = l.split(':')
18447
7159426c8d13 rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18446
diff changeset
816 if newrev in (str(nullmerge), str(revignored)):
7159426c8d13 rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18446
diff changeset
817 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
818 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
819 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
820 # 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
821 else:
15464
3411a83e232a rebase: treat nullmerge as a special case in rebasestate (issue3046)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 15289
diff changeset
822 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
823
46c2331fc750 rebase: abort cleanly when we encounter a damaged rebasestate (issue4155)
Matt Mackall <mpm@selenic.com>
parents: 20313
diff changeset
824 if keepbranches is None:
46c2331fc750 rebase: abort cleanly when we encounter a damaged rebasestate (issue4155)
Matt Mackall <mpm@selenic.com>
parents: 20313
diff changeset
825 raise util.Abort(_('.hg/rebasestate is incomplete'))
46c2331fc750 rebase: abort cleanly when we encounter a damaged rebasestate (issue4155)
Matt Mackall <mpm@selenic.com>
parents: 20313
diff changeset
826
11843
00f8e7837668 rebase: recompute the set of skipped rev when using --continue (issue2330)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 11546
diff changeset
827 skipped = set()
00f8e7837668 rebase: recompute the set of skipped rev when using --continue (issue2330)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 11546
diff changeset
828 # recompute the set of skipped revs
00f8e7837668 rebase: recompute the set of skipped rev when using --continue (issue2330)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 11546
diff changeset
829 if not collapse:
00f8e7837668 rebase: recompute the set of skipped rev when using --continue (issue2330)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 11546
diff changeset
830 seen = set([target])
00f8e7837668 rebase: recompute the set of skipped rev when using --continue (issue2330)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 11546
diff changeset
831 for old, new in sorted(state.items()):
23490
102f144f6e02 rebase: add a 'revtodo' constant
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23489
diff changeset
832 if new != revtodo and new in seen:
11843
00f8e7837668 rebase: recompute the set of skipped rev when using --continue (issue2330)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 11546
diff changeset
833 skipped.add(old)
00f8e7837668 rebase: recompute the set of skipped rev when using --continue (issue2330)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 11546
diff changeset
834 seen.add(new)
20546
bf1d91ab1efb rebase: show nice list instead of set repr for 'computed skipped revs' debug
Mads Kiilerich <madski@unity3d.com>
parents: 20545
diff changeset
835 repo.ui.debug('computed skipped revs: %s\n' %
bf1d91ab1efb rebase: show nice list instead of set repr for 'computed skipped revs' debug
Mads Kiilerich <madski@unity3d.com>
parents: 20545
diff changeset
836 (' '.join(str(r) for r in sorted(skipped)) or None))
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9301
diff changeset
837 repo.ui.debug('rebase status resumed\n')
23970
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
838 _setrebasesetvisibility(repo, state.keys())
11843
00f8e7837668 rebase: recompute the set of skipped rev when using --continue (issue2330)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 11546
diff changeset
839 return (originalwd, target, state, skipped,
18755
72412afe4c28 rebase: restore active bookmark after rebase --continue
Durham Goode <durham@fb.com>
parents: 18549
diff changeset
840 collapse, keep, keepbranches, external, activebookmark)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
841 except IOError, err:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
842 if err.errno != errno.ENOENT:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
843 raise
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
844 raise util.Abort(_('no rebase in progress'))
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
845
25070
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
846 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
847 '''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
848 somehow the working dir got forcibly updated, e.g. by older hg'''
19516
fe78eb7bcca0 rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents: 19496
diff changeset
849 parents = [p.rev() for p in repo.parents()]
25070
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
850
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
851 # 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
852 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
853 return False
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
854
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
855 # 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
856 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
857 if new == nullrev])
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
858 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
859 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
860
fe78eb7bcca0 rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents: 19496
diff changeset
861 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
862
24758
d7451adc72f6 rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents: 23970
diff changeset
863 def abort(repo, originalwd, target, state, activebookmark=None):
d7451adc72f6 rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents: 23970
diff changeset
864 '''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
865
d7451adc72f6 rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents: 23970
diff changeset
866 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
867 restore'''
23489
fe4157d839ac rebase: use '>= 0' to know is a revision was rebased
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23484
diff changeset
868 dstates = [s for s in state.values() if s >= 0]
17026
f8af57c00a29 rebase: improve error message on improper phases
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 16551
diff changeset
869 immutable = [d for d in dstates if not repo[d].mutable()]
19518
12843143663d rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents: 19517
diff changeset
870 cleanup = True
17026
f8af57c00a29 rebase: improve error message on improper phases
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 16551
diff changeset
871 if immutable:
19517
eab2ff59481e rebase: continue abort without strip for immutable csets (issue3997)
Matt Mackall <mpm@selenic.com>
parents: 19516
diff changeset
872 repo.ui.warn(_("warning: can't clean up immutable changesets %s\n")
eab2ff59481e rebase: continue abort without strip for immutable csets (issue3997)
Matt Mackall <mpm@selenic.com>
parents: 19516
diff changeset
873 % ', '.join(str(repo[r]) for r in immutable),
23917
3cbb5bf4035d messages: quote "hg help" hints consistently
Wagner Bruna <wbruna@yahoo.com>
parents: 23877
diff changeset
874 hint=_('see "hg help phases" for details'))
19518
12843143663d rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents: 19517
diff changeset
875 cleanup = False
16280
0806823370d8 rebase: properly calculate descendant set when aborting (issue3332)
Matt Mackall <mpm@selenic.com>
parents: 16228
diff changeset
876
0806823370d8 rebase: properly calculate descendant set when aborting (issue3332)
Matt Mackall <mpm@selenic.com>
parents: 16228
diff changeset
877 descendants = set()
0806823370d8 rebase: properly calculate descendant set when aborting (issue3332)
Matt Mackall <mpm@selenic.com>
parents: 16228
diff changeset
878 if dstates:
16867
1093ad1e8903 revlog: descendants(*revs) becomes descendants(revs) (API)
Bryan O'Sullivan <bryano@fb.com>
parents: 16866
diff changeset
879 descendants = set(repo.changelog.descendants(dstates))
16280
0806823370d8 rebase: properly calculate descendant set when aborting (issue3332)
Matt Mackall <mpm@selenic.com>
parents: 16228
diff changeset
880 if descendants - set(dstates):
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
881 repo.ui.warn(_("warning: new changesets detected on target branch, "
19518
12843143663d rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents: 19517
diff changeset
882 "can't strip\n"))
12843143663d rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents: 19517
diff changeset
883 cleanup = False
12843143663d rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents: 19517
diff changeset
884
12843143663d rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents: 19517
diff changeset
885 if cleanup:
19516
fe78eb7bcca0 rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents: 19496
diff changeset
886 # Update away from the rebase if necessary
25070
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
887 if needupdate(repo, state):
23461
ffef6d503ab2 rebase: avoid redundant repo[rev].rev() - just keep working in rev space
Mads Kiilerich <madski@unity3d.com>
parents: 23460
diff changeset
888 merge.update(repo, originalwd, False, True, False)
19516
fe78eb7bcca0 rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents: 19496
diff changeset
889
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
890 # Strip from the first rebased revision
23489
fe4157d839ac rebase: use '>= 0' to know is a revision was rebased
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23484
diff changeset
891 rebased = filter(lambda x: x >= 0 and x != target, state.values())
19518
12843143663d rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents: 19517
diff changeset
892 if rebased:
18424
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
893 strippoints = [c.node() for c in repo.set('roots(%ld)', rebased)]
11201
34023f2ca305 Fix up rebase's handling of strip backups
Matt Mackall <mpm@selenic.com>
parents: 11189
diff changeset
894 # no backup of rebased cset versions needed
18424
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
895 repair.strip(repo.ui, repo, strippoints)
19518
12843143663d rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents: 19517
diff changeset
896
25101
91c2278c68a3 rebase: check that the bookmark is still valid when restoring (issue4669)
Tony Tung <tonytung@fb.com>
parents: 25070
diff changeset
897 if activebookmark and activebookmark in repo._bookmarks:
24945
e0b0fbd47491 bookmarks: rename setcurrent to activate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24944
diff changeset
898 bookmarks.activate(repo, activebookmark)
24758
d7451adc72f6 rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents: 23970
diff changeset
899
19518
12843143663d rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents: 19517
diff changeset
900 clearstatus(repo)
12843143663d rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents: 19517
diff changeset
901 repo.ui.warn(_('rebase aborted\n'))
12843143663d rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents: 19517
diff changeset
902 return 0
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
903
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
904 def buildstate(repo, dest, rebaseset, collapse):
15267
3bfdfefea2fc rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15219
diff changeset
905 '''Define which revisions are going to be rebased and where
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
906
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
907 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
908 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
909 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
910 '''
23970
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
911 _setrebasesetvisibility(repo, rebaseset)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
912
10672
c2e1e637d4da rebase: always check if rebasing onto an applied mq patch.
Greg Ward <greg-hg@gerg.ca>
parents: 10659
diff changeset
913 # 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
914 # 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
915 # 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
916 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
917 [s.node for s in repo.mq.applied]):
10672
c2e1e637d4da rebase: always check if rebasing onto an applied mq patch.
Greg Ward <greg-hg@gerg.ca>
parents: 10659
diff changeset
918 raise util.Abort(_('cannot rebase onto an applied mq patch'))
c2e1e637d4da rebase: always check if rebasing onto an applied mq patch.
Greg Ward <greg-hg@gerg.ca>
parents: 10659
diff changeset
919
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
920 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
921 if not roots:
15270
6cb6064f1d50 rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15269
diff changeset
922 raise util.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
923 roots.sort()
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
924 state = {}
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
925 detachset = set()
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
926 for root in roots:
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
927 commonbase = root.ancestor(dest)
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
928 if commonbase == root:
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
929 raise util.Abort(_('source is ancestor of destination'))
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
930 if commonbase == dest:
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
931 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
932 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
933 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
934 return None
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
935
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
936 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
937 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
938 # 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
939 # 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
940 #
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
941 # - 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
942 # 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
943 #
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
944 # - 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
945 # 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
946 # pruned while rebased.
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
947 #
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
948 # 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
949 # 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
950 # --base option.
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
951 #
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
952 # 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
953 # <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
954 # 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
955 # <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
956 # 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
957 #
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
958 # - 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
959 #
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
960 # - 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
961 # 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
962 #
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
963 # 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
964 #
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
965 # +------------------+----------------------+-------------------------+
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
966 # | | one parent | merge |
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
967 # +------------------+----------------------+-------------------------+
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
968 # | 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
969 # | ::<dest> | | remapped to <dest> |
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
970 # +------------------+----------------------+-------------------------+
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
971 # | 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
972 # +------------------+----------------------+-------------------------+
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
973 #
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
974 # 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
975 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
976 # 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
977 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
978 [root.rev()]))
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
979 for r in detachset:
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
980 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
981 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
982 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
983 # 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
984 # 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
985 # 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
986 # 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
987 # 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
988 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
989 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
990 state[ignored] = revignored
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
991 return repo['.'].rev(), dest.rev(), state
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
992
18444
55aff0c2b73c rebase: do not invent successor to skipped changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18424
diff changeset
993 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
994 """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
995
aafc521668d8 rebase: properly handle --collapse when creating obsolescence marker
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17612
diff changeset
996 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
997 `collapsedas` node."""
22951
6c86c673dde6 obsolete: add createmarkers option
Durham Goode <durham@fb.com>
parents: 22906
diff changeset
998 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
999 markers = []
fc2a6114f0a0 rebase: allow creation obsolescence relation instead of stripping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17611
diff changeset
1000 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
1001 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
1002 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
1003 succs = ()
55aff0c2b73c rebase: do not invent successor to skipped changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18424
diff changeset
1004 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
1005 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
1006 else:
55aff0c2b73c rebase: do not invent successor to skipped changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18424
diff changeset
1007 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
1008 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
1009 if markers:
fc2a6114f0a0 rebase: allow creation obsolescence relation instead of stripping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17611
diff changeset
1010 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
1011 else:
18446
c83d36b81df1 rebase: lose the comparison to `nullmerge`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18444
diff changeset
1012 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
1013 if rebased:
18424
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
1014 stripped = []
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
1015 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
1016 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
1017 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
1018 "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
1019 else:
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
1020 stripped.append(root.node())
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
1021 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
1022 # 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
1023 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
1024
910123eac887 rebase: extract final changesets cleanup logic in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17325
diff changeset
1025
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
1026 def pullrebase(orig, ui, repo, *args, **opts):
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1027 'Call rebase after pull if the latter has been invoked with --rebase'
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1028 if opts.get('rebase'):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1029 if opts.get('update'):
8242
aee8455ee8ec Fix typeerror when specifying both --rebase and --pull
Martijn Pieters <mj@zopatista.com>
parents: 7786
diff changeset
1030 del opts['update']
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9301
diff changeset
1031 ui.debug('--update and --rebase are not compatible, ignoring '
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9301
diff changeset
1032 'the update flag\n')
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1033
16228
5b41d5ad52bf rebase: move bookmarks as needed with pull --rebase (issue3285)
Matt Mackall <mpm@selenic.com>
parents: 15945
diff changeset
1034 movemarkfrom = repo['.'].node()
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1035 revsprepull = len(repo)
10628
6227c8d669d5 rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents: 10436
diff changeset
1036 origpostincoming = commands.postincoming
6227c8d669d5 rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents: 10436
diff changeset
1037 def _dummy(*args, **kwargs):
6227c8d669d5 rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents: 10436
diff changeset
1038 pass
6227c8d669d5 rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents: 10436
diff changeset
1039 commands.postincoming = _dummy
6227c8d669d5 rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents: 10436
diff changeset
1040 try:
6227c8d669d5 rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents: 10436
diff changeset
1041 orig(ui, repo, *args, **opts)
6227c8d669d5 rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents: 10436
diff changeset
1042 finally:
6227c8d669d5 rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents: 10436
diff changeset
1043 commands.postincoming = origpostincoming
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1044 revspostpull = len(repo)
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1045 if revspostpull > revsprepull:
17988
848345a8d6ad rebase: fix pull --rev options clashing with --rebase (issue3619)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17615
diff changeset
1046 # --rev option from pull conflict with rebase own --rev
848345a8d6ad rebase: fix pull --rev options clashing with --rebase (issue3619)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17615
diff changeset
1047 # dropping it
848345a8d6ad rebase: fix pull --rev options clashing with --rebase (issue3619)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17615
diff changeset
1048 if 'rev' in opts:
848345a8d6ad rebase: fix pull --rev options clashing with --rebase (issue3619)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17615
diff changeset
1049 del opts['rev']
24870
4ec40a4db64a rebase: don't forward "source" argument to rebase (issue4633)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24758
diff changeset
1050 # positional argument from pull conflicts with rebase's own
4ec40a4db64a rebase: don't forward "source" argument to rebase (issue4633)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24758
diff changeset
1051 # --source.
4ec40a4db64a rebase: don't forward "source" argument to rebase (issue4633)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24758
diff changeset
1052 if 'source' in opts:
4ec40a4db64a rebase: don't forward "source" argument to rebase (issue4633)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24758
diff changeset
1053 del opts['source']
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
1054 rebase(ui, repo, **opts)
7786
92455c1d6f83 rebase: pull --rebase updates if there is nothing to rebase
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7636
diff changeset
1055 branch = repo[None].branch()
92455c1d6f83 rebase: pull --rebase updates if there is nothing to rebase
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7636
diff changeset
1056 dest = repo[branch].rev()
92455c1d6f83 rebase: pull --rebase updates if there is nothing to rebase
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7636
diff changeset
1057 if dest != repo['.'].rev():
92455c1d6f83 rebase: pull --rebase updates if there is nothing to rebase
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7636
diff changeset
1058 # there was nothing to rebase we force an update
10628
6227c8d669d5 rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents: 10436
diff changeset
1059 hg.update(repo, dest)
16228
5b41d5ad52bf rebase: move bookmarks as needed with pull --rebase (issue3285)
Matt Mackall <mpm@selenic.com>
parents: 15945
diff changeset
1060 if bookmarks.update(repo, [movemarkfrom], repo['.'].node()):
5b41d5ad52bf rebase: move bookmarks as needed with pull --rebase (issue3285)
Matt Mackall <mpm@selenic.com>
parents: 15945
diff changeset
1061 ui.status(_("updating bookmark %s\n")
24947
a02d293a1079 bookmarks: rename bookmarkcurrent to activebookmark (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24945
diff changeset
1062 % repo._activebookmark)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1063 else:
14444
1f997134a9d1 rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents: 14306
diff changeset
1064 if opts.get('tool'):
1f997134a9d1 rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents: 14306
diff changeset
1065 raise util.Abort(_('--tool can only be used with --rebase'))
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
1066 orig(ui, repo, *args, **opts)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1067
23970
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
1068 def _setrebasesetvisibility(repo, revs):
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
1069 """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
1070
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
1071 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
1072 hidden (see issue4505)"""
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
1073 repo = repo.unfiltered()
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
1074 revs = set(revs)
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
1075 repo._rebaseset = revs
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
1076 # 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
1077 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
1078 if revs & hiddens:
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
1079 repo.invalidatevolatilesets()
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
1080
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
1081 def _clearrebasesetvisibiliy(repo):
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
1082 """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
1083 repo = repo.unfiltered()
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
1084 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
1085 del repo._rebaseset
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
1086
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
1087 def _rebasedvisible(orig, repo):
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
1088 """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
1089 blockers = orig(repo)
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
1090 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
1091 return blockers
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
1092
19214
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
1093 def summaryhook(ui, repo):
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
1094 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
1095 return
19849
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
1096 try:
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
1097 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
1098 except error.RepoLookupError:
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
1099 # 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
1100 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
1101 ui.write(msg)
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
1102 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
1103 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
1104 # i18n: column positioning for "hg summary"
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
1105 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
1106 (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
1107 ui.label(_('%d remaining'), 'rebase.remaining') %
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
1108 (len(state) - numrebased)))
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
1109
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1110 def uisetup(ui):
23970
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
1111 #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
1112 entry = extensions.wrapcommand(commands.table, 'pull', pullrebase)
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
1113 entry[1].append(('', 'rebase', None,
14444
1f997134a9d1 rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents: 14306
diff changeset
1114 _("rebase working directory to branch head")))
1f997134a9d1 rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents: 14306
diff changeset
1115 entry[1].append(('t', 'tool', '',
1f997134a9d1 rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents: 14306
diff changeset
1116 _("specify merge tool for rebase")))
19214
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
1117 cmdutil.summaryhooks.add('rebase', summaryhook)
19478
e5a5790a3185 rebase: add checkunfinished support (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19477
diff changeset
1118 cmdutil.unfinishedstates.append(
19496
607191a45f8c checkunfinished: accommodate histedit quirk
Matt Mackall <mpm@selenic.com>
parents: 19478
diff changeset
1119 ['rebasestate', False, False, _('rebase in progress'),
19478
e5a5790a3185 rebase: add checkunfinished support (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19477
diff changeset
1120 _("use 'hg rebase --continue' or 'hg rebase --abort'")])
23970
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
1121 # 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
1122 extensions.wrapfunction(repoview, '_getdynamicblockers', _rebasedvisible)