annotate hgext/rebase.py @ 12038:9617803b1acb stable

hgweb: handle exception of misconfigured path on index page If hgweb.config contains wrong path mapping, hgweb causes internal server error on repository index page. This patch changes makeindex() to ignore RepoError, because it looks to be designed to suppress configuration error.
author Yuya Nishihara <yuya@tcha.org>
date Tue, 24 Aug 2010 23:30:51 +0900
parents 00f8e7837668
children 1fe94103c6ee
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
1 # rebase.py - rebasing feature for mercurial
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
2 #
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
3 # Copyright 2008 Stefano Tortarolo <stefano.tortarolo at gmail dot com>
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
4 #
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8222
diff changeset
5 # This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9815
diff changeset
6 # GNU General Public License version 2 or any later version.
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
7
8934
9dda4c73fc3b extensions: change descriptions for extensions providing a few commands
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8706
diff changeset
8 '''command to move sets of revisions to a different ancestor
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
9
7999
b25110140573 rebase: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7955
diff changeset
10 This extension lets you rebase changesets in an existing Mercurial
b25110140573 rebase: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7955
diff changeset
11 repository.
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
12
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
13 For more information:
9301
ad4501d20214 rebase: link to RebaseExtension
Martin Geisler <mg@lazybytes.net>
parents: 9271
diff changeset
14 http://mercurial.selenic.com/wiki/RebaseExtension
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
15 '''
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
16
10628
6227c8d669d5 rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents: 10436
diff changeset
17 from mercurial import hg, util, repair, merge, cmdutil, commands, error
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
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
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
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
33 development tree.
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
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
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
40 If you don't specify a destination changeset (``-d/--dest``),
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
41 rebase uses the tipmost head of the current named branch as the
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
42 destination. (The destination changeset is not modified by
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
43 rebasing, but new changesets are added as its descendants.)
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
44
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
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
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
56
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
57 By default, rebase recreates the changesets in the source branch
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
58 as descendants of dest and then destroys the originals. Use
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
59 ``--keep`` to preserve the original source changesets. Some
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
60 changesets in the source branch (e.g. merges from the destination
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
61 branch) may be dropped if they no longer contribute any change.
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
62
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
63 One result of the rules for selecting the destination changeset
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
64 and source branch is that, unlike ``merge``, rebase will do
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
65 nothing if you are at the latest (tipmost) head of a named branch
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
66 with two heads. You need to explicitly specify source and/or
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
67 destination (or ``update`` to the other head, if it's the head of
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
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
d26f662bfbf5 rebase: add error codes
Matt Mackall <mpm@selenic.com>
parents: 11204
diff changeset
72
d26f662bfbf5 rebase: add error codes
Matt Mackall <mpm@selenic.com>
parents: 11204
diff changeset
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)
7468
3e5db4228f8f rebase: add support to keep branch names
Augie Fackler <durin42@gmail.com>
parents: 7298
diff changeset
93 extrafn = opts.get('extrafn')
7952
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
94 keepf = opts.get('keep', False)
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
95 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
96 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
97 # 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
98 # other extensions
f2558a8228be rebase: add option to not commit after a collapsing
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10676
diff changeset
99 keepopen = opts.get('keepopen', False)
7468
3e5db4228f8f rebase: add support to keep branch names
Augie Fackler <durin42@gmail.com>
parents: 7298
diff changeset
100
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
101 if contf or abortf:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
102 if contf and abortf:
11285
f118029e534c rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents: 11205
diff changeset
103 raise util.Abort(_('cannot use both abort and continue'))
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
104 if collapsef:
11285
f118029e534c rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents: 11205
diff changeset
105 raise util.Abort(
f118029e534c rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents: 11205
diff changeset
106 _('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
107 if detachf:
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 detach with continue or abort'))
8117
2b30d8488819 remove unnecessary outer parenthesis in if-statements
Martin Geisler <mg@lazybytes.net>
parents: 8112
diff changeset
109 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
110 raise util.Abort(
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
111 _('abort and continue do not allow specifying revisions'))
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
112
11843
00f8e7837668 rebase: recompute the set of skipped rev when using --continue (issue2330)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 11546
diff changeset
113 (originalwd, target, state, skipped, collapsef, keepf,
7952
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
114 keepbranchesf, external) = restorestatus(repo)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
115 if abortf:
11205
d26f662bfbf5 rebase: add error codes
Matt Mackall <mpm@selenic.com>
parents: 11204
diff changeset
116 return abort(repo, originalwd, target, state)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
117 else:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
118 if srcf and basef:
11285
f118029e534c rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents: 11205
diff changeset
119 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
120 '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
121 if detachf:
66d954e76ffb rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10351
diff changeset
122 if not srcf:
11285
f118029e534c rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents: 11205
diff changeset
123 raise util.Abort(
f118029e534c rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents: 11205
diff changeset
124 _('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
125 if basef:
11285
f118029e534c rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents: 11205
diff changeset
126 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
127
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
128 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
129 result = buildstate(repo, destf, srcf, basef, detachf)
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
130 if not result:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
131 # 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
132 ui.status(_('nothing to rebase\n'))
11205
d26f662bfbf5 rebase: add error codes
Matt Mackall <mpm@selenic.com>
parents: 11204
diff changeset
133 return 1
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
134 else:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
135 originalwd, target, state = result
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
136 if collapsef:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
137 targetancestors = set(repo.changelog.ancestors(target))
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
138 external = checkexternal(repo, state, targetancestors)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
139
7952
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
140 if keepbranchesf:
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
141 if extrafn:
11285
f118029e534c rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents: 11205
diff changeset
142 raise util.Abort(_('cannot use both keepbranches and extrafn'))
7952
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
143 def extrafn(ctx, extra):
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
144 extra['branch'] = ctx.branch()
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
145
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
146 # Rebase
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
147 if not targetancestors:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
148 targetancestors = set(repo.changelog.ancestors(target))
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
149 targetancestors.add(target)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
150
8209
a1a5a57efe90 replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents: 8163
diff changeset
151 for rev in sorted(state):
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
152 if state[rev] == -1:
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
153 ui.debug("rebasing %d:%s\n" % (rev, repo[rev]))
7952
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
154 storestatus(repo, originalwd, target, state, collapsef, keepf,
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
155 keepbranchesf, external)
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
156 p1, p2 = defineparents(repo, rev, target, state,
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
157 targetancestors)
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
158 if len(repo.parents()) == 2:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
159 repo.ui.debug('resuming interrupted rebase\n')
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
160 else:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
161 stats = rebasenode(repo, rev, p1, p2, state)
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
162 if stats and stats[3] > 0:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
163 raise util.Abort(_('fix unresolved conflicts with hg '
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
164 'resolve then run hg rebase --continue'))
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
165 updatedirstate(repo, rev, target, p2)
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
166 if not collapsef:
10762
129e96f7a87a rebase: fix --collapse with --keepbranches (issue2100)
Patrick Mezard <pmezard@gmail.com>
parents: 10672
diff changeset
167 newrev = concludenode(repo, rev, p1, p2, extrafn=extrafn)
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
168 else:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
169 # Skip commit if we are collapsing
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
170 repo.dirstate.setparents(repo[p1].node())
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
171 newrev = None
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
172 # Update the state
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
173 if newrev is not None:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
174 state[rev] = repo[newrev].rev()
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
175 else:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
176 if not collapsef:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
177 ui.note(_('no changes, revision %d skipped\n') % rev)
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
178 ui.debug('next revision set to %s\n' % p1)
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
179 skipped.add(rev)
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
180 state[rev] = p1
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
181
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
182 ui.note(_('rebase merging completed\n'))
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
183
10677
f2558a8228be rebase: add option to not commit after a collapsing
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10676
diff changeset
184 if collapsef and not keepopen:
6923
ebf1462f2145 strip trailing whitespace, replace tabs by spaces
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6906
diff changeset
185 p1, p2 = defineparents(repo, min(state), target,
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
186 state, targetancestors)
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
187 commitmsg = 'Collapsed revision'
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
188 for rebased in state:
10352
66d954e76ffb rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10351
diff changeset
189 if rebased not in skipped and state[rebased] != nullmerge:
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
190 commitmsg += '\n* %s' % repo[rebased].description()
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
191 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
192 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
193 extrafn=extrafn)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
194
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
195 if 'qtip' in repo.tags():
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
196 updatemq(repo, state, skipped, **opts)
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
197
7952
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
198 if not keepf:
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
199 # 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
200 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
201 if rebased:
66d954e76ffb rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10351
diff changeset
202 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
203 ui.warn(_("warning: new changesets detected "
6cebf27287de rebase: split line longer than 80 chars
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10413
diff changeset
204 "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
205 else:
11201
34023f2ca305 Fix up rebase's handling of strip backups
Matt Mackall <mpm@selenic.com>
parents: 11189
diff changeset
206 # backup the old csets by default
34023f2ca305 Fix up rebase's handling of strip backups
Matt Mackall <mpm@selenic.com>
parents: 11189
diff changeset
207 repair.strip(ui, repo, repo[min(rebased)].node(), "all")
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
208
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
209 clearstatus(repo)
11203
7a9cf012dddc rebase: only show "rebase completed" message with -v
Matt Mackall <mpm@selenic.com>
parents: 11201
diff changeset
210 ui.note(_("rebase completed\n"))
7130
204c7850c158 rebase: disable rollback after rebasing
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7127
diff changeset
211 if os.path.exists(repo.sjoin('undo')):
204c7850c158 rebase: disable rollback after rebasing
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7127
diff changeset
212 util.unlink(repo.sjoin('undo'))
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
213 if skipped:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
214 ui.note(_("%d revisions have been skipped\n") % len(skipped))
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
215 finally:
8112
6ee71f78497c switch lock releasing in the extensions from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8076
diff changeset
216 release(lock, wlock)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
217
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
218 def rebasemerge(repo, rev, first=False):
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
219 'return the correct ancestor'
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
220 oldancestor = ancestor.ancestor
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
221
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
222 def newancestor(a, b, pfunc):
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
223 if b == rev:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
224 return repo[rev].parents()[0].rev()
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
225 return oldancestor(a, b, pfunc)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
226
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
227 if not first:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
228 ancestor.ancestor = newancestor
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
229 else:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
230 repo.ui.debug("first revision, do not change ancestor\n")
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
231 try:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
232 stats = merge.update(repo, rev, True, True, False)
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
233 return stats
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
234 finally:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
235 ancestor.ancestor = oldancestor
8454
6d4bf1c1a003 rebase: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8270
diff changeset
236
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
237 def checkexternal(repo, state, targetancestors):
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
238 """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
239 consideration. In the latter case, abort.
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
240 """
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
241 external = nullrev
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
242 source = min(state)
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
243 for rev in state:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
244 if rev == source:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
245 continue
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
246 # Check externals and fail if there are more than one
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
247 for p in repo[rev].parents():
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
248 if (p.rev() not in state
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
249 and p.rev() not in targetancestors):
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
250 if external != nullrev:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
251 raise util.Abort(_('unable to collapse, there is more '
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
252 'than one external parent'))
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
253 external = p.rev()
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
254 return external
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
255
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
256 def updatedirstate(repo, rev, p1, p2):
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
257 """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
258 """
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
259 # Here we simulate the copies and renames in the source changeset
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
260 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
261 m1 = repo[rev].manifest()
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
262 m2 = repo[p1].manifest()
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
263 for k, v in cop.iteritems():
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
264 if k in m1:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
265 if v in m1 or v in m2:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
266 repo.dirstate.copy(v, k)
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
267 if v in m2 and v not in m1:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
268 repo.dirstate.remove(v)
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
269
10762
129e96f7a87a rebase: fix --collapse with --keepbranches (issue2100)
Patrick Mezard <pmezard@gmail.com>
parents: 10672
diff changeset
270 def concludenode(repo, rev, p1, p2, commitmsg=None, extrafn=None):
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
271 'Commit the changes and store useful information in extra'
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
272 try:
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
273 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
274 ctx = repo[rev]
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
275 if commitmsg is None:
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
276 commitmsg = ctx.description()
10762
129e96f7a87a rebase: fix --collapse with --keepbranches (issue2100)
Patrick Mezard <pmezard@gmail.com>
parents: 10672
diff changeset
277 extra = {'rebase_source': ctx.hex()}
129e96f7a87a rebase: fix --collapse with --keepbranches (issue2100)
Patrick Mezard <pmezard@gmail.com>
parents: 10672
diff changeset
278 if extrafn:
129e96f7a87a rebase: fix --collapse with --keepbranches (issue2100)
Patrick Mezard <pmezard@gmail.com>
parents: 10672
diff changeset
279 extrafn(ctx, extra)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
280 # Commit might fail if unresolved files exist
10762
129e96f7a87a rebase: fix --collapse with --keepbranches (issue2100)
Patrick Mezard <pmezard@gmail.com>
parents: 10672
diff changeset
281 newrev = repo.commit(text=commitmsg, user=ctx.user(),
129e96f7a87a rebase: fix --collapse with --keepbranches (issue2100)
Patrick Mezard <pmezard@gmail.com>
parents: 10672
diff changeset
282 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
283 repo.dirstate.setbranch(repo[newrev].branch())
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
284 return newrev
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
285 except util.Abort:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
286 # Invalidate the previous setparents
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
287 repo.dirstate.invalidate()
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
288 raise
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
289
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
290 def rebasenode(repo, rev, p1, p2, state):
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
291 'Rebase a single revision'
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
292 # Merge phase
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
293 # Update to target and merge it with local
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
294 if repo['.'].rev() != repo[p1].rev():
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
295 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
296 merge.update(repo, p1, False, True, False)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
297 else:
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
298 repo.ui.debug(" already in target\n")
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
299 repo.dirstate.write()
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
300 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
301 first = repo[rev].rev() == repo[min(state)].rev()
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
302 stats = rebasemerge(repo, rev, first)
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
303 return stats
6923
ebf1462f2145 strip trailing whitespace, replace tabs by spaces
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6906
diff changeset
304
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
305 def defineparents(repo, rev, target, state, targetancestors):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
306 '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
307 parents = repo[rev].parents()
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
308 p1 = p2 = nullrev
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
309
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
310 P1n = parents[0].rev()
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
311 if P1n in targetancestors:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
312 p1 = target
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
313 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
314 if state[P1n] == nullmerge:
66d954e76ffb rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10351
diff changeset
315 p1 = target
66d954e76ffb rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10351
diff changeset
316 else:
66d954e76ffb rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10351
diff changeset
317 p1 = state[P1n]
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
318 else: # P1n external
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
319 p1 = target
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
320 p2 = P1n
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
321
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
322 if len(parents) == 2 and parents[1].rev() not in targetancestors:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
323 P2n = parents[1].rev()
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
324 # interesting second parent
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
325 if P2n in state:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
326 if p1 == target: # P1n in targetancestors or external
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
327 p1 = state[P2n]
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
328 else:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
329 p2 = state[P2n]
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
330 else: # P2n external
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
331 if p2 != nullrev: # P1n external too => rev is a merged revision
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
332 raise util.Abort(_('cannot use revision %d as base, result '
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
333 'would have 3 parents') % rev)
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
334 p2 = P2n
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
335 repo.ui.debug(" future parents are %d and %d\n" %
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
336 (repo[p1].rev(), repo[p2].rev()))
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
337 return p1, p2
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
338
7955
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
339 def isagitpatch(repo, patchname):
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
340 '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
341 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
342 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
343 if line.startswith('diff --git'):
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
344 return True
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
345 return False
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
346
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
347 def updatemq(repo, state, skipped, **opts):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
348 'Update rebased mq patches - finalize and then import them'
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
349 mqrebase = {}
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
350 mq = repo.mq
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
351 for p in mq.applied:
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
352 rev = repo[p.node].rev()
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
353 if rev in state:
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9301
diff changeset
354 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
355 (rev, p.name))
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
356 mqrebase[rev] = (p.name, isagitpatch(repo, p.name))
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
357
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
358 if mqrebase:
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
359 mq.finish(repo, mqrebase.keys())
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
360
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
361 # 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
362 for rev in sorted(mqrebase, reverse=True):
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
363 if rev not in skipped:
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
364 name, isgit = mqrebase[rev]
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
365 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
366 mq.qimport(repo, (), patchname=name, git=isgit,
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
367 rev=[str(state[rev])])
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
368 mq.save_dirty()
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
369
7952
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
370 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
371 external):
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
372 'Store the current status to allow recovery'
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
373 f = repo.opener("rebasestate", "w")
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
374 f.write(repo[originalwd].hex() + '\n')
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
375 f.write(repo[target].hex() + '\n')
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
376 f.write(repo[external].hex() + '\n')
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
377 f.write('%d\n' % int(collapse))
7952
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
378 f.write('%d\n' % int(keep))
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
379 f.write('%d\n' % int(keepbranches))
7622
4dd7b28003d2 use dict.iteritems() rather than dict.items()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7599
diff changeset
380 for d, v in state.iteritems():
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
381 oldrev = repo[d].hex()
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
382 newrev = repo[v].hex()
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
383 f.write("%s:%s\n" % (oldrev, newrev))
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
384 f.close()
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9301
diff changeset
385 repo.ui.debug('rebase status stored\n')
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
386
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
387 def clearstatus(repo):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
388 'Remove the status files'
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
389 if os.path.exists(repo.join("rebasestate")):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
390 util.unlink(repo.join("rebasestate"))
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
391
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
392 def restorestatus(repo):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
393 'Restore a previously stored status'
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
394 try:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
395 target = None
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
396 collapse = False
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
397 external = nullrev
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
398 state = {}
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
399 f = repo.opener("rebasestate")
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
400 for i, l in enumerate(f.read().splitlines()):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
401 if i == 0:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
402 originalwd = repo[l].rev()
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
403 elif i == 1:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
404 target = repo[l].rev()
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
405 elif i == 2:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
406 external = repo[l].rev()
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
407 elif i == 3:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
408 collapse = bool(int(l))
7952
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
409 elif i == 4:
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
410 keep = bool(int(l))
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
411 elif i == 5:
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
412 keepbranches = bool(int(l))
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
413 else:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
414 oldrev, newrev = l.split(':')
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
415 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
416 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
417 # 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
418 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
419 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
420 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
421 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
422 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
423 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
424 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
425 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
426 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
427 collapse, keep, keepbranches, external)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
428 except IOError, err:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
429 if err.errno != errno.ENOENT:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
430 raise
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
431 raise util.Abort(_('no rebase in progress'))
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
432
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
433 def abort(repo, originalwd, target, state):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
434 '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
435 if set(repo.changelog.descendants(target)) - set(state.values()):
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
436 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
437 "can't abort\n"))
11205
d26f662bfbf5 rebase: add error codes
Matt Mackall <mpm@selenic.com>
parents: 11204
diff changeset
438 return -1
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
439 else:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
440 # Strip from the first rebased revision
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
441 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
442 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
443 if rebased:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
444 strippoint = min(rebased)
11201
34023f2ca305 Fix up rebase's handling of strip backups
Matt Mackall <mpm@selenic.com>
parents: 11189
diff changeset
445 # 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
446 repair.strip(repo.ui, repo, repo[strippoint].node())
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
447 clearstatus(repo)
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
448 repo.ui.status(_('rebase aborted\n'))
11205
d26f662bfbf5 rebase: add error codes
Matt Mackall <mpm@selenic.com>
parents: 11204
diff changeset
449 return 0
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
450
10352
66d954e76ffb rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10351
diff changeset
451 def buildstate(repo, dest, src, base, detach):
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
452 '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
453 targetancestors = set()
10352
66d954e76ffb rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10351
diff changeset
454 detachset = set()
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
455
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
456 if not dest:
7877
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
457 # Destination defaults to the latest revision in the current branch
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
458 branch = repo[None].branch()
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
459 dest = repo[branch].rev()
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
460 else:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
461 dest = repo[dest].rev()
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
462
10672
c2e1e637d4da rebase: always check if rebasing onto an applied mq patch.
Greg Ward <greg-hg@gerg.ca>
parents: 10659
diff changeset
463 # 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
464 # 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
465 # 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
466 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
467 [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
468 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
469
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
470 if src:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
471 commonbase = repo[src].ancestor(repo[dest])
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
472 if commonbase == repo[src]:
9577
b91960aed018 rebase: improve error and debug messages
Sune Foldager <cryo@cyanite.org>
parents: 9467
diff changeset
473 raise util.Abort(_('source is ancestor of destination'))
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
474 if commonbase == repo[dest]:
9577
b91960aed018 rebase: improve error and debug messages
Sune Foldager <cryo@cyanite.org>
parents: 9467
diff changeset
475 raise util.Abort(_('source is descendant of destination'))
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
476 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
477 if detach:
66d954e76ffb rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10351
diff changeset
478 # 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
479 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
480 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
481 detachset = srcancestors - baseancestors
66d954e76ffb rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10351
diff changeset
482 detachset.remove(commonbase.rev())
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
483 else:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
484 if base:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
485 cwd = repo[base].rev()
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
486 else:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
487 cwd = repo['.'].rev()
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
488
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
489 if cwd == dest:
9577
b91960aed018 rebase: improve error and debug messages
Sune Foldager <cryo@cyanite.org>
parents: 9467
diff changeset
490 repo.ui.debug('source and destination are the same\n')
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
491 return None
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
492
8150
bbc24c0753a0 util: use built-in set and frozenset
Martin Geisler <mg@lazybytes.net>
parents: 8117
diff changeset
493 targetancestors = set(repo.changelog.ancestors(dest))
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
494 if cwd in targetancestors:
9577
b91960aed018 rebase: improve error and debug messages
Sune Foldager <cryo@cyanite.org>
parents: 9467
diff changeset
495 repo.ui.debug('source is ancestor of destination\n')
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
496 return None
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
497
8150
bbc24c0753a0 util: use built-in set and frozenset
Martin Geisler <mg@lazybytes.net>
parents: 8117
diff changeset
498 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
499 if dest in cwdancestors:
341182ac95e4 rebase: return early when source is descendant of destination
Sune Foldager <cryo@cyanite.org>
parents: 9577
diff changeset
500 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
501 return None
341182ac95e4 rebase: return early when source is descendant of destination
Sune Foldager <cryo@cyanite.org>
parents: 9577
diff changeset
502
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
503 cwdancestors.add(cwd)
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
504 rebasingbranch = cwdancestors - targetancestors
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
505 source = min(rebasingbranch)
6923
ebf1462f2145 strip trailing whitespace, replace tabs by spaces
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6906
diff changeset
506
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9301
diff changeset
507 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
508 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
509 state.update(dict.fromkeys(detachset, nullmerge))
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
510 state[source] = nullrev
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
511 return repo['.'].rev(), repo[dest].rev(), state
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
512
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
513 def pullrebase(orig, ui, repo, *args, **opts):
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
514 '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
515 if opts.get('rebase'):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
516 if opts.get('update'):
8242
aee8455ee8ec Fix typeerror when specifying both --rebase and --pull
Martijn Pieters <mj@zopatista.com>
parents: 7786
diff changeset
517 del opts['update']
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9301
diff changeset
518 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
519 'the update flag\n')
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
520
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
521 cmdutil.bail_if_changed(repo)
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
522 revsprepull = len(repo)
10628
6227c8d669d5 rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents: 10436
diff changeset
523 origpostincoming = commands.postincoming
6227c8d669d5 rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents: 10436
diff changeset
524 def _dummy(*args, **kwargs):
6227c8d669d5 rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents: 10436
diff changeset
525 pass
6227c8d669d5 rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents: 10436
diff changeset
526 commands.postincoming = _dummy
6227c8d669d5 rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents: 10436
diff changeset
527 try:
6227c8d669d5 rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents: 10436
diff changeset
528 orig(ui, repo, *args, **opts)
6227c8d669d5 rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents: 10436
diff changeset
529 finally:
6227c8d669d5 rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents: 10436
diff changeset
530 commands.postincoming = origpostincoming
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
531 revspostpull = len(repo)
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
532 if revspostpull > revsprepull:
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
533 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
534 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
535 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
536 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
537 # 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
538 hg.update(repo, dest)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
539 else:
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
540 orig(ui, repo, *args, **opts)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
541
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
542 def uisetup(ui):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
543 '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
544 entry = extensions.wrapcommand(commands.table, 'pull', pullrebase)
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
545 entry[1].append(('', 'rebase', None,
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
546 _("rebase working directory to branch head"))
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
547 )
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
548
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
549 cmdtable = {
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
550 "rebase":
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
551 (rebase,
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
552 [
11321
40c06bbf58be help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 11316
diff changeset
553 ('s', 'source', '',
40c06bbf58be help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 11316
diff changeset
554 _('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
555 ('b', 'base', '',
40c06bbf58be help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 11316
diff changeset
556 _('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
557 '(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
558 _('REV')),
40c06bbf58be help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 11316
diff changeset
559 ('d', 'dest', '',
40c06bbf58be help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 11316
diff changeset
560 _('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
561 ('', 'collapse', False, _('collapse the rebased changesets')),
fdf0c375cdbf rebase: change rebase help to talk about changesets and branch names
timeless@mozdev.org
parents: 9183
diff changeset
562 ('', 'keep', False, _('keep original changesets')),
fdf0c375cdbf rebase: change rebase help to talk about changesets and branch names
timeless@mozdev.org
parents: 9183
diff changeset
563 ('', '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
564 ('', '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
565 'branch')),
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
566 ('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
567 ('a', 'abort', False, _('abort an interrupted rebase'))] +
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
568 templateopts,
10646
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
569 _('hg rebase [-s REV | -b REV] [-d REV] [options]\n'
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
570 'hg rebase {-a|-c}'))
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
571 }