hgext/rebase.py
author Nicolas Dumazet <nicdumz.commits@gmail.com>
Tue, 13 Jul 2010 20:12:32 +0900
branchstable
changeset 11531 59bd20451ab6
parent 11321 40c06bbf58be
child 11537 0a044e5ff489
permissions -rw-r--r--
rebase: re-add patches to mq repo after rebase Since 1b82a26635d7, we are adding patches after the qimport call, and not inside it anymore. Correct updatemq to match the new behaviour.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
7952
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
   113
            (originalwd, target, state, collapsef, keepf,
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())
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   274
        if commitmsg is None:
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   275
            commitmsg = repo[rev].description()
10762
129e96f7a87a rebase: fix --collapse with --keepbranches (issue2100)
Patrick Mezard <pmezard@gmail.com>
parents: 10672
diff changeset
   276
        ctx = repo[rev]
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 = {}
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   350
    for p in repo.mq.applied:
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
   351
        if repo[p.node].rev() in state:
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9301
diff changeset
   352
            repo.ui.debug('revision %d is an mq patch (%s), finalize it.\n' %
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
   353
                                        (repo[p.node].rev(), p.name))
da2a0c9c895d mq: avoid many hex/bin conversions, keep the binary node when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10677
diff changeset
   354
            mqrebase[repo[p.node].rev()] = (p.name, isagitpatch(repo, p.name))
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   355
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   356
    if mqrebase:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   357
        repo.mq.finish(repo, mqrebase.keys())
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   358
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   359
        # 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
   360
        for rev in sorted(mqrebase, reverse=True):
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   361
            if rev not in skipped:
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9301
diff changeset
   362
                repo.ui.debug('import mq patch %d (%s)\n'
7955
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
   363
                              % (state[rev], mqrebase[rev][0]))
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
   364
                repo.mq.qimport(repo, (), patchname=mqrebase[rev][0],
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
   365
                            git=mqrebase[rev][1],rev=[str(state[rev])])
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   366
        repo.mq.save_dirty()
11531
59bd20451ab6 rebase: re-add patches to mq repo after rebase
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11321
diff changeset
   367
        qrepo = repo.mq.qrepo()
59bd20451ab6 rebase: re-add patches to mq repo after rebase
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11321
diff changeset
   368
        if qrepo:
59bd20451ab6 rebase: re-add patches to mq repo after rebase
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11321
diff changeset
   369
            qrepo[None].add(repo.mq.added)
59bd20451ab6 rebase: re-add patches to mq repo after rebase
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11321
diff changeset
   370
        repo.mq.added = []
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   371
7952
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
   372
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
   373
                                                                external):
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   374
    'Store the current status to allow recovery'
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   375
    f = repo.opener("rebasestate", "w")
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   376
    f.write(repo[originalwd].hex() + '\n')
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   377
    f.write(repo[target].hex() + '\n')
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   378
    f.write(repo[external].hex() + '\n')
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   379
    f.write('%d\n' % int(collapse))
7952
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
   380
    f.write('%d\n' % int(keep))
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
   381
    f.write('%d\n' % int(keepbranches))
7622
4dd7b28003d2 use dict.iteritems() rather than dict.items()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7599
diff changeset
   382
    for d, v in state.iteritems():
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   383
        oldrev = repo[d].hex()
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   384
        newrev = repo[v].hex()
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   385
        f.write("%s:%s\n" % (oldrev, newrev))
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   386
    f.close()
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9301
diff changeset
   387
    repo.ui.debug('rebase status stored\n')
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   388
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   389
def clearstatus(repo):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   390
    'Remove the status files'
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   391
    if os.path.exists(repo.join("rebasestate")):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   392
        util.unlink(repo.join("rebasestate"))
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   393
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   394
def restorestatus(repo):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   395
    'Restore a previously stored status'
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   396
    try:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   397
        target = None
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   398
        collapse = False
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   399
        external = nullrev
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   400
        state = {}
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   401
        f = repo.opener("rebasestate")
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   402
        for i, l in enumerate(f.read().splitlines()):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   403
            if i == 0:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   404
                originalwd = repo[l].rev()
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   405
            elif i == 1:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   406
                target = repo[l].rev()
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   407
            elif i == 2:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   408
                external = repo[l].rev()
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   409
            elif i == 3:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   410
                collapse = bool(int(l))
