author | Patrick Mezard <patrick@mezard.eu> |
Thu, 03 May 2012 15:14:58 +0200 | |
changeset 16696 | d1afbf03e69a |
parent 16566 | ae6dddffe4f1 |
child 16743 | 38caf405d010 |
permissions | -rw-r--r-- |
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 |
15917
e66084ef8449
rebase: fix phases movement
Alain Leufroy <alain.leufroyATgmailMYDOTcom>
parents:
15904
diff
changeset
|
18 |
from mercurial import extensions, patch, scmutil, phases |
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 |
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
26 |
|
14306
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
27 |
cmdtable = {} |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
28 |
command = cmdutil.command(cmdtable) |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
29 |
|
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
30 |
@command('rebase', |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
31 |
[('s', 'source', '', |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
32 |
_('rebase from the specified changeset'), _('REV')), |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
33 |
('b', 'base', '', |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
34 |
_('rebase from the base of the specified changeset ' |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
35 |
'(up to greatest common ancestor of base and dest)'), |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
36 |
_('REV')), |
15270
6cb6064f1d50
rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15269
diff
changeset
|
37 |
('r', 'rev', [], |
6cb6064f1d50
rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15269
diff
changeset
|
38 |
_('rebase these revisions'), |
6cb6064f1d50
rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15269
diff
changeset
|
39 |
_('REV')), |
14306
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
40 |
('d', 'dest', '', |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
41 |
_('rebase onto the specified changeset'), _('REV')), |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
42 |
('', 'collapse', False, _('collapse the rebased changesets')), |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
43 |
('m', 'message', '', |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
44 |
_('use text as collapse commit message'), _('TEXT')), |
15219 | 45 |
('e', 'edit', False, _('invoke editor on commit messages')), |
14306
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
46 |
('l', 'logfile', '', |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
47 |
_('read collapse commit message from file'), _('FILE')), |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
48 |
('', 'keep', False, _('keep original changesets')), |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
49 |
('', 'keepbranches', False, _('keep original branch names')), |
15737
8edd9f2c7b57
rebase: add a "D" short option for detach
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15736
diff
changeset
|
50 |
('D', 'detach', False, _('force detaching of source from its original ' |
14306
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
51 |
'branch')), |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
52 |
('t', 'tool', '', _('specify merge tool')), |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
53 |
('c', 'continue', False, _('continue an interrupted rebase')), |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
54 |
('a', 'abort', False, _('abort an interrupted rebase'))] + |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
55 |
templateopts, |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
56 |
_('hg rebase [-s REV | -b REV] [-d REV] [options]\n' |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
57 |
'hg rebase {-a|-c}')) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
58 |
def rebase(ui, repo, **opts): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
59 |
"""move changeset (and descendants) to a different branch |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
60 |
|
7999
b25110140573
rebase: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents:
7955
diff
changeset
|
61 |
Rebase uses repeated merging to graft changesets from one part of |
10646 | 62 |
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
|
63 |
useful for linearizing *local* changes relative to a master |
10646 | 64 |
development tree. |
65 |
||
11188
b5c0f6a11430
rebase: stress that only local changesets should be rebased
Martin Geisler <mg@lazybytes.net>
parents:
10762
diff
changeset
|
66 |
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
|
67 |
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
|
68 |
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
|
69 |
pulling in your rebased changesets. |
b5c0f6a11430
rebase: stress that only local changesets should be rebased
Martin Geisler <mg@lazybytes.net>
parents:
10762
diff
changeset
|
70 |
|
10646 | 71 |
If you don't specify a destination changeset (``-d/--dest``), |
72 |
rebase uses the tipmost head of the current named branch as the |
|
73 |
destination. (The destination changeset is not modified by |
|
74 |
rebasing, but new changesets are added as its descendants.) |
|
75 |
||
76 |
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
|
77 |
"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
|
78 |
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
|
79 |
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
|
80 |
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
|
81 |
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
|
82 |
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
|
83 |
``-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
|
84 |
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
|
85 |
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
|
86 |
uses the parent of the working directory as the base. |
10646 | 87 |
|
88 |
By default, rebase recreates the changesets in the source branch |
|
89 |
as descendants of dest and then destroys the originals. Use |
|
90 |
``--keep`` to preserve the original source changesets. Some |
|
91 |
changesets in the source branch (e.g. merges from the destination |
|
92 |
branch) may be dropped if they no longer contribute any change. |
|
93 |
||
94 |
One result of the rules for selecting the destination changeset |
|
95 |
and source branch is that, unlike ``merge``, rebase will do |
|
96 |
nothing if you are at the latest (tipmost) head of a named branch |
|
97 |
with two heads. You need to explicitly specify source and/or |
|
98 |
destination (or ``update`` to the other head, if it's the head of |
|
99 |
the intended source branch). |
|
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
100 |
|
7999
b25110140573
rebase: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents:
7955
diff
changeset
|
101 |
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
|
102 |
continued with --continue/-c or aborted with --abort/-a. |
11205 | 103 |
|
104 |
Returns 0 on success, 1 if nothing to rebase. |
|
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
105 |
""" |
7280
810ca383da9c
remove unused variables
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7216
diff
changeset
|
106 |
originalwd = target = None |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
107 |
external = nullrev |
8454
6d4bf1c1a003
rebase: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8270
diff
changeset
|
108 |
state = {} |
6d4bf1c1a003
rebase: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8270
diff
changeset
|
109 |
skipped = set() |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
110 |
targetancestors = set() |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
111 |
|
15219 | 112 |
editor = None |
113 |
if opts.get('edit'): |
|
114 |
editor = cmdutil.commitforceeditor |
|
115 |
||
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
116 |
lock = wlock = None |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
117 |
try: |
15874
2305baff673f
rebase: take locks in the right order
Mads Kiilerich <mads@kiilerich.com>
parents:
15801
diff
changeset
|
118 |
wlock = repo.wlock() |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
119 |
lock = repo.lock() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
120 |
|
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
121 |
# Validate input and define rebasing points |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
122 |
destf = opts.get('dest', None) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
123 |
srcf = opts.get('source', None) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
124 |
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
|
125 |
revf = opts.get('rev', []) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
126 |
contf = opts.get('continue') |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
127 |
abortf = opts.get('abort') |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
128 |
collapsef = opts.get('collapse', False) |
14635
217b7d83afc3
cmdutil, logmessage: use ui.fin when reading from '-'
Idan Kamara <idankk86@gmail.com>
parents:
14599
diff
changeset
|
129 |
collapsemsg = cmdutil.logmessage(ui, opts) |
13609
e035356dbfdc
rebase: don't use util.Abort for an internal error
Martin Geisler <mg@lazybytes.net>
parents:
13235
diff
changeset
|
130 |
extrafn = opts.get('extrafn') # internal, used by e.g. hgsubversion |
7952
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
131 |
keepf = opts.get('keep', False) |
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
132 |
keepbranchesf = opts.get('keepbranches', False) |
10352
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
133 |
detachf = opts.get('detach', False) |
10677
f2558a8228be
rebase: add option to not commit after a collapsing
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10676
diff
changeset
|
134 |
# 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
|
135 |
# other extensions |
f2558a8228be
rebase: add option to not commit after a collapsing
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10676
diff
changeset
|
136 |
keepopen = opts.get('keepopen', False) |
7468
3e5db4228f8f
rebase: add support to keep branch names
Augie Fackler <durin42@gmail.com>
parents:
7298
diff
changeset
|
137 |
|
13661
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
138 |
if collapsemsg and not collapsef: |
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
139 |
raise util.Abort( |
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
140 |
_('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
|
141 |
|
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
142 |
if contf or abortf: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
143 |
if contf and abortf: |
11285
f118029e534c
rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents:
11205
diff
changeset
|
144 |
raise util.Abort(_('cannot use both abort and continue')) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
145 |
if collapsef: |
11285
f118029e534c
rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents:
11205
diff
changeset
|
146 |
raise util.Abort( |
f118029e534c
rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents:
11205
diff
changeset
|
147 |
_('cannot use collapse with continue or abort')) |
10352
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
148 |
if detachf: |
11285
f118029e534c
rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents:
11205
diff
changeset
|
149 |
raise util.Abort(_('cannot use detach with continue or abort')) |
8117
2b30d8488819
remove unnecessary outer parenthesis in if-statements
Martin Geisler <mg@lazybytes.net>
parents:
8112
diff
changeset
|
150 |
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
|
151 |
raise util.Abort( |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
152 |
_('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
|
153 |
if opts.get('tool', False): |
0995eee8ffe4
rebase: add --tool argument for specifying merge tool
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
13778
diff
changeset
|
154 |
ui.warn(_('tool option will be ignored\n')) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
155 |
|
11843
00f8e7837668
rebase: recompute the set of skipped rev when using --continue (issue2330)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11546
diff
changeset
|
156 |
(originalwd, target, state, skipped, collapsef, keepf, |
7952
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
157 |
keepbranchesf, external) = restorestatus(repo) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
158 |
if abortf: |
11205 | 159 |
return abort(repo, originalwd, target, state) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
160 |
else: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
161 |
if srcf and basef: |
11285
f118029e534c
rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents:
11205
diff
changeset
|
162 |
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
|
163 |
'source and a base')) |
6cb6064f1d50
rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15269
diff
changeset
|
164 |
if revf and basef: |
15289
9cec4b24615b
rebase: fix typos
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
15272
diff
changeset
|
165 |
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
|
166 |
'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
|
167 |
if revf and srcf: |
15289
9cec4b24615b
rebase: fix typos
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
15272
diff
changeset
|
168 |
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
|
169 |
'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
|
170 |
if detachf: |
15736
306e84e8bbe9
rebase: allow --detach when --rev is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15471
diff
changeset
|
171 |
if not (srcf or revf): |
11285
f118029e534c
rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents:
11205
diff
changeset
|
172 |
raise util.Abort( |
f118029e534c
rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents:
11205
diff
changeset
|
173 |
_('detach requires a revision to be specified')) |
10352
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
174 |
if basef: |
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 specify a base with detach')) |
10352
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
176 |
|
14289
d68ddccf276b
cmdutil: bail_if_changed to bailifchanged
Matt Mackall <mpm@selenic.com>
parents:
13895
diff
changeset
|
177 |
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
|
178 |
|
3bfdfefea2fc
rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15219
diff
changeset
|
179 |
if not destf: |
15270
6cb6064f1d50
rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15269
diff
changeset
|
180 |
# 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
|
181 |
# 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
|
182 |
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
|
183 |
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
|
184 |
else: |
16566
ae6dddffe4f1
rebase: make --dest understand revsets
Patrick Mezard <patrick@mezard.eu>
parents:
16565
diff
changeset
|
185 |
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
|
186 |
|
15271
84d4a4ce45fd
rebase: simplify set generation
Matt Mackall <mpm@selenic.com>
parents:
15270
diff
changeset
|
187 |
if revf: |
15404
c1eb8398fe82
localrepo: convert various repo.set() users to repo.revs()
Matt Mackall <mpm@selenic.com>
parents:
15289
diff
changeset
|
188 |
rebaseset = repo.revs('%lr', revf) |
15271
84d4a4ce45fd
rebase: simplify set generation
Matt Mackall <mpm@selenic.com>
parents:
15270
diff
changeset
|
189 |
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
|
190 |
src = scmutil.revrange(repo, [srcf]) |
15801 | 191 |
rebaseset = repo.revs('(%ld)::', src) |
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
|
192 |
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
|
193 |
base = scmutil.revrange(repo, [basef or '.']) |
15801 | 194 |
rebaseset = repo.revs( |
195 |
'(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
|
196 |
base, dest, base) |
15271
84d4a4ce45fd
rebase: simplify set generation
Matt Mackall <mpm@selenic.com>
parents:
15270
diff
changeset
|
197 |
|
15742
65df60a3f96b
phases: prevent rebase to rebase immutable changeset.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15737
diff
changeset
|
198 |
if rebaseset: |
65df60a3f96b
phases: prevent rebase to rebase immutable changeset.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15737
diff
changeset
|
199 |
root = min(rebaseset) |
65df60a3f96b
phases: prevent rebase to rebase immutable changeset.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15737
diff
changeset
|
200 |
else: |
65df60a3f96b
phases: prevent rebase to rebase immutable changeset.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15737
diff
changeset
|
201 |
root = None |
15271
84d4a4ce45fd
rebase: simplify set generation
Matt Mackall <mpm@selenic.com>
parents:
15270
diff
changeset
|
202 |
|
84d4a4ce45fd
rebase: simplify set generation
Matt Mackall <mpm@selenic.com>
parents:
15270
diff
changeset
|
203 |
if not rebaseset: |
16565
9b7d2ff4b006
rebase: add missing EOL to debug strings
Patrick Mezard <patrick@mezard.eu>
parents:
16551
diff
changeset
|
204 |
repo.ui.debug('base is ancestor of destination\n') |
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
|
205 |
result = None |
15404
c1eb8398fe82
localrepo: convert various repo.set() users to repo.revs()
Matt Mackall <mpm@selenic.com>
parents:
15289
diff
changeset
|
206 |
elif not keepf and list(repo.revs('first(children(%ld) - %ld)', |
c1eb8398fe82
localrepo: convert various repo.set() users to repo.revs()
Matt Mackall <mpm@selenic.com>
parents:
15289
diff
changeset
|
207 |
rebaseset, rebaseset)): |
15272
2889d4574726
rebase: simplify check for orphaned descendants
Matt Mackall <mpm@selenic.com>
parents:
15271
diff
changeset
|
208 |
raise util.Abort( |
2889d4574726
rebase: simplify check for orphaned descendants
Matt Mackall <mpm@selenic.com>
parents:
15271
diff
changeset
|
209 |
_("can't remove original changesets with" |
2889d4574726
rebase: simplify check for orphaned descendants
Matt Mackall <mpm@selenic.com>
parents:
15271
diff
changeset
|
210 |
" unrebased descendants"), |
2889d4574726
rebase: simplify check for orphaned descendants
Matt Mackall <mpm@selenic.com>
parents:
15271
diff
changeset
|
211 |
hint=_('use --keep to keep original changesets')) |
15742
65df60a3f96b
phases: prevent rebase to rebase immutable changeset.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15737
diff
changeset
|
212 |
elif not keepf and not repo[root].mutable(): |
15945
cd42f77d30c4
rebase: drop uppercase in abort message
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
15923
diff
changeset
|
213 |
raise util.Abort(_("can't rebase immutable changeset %s") |
15742
65df60a3f96b
phases: prevent rebase to rebase immutable changeset.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15737
diff
changeset
|
214 |
% repo[root], |
65df60a3f96b
phases: prevent rebase to rebase immutable changeset.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15737
diff
changeset
|
215 |
hint=_('see hg help phases for details')) |
15272
2889d4574726
rebase: simplify check for orphaned descendants
Matt Mackall <mpm@selenic.com>
parents:
15271
diff
changeset
|
216 |
else: |
16696
d1afbf03e69a
rebase: allow collapsing branches in place (issue3111)
Patrick Mezard <patrick@mezard.eu>
parents:
16566
diff
changeset
|
217 |
result = buildstate(repo, dest, rebaseset, detachf, collapsef) |
15272
2889d4574726
rebase: simplify check for orphaned descendants
Matt Mackall <mpm@selenic.com>
parents:
15271
diff
changeset
|
218 |
|
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
219 |
if not result: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
220 |
# 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
|
221 |
ui.status(_('nothing to rebase\n')) |
11205 | 222 |
return 1 |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
223 |
else: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
224 |
originalwd, target, state = result |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
225 |
if collapsef: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
226 |
targetancestors = set(repo.changelog.ancestors(target)) |
15469
ad336e093a59
rebase: ensure target is not taken as external (issue3085)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
15464
diff
changeset
|
227 |
targetancestors.add(target) |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
228 |
external = checkexternal(repo, state, targetancestors) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
229 |
|
7952
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
230 |
if keepbranchesf: |
13609
e035356dbfdc
rebase: don't use util.Abort for an internal error
Martin Geisler <mg@lazybytes.net>
parents:
13235
diff
changeset
|
231 |
assert not extrafn, 'cannot use both keepbranches and extrafn' |
7952
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
232 |
def extrafn(ctx, extra): |
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
233 |
extra['branch'] = ctx.branch() |
14897
b9daa5b7a3af
rebase: block collapse with keepbranches on multiple named branches (issue2112)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14884
diff
changeset
|
234 |
if collapsef: |
b9daa5b7a3af
rebase: block collapse with keepbranches on multiple named branches (issue2112)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14884
diff
changeset
|
235 |
branches = set() |
b9daa5b7a3af
rebase: block collapse with keepbranches on multiple named branches (issue2112)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14884
diff
changeset
|
236 |
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
|
237 |
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
|
238 |
if len(branches) > 1: |
14917
2957b8b1e809
rebase: remove trailing whitespace found by check-code
Augie Fackler <durin42@gmail.com>
parents:
14897
diff
changeset
|
239 |
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
|
240 |
'branches')) |
b9daa5b7a3af
rebase: block collapse with keepbranches on multiple named branches (issue2112)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14884
diff
changeset
|
241 |
|
7952
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
242 |
|
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
243 |
# Rebase |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
244 |
if not targetancestors: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
245 |
targetancestors = set(repo.changelog.ancestors(target)) |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
246 |
targetancestors.add(target) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
247 |
|
14884
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
248 |
# 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
|
249 |
currentbookmarks = repo._bookmarks.copy() |
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
250 |
|
11729
c91b86a291b0
rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents:
11546
diff
changeset
|
251 |
sortedstate = sorted(state) |
c91b86a291b0
rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents:
11546
diff
changeset
|
252 |
total = len(sortedstate) |
c91b86a291b0
rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents:
11546
diff
changeset
|
253 |
pos = 0 |
c91b86a291b0
rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents:
11546
diff
changeset
|
254 |
for rev in sortedstate: |
c91b86a291b0
rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents:
11546
diff
changeset
|
255 |
pos += 1 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
256 |
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
|
257 |
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
|
258 |
_('changesets'), total) |
7952
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
259 |
storestatus(repo, originalwd, target, state, collapsef, keepf, |
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
260 |
keepbranchesf, external) |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
261 |
p1, p2 = defineparents(repo, rev, target, state, |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
262 |
targetancestors) |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
263 |
if len(repo.parents()) == 2: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
264 |
repo.ui.debug('resuming interrupted rebase\n') |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
265 |
else: |
13856
0995eee8ffe4
rebase: add --tool argument for specifying merge tool
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
13778
diff
changeset
|
266 |
try: |
0995eee8ffe4
rebase: add --tool argument for specifying merge tool
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
13778
diff
changeset
|
267 |
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
|
268 |
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
|
269 |
if stats and stats[3] > 0: |
0995eee8ffe4
rebase: add --tool argument for specifying merge tool
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
13778
diff
changeset
|
270 |
raise util.Abort(_('unresolved conflicts (see hg ' |
0995eee8ffe4
rebase: add --tool argument for specifying merge tool
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
13778
diff
changeset
|
271 |
'resolve, then hg rebase --continue)')) |
0995eee8ffe4
rebase: add --tool argument for specifying merge tool
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
13778
diff
changeset
|
272 |
finally: |
0995eee8ffe4
rebase: add --tool argument for specifying merge tool
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
13778
diff
changeset
|
273 |
ui.setconfig('ui', 'forcemerge', '') |
15777
12309c09d19a
cmdutil: simplify duplicatecopies
Matt Mackall <mpm@selenic.com>
parents:
15742
diff
changeset
|
274 |
cmdutil.duplicatecopies(repo, rev, target) |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
275 |
if not collapsef: |
15219 | 276 |
newrev = concludenode(repo, rev, p1, p2, extrafn=extrafn, |
277 |
editor=editor) |
|
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
278 |
else: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
279 |
# 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
|
280 |
repo.setparents(repo[p1].node()) |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
281 |
newrev = None |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
282 |
# Update the state |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
283 |
if newrev is not None: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
284 |
state[rev] = repo[newrev].rev() |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
285 |
else: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
286 |
if not collapsef: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
287 |
ui.note(_('no changes, revision %d skipped\n') % rev) |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
288 |
ui.debug('next revision set to %s\n' % p1) |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
289 |
skipped.add(rev) |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
290 |
state[rev] = p1 |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
291 |
|
11729
c91b86a291b0
rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents:
11546
diff
changeset
|
292 |
ui.progress(_('rebasing'), None) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
293 |
ui.note(_('rebase merging completed\n')) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
294 |
|
10677
f2558a8228be
rebase: add option to not commit after a collapsing
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10676
diff
changeset
|
295 |
if collapsef and not keepopen: |
6923
ebf1462f2145
strip trailing whitespace, replace tabs by spaces
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6906
diff
changeset
|
296 |
p1, p2 = defineparents(repo, min(state), target, |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
297 |
state, targetancestors) |
13661
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
298 |
if collapsemsg: |
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
299 |
commitmsg = collapsemsg |
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
300 |
else: |
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
301 |
commitmsg = 'Collapsed revision' |
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
302 |
for rebased in state: |
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
303 |
if rebased not in skipped and state[rebased] != nullmerge: |
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
304 |
commitmsg += '\n* %s' % repo[rebased].description() |
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
305 |
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
|
306 |
newrev = concludenode(repo, rev, p1, external, commitmsg=commitmsg, |
15219 | 307 |
extrafn=extrafn, editor=editor) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
308 |
|
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
309 |
if 'qtip' in repo.tags(): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
310 |
updatemq(repo, state, skipped, **opts) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
311 |
|
14884
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
312 |
if currentbookmarks: |
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
313 |
# Nodeids are needed to reset bookmarks |
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
314 |
nstate = {} |
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
315 |
for k, v in state.iteritems(): |
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
316 |
if v != nullmerge: |
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
317 |
nstate[repo[k].node()] = repo[v].node() |
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
318 |
|
7952
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
319 |
if not keepf: |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
320 |
# Remove no more useful revisions |
10352
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
321 |
rebased = [rev for rev in state if state[rev] != nullmerge] |
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
322 |
if rebased: |
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
323 |
if set(repo.changelog.descendants(min(rebased))) - set(state): |
10436
6cebf27287de
rebase: split line longer than 80 chars
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10413
diff
changeset
|
324 |
ui.warn(_("warning: new changesets detected " |
6cebf27287de
rebase: split line longer than 80 chars
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10413
diff
changeset
|
325 |
"on source branch, not stripping\n")) |
10352
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
326 |
else: |
11201
34023f2ca305
Fix up rebase's handling of strip backups
Matt Mackall <mpm@selenic.com>
parents:
11189
diff
changeset
|
327 |
# backup the old csets by default |
34023f2ca305
Fix up rebase's handling of strip backups
Matt Mackall <mpm@selenic.com>
parents:
11189
diff
changeset
|
328 |
repair.strip(ui, repo, repo[min(rebased)].node(), "all") |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
329 |
|
14884
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
330 |
if currentbookmarks: |
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
331 |
updatebookmarks(repo, nstate, currentbookmarks, **opts) |
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
332 |
|
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
333 |
clearstatus(repo) |
11203
7a9cf012dddc
rebase: only show "rebase completed" message with -v
Matt Mackall <mpm@selenic.com>
parents:
11201
diff
changeset
|
334 |
ui.note(_("rebase completed\n")) |
7130
204c7850c158
rebase: disable rollback after rebasing
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7127
diff
changeset
|
335 |
if os.path.exists(repo.sjoin('undo')): |
13235
6bf39d88c857
rename util.unlink to unlinkpath
Adrian Buehlmann <adrian@cadifra.com>
parents:
13021
diff
changeset
|
336 |
util.unlinkpath(repo.sjoin('undo')) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
337 |
if skipped: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
338 |
ui.note(_("%d revisions have been skipped\n") % len(skipped)) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
339 |
finally: |
8112
6ee71f78497c
switch lock releasing in the extensions from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
8076
diff
changeset
|
340 |
release(lock, wlock) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
341 |
|
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
342 |
def checkexternal(repo, state, targetancestors): |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
343 |
"""Check whether one or more external revisions need to be taken in |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
344 |
consideration. In the latter case, abort. |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
345 |
""" |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
346 |
external = nullrev |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
347 |
source = min(state) |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
348 |
for rev in state: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
349 |
if rev == source: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
350 |
continue |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
351 |
# Check externals and fail if there are more than one |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
352 |
for p in repo[rev].parents(): |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
353 |
if (p.rev() not in state |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
354 |
and p.rev() not in targetancestors): |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
355 |
if external != nullrev: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
356 |
raise util.Abort(_('unable to collapse, there is more ' |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
357 |
'than one external parent')) |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
358 |
external = p.rev() |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
359 |
return external |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
360 |
|
15219 | 361 |
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
|
362 |
'Commit the changes and store useful information in extra' |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
363 |
try: |
16551
ebf6d38c9063
localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents:
16531
diff
changeset
|
364 |
repo.setparents(repo[p1].node(), repo[p2].node()) |
11537
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
365 |
ctx = repo[rev] |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
366 |
if commitmsg is None: |
11537
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
367 |
commitmsg = ctx.description() |
10762
129e96f7a87a
rebase: fix --collapse with --keepbranches (issue2100)
Patrick Mezard <pmezard@gmail.com>
parents:
10672
diff
changeset
|
368 |
extra = {'rebase_source': ctx.hex()} |
129e96f7a87a
rebase: fix --collapse with --keepbranches (issue2100)
Patrick Mezard <pmezard@gmail.com>
parents:
10672
diff
changeset
|
369 |
if extrafn: |
129e96f7a87a
rebase: fix --collapse with --keepbranches (issue2100)
Patrick Mezard <pmezard@gmail.com>
parents:
10672
diff
changeset
|
370 |
extrafn(ctx, extra) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
371 |
# Commit might fail if unresolved files exist |
10762
129e96f7a87a
rebase: fix --collapse with --keepbranches (issue2100)
Patrick Mezard <pmezard@gmail.com>
parents:
10672
diff
changeset
|
372 |
newrev = repo.commit(text=commitmsg, user=ctx.user(), |
15219 | 373 |
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
|
374 |
repo.dirstate.setbranch(repo[newrev].branch()) |
15917
e66084ef8449
rebase: fix phases movement
Alain Leufroy <alain.leufroyATgmailMYDOTcom>
parents:
15904
diff
changeset
|
375 |
targetphase = max(ctx.phase(), phases.draft) |
e66084ef8449
rebase: fix phases movement
Alain Leufroy <alain.leufroyATgmailMYDOTcom>
parents:
15904
diff
changeset
|
376 |
# retractboundary doesn't overwrite upper phase inherited from parent |
e66084ef8449
rebase: fix phases movement
Alain Leufroy <alain.leufroyATgmailMYDOTcom>
parents:
15904
diff
changeset
|
377 |
newnode = repo[newrev].node() |
15923
4b088ae9d47a
rebase: only advance phase on successful commit
Matt Mackall <mpm@selenic.com>
parents:
15917
diff
changeset
|
378 |
if newnode: |
4b088ae9d47a
rebase: only advance phase on successful commit
Matt Mackall <mpm@selenic.com>
parents:
15917
diff
changeset
|
379 |
phases.retractboundary(repo, targetphase, [newnode]) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
380 |
return newrev |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
381 |
except util.Abort: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
382 |
# Invalidate the previous setparents |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
383 |
repo.dirstate.invalidate() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
384 |
raise |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
385 |
|
16696
d1afbf03e69a
rebase: allow collapsing branches in place (issue3111)
Patrick Mezard <patrick@mezard.eu>
parents:
16566
diff
changeset
|
386 |
def rebasenode(repo, rev, p1, state, collapse): |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
387 |
'Rebase a single revision' |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
388 |
# Merge phase |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
389 |
# Update to target and merge it with local |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
390 |
if repo['.'].rev() != repo[p1].rev(): |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
391 |
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
|
392 |
merge.update(repo, p1, False, True, False) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
393 |
else: |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
394 |
repo.ui.debug(" already in target\n") |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
395 |
repo.dirstate.write() |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
396 |
repo.ui.debug(" merge against %d:%s\n" % (repo[rev].rev(), repo[rev])) |
13875
ff3c683eb8ff
rebase: use merge's ancestor parameter
Matt Mackall <mpm@selenic.com>
parents:
13856
diff
changeset
|
397 |
base = None |
ff3c683eb8ff
rebase: use merge's ancestor parameter
Matt Mackall <mpm@selenic.com>
parents:
13856
diff
changeset
|
398 |
if repo[rev].rev() != repo[min(state)].rev(): |
13878
a8d13ee0ce68
misc: replace .parents()[0] with p1()
Matt Mackall <mpm@selenic.com>
parents:
13875
diff
changeset
|
399 |
base = repo[rev].p1().node() |
16696
d1afbf03e69a
rebase: allow collapsing branches in place (issue3111)
Patrick Mezard <patrick@mezard.eu>
parents:
16566
diff
changeset
|
400 |
# 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
|
401 |
# have to allow merging with it. |
d1afbf03e69a
rebase: allow collapsing branches in place (issue3111)
Patrick Mezard <patrick@mezard.eu>
parents:
16566
diff
changeset
|
402 |
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
|
403 |
|
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
404 |
def defineparents(repo, rev, target, state, targetancestors): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
405 |
'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
|
406 |
parents = repo[rev].parents() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
407 |
p1 = p2 = nullrev |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
408 |
|
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
409 |
P1n = parents[0].rev() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
410 |
if P1n in targetancestors: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
411 |
p1 = target |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
412 |
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
|
413 |
if state[P1n] == nullmerge: |
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
414 |
p1 = target |
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
415 |
else: |
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
416 |
p1 = state[P1n] |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
417 |
else: # P1n external |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
418 |
p1 = target |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
419 |
p2 = P1n |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
420 |
|
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
421 |
if len(parents) == 2 and parents[1].rev() not in targetancestors: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
422 |
P2n = parents[1].rev() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
423 |
# interesting second parent |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
424 |
if P2n in state: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
425 |
if p1 == target: # P1n in targetancestors or external |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
426 |
p1 = state[P2n] |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
427 |
else: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
428 |
p2 = state[P2n] |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
429 |
else: # P2n external |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
430 |
if p2 != nullrev: # P1n external too => rev is a merged revision |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
431 |
raise util.Abort(_('cannot use revision %d as base, result ' |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
432 |
'would have 3 parents') % rev) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
433 |
p2 = P2n |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
434 |
repo.ui.debug(" future parents are %d and %d\n" % |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
435 |
(repo[p1].rev(), repo[p2].rev())) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
436 |
return p1, p2 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
437 |
|
7955
c3d4ff03ec72
rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7954
diff
changeset
|
438 |
def isagitpatch(repo, patchname): |
c3d4ff03ec72
rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7954
diff
changeset
|
439 |
'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
|
440 |
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
|
441 |
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
|
442 |
if line.startswith('diff --git'): |
c3d4ff03ec72
rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7954
diff
changeset
|
443 |
return True |
c3d4ff03ec72
rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7954
diff
changeset
|
444 |
return False |
c3d4ff03ec72
rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7954
diff
changeset
|
445 |
|
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
446 |
def updatemq(repo, state, skipped, **opts): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
447 |
'Update rebased mq patches - finalize and then import them' |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
448 |
mqrebase = {} |
11537
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
449 |
mq = repo.mq |
14572
8ff2957c1d82
mq: rename full_series to fullseries
Adrian Buehlmann <adrian@cadifra.com>
parents:
14509
diff
changeset
|
450 |
original_series = mq.fullseries[:] |
16531
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
451 |
skippedpatches = set() |
14497
ea585f2b1adc
rebase: restore mq guards after rebasing (issue2107)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
13894
diff
changeset
|
452 |
|
11537
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
453 |
for p in mq.applied: |
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
454 |
rev = repo[p.node].rev() |
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
455 |
if rev in state: |
9467
4c041f1ee1b4
do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents:
9301
diff
changeset
|
456 |
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
|
457 |
(rev, p.name)) |
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
458 |
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
|
459 |
else: |
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
460 |
# 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
|
461 |
skippedpatches.add(p.name) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
462 |
|
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
463 |
if mqrebase: |
11537
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
464 |
mq.finish(repo, mqrebase.keys()) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
465 |
|
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
466 |
# 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
|
467 |
for rev in sorted(mqrebase, reverse=True): |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
468 |
if rev not in skipped: |
11537
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
469 |
name, isgit = mqrebase[rev] |
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
470 |
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
|
471 |
mq.qimport(repo, (), patchname=name, git=isgit, |
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
472 |
rev=[str(state[rev])]) |
16531
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
473 |
else: |
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
474 |
# Rebased and skipped |
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
475 |
skippedpatches.add(mqrebase[rev][0]) |
14497
ea585f2b1adc
rebase: restore mq guards after rebasing (issue2107)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
13894
diff
changeset
|
476 |
|
16531
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
477 |
# 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
|
478 |
# 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
|
479 |
# 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
|
480 |
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
|
481 |
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
|
482 |
mq.fullseries[:] = newseries |
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
483 |
mq.seriesdirty = True |
14580
92101ea35015
mq: rename save_dirty to savedirty
Adrian Buehlmann <adrian@cadifra.com>
parents:
14572
diff
changeset
|
484 |
mq.savedirty() |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
485 |
|
14884
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
486 |
def updatebookmarks(repo, nstate, originalbookmarks, **opts): |
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
487 |
'Move bookmarks to their correct changesets' |
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
488 |
current = repo._bookmarkcurrent |
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
489 |
for k, v in originalbookmarks.iteritems(): |
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
490 |
if v in nstate: |
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
491 |
if nstate[v] != nullmerge: |
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
492 |
# reset the pointer if the bookmark was moved incorrectly |
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
493 |
if k != current: |
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
494 |
repo._bookmarks[k] = nstate[v] |
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
495 |
|
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
496 |
bookmarks.write(repo) |
c0ccd70df52c
rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
14635
diff
changeset
|
497 |
|
7952
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
498 |
def storestatus(repo, originalwd, target, state, collapse, keep, keepbranches, |
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
499 |
external): |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
500 |
'Store the current status to allow recovery' |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
501 |
f = repo.opener("rebasestate", "w") |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
502 |
f.write(repo[originalwd].hex() + '\n') |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
503 |
f.write(repo[target].hex() + '\n') |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
504 |
f.write(repo[external].hex() + '\n') |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
505 |
f.write('%d\n' % int(collapse)) |
7952
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
506 |
f.write('%d\n' % int(keep)) |
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
507 |
f.write('%d\n' % int(keepbranches)) |
7622
4dd7b28003d2
use dict.iteritems() rather than dict.items()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7599
diff
changeset
|
508 |
for d, v in state.iteritems(): |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
509 |
oldrev = repo[d].hex() |
15464
3411a83e232a
rebase: treat nullmerge as a special case in rebasestate (issue3046)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
15289
diff
changeset
|
510 |
if v != nullmerge: |
3411a83e232a
rebase: treat nullmerge as a special case in rebasestate (issue3046)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
15289
diff
changeset
|
511 |
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
|
512 |
else: |
3411a83e232a
rebase: treat nullmerge as a special case in rebasestate (issue3046)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
15289
diff
changeset
|
513 |
newrev = v |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
514 |
f.write("%s:%s\n" % (oldrev, newrev)) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
515 |
f.close() |
9467
4c041f1ee1b4
do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents:
9301
diff
changeset
|
516 |
repo.ui.debug('rebase status stored\n') |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
517 |
|
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
518 |
def clearstatus(repo): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
519 |
'Remove the status files' |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
520 |
if os.path.exists(repo.join("rebasestate")): |
13235
6bf39d88c857
rename util.unlink to unlinkpath
Adrian Buehlmann <adrian@cadifra.com>
parents:
13021
diff
changeset
|
521 |
util.unlinkpath(repo.join("rebasestate")) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
522 |
|
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
523 |
def restorestatus(repo): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
524 |
'Restore a previously stored status' |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
525 |
try: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
526 |
target = None |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
527 |
collapse = False |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
528 |
external = nullrev |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
529 |
state = {} |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
530 |
f = repo.opener("rebasestate") |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
531 |
for i, l in enumerate(f.read().splitlines()): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
532 |
if i == 0: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
533 |
originalwd = repo[l].rev() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
534 |
elif i == 1: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
535 |
target = repo[l].rev() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
536 |
elif i == 2: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
537 |
external = repo[l].rev() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
538 |
elif i == 3: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
539 |
collapse = bool(int(l)) |
7952
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
540 |
elif i == 4: |
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
541 |
keep = bool(int(l)) |
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
542 |
elif i == 5: |
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
543 |
keepbranches = bool(int(l)) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
544 |
else: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
545 |
oldrev, newrev = l.split(':') |
15464
3411a83e232a
rebase: treat nullmerge as a special case in rebasestate (issue3046)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
15289
diff
changeset
|
546 |
if newrev != str(nullmerge): |
3411a83e232a
rebase: treat nullmerge as a special case in rebasestate (issue3046)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
15289
diff
changeset
|
547 |
state[repo[oldrev].rev()] = repo[newrev].rev() |
3411a83e232a
rebase: treat nullmerge as a special case in rebasestate (issue3046)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
15289
diff
changeset
|
548 |
else: |
3411a83e232a
rebase: treat nullmerge as a special case in rebasestate (issue3046)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
15289
diff
changeset
|
549 |
state[repo[oldrev].rev()] = int(newrev) |
11843
00f8e7837668
rebase: recompute the set of skipped rev when using --continue (issue2330)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11546
diff
changeset
|
550 |
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
|
551 |
# 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
|
552 |
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
|
553 |
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
|
554 |
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
|
555 |
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
|
556 |
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
|
557 |
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
|
558 |
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
|
559 |
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
|
560 |
return (originalwd, target, state, skipped, |
00f8e7837668
rebase: recompute the set of skipped rev when using --continue (issue2330)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11546
diff
changeset
|
561 |
collapse, keep, keepbranches, external) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
562 |
except IOError, err: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
563 |
if err.errno != errno.ENOENT: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
564 |
raise |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
565 |
raise util.Abort(_('no rebase in progress')) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
566 |
|
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
567 |
def abort(repo, originalwd, target, state): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
568 |
'Restore the repository to its original state' |
16280
0806823370d8
rebase: properly calculate descendant set when aborting (issue3332)
Matt Mackall <mpm@selenic.com>
parents:
16228
diff
changeset
|
569 |
dstates = [s for s in state.values() if s != nullrev] |
0806823370d8
rebase: properly calculate descendant set when aborting (issue3332)
Matt Mackall <mpm@selenic.com>
parents:
16228
diff
changeset
|
570 |
if [d for d in dstates if not repo[d].mutable()]: |
15917
e66084ef8449
rebase: fix phases movement
Alain Leufroy <alain.leufroyATgmailMYDOTcom>
parents:
15904
diff
changeset
|
571 |
repo.ui.warn(_("warning: immutable rebased changeset detected, " |
e66084ef8449
rebase: fix phases movement
Alain Leufroy <alain.leufroyATgmailMYDOTcom>
parents:
15904
diff
changeset
|
572 |
"can't abort\n")) |
e66084ef8449
rebase: fix phases movement
Alain Leufroy <alain.leufroyATgmailMYDOTcom>
parents:
15904
diff
changeset
|
573 |
return -1 |
16280
0806823370d8
rebase: properly calculate descendant set when aborting (issue3332)
Matt Mackall <mpm@selenic.com>
parents:
16228
diff
changeset
|
574 |
|
0806823370d8
rebase: properly calculate descendant set when aborting (issue3332)
Matt Mackall <mpm@selenic.com>
parents:
16228
diff
changeset
|
575 |
descendants = set() |
0806823370d8
rebase: properly calculate descendant set when aborting (issue3332)
Matt Mackall <mpm@selenic.com>
parents:
16228
diff
changeset
|
576 |
if dstates: |
0806823370d8
rebase: properly calculate descendant set when aborting (issue3332)
Matt Mackall <mpm@selenic.com>
parents:
16228
diff
changeset
|
577 |
descendants = set(repo.changelog.descendants(*dstates)) |
0806823370d8
rebase: properly calculate descendant set when aborting (issue3332)
Matt Mackall <mpm@selenic.com>
parents:
16228
diff
changeset
|
578 |
if descendants - set(dstates): |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
579 |
repo.ui.warn(_("warning: new changesets detected on target branch, " |
16280
0806823370d8
rebase: properly calculate descendant set when aborting (issue3332)
Matt Mackall <mpm@selenic.com>
parents:
16228
diff
changeset
|
580 |
"can't abort\n")) |
11205 | 581 |
return -1 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
582 |
else: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
583 |
# Strip from the first rebased revision |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
584 |
merge.update(repo, repo[originalwd].rev(), False, True, False) |
11316
7fa3968004c1
rebase: --abort doesn't strip away the target changeset (issue2220)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
11285
diff
changeset
|
585 |
rebased = filter(lambda x: x > -1 and x != target, state.values()) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
586 |
if rebased: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
587 |
strippoint = min(rebased) |
11201
34023f2ca305
Fix up rebase's handling of strip backups
Matt Mackall <mpm@selenic.com>
parents:
11189
diff
changeset
|
588 |
# no backup of rebased cset versions needed |
34023f2ca305
Fix up rebase's handling of strip backups
Matt Mackall <mpm@selenic.com>
parents:
11189
diff
changeset
|
589 |
repair.strip(repo.ui, repo, repo[strippoint].node()) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
590 |
clearstatus(repo) |
12861
1c57a66bf985
rebase: abort message should appear even with --quiet
timeless <timeless@gmail.com>
parents:
12744
diff
changeset
|
591 |
repo.ui.warn(_('rebase aborted\n')) |
11205 | 592 |
return 0 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
593 |
|
16696
d1afbf03e69a
rebase: allow collapsing branches in place (issue3111)
Patrick Mezard <patrick@mezard.eu>
parents:
16566
diff
changeset
|
594 |
def buildstate(repo, dest, rebaseset, detach, 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
|
595 |
'''Define which revisions are going to be rebased and where |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
596 |
|
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
|
597 |
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
|
598 |
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
|
599 |
rebaseset: set of rev |
3bfdfefea2fc
rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15219
diff
changeset
|
600 |
detach: boolean''' |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
601 |
|
10672
c2e1e637d4da
rebase: always check if rebasing onto an applied mq patch.
Greg Ward <greg-hg@gerg.ca>
parents:
10659
diff
changeset
|
602 |
# 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
|
603 |
# 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
|
604 |
# 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
|
605 |
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
|
606 |
[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
|
607 |
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
|
608 |
|
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
|
609 |
detachset = set() |
3bfdfefea2fc
rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15219
diff
changeset
|
610 |
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
|
611 |
if not roots: |
15270
6cb6064f1d50
rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15269
diff
changeset
|
612 |
raise util.Abort(_('no matching revisions')) |
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
|
613 |
if len(roots) > 1: |
15270
6cb6064f1d50
rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15269
diff
changeset
|
614 |
raise util.Abort(_("can't rebase multiple roots")) |
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
|
615 |
root = roots[0] |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
616 |
|
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
|
617 |
commonbase = root.ancestor(dest) |
3bfdfefea2fc
rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15219
diff
changeset
|
618 |
if commonbase == root: |
3bfdfefea2fc
rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15219
diff
changeset
|
619 |
raise util.Abort(_('source is ancestor of destination')) |
3bfdfefea2fc
rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15219
diff
changeset
|
620 |
if commonbase == dest: |
3bfdfefea2fc
rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15219
diff
changeset
|
621 |
samebranch = root.branch() == dest.branch() |
16696
d1afbf03e69a
rebase: allow collapsing branches in place (issue3111)
Patrick Mezard <patrick@mezard.eu>
parents:
16566
diff
changeset
|
622 |
if not collapse and samebranch and root in dest.children(): |
d1afbf03e69a
rebase: allow collapsing branches in place (issue3111)
Patrick Mezard <patrick@mezard.eu>
parents:
16566
diff
changeset
|
623 |
repo.ui.debug('source is a child of destination\n') |
d1afbf03e69a
rebase: allow collapsing branches in place (issue3111)
Patrick Mezard <patrick@mezard.eu>
parents:
16566
diff
changeset
|
624 |
return None |
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
|
625 |
# rebase on ancestor, force detach |
3bfdfefea2fc
rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15219
diff
changeset
|
626 |
detach = True |
3bfdfefea2fc
rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15219
diff
changeset
|
627 |
if detach: |
15404
c1eb8398fe82
localrepo: convert various repo.set() users to repo.revs()
Matt Mackall <mpm@selenic.com>
parents:
15289
diff
changeset
|
628 |
detachset = repo.revs('::%d - ::%d - %d', root, commonbase, root) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
629 |
|
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
|
630 |
repo.ui.debug('rebase onto %d starting from %d\n' % (dest, root)) |
3bfdfefea2fc
rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15219
diff
changeset
|
631 |
state = dict.fromkeys(rebaseset, nullrev) |
10352
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
632 |
state.update(dict.fromkeys(detachset, nullmerge)) |
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
|
633 |
return repo['.'].rev(), dest.rev(), state |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
634 |
|
7216
292fb2ad2846
extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents:
7213
diff
changeset
|
635 |
def pullrebase(orig, ui, repo, *args, **opts): |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
636 |
'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
|
637 |
if opts.get('rebase'): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
638 |
if opts.get('update'): |
8242
aee8455ee8ec
Fix typeerror when specifying both --rebase and --pull
Martijn Pieters <mj@zopatista.com>
parents:
7786
diff
changeset
|
639 |
del opts['update'] |
9467
4c041f1ee1b4
do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents:
9301
diff
changeset
|
640 |
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
|
641 |
'the update flag\n') |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
642 |
|
16228
5b41d5ad52bf
rebase: move bookmarks as needed with pull --rebase (issue3285)
Matt Mackall <mpm@selenic.com>
parents:
15945
diff
changeset
|
643 |
movemarkfrom = repo['.'].node() |
14289
d68ddccf276b
cmdutil: bail_if_changed to bailifchanged
Matt Mackall <mpm@selenic.com>
parents:
13895
diff
changeset
|
644 |
cmdutil.bailifchanged(repo) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
645 |
revsprepull = len(repo) |
10628
6227c8d669d5
rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents:
10436
diff
changeset
|
646 |
origpostincoming = commands.postincoming |
6227c8d669d5
rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents:
10436
diff
changeset
|
647 |
def _dummy(*args, **kwargs): |
6227c8d669d5
rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents:
10436
diff
changeset
|
648 |
pass |
6227c8d669d5
rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents:
10436
diff
changeset
|
649 |
commands.postincoming = _dummy |
6227c8d669d5
rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents:
10436
diff
changeset
|
650 |
try: |
6227c8d669d5
rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents:
10436
diff
changeset
|
651 |
orig(ui, repo, *args, **opts) |
6227c8d669d5
rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents:
10436
diff
changeset
|
652 |
finally: |
6227c8d669d5
rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents:
10436
diff
changeset
|
653 |
commands.postincoming = origpostincoming |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
654 |
revspostpull = len(repo) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
655 |
if revspostpull > revsprepull: |
7216
292fb2ad2846
extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents:
7213
diff
changeset
|
656 |
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
|
657 |
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
|
658 |
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
|
659 |
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
|
660 |
# 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
|
661 |
hg.update(repo, dest) |
16228
5b41d5ad52bf
rebase: move bookmarks as needed with pull --rebase (issue3285)
Matt Mackall <mpm@selenic.com>
parents:
15945
diff
changeset
|
662 |
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
|
663 |
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
|
664 |
% repo._bookmarkcurrent) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
665 |
else: |
14444
1f997134a9d1
rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents:
14306
diff
changeset
|
666 |
if opts.get('tool'): |
1f997134a9d1
rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents:
14306
diff
changeset
|
667 |
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
|
668 |
orig(ui, repo, *args, **opts) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
669 |
|
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
670 |
def uisetup(ui): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
671 |
'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
|
672 |
entry = extensions.wrapcommand(commands.table, 'pull', pullrebase) |
292fb2ad2846
extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents:
7213
diff
changeset
|
673 |
entry[1].append(('', 'rebase', None, |
14444
1f997134a9d1
rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents:
14306
diff
changeset
|
674 |
_("rebase working directory to branch head"))) |
1f997134a9d1
rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents:
14306
diff
changeset
|
675 |
entry[1].append(('t', 'tool', '', |
1f997134a9d1
rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents:
14306
diff
changeset
|
676 |
_("specify merge tool for rebase"))) |