Mercurial > hg
annotate hgext/rebase.py @ 20394:a817964e7fdf
qimport: allow importing URLs
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Fri, 07 Feb 2014 17:54:10 -0600 |
parents | 46c2331fc750 |
children | f2a0a0e76b4c |
rev | line source |
---|---|
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1 # rebase.py - rebasing feature for mercurial |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
2 # |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
3 # Copyright 2008 Stefano Tortarolo <stefano.tortarolo at gmail dot com> |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
4 # |
8225
46293a0c7e9f
updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents:
8222
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
10263 | 6 # GNU General Public License version 2 or any later version. |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
7 |
8934
9dda4c73fc3b
extensions: change descriptions for extensions providing a few commands
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8706
diff
changeset
|
8 '''command to move sets of revisions to a different ancestor |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
9 |
7999
b25110140573
rebase: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents:
7955
diff
changeset
|
10 This extension lets you rebase changesets in an existing Mercurial |
b25110140573
rebase: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents:
7955
diff
changeset
|
11 repository. |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
12 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
13 For more information: |
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 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
19 from mercurial.commands import templateopts |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
20 from mercurial.node import nullrev |
8112
6ee71f78497c
switch lock releasing in the extensions from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
8076
diff
changeset
|
21 from mercurial.lock import release |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
22 from mercurial.i18n import _ |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
23 import os, errno |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
24 |
10352
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
25 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
|
26 revignored = -3 |
10352
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
27 |
14306
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
28 cmdtable = {} |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
29 command = cmdutil.command(cmdtable) |
16743
38caf405d010
hgext: mark all first-party extensions as such
Augie Fackler <raf@durin42.com>
parents:
16696
diff
changeset
|
30 testedwith = 'internal' |
14306
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
31 |
19861
a69a77a80900
rebase: preserve metadata from grafts of changes (issue4001)
Augie Fackler <raf@durin42.com>
parents:
19860
diff
changeset
|
32 def _savegraft(ctx, extra): |
a69a77a80900
rebase: preserve metadata from grafts of changes (issue4001)
Augie Fackler <raf@durin42.com>
parents:
19860
diff
changeset
|
33 s = ctx.extra().get('source', None) |
a69a77a80900
rebase: preserve metadata from grafts of changes (issue4001)
Augie Fackler <raf@durin42.com>
parents:
19860
diff
changeset
|
34 if s is not None: |
a69a77a80900
rebase: preserve metadata from grafts of changes (issue4001)
Augie Fackler <raf@durin42.com>
parents:
19860
diff
changeset
|
35 extra['source'] = s |
a69a77a80900
rebase: preserve metadata from grafts of changes (issue4001)
Augie Fackler <raf@durin42.com>
parents:
19860
diff
changeset
|
36 |
19860
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
37 def _savebranch(ctx, extra): |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
38 extra['branch'] = ctx.branch() |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
39 |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
40 def _makeextrafn(copiers): |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
41 """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
|
42 |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
43 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
|
44 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
|
45 """ |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
46 def extrafn(ctx, extra): |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
47 for c in copiers: |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
48 c(ctx, extra) |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
49 return extrafn |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
50 |
14306
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
51 @command('rebase', |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
52 [('s', 'source', '', |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
53 _('rebase from the specified changeset'), _('REV')), |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
54 ('b', 'base', '', |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
55 _('rebase from the base of the specified changeset ' |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
56 '(up to greatest common ancestor of base and dest)'), |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
57 _('REV')), |
15270
6cb6064f1d50
rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15269
diff
changeset
|
58 ('r', 'rev', [], |
6cb6064f1d50
rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15269
diff
changeset
|
59 _('rebase these revisions'), |
6cb6064f1d50
rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15269
diff
changeset
|
60 _('REV')), |
14306
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
61 ('d', 'dest', '', |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
62 _('rebase onto the specified changeset'), _('REV')), |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
63 ('', 'collapse', False, _('collapse the rebased changesets')), |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
64 ('m', 'message', '', |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
65 _('use text as collapse commit message'), _('TEXT')), |
15219 | 66 ('e', 'edit', False, _('invoke editor on commit messages')), |
14306
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
67 ('l', 'logfile', '', |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
68 _('read collapse commit message from file'), _('FILE')), |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
69 ('', 'keep', False, _('keep original changesets')), |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
70 ('', '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
|
71 ('D', 'detach', False, _('(DEPRECATED)')), |
14306
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
72 ('t', 'tool', '', _('specify merge tool')), |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
73 ('c', 'continue', False, _('continue an interrupted rebase')), |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
74 ('a', 'abort', False, _('abort an interrupted rebase'))] + |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
75 templateopts, |
17325
e4db509c08ec
rebase: remove second broken synopsis line (issue3172)
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
76 _('[-s REV | -b REV] [-d REV] [OPTION]')) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
77 def rebase(ui, repo, **opts): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
78 """move changeset (and descendants) to a different branch |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
79 |
7999
b25110140573
rebase: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents:
7955
diff
changeset
|
80 Rebase uses repeated merging to graft changesets from one part of |
10646 | 81 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
|
82 useful for linearizing *local* changes relative to a master |
10646 | 83 development tree. |
84 | |
11188
b5c0f6a11430
rebase: stress that only local changesets should be rebased
Martin Geisler <mg@lazybytes.net>
parents:
10762
diff
changeset
|
85 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
|
86 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
|
87 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
|
88 pulling in your rebased changesets. |
b5c0f6a11430
rebase: stress that only local changesets should be rebased
Martin Geisler <mg@lazybytes.net>
parents:
10762
diff
changeset
|
89 |
18516
9fbeb61b8ad2
rebase: mention phases in the help
Kevin Bullock <kbullock@ringworld.org>
parents:
18514
diff
changeset
|
90 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
|
91 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
|
92 |
10646 | 93 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
|
94 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
|
95 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
|
96 changesets are added as its descendants.) |
10646 | 97 |
98 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
|
99 "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
|
100 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
|
101 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
|
102 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
|
103 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
|
104 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
|
105 ``-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
|
106 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
|
107 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
|
108 uses the parent of the working directory as the base. |
10646 | 109 |
18518
0324a1d88a53
rebase: mention --rev in the help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18516
diff
changeset
|
110 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
|
111 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
|
112 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
|
113 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
|
114 |
10646 | 115 By default, rebase recreates the changesets in the source branch |
116 as descendants of dest and then destroys the originals. Use | |
117 ``--keep`` to preserve the original source changesets. Some | |
118 changesets in the source branch (e.g. merges from the destination | |
119 branch) may be dropped if they no longer contribute any change. | |
120 | |
121 One result of the rules for selecting the destination changeset | |
122 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
|
123 nothing if you are at the branch tip of a named branch |
10646 | 124 with two heads. You need to explicitly specify source and/or |
125 destination (or ``update`` to the other head, if it's the head of | |
126 the intended source branch). | |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
127 |
7999
b25110140573
rebase: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents:
7955
diff
changeset
|
128 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
|
129 continued with --continue/-c or aborted with --abort/-a. |
11205 | 130 |
19971
2a9bb64faa0b
rebase: add description about exit code when there are unresolved conflicts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19969
diff
changeset
|
131 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
|
132 unresolved conflicts. |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
133 """ |
7280
810ca383da9c
remove unused variables
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7216
diff
changeset
|
134 originalwd = target = None |
18755
72412afe4c28
rebase: restore active bookmark after rebase --continue
Durham Goode <durham@fb.com>
parents:
18549
diff
changeset
|
135 activebookmark = None |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
136 external = nullrev |
8454
6d4bf1c1a003
rebase: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8270
diff
changeset
|
137 state = {} |
6d4bf1c1a003
rebase: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8270
diff
changeset
|
138 skipped = set() |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
139 targetancestors = set() |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
140 |
15219 | 141 editor = None |
142 if opts.get('edit'): | |
143 editor = cmdutil.commitforceeditor | |
144 | |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
145 lock = wlock = None |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
146 try: |
15874
2305baff673f
rebase: take locks in the right order
Mads Kiilerich <mads@kiilerich.com>
parents:
15801
diff
changeset
|
147 wlock = repo.wlock() |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
148 lock = repo.lock() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
149 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
150 # Validate input and define rebasing points |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
151 destf = opts.get('dest', None) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
152 srcf = opts.get('source', None) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
153 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
|
154 revf = opts.get('rev', []) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
155 contf = opts.get('continue') |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
156 abortf = opts.get('abort') |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
157 collapsef = opts.get('collapse', False) |
14635
217b7d83afc3
cmdutil, logmessage: use ui.fin when reading from '-'
Idan Kamara <idankk86@gmail.com>
parents:
14599
diff
changeset
|
158 collapsemsg = cmdutil.logmessage(ui, opts) |
19860
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
159 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
|
160 extrafns = [_savegraft] |
19860
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
161 if e: |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
162 extrafns = [e] |
7952
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
163 keepf = opts.get('keep', False) |
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
164 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
|
165 # 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
|
166 # other extensions |
f2558a8228be
rebase: add option to not commit after a collapsing
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10676
diff
changeset
|
167 keepopen = opts.get('keepopen', False) |
7468
3e5db4228f8f
rebase: add support to keep branch names
Augie Fackler <durin42@gmail.com>
parents:
7298
diff
changeset
|
168 |
13661
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
169 if collapsemsg and not collapsef: |
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
170 raise util.Abort( |
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
171 _('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
|
172 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
173 if contf or abortf: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
174 if contf and abortf: |
11285
f118029e534c
rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents:
11205
diff
changeset
|
175 raise util.Abort(_('cannot use both abort and continue')) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
176 if collapsef: |
11285
f118029e534c
rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents:
11205
diff
changeset
|
177 raise util.Abort( |
f118029e534c
rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents:
11205
diff
changeset
|
178 _('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
|
179 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
|
180 raise util.Abort( |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
181 _('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
|
182 if opts.get('tool', False): |
0995eee8ffe4
rebase: add --tool argument for specifying merge tool
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
13778
diff
changeset
|
183 ui.warn(_('tool option will be ignored\n')) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
184 |
19848
577f4c562d52
rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19641
diff
changeset
|
185 try: |
577f4c562d52
rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19641
diff
changeset
|
186 (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
|
187 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
|
188 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
|
189 if abortf: |
577f4c562d52
rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19641
diff
changeset
|
190 clearstatus(repo) |
577f4c562d52
rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19641
diff
changeset
|
191 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
|
192 ' 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
|
193 return 0 |
577f4c562d52
rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19641
diff
changeset
|
194 else: |
577f4c562d52
rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19641
diff
changeset
|
195 msg = _('cannot continue inconsistent rebase') |
20313
dcd65ce87260
hgext: fix one typo in rebase
Simon Heimberg <simohe@besonet.ch>
parents:
20250
diff
changeset
|
196 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
|
197 raise util.Abort(msg, hint=hint) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
198 if abortf: |
11205 | 199 return abort(repo, originalwd, target, state) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
200 else: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
201 if srcf and basef: |
11285
f118029e534c
rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents:
11205
diff
changeset
|
202 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
|
203 'source and a base')) |
6cb6064f1d50
rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15269
diff
changeset
|
204 if revf and basef: |
15289
9cec4b24615b
rebase: fix typos
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
15272
diff
changeset
|
205 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
|
206 '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
|
207 if revf and srcf: |
15289
9cec4b24615b
rebase: fix typos
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
15272
diff
changeset
|
208 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
|
209 '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
|
210 |
19478
e5a5790a3185
rebase: add checkunfinished support (issue3955)
Matt Mackall <mpm@selenic.com>
parents:
19477
diff
changeset
|
211 cmdutil.checkunfinished(repo) |
14289
d68ddccf276b
cmdutil: bail_if_changed to bailifchanged
Matt Mackall <mpm@selenic.com>
parents:
13895
diff
changeset
|
212 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
|
213 |
3bfdfefea2fc
rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15219
diff
changeset
|
214 if not destf: |
15270
6cb6064f1d50
rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15269
diff
changeset
|
215 # 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
|
216 # 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
|
217 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
|
218 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
|
219 else: |
16566
ae6dddffe4f1
rebase: make --dest understand revsets
Patrick Mezard <patrick@mezard.eu>
parents:
16565
diff
changeset
|
220 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
|
221 |
15271
84d4a4ce45fd
rebase: simplify set generation
Matt Mackall <mpm@selenic.com>
parents:
15270
diff
changeset
|
222 if revf: |
19641
5528c31c629c
rebase: handle bookmarks matching revset function names (issue3950)
Bryan O'Sullivan <bryano@fb.com>
parents:
19518
diff
changeset
|
223 rebaseset = scmutil.revrange(repo, revf) |
20247
a259f7b488ab
rebase: improve error message for empty --rev set
Mads Kiilerich <madski@unity3d.com>
parents:
19986
diff
changeset
|
224 if not rebaseset: |
a259f7b488ab
rebase: improve error message for empty --rev set
Mads Kiilerich <madski@unity3d.com>
parents:
19986
diff
changeset
|
225 raise util.Abort(_('empty "rev" revision set - ' |
a259f7b488ab
rebase: improve error message for empty --rev set
Mads Kiilerich <madski@unity3d.com>
parents:
19986
diff
changeset
|
226 'nothing to rebase')) |
15271
84d4a4ce45fd
rebase: simplify set generation
Matt Mackall <mpm@selenic.com>
parents:
15270
diff
changeset
|
227 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
|
228 src = scmutil.revrange(repo, [srcf]) |
20248
3bff26f67169
rebase: improve error message for empty --source set
Mads Kiilerich <madski@unity3d.com>
parents:
20247
diff
changeset
|
229 if not src: |
3bff26f67169
rebase: improve error message for empty --source set
Mads Kiilerich <madski@unity3d.com>
parents:
20247
diff
changeset
|
230 raise util.Abort(_('empty "source" revision set - ' |
3bff26f67169
rebase: improve error message for empty --source set
Mads Kiilerich <madski@unity3d.com>
parents:
20247
diff
changeset
|
231 'nothing to rebase')) |
15801 | 232 rebaseset = repo.revs('(%ld)::', src) |
20248
3bff26f67169
rebase: improve error message for empty --source set
Mads Kiilerich <madski@unity3d.com>
parents:
20247
diff
changeset
|
233 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
|
234 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
|
235 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
|
236 if not base: |
dc5157841361
rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents:
20248
diff
changeset
|
237 raise util.Abort(_('empty "base" revision set - ' |
dc5157841361
rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents:
20248
diff
changeset
|
238 "can't compute rebase set")) |
15801 | 239 rebaseset = repo.revs( |
240 '(children(ancestor(%ld, %d)) and ::(%ld))::', | |
15404
c1eb8398fe82
localrepo: convert various repo.set() users to repo.revs()
Matt Mackall <mpm@selenic.com>
parents:
15289
diff
changeset
|
241 base, dest, base) |
20249
dc5157841361
rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents:
20248
diff
changeset
|
242 if not rebaseset: |
dc5157841361
rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents:
20248
diff
changeset
|
243 if base == [dest.rev()]: |
dc5157841361
rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents:
20248
diff
changeset
|
244 if basef: |
dc5157841361
rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents:
20248
diff
changeset
|
245 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
|
246 ' 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
|
247 else: |
dc5157841361
rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents:
20248
diff
changeset
|
248 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
|
249 '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
|
250 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
|
251 if basef: |
dc5157841361
rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents:
20248
diff
changeset
|
252 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
|
253 '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
|
254 '%s\n') % |
dc5157841361
rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents:
20248
diff
changeset
|
255 ('+'.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
|
256 dest)) |
dc5157841361
rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents:
20248
diff
changeset
|
257 else: |
dc5157841361
rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents:
20248
diff
changeset
|
258 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
|
259 '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
|
260 '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
|
261 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
|
262 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
|
263 ('+'.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
|
264 return 1 |
15271
84d4a4ce45fd
rebase: simplify set generation
Matt Mackall <mpm@selenic.com>
parents:
15270
diff
changeset
|
265 |
20250
f380b191e085
rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents:
20249
diff
changeset
|
266 if (not (keepf or obsolete._enabled) |
18269
9454e40e047b
clfilter: drop unnecessary explicit filtering on rebase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18164
diff
changeset
|
267 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
|
268 rebaseset, rebaseset)): |
15272
2889d4574726
rebase: simplify check for orphaned descendants
Matt Mackall <mpm@selenic.com>
parents:
15271
diff
changeset
|
269 raise util.Abort( |
2889d4574726
rebase: simplify check for orphaned descendants
Matt Mackall <mpm@selenic.com>
parents:
15271
diff
changeset
|
270 _("can't remove original changesets with" |
2889d4574726
rebase: simplify check for orphaned descendants
Matt Mackall <mpm@selenic.com>
parents:
15271
diff
changeset
|
271 " unrebased descendants"), |
2889d4574726
rebase: simplify check for orphaned descendants
Matt Mackall <mpm@selenic.com>
parents:
15271
diff
changeset
|
272 hint=_('use --keep to keep original changesets')) |
2889d4574726
rebase: simplify check for orphaned descendants
Matt Mackall <mpm@selenic.com>
parents:
15271
diff
changeset
|
273 |
20250
f380b191e085
rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents:
20249
diff
changeset
|
274 result = buildstate(repo, dest, rebaseset, collapsef) |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
275 if not result: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
276 # 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
|
277 ui.status(_('nothing to rebase\n')) |
11205 | 278 return 1 |
20250
f380b191e085
rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents:
20249
diff
changeset
|
279 |
f380b191e085
rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents:
20249
diff
changeset
|
280 root = min(rebaseset) |
f380b191e085
rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents:
20249
diff
changeset
|
281 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
|
282 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
|
283 % repo[root], |
53eadcb814fd
rebase: check no-op before checking phase (issue3891)
Siddharth Agarwal <sid0@fb.com>
parents:
18933
diff
changeset
|
284 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
|
285 |
f380b191e085
rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents:
20249
diff
changeset
|
286 originalwd, target, state = result |
f380b191e085
rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents:
20249
diff
changeset
|
287 if collapsef: |
f380b191e085
rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents:
20249
diff
changeset
|
288 targetancestors = repo.changelog.ancestors([target], |
f380b191e085
rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents:
20249
diff
changeset
|
289 inclusive=True) |
f380b191e085
rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents:
20249
diff
changeset
|
290 external = externalparent(repo, state, targetancestors) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
291 |
7952
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
292 if keepbranchesf: |
19860
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
293 # 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
|
294 # 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
|
295 # desired |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
296 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
|
297 if collapsef: |
b9daa5b7a3af
rebase: block collapse with keepbranches on multiple named branches (issue2112)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14884
diff
changeset
|
298 branches = set() |
b9daa5b7a3af
rebase: block collapse with keepbranches on multiple named branches (issue2112)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14884
diff
changeset
|
299 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
|
300 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
|
301 if len(branches) > 1: |
14917
2957b8b1e809
rebase: remove trailing whitespace found by check-code
Augie Fackler <durin42@gmail.com>
parents:
14897
diff
changeset
|
302 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
|
303 'branches')) |
b9daa5b7a3af
rebase: block collapse with keepbranches on multiple named branches (issue2112)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14884
diff
changeset
|
304 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
305 # Rebase |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
306 if not targetancestors: |
18093
9c76da468a19
rebase: use lazy ancestor membership testing
Siddharth Agarwal <sid0@fb.com>
parents:
17989
diff
changeset
|
307 targetancestors = repo.changelog.ancestors([target], inclusive=True) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
308 |
14884
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
309 # 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
|
310 currentbookmarks = repo._bookmarks.copy() |
18755
72412afe4c28
rebase: restore active bookmark after rebase --continue
Durham Goode <durham@fb.com>
parents:
18549
diff
changeset
|
311 activebookmark = activebookmark or repo._bookmarkcurrent |
17046
4116504d1ec4
bookmarks: correctly update current bookmarks on rebase (issue2277)
David Schleimer <dschleimer@fb.com>
parents:
17026
diff
changeset
|
312 if activebookmark: |
4116504d1ec4
bookmarks: correctly update current bookmarks on rebase (issue2277)
David Schleimer <dschleimer@fb.com>
parents:
17026
diff
changeset
|
313 bookmarks.unsetcurrent(repo) |
14884
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
314 |
19860
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
315 extrafn = _makeextrafn(extrafns) |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
316 |
11729
c91b86a291b0
rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents:
11546
diff
changeset
|
317 sortedstate = sorted(state) |
c91b86a291b0
rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents:
11546
diff
changeset
|
318 total = len(sortedstate) |
c91b86a291b0
rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents:
11546
diff
changeset
|
319 pos = 0 |
c91b86a291b0
rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents:
11546
diff
changeset
|
320 for rev in sortedstate: |
c91b86a291b0
rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents:
11546
diff
changeset
|
321 pos += 1 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
322 if state[rev] == -1: |
11761
e27a0fa7ba59
minor style fix: hgext/rebase.py:157 -- line too long
Alecs King <alecsk@gmail.com>
parents:
11729
diff
changeset
|
323 ui.progress(_("rebasing"), pos, ("%d:%s" % (rev, repo[rev])), |
12744
0793d763e413
progress: dropping superfluous space from units
timeless <timeless@gmail.com>
parents:
12062
diff
changeset
|
324 _('changesets'), total) |
19477
e9351f0d9a2a
rebase: reorder parent check and state storage
Matt Mackall <mpm@selenic.com>
parents:
19398
diff
changeset
|
325 p1, p2 = defineparents(repo, rev, target, state, |
e9351f0d9a2a
rebase: reorder parent check and state storage
Matt Mackall <mpm@selenic.com>
parents:
19398
diff
changeset
|
326 targetancestors) |
7952
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
327 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
|
328 keepbranchesf, external, activebookmark) |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
329 if len(repo.parents()) == 2: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
330 repo.ui.debug('resuming interrupted rebase\n') |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
331 else: |
13856
0995eee8ffe4
rebase: add --tool argument for specifying merge tool
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
13778
diff
changeset
|
332 try: |
0995eee8ffe4
rebase: add --tool argument for specifying merge tool
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
13778
diff
changeset
|
333 ui.setconfig('ui', 'forcemerge', opts.get('tool', '')) |
16696
d1afbf03e69a
rebase: allow collapsing branches in place (issue3111)
Patrick Mezard <patrick@mezard.eu>
parents:
16566
diff
changeset
|
334 stats = rebasenode(repo, rev, p1, state, collapsef) |
13856
0995eee8ffe4
rebase: add --tool argument for specifying merge tool
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
13778
diff
changeset
|
335 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
|
336 raise error.InterventionRequired( |
42b620fc89e2
rebase: switch from util.Abort to util.InterventionRequired where appropriate (bc)
Augie Fackler <raf@durin42.com>
parents:
18764
diff
changeset
|
337 _('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
|
338 '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
|
339 finally: |
0995eee8ffe4
rebase: add --tool argument for specifying merge tool
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
13778
diff
changeset
|
340 ui.setconfig('ui', 'forcemerge', '') |
15777
12309c09d19a
cmdutil: simplify duplicatecopies
Matt Mackall <mpm@selenic.com>
parents:
15742
diff
changeset
|
341 cmdutil.duplicatecopies(repo, rev, target) |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
342 if not collapsef: |
15219 | 343 newrev = concludenode(repo, rev, p1, p2, extrafn=extrafn, |
344 editor=editor) | |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
345 else: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
346 # Skip commit if we are collapsing |
16551
ebf6d38c9063
localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents:
16531
diff
changeset
|
347 repo.setparents(repo[p1].node()) |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
348 newrev = None |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
349 # Update the state |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
350 if newrev is not None: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
351 state[rev] = repo[newrev].rev() |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
352 else: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
353 if not collapsef: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
354 ui.note(_('no changes, revision %d skipped\n') % rev) |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
355 ui.debug('next revision set to %s\n' % p1) |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
356 skipped.add(rev) |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
357 state[rev] = p1 |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
358 |
11729
c91b86a291b0
rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents:
11546
diff
changeset
|
359 ui.progress(_('rebasing'), None) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
360 ui.note(_('rebase merging completed\n')) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
361 |
10677
f2558a8228be
rebase: add option to not commit after a collapsing
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10676
diff
changeset
|
362 if collapsef and not keepopen: |
6923
ebf1462f2145
strip trailing whitespace, replace tabs by spaces
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6906
diff
changeset
|
363 p1, p2 = defineparents(repo, min(state), target, |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
364 state, targetancestors) |
13661
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
365 if collapsemsg: |
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
366 commitmsg = collapsemsg |
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
367 else: |
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
368 commitmsg = 'Collapsed revision' |
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
369 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
|
370 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
|
371 commitmsg += '\n* %s' % repo[rebased].description() |
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
372 commitmsg = ui.edit(commitmsg, repo.ui.username()) |
10352
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
373 newrev = concludenode(repo, rev, p1, external, commitmsg=commitmsg, |
15219 | 374 extrafn=extrafn, editor=editor) |
19986
ea81f8b2364e
rebase: fix working copy location after a --collapse (issue4080)
Durham Goode <durham@fb.com>
parents:
19984
diff
changeset
|
375 for oldrev in state.iterkeys(): |
ea81f8b2364e
rebase: fix working copy location after a --collapse (issue4080)
Durham Goode <durham@fb.com>
parents:
19984
diff
changeset
|
376 if state[oldrev] > nullmerge: |
ea81f8b2364e
rebase: fix working copy location after a --collapse (issue4080)
Durham Goode <durham@fb.com>
parents:
19984
diff
changeset
|
377 state[oldrev] = newrev |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
378 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
379 if 'qtip' in repo.tags(): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
380 updatemq(repo, state, skipped, **opts) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
381 |
14884
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
382 if currentbookmarks: |
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
383 # Nodeids are needed to reset bookmarks |
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
384 nstate = {} |
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
385 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
|
386 if v > nullmerge: |
14884
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
387 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
|
388 # 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
|
389 # this should probably be cleaned up |
12de53323e59
rebase: derive node from target rev (issue3802)
Siddharth Agarwal <sid0@fb.com>
parents:
18518
diff
changeset
|
390 targetnode = repo[target].node() |
14884
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
391 |
19925
9c78ed396075
rebase: preserve working directory parent (BC)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19861
diff
changeset
|
392 # restore original working directory |
9c78ed396075
rebase: preserve working directory parent (BC)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19861
diff
changeset
|
393 # (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
|
394 newwd = state.get(originalwd, originalwd) |
9c78ed396075
rebase: preserve working directory parent (BC)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19861
diff
changeset
|
395 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
|
396 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
|
397 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
|
398 |
7952
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
399 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
|
400 collapsedas = None |
aafc521668d8
rebase: properly handle --collapse when creating obsolescence marker
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17612
diff
changeset
|
401 if collapsef: |
aafc521668d8
rebase: properly handle --collapse when creating obsolescence marker
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17612
diff
changeset
|
402 collapsedas = newrev |
18444
55aff0c2b73c
rebase: do not invent successor to skipped changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18424
diff
changeset
|
403 clearrebased(ui, repo, state, skipped, collapsedas) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
404 |
14884
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
405 if currentbookmarks: |
18549
12de53323e59
rebase: derive node from target rev (issue3802)
Siddharth Agarwal <sid0@fb.com>
parents:
18518
diff
changeset
|
406 updatebookmarks(repo, targetnode, nstate, currentbookmarks) |
14884
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
407 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
408 clearstatus(repo) |
11203
7a9cf012dddc
rebase: only show "rebase completed" message with -v
Matt Mackall <mpm@selenic.com>
parents:
11201
diff
changeset
|
409 ui.note(_("rebase completed\n")) |
18386
03442135dff4
refactoring: use unlinkpath with ignoremissing
Mads Kiilerich <madski@unity3d.com>
parents:
18269
diff
changeset
|
410 util.unlinkpath(repo.sjoin('undo'), ignoremissing=True) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
411 if skipped: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
412 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
|
413 |
4116504d1ec4
bookmarks: correctly update current bookmarks on rebase (issue2277)
David Schleimer <dschleimer@fb.com>
parents:
17026
diff
changeset
|
414 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
|
415 repo['.'].node() == repo._bookmarks[activebookmark]): |
17046
4116504d1ec4
bookmarks: correctly update current bookmarks on rebase (issue2277)
David Schleimer <dschleimer@fb.com>
parents:
17026
diff
changeset
|
416 bookmarks.setcurrent(repo, activebookmark) |
4116504d1ec4
bookmarks: correctly update current bookmarks on rebase (issue2277)
David Schleimer <dschleimer@fb.com>
parents:
17026
diff
changeset
|
417 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
418 finally: |
8112
6ee71f78497c
switch lock releasing in the extensions from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
8076
diff
changeset
|
419 release(lock, wlock) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
420 |
19955
2160c2e0d7d1
rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents:
19951
diff
changeset
|
421 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
|
422 """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
|
423 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
|
424 Abort if there is more than one parent. |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
425 """ |
19955
2160c2e0d7d1
rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents:
19951
diff
changeset
|
426 parents = set() |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
427 source = min(state) |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
428 for rev in state: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
429 if rev == source: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
430 continue |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
431 for p in repo[rev].parents(): |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
432 if (p.rev() not in state |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
433 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
|
434 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
|
435 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
|
436 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
|
437 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
|
438 return parents.pop() |
19956
78ab0f85e249
rebase: improve error message for more than one external parent
Mads Kiilerich <madski@unity3d.com>
parents:
19955
diff
changeset
|
439 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
|
440 '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
|
441 (max(targetancestors), |
78ab0f85e249
rebase: improve error message for more than one external parent
Mads Kiilerich <madski@unity3d.com>
parents:
19955
diff
changeset
|
442 ', '.join(str(p) for p in sorted(parents)))) |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
443 |
15219 | 444 def concludenode(repo, rev, p1, p2, commitmsg=None, editor=None, extrafn=None): |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
445 'Commit the changes and store useful information in extra' |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
446 try: |
16551
ebf6d38c9063
localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents:
16531
diff
changeset
|
447 repo.setparents(repo[p1].node(), repo[p2].node()) |
11537
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
448 ctx = repo[rev] |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
449 if commitmsg is None: |
11537
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
450 commitmsg = ctx.description() |
10762
129e96f7a87a
rebase: fix --collapse with --keepbranches (issue2100)
Patrick Mezard <pmezard@gmail.com>
parents:
10672
diff
changeset
|
451 extra = {'rebase_source': ctx.hex()} |
129e96f7a87a
rebase: fix --collapse with --keepbranches (issue2100)
Patrick Mezard <pmezard@gmail.com>
parents:
10672
diff
changeset
|
452 if extrafn: |
129e96f7a87a
rebase: fix --collapse with --keepbranches (issue2100)
Patrick Mezard <pmezard@gmail.com>
parents:
10672
diff
changeset
|
453 extrafn(ctx, extra) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
454 # Commit might fail if unresolved files exist |
10762
129e96f7a87a
rebase: fix --collapse with --keepbranches (issue2100)
Patrick Mezard <pmezard@gmail.com>
parents:
10672
diff
changeset
|
455 newrev = repo.commit(text=commitmsg, user=ctx.user(), |
15219 | 456 date=ctx.date(), extra=extra, editor=editor) |
8266
609ce91670d0
rebase: fix bug where --keepbranches could leave wrong branch in dirstate
Patrick Mezard <pmezard@gmail.com>
parents:
8242
diff
changeset
|
457 repo.dirstate.setbranch(repo[newrev].branch()) |
15917
e66084ef8449
rebase: fix phases movement
Alain Leufroy <alain.leufroyATgmailMYDOTcom>
parents:
15904
diff
changeset
|
458 targetphase = max(ctx.phase(), phases.draft) |
e66084ef8449
rebase: fix phases movement
Alain Leufroy <alain.leufroyATgmailMYDOTcom>
parents:
15904
diff
changeset
|
459 # retractboundary doesn't overwrite upper phase inherited from parent |
e66084ef8449
rebase: fix phases movement
Alain Leufroy <alain.leufroyATgmailMYDOTcom>
parents:
15904
diff
changeset
|
460 newnode = repo[newrev].node() |
15923
4b088ae9d47a
rebase: only advance phase on successful commit
Matt Mackall <mpm@selenic.com>
parents:
15917
diff
changeset
|
461 if newnode: |
4b088ae9d47a
rebase: only advance phase on successful commit
Matt Mackall <mpm@selenic.com>
parents:
15917
diff
changeset
|
462 phases.retractboundary(repo, targetphase, [newnode]) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
463 return newrev |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
464 except util.Abort: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
465 # Invalidate the previous setparents |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
466 repo.dirstate.invalidate() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
467 raise |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
468 |
16696
d1afbf03e69a
rebase: allow collapsing branches in place (issue3111)
Patrick Mezard <patrick@mezard.eu>
parents:
16566
diff
changeset
|
469 def rebasenode(repo, rev, p1, state, collapse): |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
470 'Rebase a single revision' |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
471 # Merge phase |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
472 # Update to target and merge it with local |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
473 if repo['.'].rev() != repo[p1].rev(): |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
474 repo.ui.debug(" update to %d:%s\n" % (repo[p1].rev(), repo[p1])) |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
475 merge.update(repo, p1, False, True, False) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
476 else: |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
477 repo.ui.debug(" already in target\n") |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
478 repo.dirstate.write() |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
479 repo.ui.debug(" merge against %d:%s\n" % (repo[rev].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
|
480 if repo[rev].rev() == repo[min(state)].rev(): |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
481 # Case (1) initial changeset of a non-detaching rebase. |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
482 # Let the merge mechanism find the base itself. |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
483 base = None |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
484 elif not repo[rev].p2(): |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
485 # Case (2) detaching the node with a single parent, use this parent |
13878
a8d13ee0ce68
misc: replace .parents()[0] with p1()
Matt Mackall <mpm@selenic.com>
parents:
13875
diff
changeset
|
486 base = repo[rev].p1().node() |
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
|
487 else: |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
488 # In case of merge, we need to pick the right parent as merge base. |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
489 # |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
490 # Imagine we have: |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
491 # - M: currently rebase revision in this step |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
492 # - A: one parent of M |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
493 # - B: second parent of M |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
494 # - D: destination of this merge step (p1 var) |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
495 # |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
496 # If we are rebasing on D, D is the successors of A or B. The right |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
497 # merge base is the one D succeed to. We pretend it is B for the rest |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
498 # of this comment |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
499 # |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
500 # If we pick B as the base, the merge involves: |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
501 # - changes from B to M (actual changeset payload) |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
502 # - changes from B to D (induced by rebase) as D is a rebased |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
503 # version of B) |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
504 # Which exactly represent the rebase operation. |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
505 # |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
506 # If we pick the A as the base, the merge involves |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
507 # - changes from A to M (actual changeset payload) |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
508 # - changes from A to D (with include changes between unrelated A and B |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
509 # plus changes induced by rebase) |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
510 # Which does not represent anything sensible and creates a lot of |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
511 # conflicts. |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
512 for p in repo[rev].parents(): |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
513 if state.get(p.rev()) == repo[p1].rev(): |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
514 base = p.node() |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
515 break |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
516 if base is not None: |
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
517 repo.ui.debug(" detach base %d:%s\n" % (repo[base].rev(), repo[base])) |
16696
d1afbf03e69a
rebase: allow collapsing branches in place (issue3111)
Patrick Mezard <patrick@mezard.eu>
parents:
16566
diff
changeset
|
518 # 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
|
519 # have to allow merging with it. |
d1afbf03e69a
rebase: allow collapsing branches in place (issue3111)
Patrick Mezard <patrick@mezard.eu>
parents:
16566
diff
changeset
|
520 return merge.update(repo, rev, True, True, False, base, collapse) |
6923
ebf1462f2145
strip trailing whitespace, replace tabs by spaces
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6906
diff
changeset
|
521 |
18447
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
522 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
|
523 """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
|
524 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
|
525 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
|
526 if candidates: |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
527 return state[candidates[0]] |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
528 else: |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
529 return None |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
530 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
531 def defineparents(repo, rev, target, state, targetancestors): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
532 '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
|
533 parents = repo[rev].parents() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
534 p1 = p2 = nullrev |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
535 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
536 P1n = parents[0].rev() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
537 if P1n in targetancestors: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
538 p1 = target |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
539 elif P1n in state: |
10352
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
540 if state[P1n] == nullmerge: |
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
541 p1 = target |
18447
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
542 elif state[P1n] == revignored: |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
543 p1 = nearestrebased(repo, P1n, state) |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
544 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
|
545 p1 = target |
10352
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
546 else: |
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
547 p1 = state[P1n] |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
548 else: # P1n external |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
549 p1 = target |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
550 p2 = P1n |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
551 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
552 if len(parents) == 2 and parents[1].rev() not in targetancestors: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
553 P2n = parents[1].rev() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
554 # interesting second parent |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
555 if P2n in state: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
556 if p1 == target: # P1n in targetancestors or external |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
557 p1 = state[P2n] |
18447
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
558 elif state[P2n] == revignored: |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
559 p2 = nearestrebased(repo, P2n, state) |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
560 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
|
561 # 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
|
562 p2 = target |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
563 else: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
564 p2 = state[P2n] |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
565 else: # P2n external |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
566 if p2 != nullrev: # P1n external too => rev is a merged revision |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
567 raise util.Abort(_('cannot use revision %d as base, result ' |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
568 'would have 3 parents') % rev) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
569 p2 = P2n |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
570 repo.ui.debug(" future parents are %d and %d\n" % |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
571 (repo[p1].rev(), repo[p2].rev())) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
572 return p1, p2 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
573 |
7955
c3d4ff03ec72
rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7954
diff
changeset
|
574 def isagitpatch(repo, patchname): |
c3d4ff03ec72
rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7954
diff
changeset
|
575 '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
|
576 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
|
577 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
|
578 if line.startswith('diff --git'): |
c3d4ff03ec72
rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7954
diff
changeset
|
579 return True |
c3d4ff03ec72
rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7954
diff
changeset
|
580 return False |
c3d4ff03ec72
rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7954
diff
changeset
|
581 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
582 def updatemq(repo, state, skipped, **opts): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
583 'Update rebased mq patches - finalize and then import them' |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
584 mqrebase = {} |
11537
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
585 mq = repo.mq |
14572
8ff2957c1d82
mq: rename full_series to fullseries
Adrian Buehlmann <adrian@cadifra.com>
parents:
14509
diff
changeset
|
586 original_series = mq.fullseries[:] |
16531
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
587 skippedpatches = set() |
14497
ea585f2b1adc
rebase: restore mq guards after rebasing (issue2107)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
13894
diff
changeset
|
588 |
11537
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
589 for p in mq.applied: |
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
590 rev = repo[p.node].rev() |
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
591 if rev in state: |
9467
4c041f1ee1b4
do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents:
9301
diff
changeset
|
592 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
|
593 (rev, p.name)) |
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
594 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
|
595 else: |
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
596 # 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
|
597 skippedpatches.add(p.name) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
598 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
599 if mqrebase: |
11537
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
600 mq.finish(repo, mqrebase.keys()) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
601 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
602 # 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
|
603 for rev in sorted(mqrebase, reverse=True): |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
604 if rev not in skipped: |
11537
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
605 name, isgit = mqrebase[rev] |
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
606 repo.ui.debug('import mq patch %d (%s)\n' % (state[rev], name)) |
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
607 mq.qimport(repo, (), patchname=name, git=isgit, |
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
608 rev=[str(state[rev])]) |
16531
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
609 else: |
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
610 # Rebased and skipped |
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
611 skippedpatches.add(mqrebase[rev][0]) |
14497
ea585f2b1adc
rebase: restore mq guards after rebasing (issue2107)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
13894
diff
changeset
|
612 |
16531
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
613 # 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
|
614 # 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
|
615 # 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
|
616 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
|
617 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
|
618 mq.fullseries[:] = newseries |
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
619 mq.seriesdirty = True |
14580
92101ea35015
mq: rename save_dirty to savedirty
Adrian Buehlmann <adrian@cadifra.com>
parents:
14572
diff
changeset
|
620 mq.savedirty() |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
621 |
18549
12de53323e59
rebase: derive node from target rev (issue3802)
Siddharth Agarwal <sid0@fb.com>
parents:
18518
diff
changeset
|
622 def updatebookmarks(repo, targetnode, nstate, originalbookmarks): |
18514
2a1fac3650a5
rebase: delete divergent bookmarks on destination (issue3685)
Siddharth Agarwal <sid0@fb.com>
parents:
18512
diff
changeset
|
623 '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
|
624 marks = repo._bookmarks |
14884
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
625 for k, v in originalbookmarks.iteritems(): |
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
626 if v in nstate: |
18512
22978b82ab4b
rebase: remove bogus nullmerge check in updatebookmarks
Siddharth Agarwal <sid0@fb.com>
parents:
18447
diff
changeset
|
627 # 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
|
628 marks[k] = nstate[v] |
18549
12de53323e59
rebase: derive node from target rev (issue3802)
Siddharth Agarwal <sid0@fb.com>
parents:
18518
diff
changeset
|
629 bookmarks.deletedivergent(repo, [targetnode], k) |
14884
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
630 |
17922
7f5dab94e48c
bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents:
17615
diff
changeset
|
631 marks.write() |
14884
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
632 |
7952
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
633 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
|
634 external, activebookmark): |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
635 'Store the current status to allow recovery' |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
636 f = repo.opener("rebasestate", "w") |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
637 f.write(repo[originalwd].hex() + '\n') |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
638 f.write(repo[target].hex() + '\n') |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
639 f.write(repo[external].hex() + '\n') |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
640 f.write('%d\n' % int(collapse)) |
7952
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
641 f.write('%d\n' % int(keep)) |
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
642 f.write('%d\n' % int(keepbranches)) |
18755
72412afe4c28
rebase: restore active bookmark after rebase --continue
Durham Goode <durham@fb.com>
parents:
18549
diff
changeset
|
643 f.write('%s\n' % (activebookmark or '')) |
7622
4dd7b28003d2
use dict.iteritems() rather than dict.items()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7599
diff
changeset
|
644 for d, v in state.iteritems(): |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
645 oldrev = repo[d].hex() |
18446
c83d36b81df1
rebase: lose the comparison to `nullmerge`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18444
diff
changeset
|
646 if v > nullmerge: |
15464
3411a83e232a
rebase: treat nullmerge as a special case in rebasestate (issue3046)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
15289
diff
changeset
|
647 newrev = repo[v].hex() |
3411a83e232a
rebase: treat nullmerge as a special case in rebasestate (issue3046)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
15289
diff
changeset
|
648 else: |
3411a83e232a
rebase: treat nullmerge as a special case in rebasestate (issue3046)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
15289
diff
changeset
|
649 newrev = v |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
650 f.write("%s:%s\n" % (oldrev, newrev)) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
651 f.close() |
9467
4c041f1ee1b4
do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents:
9301
diff
changeset
|
652 repo.ui.debug('rebase status stored\n') |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
653 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
654 def clearstatus(repo): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
655 'Remove the status files' |
18386
03442135dff4
refactoring: use unlinkpath with ignoremissing
Mads Kiilerich <madski@unity3d.com>
parents:
18269
diff
changeset
|
656 util.unlinkpath(repo.join("rebasestate"), ignoremissing=True) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
657 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
658 def restorestatus(repo): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
659 'Restore a previously stored status' |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
660 try: |
20327
46c2331fc750
rebase: abort cleanly when we encounter a damaged rebasestate (issue4155)
Matt Mackall <mpm@selenic.com>
parents:
20313
diff
changeset
|
661 keepbranches = None |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
662 target = None |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
663 collapse = False |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
664 external = nullrev |
18755
72412afe4c28
rebase: restore active bookmark after rebase --continue
Durham Goode <durham@fb.com>
parents:
18549
diff
changeset
|
665 activebookmark = None |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
666 state = {} |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
667 f = repo.opener("rebasestate") |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
668 for i, l in enumerate(f.read().splitlines()): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
669 if i == 0: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
670 originalwd = repo[l].rev() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
671 elif i == 1: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
672 target = repo[l].rev() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
673 elif i == 2: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
674 external = repo[l].rev() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
675 elif i == 3: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
676 collapse = bool(int(l)) |
7952
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
677 elif i == 4: |
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
678 keep = bool(int(l)) |
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
679 elif i == 5: |
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
680 keepbranches = bool(int(l)) |
18755
72412afe4c28
rebase: restore active bookmark after rebase --continue
Durham Goode <durham@fb.com>
parents:
18549
diff
changeset
|
681 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
|
682 # 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
|
683 # 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
|
684 activebookmark = l |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
685 else: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
686 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
|
687 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
|
688 state[repo[oldrev].rev()] = int(newrev) |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
689 else: |
15464
3411a83e232a
rebase: treat nullmerge as a special case in rebasestate (issue3046)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
15289
diff
changeset
|
690 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
|
691 |
46c2331fc750
rebase: abort cleanly when we encounter a damaged rebasestate (issue4155)
Matt Mackall <mpm@selenic.com>
parents:
20313
diff
changeset
|
692 if keepbranches is None: |
46c2331fc750
rebase: abort cleanly when we encounter a damaged rebasestate (issue4155)
Matt Mackall <mpm@selenic.com>
parents:
20313
diff
changeset
|
693 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
|
694 |
11843
00f8e7837668
rebase: recompute the set of skipped rev when using --continue (issue2330)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11546
diff
changeset
|
695 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
|
696 # 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
|
697 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
|
698 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
|
699 for old, new in sorted(state.items()): |
00f8e7837668
rebase: recompute the set of skipped rev when using --continue (issue2330)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11546
diff
changeset
|
700 if new != nullrev and new in seen: |
00f8e7837668
rebase: recompute the set of skipped rev when using --continue (issue2330)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11546
diff
changeset
|
701 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
|
702 seen.add(new) |
00f8e7837668
rebase: recompute the set of skipped rev when using --continue (issue2330)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11546
diff
changeset
|
703 repo.ui.debug('computed skipped revs: %s\n' % skipped) |
9467
4c041f1ee1b4
do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents:
9301
diff
changeset
|
704 repo.ui.debug('rebase status resumed\n') |
11843
00f8e7837668
rebase: recompute the set of skipped rev when using --continue (issue2330)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11546
diff
changeset
|
705 return (originalwd, target, state, skipped, |
18755
72412afe4c28
rebase: restore active bookmark after rebase --continue
Durham Goode <durham@fb.com>
parents:
18549
diff
changeset
|
706 collapse, keep, keepbranches, external, activebookmark) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
707 except IOError, err: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
708 if err.errno != errno.ENOENT: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
709 raise |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
710 raise util.Abort(_('no rebase in progress')) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
711 |
19516
fe78eb7bcca0
rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents:
19496
diff
changeset
|
712 def inrebase(repo, originalwd, state): |
19951
d51c4d85ec23
spelling: random spell checker fixes
Mads Kiilerich <madski@unity3d.com>
parents:
19926
diff
changeset
|
713 '''check whether the working dir is in an interrupted rebase''' |
19516
fe78eb7bcca0
rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents:
19496
diff
changeset
|
714 parents = [p.rev() for p in repo.parents()] |
fe78eb7bcca0
rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents:
19496
diff
changeset
|
715 if originalwd in parents: |
fe78eb7bcca0
rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents:
19496
diff
changeset
|
716 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
|
717 |
fe78eb7bcca0
rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents:
19496
diff
changeset
|
718 for newrev in state.itervalues(): |
fe78eb7bcca0
rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents:
19496
diff
changeset
|
719 if newrev in parents: |
fe78eb7bcca0
rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents:
19496
diff
changeset
|
720 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
|
721 |
fe78eb7bcca0
rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents:
19496
diff
changeset
|
722 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
|
723 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
724 def abort(repo, originalwd, target, state): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
725 'Restore the repository to its original state' |
19984
7d5e7799a29f
rebase: fix rebase aborts when 'tip-1' is public (issue4082)
Durham Goode <durham@fb.com>
parents:
19971
diff
changeset
|
726 dstates = [s for s in state.values() if s > nullrev] |
17026
f8af57c00a29
rebase: improve error message on improper phases
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents:
16551
diff
changeset
|
727 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
|
728 cleanup = True |
17026
f8af57c00a29
rebase: improve error message on improper phases
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents:
16551
diff
changeset
|
729 if immutable: |
19517
eab2ff59481e
rebase: continue abort without strip for immutable csets (issue3997)
Matt Mackall <mpm@selenic.com>
parents:
19516
diff
changeset
|
730 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
|
731 % ', '.join(str(repo[r]) for r in immutable), |
eab2ff59481e
rebase: continue abort without strip for immutable csets (issue3997)
Matt Mackall <mpm@selenic.com>
parents:
19516
diff
changeset
|
732 hint=_('see hg help phases for details')) |
19518
12843143663d
rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents:
19517
diff
changeset
|
733 cleanup = False |
16280
0806823370d8
rebase: properly calculate descendant set when aborting (issue3332)
Matt Mackall <mpm@selenic.com>
parents:
16228
diff
changeset
|
734 |
0806823370d8
rebase: properly calculate descendant set when aborting (issue3332)
Matt Mackall <mpm@selenic.com>
parents:
16228
diff
changeset
|
735 descendants = set() |
0806823370d8
rebase: properly calculate descendant set when aborting (issue3332)
Matt Mackall <mpm@selenic.com>
parents:
16228
diff
changeset
|
736 if dstates: |
16867
1093ad1e8903
revlog: descendants(*revs) becomes descendants(revs) (API)
Bryan O'Sullivan <bryano@fb.com>
parents:
16866
diff
changeset
|
737 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
|
738 if descendants - set(dstates): |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
739 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
|
740 "can't strip\n")) |
12843143663d
rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents:
19517
diff
changeset
|
741 cleanup = False |
12843143663d
rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents:
19517
diff
changeset
|
742 |
12843143663d
rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents:
19517
diff
changeset
|
743 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
|
744 # Update away from the rebase if necessary |
19518
12843143663d
rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents:
19517
diff
changeset
|
745 if inrebase(repo, originalwd, state): |
19516
fe78eb7bcca0
rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents:
19496
diff
changeset
|
746 merge.update(repo, repo[originalwd].rev(), False, True, False) |
fe78eb7bcca0
rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents:
19496
diff
changeset
|
747 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
748 # Strip from the first rebased revision |
11316
7fa3968004c1
rebase: --abort doesn't strip away the target changeset (issue2220)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
11285
diff
changeset
|
749 rebased = filter(lambda x: x > -1 and x != target, state.values()) |
19518
12843143663d
rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents:
19517
diff
changeset
|
750 if rebased: |
18424
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
751 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
|
752 # 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
|
753 repair.strip(repo.ui, repo, strippoints) |
19518
12843143663d
rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents:
19517
diff
changeset
|
754 |
12843143663d
rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents:
19517
diff
changeset
|
755 clearstatus(repo) |
12843143663d
rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents:
19517
diff
changeset
|
756 repo.ui.warn(_('rebase aborted\n')) |
12843143663d
rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents:
19517
diff
changeset
|
757 return 0 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
758 |
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
|
759 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
|
760 '''Define which revisions are going to be rebased and where |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
761 |
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
|
762 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
|
763 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
|
764 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
|
765 ''' |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
766 |
10672
c2e1e637d4da
rebase: always check if rebasing onto an applied mq patch.
Greg Ward <greg-hg@gerg.ca>
parents:
10659
diff
changeset
|
767 # 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
|
768 # 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
|
769 # 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
|
770 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
|
771 [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
|
772 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
|
773 |
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
|
774 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
|
775 if not roots: |
15270
6cb6064f1d50
rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15269
diff
changeset
|
776 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
|
777 roots.sort() |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
778 state = {} |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
779 detachset = set() |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
780 for root in roots: |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
781 commonbase = root.ancestor(dest) |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
782 if commonbase == root: |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
783 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
|
784 if commonbase == dest: |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
785 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
|
786 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
|
787 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
|
788 return None |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
789 |
18424
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
790 repo.ui.debug('rebase onto %d starting from %s\n' % (dest, roots)) |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
791 state.update(dict.fromkeys(rebaseset, nullrev)) |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
792 # 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
|
793 # 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
|
794 # |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
795 # - 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
|
796 # 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
|
797 # |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
798 # - 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
|
799 # 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
|
800 # pruned while rebased. |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
801 # |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
802 # 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
|
803 # 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
|
804 # --base option. |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
805 # |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
806 # 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
|
807 # <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
|
808 # 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
|
809 # <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
|
810 # 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
|
811 # |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
812 # - 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
|
813 # |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
814 # - 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
|
815 # 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
|
816 # |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
817 # 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
|
818 # |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
819 # +------------------+----------------------+-------------------------+ |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
820 # | | one parent | merge | |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
821 # +------------------+----------------------+-------------------------+ |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
822 # | 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
|
823 # | ::<dest> | | remapped to <dest> | |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
824 # +------------------+----------------------+-------------------------+ |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
825 # | 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
|
826 # +------------------+----------------------+-------------------------+ |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
827 # |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
828 # 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
|
829 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
|
830 # 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
|
831 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
|
832 [root.rev()])) |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
833 for r in detachset: |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
834 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
|
835 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
|
836 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
|
837 # 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
|
838 # 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
|
839 # 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
|
840 # 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
|
841 # 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
|
842 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
|
843 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
|
844 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
|
845 return repo['.'].rev(), dest.rev(), state |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
846 |
18444
55aff0c2b73c
rebase: do not invent successor to skipped changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18424
diff
changeset
|
847 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
|
848 """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
|
849 |
aafc521668d8
rebase: properly handle --collapse when creating obsolescence marker
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17612
diff
changeset
|
850 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
|
851 `collapsedas` node.""" |
17612
fc2a6114f0a0
rebase: allow creation obsolescence relation instead of stripping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17611
diff
changeset
|
852 if obsolete._enabled: |
fc2a6114f0a0
rebase: allow creation obsolescence relation instead of stripping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17611
diff
changeset
|
853 markers = [] |
fc2a6114f0a0
rebase: allow creation obsolescence relation instead of stripping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17611
diff
changeset
|
854 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
|
855 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
|
856 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
|
857 succs = () |
55aff0c2b73c
rebase: do not invent successor to skipped changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18424
diff
changeset
|
858 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
|
859 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
|
860 else: |
55aff0c2b73c
rebase: do not invent successor to skipped changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18424
diff
changeset
|
861 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
|
862 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
|
863 if markers: |
fc2a6114f0a0
rebase: allow creation obsolescence relation instead of stripping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17611
diff
changeset
|
864 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
|
865 else: |
18446
c83d36b81df1
rebase: lose the comparison to `nullmerge`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18444
diff
changeset
|
866 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
|
867 if rebased: |
18424
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
868 stripped = [] |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
869 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
|
870 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
|
871 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
|
872 "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
|
873 else: |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
874 stripped.append(root.node()) |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
875 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
|
876 # 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
|
877 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
|
878 |
910123eac887
rebase: extract final changesets cleanup logic in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17325
diff
changeset
|
879 |
7216
292fb2ad2846
extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents:
7213
diff
changeset
|
880 def pullrebase(orig, ui, repo, *args, **opts): |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
881 '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
|
882 if opts.get('rebase'): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
883 if opts.get('update'): |
8242
aee8455ee8ec
Fix typeerror when specifying both --rebase and --pull
Martijn Pieters <mj@zopatista.com>
parents:
7786
diff
changeset
|
884 del opts['update'] |
9467
4c041f1ee1b4
do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents:
9301
diff
changeset
|
885 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
|
886 'the update flag\n') |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
887 |
16228
5b41d5ad52bf
rebase: move bookmarks as needed with pull --rebase (issue3285)
Matt Mackall <mpm@selenic.com>
parents:
15945
diff
changeset
|
888 movemarkfrom = repo['.'].node() |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
889 revsprepull = len(repo) |
10628
6227c8d669d5
rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents:
10436
diff
changeset
|
890 origpostincoming = commands.postincoming |
6227c8d669d5
rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents:
10436
diff
changeset
|
891 def _dummy(*args, **kwargs): |
6227c8d669d5
rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents:
10436
diff
changeset
|
892 pass |
6227c8d669d5
rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents:
10436
diff
changeset
|
893 commands.postincoming = _dummy |
6227c8d669d5
rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents:
10436
diff
changeset
|
894 try: |
6227c8d669d5
rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents:
10436
diff
changeset
|
895 orig(ui, repo, *args, **opts) |
6227c8d669d5
rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents:
10436
diff
changeset
|
896 finally: |
6227c8d669d5
rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents:
10436
diff
changeset
|
897 commands.postincoming = origpostincoming |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
898 revspostpull = len(repo) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
899 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
|
900 # --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
|
901 # dropping it |
848345a8d6ad
rebase: fix pull --rev options clashing with --rebase (issue3619)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17615
diff
changeset
|
902 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
|
903 del opts['rev'] |
7216
292fb2ad2846
extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents:
7213
diff
changeset
|
904 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
|
905 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
|
906 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
|
907 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
|
908 # 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
|
909 hg.update(repo, dest) |
16228
5b41d5ad52bf
rebase: move bookmarks as needed with pull --rebase (issue3285)
Matt Mackall <mpm@selenic.com>
parents:
15945
diff
changeset
|
910 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
|
911 ui.status(_("updating bookmark %s\n") |
5b41d5ad52bf
rebase: move bookmarks as needed with pull --rebase (issue3285)
Matt Mackall <mpm@selenic.com>
parents:
15945
diff
changeset
|
912 % repo._bookmarkcurrent) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
913 else: |
14444
1f997134a9d1
rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents:
14306
diff
changeset
|
914 if opts.get('tool'): |
1f997134a9d1
rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents:
14306
diff
changeset
|
915 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
|
916 orig(ui, repo, *args, **opts) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
917 |
19214
0250047a365e
summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents:
19059
diff
changeset
|
918 def summaryhook(ui, repo): |
0250047a365e
summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents:
19059
diff
changeset
|
919 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
|
920 return |
19849
e7fa36d2ad3a
rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19848
diff
changeset
|
921 try: |
e7fa36d2ad3a
rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19848
diff
changeset
|
922 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
|
923 except error.RepoLookupError: |
e7fa36d2ad3a
rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19848
diff
changeset
|
924 # 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
|
925 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
|
926 ui.write(msg) |
e7fa36d2ad3a
rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19848
diff
changeset
|
927 return |
19214
0250047a365e
summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents:
19059
diff
changeset
|
928 numrebased = len([i for i in state.itervalues() if i != -1]) |
0250047a365e
summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents:
19059
diff
changeset
|
929 # i18n: column positioning for "hg summary" |
0250047a365e
summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents:
19059
diff
changeset
|
930 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
|
931 (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
|
932 ui.label(_('%d remaining'), 'rebase.remaining') % |
0250047a365e
summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents:
19059
diff
changeset
|
933 (len(state) - numrebased))) |
0250047a365e
summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents:
19059
diff
changeset
|
934 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
935 def uisetup(ui): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
936 '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
|
937 entry = extensions.wrapcommand(commands.table, 'pull', pullrebase) |
292fb2ad2846
extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents:
7213
diff
changeset
|
938 entry[1].append(('', 'rebase', None, |
14444
1f997134a9d1
rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents:
14306
diff
changeset
|
939 _("rebase working directory to branch head"))) |
1f997134a9d1
rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents:
14306
diff
changeset
|
940 entry[1].append(('t', 'tool', '', |
1f997134a9d1
rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents:
14306
diff
changeset
|
941 _("specify merge tool for rebase"))) |
19214
0250047a365e
summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents:
19059
diff
changeset
|
942 cmdutil.summaryhooks.add('rebase', summaryhook) |
19478
e5a5790a3185
rebase: add checkunfinished support (issue3955)
Matt Mackall <mpm@selenic.com>
parents:
19477
diff
changeset
|
943 cmdutil.unfinishedstates.append( |
19496
607191a45f8c
checkunfinished: accommodate histedit quirk
Matt Mackall <mpm@selenic.com>
parents:
19478
diff
changeset
|
944 ['rebasestate', False, False, _('rebase in progress'), |
19478
e5a5790a3185
rebase: add checkunfinished support (issue3955)
Matt Mackall <mpm@selenic.com>
parents:
19477
diff
changeset
|
945 _("use 'hg rebase --continue' or 'hg rebase --abort'")]) |