7952
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
   411
            elif i == 4:
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
   412
                keep = bool(int(l))
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
   413
            elif i == 5:
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
   414
                keepbranches = bool(int(l))
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   415
            else:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   416
                oldrev, newrev = l.split(':')
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   417
                state[repo[oldrev].rev()] = repo[newrev].rev()
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9301
diff changeset
   418
        repo.ui.debug('rebase status resumed\n')
7952
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
   419
        return originalwd, target, state, collapse, keep, keepbranches, external
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   420
    except IOError, err:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   421
        if err.errno != errno.ENOENT:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   422
            raise
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   423
        raise util.Abort(_('no rebase in progress'))
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   424
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   425
def abort(repo, originalwd, target, state):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   426
    '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
   427
    if set(repo.changelog.descendants(target)) - set(state.values()):
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   428
        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
   429
                                                    "can't abort\n"))
11205
d26f662bfbf5 rebase: add error codes
Matt Mackall <mpm@selenic.com>
parents: 11204
diff changeset
   430
        return -1
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   431
    else:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   432
        # Strip from the first rebased revision
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   433
        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
   434
        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
   435
        if rebased:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   436
            strippoint = min(rebased)
11201
34023f2ca305 Fix up rebase's handling of strip backups
Matt Mackall <mpm@selenic.com>
parents: 11189
diff changeset
   437
            # 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
   438
            repair.strip(repo.ui, repo, repo[strippoint].node())
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   439
        clearstatus(repo)
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   440
        repo.ui.status(_('rebase aborted\n'))
11205
d26f662bfbf5 rebase: add error codes
Matt Mackall <mpm@selenic.com>
parents: 11204
diff changeset
   441
        return 0
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   442
10352
66d954e76ffb rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10351
diff changeset
   443
def buildstate(repo, dest, src, base, detach):
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   444
    '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
   445
    targetancestors = set()
10352
66d954e76ffb rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10351
diff changeset
   446
    detachset = set()
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   447
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   448
    if not dest:
7877
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
   449
        # Destination defaults to the latest revision in the current branch
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   450
        branch = repo[None].branch()
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   451
        dest = repo[branch].rev()
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
        dest = repo[dest].rev()
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   454
10672
c2e1e637d4da rebase: always check if rebasing onto an applied mq patch.
Greg Ward <greg-hg@gerg.ca>
parents: 10659
diff changeset
   455
    # 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
   456
    # 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
   457
    # 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
   458
    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
   459
                            [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
   460
        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
   461
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   462
    if src:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   463
        commonbase = repo[src].ancestor(repo[dest])
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   464
        if commonbase == repo[src]:
9577
b91960aed018 rebase: improve error and debug messages
Sune Foldager <cryo@cyanite.org>
parents: 9467
diff changeset
   465
            raise util.Abort(_('source is ancestor of destination'))
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   466
        if commonbase == repo[dest]:
9577
b91960aed018 rebase: improve error and debug messages
Sune Foldager <cryo@cyanite.org>
parents: 9467
diff changeset
   467
            raise util.Abort(_('source is descendant of destination'))
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   468
        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
   469
        if detach:
66d954e76ffb rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10351
diff changeset
   470
            # 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
   471
            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
   472
            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
   473
            detachset = srcancestors - baseancestors
66d954e76ffb rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10351
diff changeset
   474
            detachset.remove(commonbase.rev())
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   475
    else:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   476
        if base:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   477
            cwd = repo[base].rev()
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   478
        else:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   479
            cwd = repo['.'].rev()
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   480
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   481
        if cwd == dest:
9577
b91960aed018 rebase: improve error and debug messages
Sune Foldager <cryo@cyanite.org>
parents: 9467
diff changeset
   482
            repo.ui.debug('source and destination are the same\n')
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   483
            return None
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   484
8150
bbc24c0753a0 util: use built-in set and frozenset
Martin Geisler <mg@lazybytes.net>
parents: 8117
diff changeset
   485
        targetancestors = set(repo.changelog.ancestors(dest))
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   486
        if cwd in targetancestors:
9577
b91960aed018 rebase: improve error and debug messages
Sune Foldager <cryo@cyanite.org>
parents: 9467
diff changeset
   487
            repo.ui.debug('source is ancestor of destination\n')
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   488
            return None
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   489
8150
bbc24c0753a0 util: use built-in set and frozenset
Martin Geisler <mg@lazybytes.net>
parents: 8117
diff changeset
   490
        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
   491
        if dest in cwdancestors:
341182ac95e4 rebase: return early when source is descendant of destination
Sune Foldager <cryo@cyanite.org>
parents: 9577
diff changeset
   492
            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
   493
            return None
341182ac95e4 rebase: return early when source is descendant of destination
Sune Foldager <cryo@cyanite.org>
parents: 9577
diff changeset
   494
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   495
        cwdancestors.add(cwd)
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   496
        rebasingbranch = cwdancestors - targetancestors
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   497
        source = min(rebasingbranch)
6923
ebf1462f2145 strip trailing whitespace, replace tabs by spaces
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6906
diff changeset
   498
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9301
diff changeset
   499
    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
   500
    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
   501
    state.update(dict.fromkeys(detachset, nullmerge))
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   502
    state[source] = nullrev
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   503
    return repo['.'].rev(), repo[dest].rev(), state
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   504
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
   505
def pullrebase(orig, ui, repo, *args, **opts):
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   506
    '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
   507
    if opts.get('rebase'):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   508
        if opts.get('update'):
8242
aee8455ee8ec Fix typeerror when specifying both --rebase and --pull
Martijn Pieters <mj@zopatista.com>
parents: 7786
diff changeset
   509
            del opts['update']
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9301
diff changeset
   510
            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
   511
                     'the update flag\n')
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   512
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   513
        cmdutil.bail_if_changed(repo)
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   514
        revsprepull = len(repo)
