Mercurial > public > mercurial-scm > hg
annotate hgext/rebase.py @ 13733:4e2690a764c1
rebase: allow for rebasing descendants onto ancestors on different named branches
So far we've been denying rebasing descendants onto ancestors, but there are
situations in which this kind of operation makes perfect sense to me.
Let's say we have made a commit (or more), that belongs to branch 'dev', on
top of the named branch 'stable':
... a (stable) - b (dev)
but then we realize that b should belong to branch 'stable'.
In these cases a rebase means: "move these csets from named branch A to named
branch B" and there isn't a valid reason to deny it.
This patch basically doesn't block it, if source and destination are
on different named branches.
The old behaviour still applies for rebases across the same named branch.
Can you think of any tricky corner cases in which this new behaviour could
lead to problems? (I bet there are tons of them...)
By the way, I created a brand new .t because I feel there should be more
tests I can't think of at the moment.
author | Stefano Tortarolo <stefano.tortarolo@gmail.com> |
---|---|
date | Wed, 23 Mar 2011 01:14:43 +0100 |
parents | ee349e228835 |
children | 627e50e9e316 |
rev | line source |
---|---|
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1 # rebase.py - rebasing feature for mercurial |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
2 # |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
3 # Copyright 2008 Stefano Tortarolo <stefano.tortarolo at gmail dot com> |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
4 # |
8225
46293a0c7e9f
updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents:
8222
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
10263 | 6 # GNU General Public License version 2 or any later version. |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
7 |
8934
9dda4c73fc3b
extensions: change descriptions for extensions providing a few commands
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8706
diff
changeset
|
8 '''command to move sets of revisions to a different ancestor |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
9 |
7999
b25110140573
rebase: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents:
7955
diff
changeset
|
10 This extension lets you rebase changesets in an existing Mercurial |
b25110140573
rebase: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents:
7955
diff
changeset
|
11 repository. |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
12 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
13 For more information: |
9301
ad4501d20214
rebase: link to RebaseExtension
Martin Geisler <mg@lazybytes.net>
parents:
9271
diff
changeset
|
14 http://mercurial.selenic.com/wiki/RebaseExtension |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
15 ''' |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
16 |
12062
c327bfa5e831
cleanup: remove unused imports
Brodie Rao <brodie@bitheap.org>
parents:
11876
diff
changeset
|
17 from mercurial import hg, util, repair, merge, cmdutil, commands |
7955
c3d4ff03ec72
rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7954
diff
changeset
|
18 from mercurial import extensions, ancestor, copies, patch |
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 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
27 def rebase(ui, repo, **opts): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
28 """move changeset (and descendants) to a different branch |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
29 |
7999
b25110140573
rebase: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents:
7955
diff
changeset
|
30 Rebase uses repeated merging to graft changesets from one part of |
10646 | 31 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
|
32 useful for linearizing *local* changes relative to a master |
10646 | 33 development tree. |
34 | |
11188
b5c0f6a11430
rebase: stress that only local changesets should be rebased
Martin Geisler <mg@lazybytes.net>
parents:
10762
diff
changeset
|
35 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
|
36 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
|
37 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
|
38 pulling in your rebased changesets. |
b5c0f6a11430
rebase: stress that only local changesets should be rebased
Martin Geisler <mg@lazybytes.net>
parents:
10762
diff
changeset
|
39 |
10646 | 40 If you don't specify a destination changeset (``-d/--dest``), |
41 rebase uses the tipmost head of the current named branch as the | |
42 destination. (The destination changeset is not modified by | |
43 rebasing, but new changesets are added as its descendants.) | |
44 | |
45 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
|
46 "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
|
47 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
|
48 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
|
49 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
|
50 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
|
51 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
|
52 ``-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
|
53 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
|
54 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
|
55 uses the parent of the working directory as the base. |
10646 | 56 |
57 By default, rebase recreates the changesets in the source branch | |
58 as descendants of dest and then destroys the originals. Use | |
59 ``--keep`` to preserve the original source changesets. Some | |
60 changesets in the source branch (e.g. merges from the destination | |
61 branch) may be dropped if they no longer contribute any change. | |
62 | |
63 One result of the rules for selecting the destination changeset | |
64 and source branch is that, unlike ``merge``, rebase will do | |
65 nothing if you are at the latest (tipmost) head of a named branch | |
66 with two heads. You need to explicitly specify source and/or | |
67 destination (or ``update`` to the other head, if it's the head of | |
68 the intended source branch). | |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
69 |
7999
b25110140573
rebase: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents:
7955
diff
changeset
|
70 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
|
71 continued with --continue/-c or aborted with --abort/-a. |
11205 | 72 |
73 Returns 0 on success, 1 if nothing to rebase. | |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
74 """ |
7280
810ca383da9c
remove unused variables
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7216
diff
changeset
|
75 originalwd = target = None |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
76 external = nullrev |
8454
6d4bf1c1a003
rebase: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8270
diff
changeset
|
77 state = {} |
6d4bf1c1a003
rebase: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8270
diff
changeset
|
78 skipped = set() |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
79 targetancestors = set() |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
80 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
81 lock = wlock = None |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
82 try: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
83 lock = repo.lock() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
84 wlock = repo.wlock() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
85 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
86 # Validate input and define rebasing points |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
87 destf = opts.get('dest', None) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
88 srcf = opts.get('source', None) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
89 basef = opts.get('base', None) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
90 contf = opts.get('continue') |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
91 abortf = opts.get('abort') |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
92 collapsef = opts.get('collapse', False) |
13661
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
93 collapsemsg = cmdutil.logmessage(opts) |
13609
e035356dbfdc
rebase: don't use util.Abort for an internal error
Martin Geisler <mg@lazybytes.net>
parents:
13235
diff
changeset
|
94 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
|
95 keepf = opts.get('keep', False) |
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
96 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
|
97 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
|
98 # 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
|
99 # other extensions |
f2558a8228be
rebase: add option to not commit after a collapsing
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10676
diff
changeset
|
100 keepopen = opts.get('keepopen', False) |
7468
3e5db4228f8f
rebase: add support to keep branch names
Augie Fackler <durin42@gmail.com>
parents:
7298
diff
changeset
|
101 |
13661
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
102 if collapsemsg and not collapsef: |
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
103 raise util.Abort( |
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
104 _('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
|
105 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
106 if contf or abortf: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
107 if contf and abortf: |
11285
f118029e534c
rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents:
11205
diff
changeset
|
108 raise util.Abort(_('cannot use both abort and continue')) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
109 if collapsef: |
11285
f118029e534c
rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents:
11205
diff
changeset
|
110 raise util.Abort( |
f118029e534c
rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents:
11205
diff
changeset
|
111 _('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
|
112 if detachf: |
11285
f118029e534c
rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents:
11205
diff
changeset
|
113 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
|
114 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
|
115 raise util.Abort( |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
116 _('abort and continue do not allow specifying revisions')) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
117 |
11843
00f8e7837668
rebase: recompute the set of skipped rev when using --continue (issue2330)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11546
diff
changeset
|
118 (originalwd, target, state, skipped, collapsef, keepf, |
7952
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
119 keepbranchesf, external) = restorestatus(repo) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
120 if abortf: |
11205 | 121 return abort(repo, originalwd, target, state) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
122 else: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
123 if srcf and basef: |
11285
f118029e534c
rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents:
11205
diff
changeset
|
124 raise util.Abort(_('cannot specify both a ' |
f118029e534c
rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents:
11205
diff
changeset
|
125 'revision and a base')) |
10352
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
126 if detachf: |
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
127 if not srcf: |
11285
f118029e534c
rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents:
11205
diff
changeset
|
128 raise util.Abort( |
f118029e534c
rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents:
11205
diff
changeset
|
129 _('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
|
130 if basef: |
11285
f118029e534c
rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents:
11205
diff
changeset
|
131 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
|
132 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
133 cmdutil.bail_if_changed(repo) |
10352
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
134 result = buildstate(repo, destf, srcf, basef, detachf) |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
135 if not result: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
136 # 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
|
137 ui.status(_('nothing to rebase\n')) |
11205 | 138 return 1 |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
139 else: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
140 originalwd, target, state = result |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
141 if collapsef: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
142 targetancestors = set(repo.changelog.ancestors(target)) |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
143 external = checkexternal(repo, state, targetancestors) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
144 |
7952
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
145 if keepbranchesf: |
13609
e035356dbfdc
rebase: don't use util.Abort for an internal error
Martin Geisler <mg@lazybytes.net>
parents:
13235
diff
changeset
|
146 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
|
147 def extrafn(ctx, extra): |
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
148 extra['branch'] = ctx.branch() |
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
149 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
150 # Rebase |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
151 if not targetancestors: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
152 targetancestors = set(repo.changelog.ancestors(target)) |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
153 targetancestors.add(target) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
154 |
11729
c91b86a291b0
rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents:
11546
diff
changeset
|
155 sortedstate = sorted(state) |
c91b86a291b0
rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents:
11546
diff
changeset
|
156 total = len(sortedstate) |
c91b86a291b0
rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents:
11546
diff
changeset
|
157 pos = 0 |
c91b86a291b0
rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents:
11546
diff
changeset
|
158 for rev in sortedstate: |
c91b86a291b0
rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents:
11546
diff
changeset
|
159 pos += 1 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
160 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
|
161 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
|
162 _('changesets'), total) |
7952
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
163 storestatus(repo, originalwd, target, state, collapsef, keepf, |
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
164 keepbranchesf, external) |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
165 p1, p2 = defineparents(repo, rev, target, state, |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
166 targetancestors) |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
167 if len(repo.parents()) == 2: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
168 repo.ui.debug('resuming interrupted rebase\n') |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
169 else: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
170 stats = rebasenode(repo, rev, p1, p2, state) |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
171 if stats and stats[3] > 0: |
12896
b19b4c1df066
rebase: improve resolve failure message
Steve Borho <steve@borho.org>
parents:
12861
diff
changeset
|
172 raise util.Abort(_('unresolved conflicts (see hg ' |
b19b4c1df066
rebase: improve resolve failure message
Steve Borho <steve@borho.org>
parents:
12861
diff
changeset
|
173 'resolve, then hg rebase --continue)')) |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
174 updatedirstate(repo, rev, target, p2) |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
175 if not collapsef: |
10762
129e96f7a87a
rebase: fix --collapse with --keepbranches (issue2100)
Patrick Mezard <pmezard@gmail.com>
parents:
10672
diff
changeset
|
176 newrev = concludenode(repo, rev, p1, p2, extrafn=extrafn) |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
177 else: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
178 # Skip commit if we are collapsing |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
179 repo.dirstate.setparents(repo[p1].node()) |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
180 newrev = None |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
181 # Update the state |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
182 if newrev is not None: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
183 state[rev] = repo[newrev].rev() |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
184 else: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
185 if not collapsef: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
186 ui.note(_('no changes, revision %d skipped\n') % rev) |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
187 ui.debug('next revision set to %s\n' % p1) |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
188 skipped.add(rev) |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
189 state[rev] = p1 |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
190 |
11729
c91b86a291b0
rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents:
11546
diff
changeset
|
191 ui.progress(_('rebasing'), None) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
192 ui.note(_('rebase merging completed\n')) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
193 |
10677
f2558a8228be
rebase: add option to not commit after a collapsing
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10676
diff
changeset
|
194 if collapsef and not keepopen: |
6923
ebf1462f2145
strip trailing whitespace, replace tabs by spaces
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6906
diff
changeset
|
195 p1, p2 = defineparents(repo, min(state), target, |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
196 state, targetancestors) |
13661
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
197 if collapsemsg: |
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
198 commitmsg = collapsemsg |
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
199 else: |
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
200 commitmsg = 'Collapsed revision' |
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
201 for rebased in state: |
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
202 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
|
203 commitmsg += '\n* %s' % repo[rebased].description() |
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
204 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
|
205 newrev = concludenode(repo, rev, p1, external, commitmsg=commitmsg, |
10762
129e96f7a87a
rebase: fix --collapse with --keepbranches (issue2100)
Patrick Mezard <pmezard@gmail.com>
parents:
10672
diff
changeset
|
206 extrafn=extrafn) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
207 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
208 if 'qtip' in repo.tags(): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
209 updatemq(repo, state, skipped, **opts) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
210 |
7952
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
211 if not keepf: |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
212 # 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
|
213 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
|
214 if rebased: |
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
215 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
|
216 ui.warn(_("warning: new changesets detected " |
6cebf27287de
rebase: split line longer than 80 chars
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10413
diff
changeset
|
217 "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
|
218 else: |
11201
34023f2ca305
Fix up rebase's handling of strip backups
Matt Mackall <mpm@selenic.com>
parents:
11189
diff
changeset
|
219 # backup the old csets by default |
34023f2ca305
Fix up rebase's handling of strip backups
Matt Mackall <mpm@selenic.com>
parents:
11189
diff
changeset
|
220 repair.strip(ui, repo, repo[min(rebased)].node(), "all") |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
221 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
222 clearstatus(repo) |
11203
7a9cf012dddc
rebase: only show "rebase completed" message with -v
Matt Mackall <mpm@selenic.com>
parents:
11201
diff
changeset
|
223 ui.note(_("rebase completed\n")) |
7130
204c7850c158
rebase: disable rollback after rebasing
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7127
diff
changeset
|
224 if os.path.exists(repo.sjoin('undo')): |
13235
6bf39d88c857
rename util.unlink to unlinkpath
Adrian Buehlmann <adrian@cadifra.com>
parents:
13021
diff
changeset
|
225 util.unlinkpath(repo.sjoin('undo')) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
226 if skipped: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
227 ui.note(_("%d revisions have been skipped\n") % len(skipped)) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
228 finally: |
8112
6ee71f78497c
switch lock releasing in the extensions from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
8076
diff
changeset
|
229 release(lock, wlock) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
230 |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
231 def rebasemerge(repo, rev, first=False): |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
232 'return the correct ancestor' |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
233 oldancestor = ancestor.ancestor |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
234 |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
235 def newancestor(a, b, pfunc): |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
236 if b == rev: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
237 return repo[rev].parents()[0].rev() |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
238 return oldancestor(a, b, pfunc) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
239 |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
240 if not first: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
241 ancestor.ancestor = newancestor |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
242 else: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
243 repo.ui.debug("first revision, do not change ancestor\n") |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
244 try: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
245 stats = merge.update(repo, rev, True, True, False) |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
246 return stats |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
247 finally: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
248 ancestor.ancestor = oldancestor |
8454
6d4bf1c1a003
rebase: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8270
diff
changeset
|
249 |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
250 def checkexternal(repo, state, targetancestors): |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
251 """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
|
252 consideration. In the latter case, abort. |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
253 """ |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
254 external = nullrev |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
255 source = min(state) |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
256 for rev in state: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
257 if rev == source: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
258 continue |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
259 # Check externals and fail if there are more than one |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
260 for p in repo[rev].parents(): |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
261 if (p.rev() not in state |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
262 and p.rev() not in targetancestors): |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
263 if external != nullrev: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
264 raise util.Abort(_('unable to collapse, there is more ' |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
265 'than one external parent')) |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
266 external = p.rev() |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
267 return external |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
268 |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
269 def updatedirstate(repo, rev, p1, p2): |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
270 """Keep track of renamed files in the revision that is going to be rebased |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
271 """ |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
272 # Here we simulate the copies and renames in the source changeset |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
273 cop, diver = copies.copies(repo, repo[rev], repo[p1], repo[p2], True) |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
274 m1 = repo[rev].manifest() |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
275 m2 = repo[p1].manifest() |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
276 for k, v in cop.iteritems(): |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
277 if k in m1: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
278 if v in m1 or v in m2: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
279 repo.dirstate.copy(v, k) |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
280 if v in m2 and v not in m1: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
281 repo.dirstate.remove(v) |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
282 |
10762
129e96f7a87a
rebase: fix --collapse with --keepbranches (issue2100)
Patrick Mezard <pmezard@gmail.com>
parents:
10672
diff
changeset
|
283 def concludenode(repo, rev, p1, p2, commitmsg=None, extrafn=None): |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
284 'Commit the changes and store useful information in extra' |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
285 try: |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
286 repo.dirstate.setparents(repo[p1].node(), repo[p2].node()) |
11537
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
287 ctx = repo[rev] |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
288 if commitmsg is None: |
11537
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
289 commitmsg = ctx.description() |
10762
129e96f7a87a
rebase: fix --collapse with --keepbranches (issue2100)
Patrick Mezard <pmezard@gmail.com>
parents:
10672
diff
changeset
|
290 extra = {'rebase_source': ctx.hex()} |
129e96f7a87a
rebase: fix --collapse with --keepbranches (issue2100)
Patrick Mezard <pmezard@gmail.com>
parents:
10672
diff
changeset
|
291 if extrafn: |
129e96f7a87a
rebase: fix --collapse with --keepbranches (issue2100)
Patrick Mezard <pmezard@gmail.com>
parents:
10672
diff
changeset
|
292 extrafn(ctx, extra) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
293 # Commit might fail if unresolved files exist |
10762
129e96f7a87a
rebase: fix --collapse with --keepbranches (issue2100)
Patrick Mezard <pmezard@gmail.com>
parents:
10672
diff
changeset
|
294 newrev = repo.commit(text=commitmsg, user=ctx.user(), |
129e96f7a87a
rebase: fix --collapse with --keepbranches (issue2100)
Patrick Mezard <pmezard@gmail.com>
parents:
10672
diff
changeset
|
295 date=ctx.date(), extra=extra) |
8266
609ce91670d0
rebase: fix bug where --keepbranches could leave wrong branch in dirstate
Patrick Mezard <pmezard@gmail.com>
parents:
8242
diff
changeset
|
296 repo.dirstate.setbranch(repo[newrev].branch()) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
297 return newrev |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
298 except util.Abort: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
299 # Invalidate the previous setparents |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
300 repo.dirstate.invalidate() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
301 raise |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
302 |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
303 def rebasenode(repo, rev, p1, p2, state): |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
304 'Rebase a single revision' |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
305 # Merge phase |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
306 # Update to target and merge it with local |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
307 if repo['.'].rev() != repo[p1].rev(): |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
308 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
|
309 merge.update(repo, p1, False, True, False) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
310 else: |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
311 repo.ui.debug(" already in target\n") |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
312 repo.dirstate.write() |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
313 repo.ui.debug(" merge against %d:%s\n" % (repo[rev].rev(), repo[rev])) |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
314 first = repo[rev].rev() == repo[min(state)].rev() |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
315 stats = rebasemerge(repo, rev, first) |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
316 return stats |
6923
ebf1462f2145
strip trailing whitespace, replace tabs by spaces
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6906
diff
changeset
|
317 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
318 def defineparents(repo, rev, target, state, targetancestors): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
319 '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
|
320 parents = repo[rev].parents() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
321 p1 = p2 = nullrev |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
322 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
323 P1n = parents[0].rev() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
324 if P1n in targetancestors: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
325 p1 = target |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
326 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
|
327 if state[P1n] == nullmerge: |
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
328 p1 = target |
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
329 else: |
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
330 p1 = state[P1n] |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
331 else: # P1n external |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
332 p1 = target |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
333 p2 = P1n |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
334 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
335 if len(parents) == 2 and parents[1].rev() not in targetancestors: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
336 P2n = parents[1].rev() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
337 # interesting second parent |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
338 if P2n in state: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
339 if p1 == target: # P1n in targetancestors or external |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
340 p1 = state[P2n] |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
341 else: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
342 p2 = state[P2n] |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
343 else: # P2n external |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
344 if p2 != nullrev: # P1n external too => rev is a merged revision |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
345 raise util.Abort(_('cannot use revision %d as base, result ' |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
346 'would have 3 parents') % rev) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
347 p2 = P2n |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
348 repo.ui.debug(" future parents are %d and %d\n" % |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
349 (repo[p1].rev(), repo[p2].rev())) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
350 return p1, p2 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
351 |
7955
c3d4ff03ec72
rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7954
diff
changeset
|
352 def isagitpatch(repo, patchname): |
c3d4ff03ec72
rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7954
diff
changeset
|
353 '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
|
354 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
|
355 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
|
356 if line.startswith('diff --git'): |
c3d4ff03ec72
rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7954
diff
changeset
|
357 return True |
c3d4ff03ec72
rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7954
diff
changeset
|
358 return False |
c3d4ff03ec72
rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7954
diff
changeset
|
359 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
360 def updatemq(repo, state, skipped, **opts): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
361 'Update rebased mq patches - finalize and then import them' |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
362 mqrebase = {} |
11537
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
363 mq = repo.mq |
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
364 for p in mq.applied: |
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
365 rev = repo[p.node].rev() |
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
366 if rev in state: |
9467
4c041f1ee1b4
do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents:
9301
diff
changeset
|
367 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
|
368 (rev, p.name)) |
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
369 mqrebase[rev] = (p.name, isagitpatch(repo, p.name)) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
370 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
371 if mqrebase: |
11537
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
372 mq.finish(repo, mqrebase.keys()) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
373 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
374 # 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
|
375 for rev in sorted(mqrebase, reverse=True): |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
376 if rev not in skipped: |
11537
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
377 name, isgit = mqrebase[rev] |
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
378 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
|
379 mq.qimport(repo, (), patchname=name, git=isgit, |
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
380 rev=[str(state[rev])]) |
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
381 mq.save_dirty() |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
382 |
7952
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
383 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
|
384 external): |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
385 'Store the current status to allow recovery' |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
386 f = repo.opener("rebasestate", "w") |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
387 f.write(repo[originalwd].hex() + '\n') |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
388 f.write(repo[target].hex() + '\n') |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
389 f.write(repo[external].hex() + '\n') |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
390 f.write('%d\n' % int(collapse)) |
7952
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
391 f.write('%d\n' % int(keep)) |
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
392 f.write('%d\n' % int(keepbranches)) |
7622
4dd7b28003d2
use dict.iteritems() rather than dict.items()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7599
diff
changeset
|
393 for d, v in state.iteritems(): |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
394 oldrev = repo[d].hex() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
395 newrev = repo[v].hex() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
396 f.write("%s:%s\n" % (oldrev, newrev)) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
397 f.close() |
9467
4c041f1ee1b4
do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents:
9301
diff
changeset
|
398 repo.ui.debug('rebase status stored\n') |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
399 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
400 def clearstatus(repo): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
401 'Remove the status files' |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
402 if os.path.exists(repo.join("rebasestate")): |
13235
6bf39d88c857
rename util.unlink to unlinkpath
Adrian Buehlmann <adrian@cadifra.com>
parents:
13021
diff
changeset
|
403 util.unlinkpath(repo.join("rebasestate")) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
404 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
405 def restorestatus(repo): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
406 'Restore a previously stored status' |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
407 try: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
408 target = None |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
409 collapse = False |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
410 external = nullrev |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
411 state = {} |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
412 f = repo.opener("rebasestate") |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
413 for i, l in enumerate(f.read().splitlines()): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
414 if i == 0: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
415 originalwd = repo[l].rev() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
416 elif i == 1: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
417 target = repo[l].rev() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
418 elif i == 2: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
419 external = repo[l].rev() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
420 elif i == 3: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
421 collapse = bool(int(l)) |
7952
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
422 elif i == 4: |
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
423 keep = bool(int(l)) |
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
424 elif i == 5: |
b214066b7e1d
rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7951
diff
changeset
|
425 keepbranches = bool(int(l)) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
426 else: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
427 oldrev, newrev = l.split(':') |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
428 state[repo[oldrev].rev()] = repo[newrev].rev() |
11843
00f8e7837668
rebase: recompute the set of skipped rev when using --continue (issue2330)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11546
diff
changeset
|
429 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
|
430 # 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
|
431 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
|
432 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
|
433 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
|
434 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
|
435 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
|
436 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
|
437 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
|
438 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
|
439 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
|
440 collapse, keep, keepbranches, external) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
441 except IOError, err: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
442 if err.errno != errno.ENOENT: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
443 raise |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
444 raise util.Abort(_('no rebase in progress')) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
445 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
446 def abort(repo, originalwd, target, state): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
447 'Restore the repository to its original state' |
8150
bbc24c0753a0
util: use built-in set and frozenset
Martin Geisler <mg@lazybytes.net>
parents:
8117
diff
changeset
|
448 if set(repo.changelog.descendants(target)) - set(state.values()): |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
449 repo.ui.warn(_("warning: new changesets detected on target branch, " |
11204
54e93b86a9e3
rebase: improve --abort failure message
Matt Mackall <mpm@selenic.com>
parents:
11203
diff
changeset
|
450 "can't abort\n")) |
11205 | 451 return -1 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
452 else: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
453 # Strip from the first rebased revision |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
454 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
|
455 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
|
456 if rebased: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
457 strippoint = min(rebased) |
11201
34023f2ca305
Fix up rebase's handling of strip backups
Matt Mackall <mpm@selenic.com>
parents:
11189
diff
changeset
|
458 # 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
|
459 repair.strip(repo.ui, repo, repo[strippoint].node()) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
460 clearstatus(repo) |
12861
1c57a66bf985
rebase: abort message should appear even with --quiet
timeless <timeless@gmail.com>
parents:
12744
diff
changeset
|
461 repo.ui.warn(_('rebase aborted\n')) |
11205 | 462 return 0 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
463 |
10352
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
464 def buildstate(repo, dest, src, base, detach): |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
465 'Define which revisions are going to be rebased and where' |
8150
bbc24c0753a0
util: use built-in set and frozenset
Martin Geisler <mg@lazybytes.net>
parents:
8117
diff
changeset
|
466 targetancestors = set() |
10352
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
467 detachset = set() |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
468 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
469 if not dest: |
7877
eba7f12b0c51
cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7875
diff
changeset
|
470 # Destination defaults to the latest revision in the current branch |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
471 branch = repo[None].branch() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
472 dest = repo[branch].rev() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
473 else: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
474 dest = repo[dest].rev() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
475 |
10672
c2e1e637d4da
rebase: always check if rebasing onto an applied mq patch.
Greg Ward <greg-hg@gerg.ca>
parents:
10659
diff
changeset
|
476 # 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
|
477 # 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
|
478 # a partially completed rebase is blocked by mq. |
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
|
479 if 'qtip' in repo.tags() and (repo[dest].node() in |
da2a0c9c895d
mq: avoid many hex/bin conversions, keep the binary node when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10677
diff
changeset
|
480 [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
|
481 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
|
482 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
483 if src: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
484 commonbase = repo[src].ancestor(repo[dest]) |
13733
4e2690a764c1
rebase: allow for rebasing descendants onto ancestors on different named branches
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
13661
diff
changeset
|
485 samebranch = repo[src].branch() == repo[dest].branch() |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
486 if commonbase == repo[src]: |
9577
b91960aed018
rebase: improve error and debug messages
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
487 raise util.Abort(_('source is ancestor of destination')) |
13733
4e2690a764c1
rebase: allow for rebasing descendants onto ancestors on different named branches
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
13661
diff
changeset
|
488 if samebranch and commonbase == repo[dest]: |
9577
b91960aed018
rebase: improve error and debug messages
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
489 raise util.Abort(_('source is descendant of destination')) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
490 source = repo[src].rev() |
10352
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
491 if detach: |
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
492 # We need to keep track of source's ancestors up to the common base |
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
493 srcancestors = set(repo.changelog.ancestors(source)) |
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
494 baseancestors = set(repo.changelog.ancestors(commonbase.rev())) |
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
495 detachset = srcancestors - baseancestors |
13021
6c800e7ef2f6
rebase: support --detach when null is common ancestor
Henrik Stuart <hg@hstuart.dk>
parents:
12896
diff
changeset
|
496 detachset.discard(commonbase.rev()) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
497 else: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
498 if base: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
499 cwd = repo[base].rev() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
500 else: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
501 cwd = repo['.'].rev() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
502 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
503 if cwd == dest: |
9577
b91960aed018
rebase: improve error and debug messages
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
504 repo.ui.debug('source and destination are the same\n') |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
505 return None |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
506 |
8150
bbc24c0753a0
util: use built-in set and frozenset
Martin Geisler <mg@lazybytes.net>
parents:
8117
diff
changeset
|
507 targetancestors = set(repo.changelog.ancestors(dest)) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
508 if cwd in targetancestors: |
9577
b91960aed018
rebase: improve error and debug messages
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
509 repo.ui.debug('source is ancestor of destination\n') |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
510 return None |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
511 |
8150
bbc24c0753a0
util: use built-in set and frozenset
Martin Geisler <mg@lazybytes.net>
parents:
8117
diff
changeset
|
512 cwdancestors = set(repo.changelog.ancestors(cwd)) |
9578
341182ac95e4
rebase: return early when source is descendant of destination
Sune Foldager <cryo@cyanite.org>
parents:
9577
diff
changeset
|
513 if dest in cwdancestors: |
341182ac95e4
rebase: return early when source is descendant of destination
Sune Foldager <cryo@cyanite.org>
parents:
9577
diff
changeset
|
514 repo.ui.debug('source is descendant of destination\n') |
341182ac95e4
rebase: return early when source is descendant of destination
Sune Foldager <cryo@cyanite.org>
parents:
9577
diff
changeset
|
515 return None |
341182ac95e4
rebase: return early when source is descendant of destination
Sune Foldager <cryo@cyanite.org>
parents:
9577
diff
changeset
|
516 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
517 cwdancestors.add(cwd) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
518 rebasingbranch = cwdancestors - targetancestors |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
519 source = min(rebasingbranch) |
6923
ebf1462f2145
strip trailing whitespace, replace tabs by spaces
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6906
diff
changeset
|
520 |
9467
4c041f1ee1b4
do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents:
9301
diff
changeset
|
521 repo.ui.debug('rebase onto %d starting from %d\n' % (dest, source)) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
522 state = dict.fromkeys(repo.changelog.descendants(source), nullrev) |
10352
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
523 state.update(dict.fromkeys(detachset, nullmerge)) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
524 state[source] = nullrev |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
525 return repo['.'].rev(), repo[dest].rev(), state |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
526 |
7216
292fb2ad2846
extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents:
7213
diff
changeset
|
527 def pullrebase(orig, ui, repo, *args, **opts): |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
528 '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
|
529 if opts.get('rebase'): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
530 if opts.get('update'): |
8242
aee8455ee8ec
Fix typeerror when specifying both --rebase and --pull
Martijn Pieters <mj@zopatista.com>
parents:
7786
diff
changeset
|
531 del opts['update'] |
9467
4c041f1ee1b4
do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents:
9301
diff
changeset
|
532 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
|
533 'the update flag\n') |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
534 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
535 cmdutil.bail_if_changed(repo) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
536 revsprepull = len(repo) |
10628
6227c8d669d5
rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents:
10436
diff
changeset
|
537 origpostincoming = commands.postincoming |
6227c8d669d5
rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents:
10436
diff
changeset
|
538 def _dummy(*args, **kwargs): |
6227c8d669d5
rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents:
10436
diff
changeset
|
539 pass |
6227c8d669d5
rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents:
10436
diff
changeset
|
540 commands.postincoming = _dummy |
6227c8d669d5
rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents:
10436
diff
changeset
|
541 try: |
6227c8d669d5
rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents:
10436
diff
changeset
|
542 orig(ui, repo, *args, **opts) |
6227c8d669d5
rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents:
10436
diff
changeset
|
543 finally: |
6227c8d669d5
rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents:
10436
diff
changeset
|
544 commands.postincoming = origpostincoming |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
545 revspostpull = len(repo) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
546 if revspostpull > revsprepull: |
7216
292fb2ad2846
extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents:
7213
diff
changeset
|
547 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
|
548 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
|
549 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
|
550 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
|
551 # 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
|
552 hg.update(repo, dest) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
553 else: |
7216
292fb2ad2846
extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents:
7213
diff
changeset
|
554 orig(ui, repo, *args, **opts) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
555 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
556 def uisetup(ui): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
557 '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
|
558 entry = extensions.wrapcommand(commands.table, 'pull', pullrebase) |
292fb2ad2846
extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents:
7213
diff
changeset
|
559 entry[1].append(('', 'rebase', None, |
292fb2ad2846
extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents:
7213
diff
changeset
|
560 _("rebase working directory to branch head")) |
292fb2ad2846
extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents:
7213
diff
changeset
|
561 ) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
562 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
563 cmdtable = { |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
564 "rebase": |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
565 (rebase, |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
566 [ |
11321
40c06bbf58be
help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
11316
diff
changeset
|
567 ('s', 'source', '', |
40c06bbf58be
help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
11316
diff
changeset
|
568 _('rebase from the specified changeset'), _('REV')), |
40c06bbf58be
help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
11316
diff
changeset
|
569 ('b', 'base', '', |
40c06bbf58be
help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
11316
diff
changeset
|
570 _('rebase from the base of the specified changeset ' |
40c06bbf58be
help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
11316
diff
changeset
|
571 '(up to greatest common ancestor of base and dest)'), |
40c06bbf58be
help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
11316
diff
changeset
|
572 _('REV')), |
40c06bbf58be
help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
11316
diff
changeset
|
573 ('d', 'dest', '', |
40c06bbf58be
help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
11316
diff
changeset
|
574 _('rebase onto the specified changeset'), _('REV')), |
9589
fdf0c375cdbf
rebase: change rebase help to talk about changesets and branch names
timeless@mozdev.org
parents:
9183
diff
changeset
|
575 ('', 'collapse', False, _('collapse the rebased changesets')), |
13661
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
576 ('m', 'message', '', |
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
577 _('use text as collapse commit message'), _('TEXT')), |
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
578 ('l', 'logfile', '', |
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
579 _('read collapse commit message from file'), _('FILE')), |
9589
fdf0c375cdbf
rebase: change rebase help to talk about changesets and branch names
timeless@mozdev.org
parents:
9183
diff
changeset
|
580 ('', 'keep', False, _('keep original changesets')), |
fdf0c375cdbf
rebase: change rebase help to talk about changesets and branch names
timeless@mozdev.org
parents:
9183
diff
changeset
|
581 ('', 'keepbranches', False, _('keep original branch names')), |
10352
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
582 ('', 'detach', False, _('force detaching of source from its original ' |
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
583 'branch')), |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
584 ('c', 'continue', False, _('continue an interrupted rebase')), |
10413
e433002acb05
fix up a bunch of check-code warnings
Matt Mackall <mpm@selenic.com>
parents:
10352
diff
changeset
|
585 ('a', 'abort', False, _('abort an interrupted rebase'))] + |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
586 templateopts, |
10646 | 587 _('hg rebase [-s REV | -b REV] [-d REV] [options]\n' |
588 'hg rebase {-a|-c}')) | |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
589 } |