10628
6227c8d669d5 rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents: 10436
diff changeset
   515
        origpostincoming = commands.postincoming
6227c8d669d5 rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents: 10436
diff changeset
   516
        def _dummy(*args, **kwargs):
6227c8d669d5 rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents: 10436
diff changeset
   517
            pass
6227c8d669d5 rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents: 10436
diff changeset
   518
        commands.postincoming = _dummy
6227c8d669d5 rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents: 10436
diff changeset
   519
        try:
6227c8d669d5 rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents: 10436
diff changeset
   520
            orig(ui, repo, *args, **opts)
6227c8d669d5 rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents: 10436
diff changeset
   521
        finally:
6227c8d669d5 rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents: 10436
diff changeset
   522
            commands.postincoming = origpostincoming
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   523
        revspostpull = len(repo)
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   524
        if revspostpull > revsprepull:
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
   525
            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
   526
            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
   527
            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
   528
            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
   529
                # 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
   530
                hg.update(repo, dest)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   531
    else:
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
   532
        orig(ui, repo, *args, **opts)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   533
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   534
def uisetup(ui):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   535
    '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
   536
    entry = extensions.wrapcommand(commands.table, 'pull', pullrebase)
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
   537
    entry[1].append(('', 'rebase', None,
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
   538
                     _("rebase working directory to branch head"))
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
   539
)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   540
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   541
cmdtable = {
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   542
"rebase":
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   543
        (rebase,
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   544
        [
11321
40c06bbf58be help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 11316
diff changeset
   545
        ('s', 'source', '',
40c06bbf58be help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 11316
diff changeset
   546
         _('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
   547
        ('b', 'base', '',
40c06bbf58be help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 11316
diff changeset
   548
         _('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
   549
           '(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
   550
         _('REV')),
40c06bbf58be help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 11316
diff changeset
   551
        ('d', 'dest', '',
40c06bbf58be help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 11316
diff changeset
   552
         _('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
   553
        ('', '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
   554
        ('', 'keep', False, _('keep original changesets')),
fdf0c375cdbf rebase: change rebase help to talk about changesets and branch names
timeless@mozdev.org
parents: 9183
diff changeset
   555
        ('', '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
   556
        ('', '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
   557
                                'branch')),
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   558
        ('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
   559
        ('a', 'abort', False, _('abort an interrupted rebase'))] +
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   560
         templateopts,
10646
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
   561
        _('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
   562
          'hg rebase {-a|-c}'))
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   563
}