hgext/rebase.py
author liscju <piotr.listkiewicz@gmail.com>
Sun, 15 Nov 2015 22:18:48 +0100
branchstable
changeset 26960 6979fe2a6d75
parent 26811 d1561a422748
child 27010 f4fec0940278
permissions -rw-r--r--
rebase: add returning value from pullrebase function So far pullrebase function has always returned None value, no matter what orig function returned. This behaviour made impossible for pull to change returned value from mercurial process (it has always ended with 0 value by default). This patch makes pullrebase returning with returned value from orig.
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:
26421
4b0fc75f9403 urls: bulk-change primary website URLs
Matt Mackall <mpm@selenic.com>
parents: 26360
diff changeset
    14
https://mercurial-scm.org/wiki/RebaseExtension
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
    15
'''
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
    16
14884
c0ccd70df52c rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14635
diff changeset
    17
from mercurial import hg, util, repair, merge, cmdutil, commands, bookmarks
18933
42b620fc89e2 rebase: switch from util.Abort to util.InterventionRequired where appropriate (bc)
Augie Fackler <raf@durin42.com>
parents: 18764
diff changeset
    18
from mercurial import extensions, patch, scmutil, phases, obsolete, error
26301
3f8c5c284c86 rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26165
diff changeset
    19
from mercurial import copies, repoview, revset
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
    20
from mercurial.commands import templateopts
23517
4f18e80d9c30 rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents: 23491
diff changeset
    21
from mercurial.node import nullrev, nullid, hex, short
8112
6ee71f78497c switch lock releasing in the extensions from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8076
diff changeset
    22
from mercurial.lock import release
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
    23
from mercurial.i18n import _
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
    24
import os, errno
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
    25
26669
07db7e95c464 rebase: added comments
Christian Delahousse <cdelahousse@fb.com>
parents: 26587
diff changeset
    26
# The following constants are used throughout the rebase module. The ordering of
07db7e95c464 rebase: added comments
Christian Delahousse <cdelahousse@fb.com>
parents: 26587
diff changeset
    27
# their values must be maintained.
07db7e95c464 rebase: added comments
Christian Delahousse <cdelahousse@fb.com>
parents: 26587
diff changeset
    28
07db7e95c464 rebase: added comments
Christian Delahousse <cdelahousse@fb.com>
parents: 26587
diff changeset
    29
# Indicates that a revision needs to be rebased
23490
102f144f6e02 rebase: add a 'revtodo' constant
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23489
diff changeset
    30
revtodo = -1
10352
66d954e76ffb rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10351
diff changeset
    31
nullmerge = -2
18447
7159426c8d13 rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18446
diff changeset
    32
revignored = -3
26669
07db7e95c464 rebase: added comments
Christian Delahousse <cdelahousse@fb.com>
parents: 26587
diff changeset
    33
# To do with obsolescence
26349
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
    34
revprecursor = -4
10352
66d954e76ffb rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10351
diff changeset
    35
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
    36
cmdtable = {}
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
    37
command = cmdutil.command(cmdtable)
25186
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 25102
diff changeset
    38
# Note for extension authors: ONLY specify testedwith = 'internal' for
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 25102
diff changeset
    39
# extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 25102
diff changeset
    40
# be specifying the version(s) of Mercurial they are tested with, or
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 25102
diff changeset
    41
# leave the attribute unspecified.
16743
38caf405d010 hgext: mark all first-party extensions as such
Augie Fackler <raf@durin42.com>
parents: 16696
diff changeset
    42
testedwith = 'internal'
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
    43
26671
66dc39cd7d06 rebase: factor out nothing to rebase return code
Ryan McElroy <rmcelroy@fb.com>
parents: 26669
diff changeset
    44
def _nothingtorebase():
66dc39cd7d06 rebase: factor out nothing to rebase return code
Ryan McElroy <rmcelroy@fb.com>
parents: 26669
diff changeset
    45
    return 1
66dc39cd7d06 rebase: factor out nothing to rebase return code
Ryan McElroy <rmcelroy@fb.com>
parents: 26669
diff changeset
    46
19861
a69a77a80900 rebase: preserve metadata from grafts of changes (issue4001)
Augie Fackler <raf@durin42.com>
parents: 19860
diff changeset
    47
def _savegraft(ctx, extra):
a69a77a80900 rebase: preserve metadata from grafts of changes (issue4001)
Augie Fackler <raf@durin42.com>
parents: 19860
diff changeset
    48
    s = ctx.extra().get('source', None)
a69a77a80900 rebase: preserve metadata from grafts of changes (issue4001)
Augie Fackler <raf@durin42.com>
parents: 19860
diff changeset
    49
    if s is not None:
a69a77a80900 rebase: preserve metadata from grafts of changes (issue4001)
Augie Fackler <raf@durin42.com>
parents: 19860
diff changeset
    50
        extra['source'] = s
a69a77a80900 rebase: preserve metadata from grafts of changes (issue4001)
Augie Fackler <raf@durin42.com>
parents: 19860
diff changeset
    51
19860
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
    52
def _savebranch(ctx, extra):
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
    53
    extra['branch'] = ctx.branch()
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
    54
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
    55
def _makeextrafn(copiers):
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
    56
    """make an extrafn out of the given copy-functions.
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
    57
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
    58
    A copy function takes a context and an extra dict, and mutates the
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
    59
    extra dict as needed based on the given context.
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
    60
    """
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
    61
    def extrafn(ctx, extra):
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
    62
        for c in copiers:
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
    63
            c(ctx, extra)
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
    64
    return extrafn
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
    65
26717
1755e1d9d1c3 rebase: extra default destination in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26677
diff changeset
    66
def _destrebase(repo):
1755e1d9d1c3 rebase: extra default destination in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26677
diff changeset
    67
    # Destination defaults to the latest revision in the
1755e1d9d1c3 rebase: extra default destination in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26677
diff changeset
    68
    # current branch
1755e1d9d1c3 rebase: extra default destination in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26677
diff changeset
    69
    branch = repo[None].branch()
1755e1d9d1c3 rebase: extra default destination in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26677
diff changeset
    70
    return repo[branch].rev()
1755e1d9d1c3 rebase: extra default destination in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26677
diff changeset
    71
26719
8bed1eae99df rebase: rename and test '_destrebase'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26718
diff changeset
    72
def _revsetdestrebase(repo, subset, x):
26301
3f8c5c284c86 rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26165
diff changeset
    73
    # ``_rebasedefaultdest()``
3f8c5c284c86 rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26165
diff changeset
    74
3f8c5c284c86 rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26165
diff changeset
    75
    # default destination for rebase.
3f8c5c284c86 rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26165
diff changeset
    76
    # # XXX: Currently private because I expect the signature to change.
3f8c5c284c86 rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26165
diff changeset
    77
    # # XXX: - taking rev as arguments,
3f8c5c284c86 rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26165
diff changeset
    78
    # # XXX: - bailing out in case of ambiguity vs returning all data.
3f8c5c284c86 rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26165
diff changeset
    79
    # # XXX: - probably merging with the merge destination.
3f8c5c284c86 rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26165
diff changeset
    80
    # i18n: "_rebasedefaultdest" is a keyword
3f8c5c284c86 rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26165
diff changeset
    81
    revset.getargs(x, 0, 0, _("_rebasedefaultdest takes no arguments"))
26717
1755e1d9d1c3 rebase: extra default destination in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26677
diff changeset
    82
    return subset & revset.baseset([_destrebase(repo)])
26301
3f8c5c284c86 rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26165
diff changeset
    83
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
    84
@command('rebase',
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
    85
    [('s', 'source', '',
22789
5f4934487382 rebase: attempt to clarify --base
Matt Mackall <mpm@selenic.com>
parents: 22405
diff changeset
    86
     _('rebase the specified changeset and descendants'), _('REV')),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
    87
    ('b', 'base', '',
22789
5f4934487382 rebase: attempt to clarify --base
Matt Mackall <mpm@selenic.com>
parents: 22405
diff changeset
    88
     _('rebase everything from branching point of specified changeset'),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
    89
     _('REV')),
15270
6cb6064f1d50 rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15269
diff changeset
    90
    ('r', 'rev', [],
6cb6064f1d50 rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15269
diff changeset
    91
     _('rebase these revisions'),
6cb6064f1d50 rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15269
diff changeset
    92
     _('REV')),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
    93
    ('d', 'dest', '',
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
    94
     _('rebase onto the specified changeset'), _('REV')),
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
    95
    ('', 'collapse', False, _('collapse the rebased changesets')),
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
    96
    ('m', 'message', '',
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
    97
     _('use text as collapse commit message'), _('TEXT')),
15219
9d58569a8b92 rebase: add --edit switch
Matt Mackall <mpm@selenic.com>
parents: 15214
diff changeset
    98
    ('e', 'edit', False, _('invoke editor on commit messages')),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
    99
    ('l', 'logfile', '',
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   100
     _('read collapse commit message from file'), _('FILE')),
25025
72f7f98bc5e5 rebase: add short -k option for --keep
Nat Mote <nmote@fb.com>
parents: 24998
diff changeset
   101
    ('k', 'keep', False, _('keep original changesets')),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   102
    ('', 'keepbranches', False, _('keep original branch names')),
17005
50f434510da6 rebase: do not add second parent to rebased changeset (drop detach option) (BC)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 16867
diff changeset
   103
    ('D', 'detach', False, _('(DEPRECATED)')),
22382
d5b04ee8ecf7 rebase: add a deprecated -i/--interactive flag
David Soria Parra <davidsp@fb.com>
parents: 22251
diff changeset
   104
    ('i', 'interactive', False, _('(DEPRECATED)')),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   105
    ('t', 'tool', '', _('specify merge tool')),
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   106
    ('c', 'continue', False, _('continue an interrupted rebase')),
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   107
    ('a', 'abort', False, _('abort an interrupted rebase'))] +
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   108
     templateopts,
17325
e4db509c08ec rebase: remove second broken synopsis line (issue3172)
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
   109
    _('[-s REV | -b REV] [-d REV] [OPTION]'))
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   110
def rebase(ui, repo, **opts):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   111
    """move changeset (and descendants) to a different branch
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   112
7999
b25110140573 rebase: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7955
diff changeset
   113
    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
   114
    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
   115
    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
   116
    development tree.
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
   117
11188
b5c0f6a11430 rebase: stress that only local changesets should be rebased
Martin Geisler <mg@lazybytes.net>
parents: 10762
diff changeset
   118
    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
   119
    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
   120
    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
   121
    pulling in your rebased changesets.
b5c0f6a11430 rebase: stress that only local changesets should be rebased
Martin Geisler <mg@lazybytes.net>
parents: 10762
diff changeset
   122
18516
9fbeb61b8ad2 rebase: mention phases in the help
Kevin Bullock <kbullock@ringworld.org>
parents: 18514
diff changeset
   123
    In its default configuration, Mercurial will prevent you from
9fbeb61b8ad2 rebase: mention phases in the help
Kevin Bullock <kbullock@ringworld.org>
parents: 18514
diff changeset
   124
    rebasing published changes. See :hg:`help phases` for details.
9fbeb61b8ad2 rebase: mention phases in the help
Kevin Bullock <kbullock@ringworld.org>
parents: 18514
diff changeset
   125
10646
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
   126
    If you don't specify a destination changeset (``-d/--dest``),
19398
f7bcc2e56279 rebase: simplify references to branch tips
Matt Mackall <mpm@selenic.com>
parents: 19214
diff changeset
   127
    rebase uses the current branch tip as the destination. (The
f7bcc2e56279 rebase: simplify references to branch tips
Matt Mackall <mpm@selenic.com>
parents: 19214
diff changeset
   128
    destination changeset is not modified by rebasing, but new
f7bcc2e56279 rebase: simplify references to branch tips
Matt Mackall <mpm@selenic.com>
parents: 19214
diff changeset
   129
    changesets are added as its descendants.)
10646
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
   130
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
   131
    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
   132
    "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
   133
    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
   134
    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
   135
    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
   136
    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
   137
    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
   138
    ``-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
   139
    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
   140
    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
   141
    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
   142
18518
0324a1d88a53 rebase: mention --rev in the help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18516
diff changeset
   143
    For advanced usage, a third way is available through the ``--rev``
0324a1d88a53 rebase: mention --rev in the help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18516
diff changeset
   144
    option. It allows you to specify an arbitrary set of changesets to
0324a1d88a53 rebase: mention --rev in the help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18516
diff changeset
   145
    rebase. Descendants of revs you specify with this option are not
0324a1d88a53 rebase: mention --rev in the help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18516
diff changeset
   146
    automatically included in the rebase.
0324a1d88a53 rebase: mention --rev in the help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18516
diff changeset
   147
10646
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
   148
    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
   149
    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
   150
    ``--keep`` to preserve the original source changesets. Some
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
   151
    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
   152
    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
   153
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
   154
    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
   155
    and source branch is that, unlike ``merge``, rebase will do
19398
f7bcc2e56279 rebase: simplify references to branch tips
Matt Mackall <mpm@selenic.com>
parents: 19214
diff changeset
   156
    nothing if you are at the branch tip of a named branch
10646
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
   157
    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
   158
    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
   159
    the intended source branch).
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   160
7999
b25110140573 rebase: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7955
diff changeset
   161
    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
   162
    continued with --continue/-c or aborted with --abort/-a.
11205
d26f662bfbf5 rebase: add error codes
Matt Mackall <mpm@selenic.com>
parents: 11204
diff changeset
   163
22790
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   164
    .. container:: verbose
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   165
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   166
      Examples:
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   167
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   168
      - move "local changes" (current commit back to branching point)
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   169
        to the current branch tip after a pull::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   170
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   171
          hg rebase
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   172
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   173
      - move a single changeset to the stable branch::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   174
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   175
          hg rebase -r 5f493448 -d stable
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   176
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   177
      - splice a commit and all its descendants onto another part of history::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   178
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   179
          hg rebase --source c0c3 --dest 4cf9
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   180
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   181
      - rebase everything on a branch marked by a bookmark onto the
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   182
        default branch::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   183
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   184
          hg rebase --base myfeature --dest default
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   185
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   186
      - collapse a sequence of changes into a single commit::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   187
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   188
          hg rebase --collapse -r 1520:1525 -d .
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   189
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   190
      - move a named branch while preserving its name::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   191
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   192
          hg rebase -r "branch(featureX)" -d 1.3 --keepbranches
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   193
19971
2a9bb64faa0b rebase: add description about exit code when there are unresolved conflicts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19969
diff changeset
   194
    Returns 0 on success, 1 if nothing to rebase or there are
2a9bb64faa0b rebase: add description about exit code when there are unresolved conflicts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19969
diff changeset
   195
    unresolved conflicts.
22790
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   196
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   197
    """
7280
810ca383da9c remove unused variables
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7216
diff changeset
   198
    originalwd = target = None
18755
72412afe4c28 rebase: restore active bookmark after rebase --continue
Durham Goode <durham@fb.com>
parents: 18549
diff changeset
   199
    activebookmark = None
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   200
    external = nullrev
26781
1aee2ab0f902 spelling: trivial spell checking
Mads Kiilerich <madski@unity3d.com>
parents: 26748
diff changeset
   201
    # Mapping between the old revision id and either what is the new rebased
1aee2ab0f902 spelling: trivial spell checking
Mads Kiilerich <madski@unity3d.com>
parents: 26748
diff changeset
   202
    # revision or what needs to be done with the old revision. The state dict
26669
07db7e95c464 rebase: added comments
Christian Delahousse <cdelahousse@fb.com>
parents: 26587
diff changeset
   203
    # will be what contains most of the rebase progress state.
8454
6d4bf1c1a003 rebase: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8270
diff changeset
   204
    state = {}
6d4bf1c1a003 rebase: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8270
diff changeset
   205
    skipped = set()
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   206
    targetancestors = set()
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   207
15219
9d58569a8b92 rebase: add --edit switch
Matt Mackall <mpm@selenic.com>
parents: 15214
diff changeset
   208
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   209
    lock = wlock = None
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   210
    try:
15874
2305baff673f rebase: take locks in the right order
Mads Kiilerich <mads@kiilerich.com>
parents: 15801
diff changeset
   211
        wlock = repo.wlock()
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   212
        lock = repo.lock()
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   213
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   214
        # Validate input and define rebasing points
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   215
        destf = opts.get('dest', None)
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   216
        srcf = opts.get('source', None)
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   217
        basef = opts.get('base', None)
15270
6cb6064f1d50 rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15269
diff changeset
   218
        revf = opts.get('rev', [])
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   219
        contf = opts.get('continue')
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   220
        abortf = opts.get('abort')
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   221
        collapsef = opts.get('collapse', False)
14635
217b7d83afc3 cmdutil, logmessage: use ui.fin when reading from '-'
Idan Kamara <idankk86@gmail.com>
parents: 14599
diff changeset
   222
        collapsemsg = cmdutil.logmessage(ui, opts)
19860
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
   223
        e = opts.get('extrafn') # internal, used by e.g. hgsubversion
19861
a69a77a80900 rebase: preserve metadata from grafts of changes (issue4001)
Augie Fackler <raf@durin42.com>
parents: 19860
diff changeset
   224
        extrafns = [_savegraft]
19860
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
   225
        if e:
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
   226
            extrafns = [e]
7952
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
   227
        keepf = opts.get('keep', False)
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
   228
        keepbranchesf = opts.get('keepbranches', False)
10677
f2558a8228be rebase: add option to not commit after a collapsing
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10676
diff changeset
   229
        # 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
   230
        # other extensions
f2558a8228be rebase: add option to not commit after a collapsing
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10676
diff changeset
   231
        keepopen = opts.get('keepopen', False)
7468
3e5db4228f8f rebase: add support to keep branch names
Augie Fackler <durin42@gmail.com>
parents: 7298
diff changeset
   232
22382
d5b04ee8ecf7 rebase: add a deprecated -i/--interactive flag
David Soria Parra <davidsp@fb.com>
parents: 22251
diff changeset
   233
        if opts.get('interactive'):
26496
b885ab9ca182 rebase: enable histedit for useful help with it
timeless@mozdev.org
parents: 26495
diff changeset
   234
            try:
b885ab9ca182 rebase: enable histedit for useful help with it
timeless@mozdev.org
parents: 26495
diff changeset
   235
                if extensions.find('histedit'):
b885ab9ca182 rebase: enable histedit for useful help with it
timeless@mozdev.org
parents: 26495
diff changeset
   236
                    enablehistedit = ''
b885ab9ca182 rebase: enable histedit for useful help with it
timeless@mozdev.org
parents: 26495
diff changeset
   237
            except KeyError:
b885ab9ca182 rebase: enable histedit for useful help with it
timeless@mozdev.org
parents: 26495
diff changeset
   238
                enablehistedit = " --config extensions.histedit="
b885ab9ca182 rebase: enable histedit for useful help with it
timeless@mozdev.org
parents: 26495
diff changeset
   239
            help = "hg%s help -e histedit" % enablehistedit
22382
d5b04ee8ecf7 rebase: add a deprecated -i/--interactive flag
David Soria Parra <davidsp@fb.com>
parents: 22251
diff changeset
   240
            msg = _("interactive history editing is supported by the "
26494
832f40d2af53 rebase: factor out histedit help command
timeless@mozdev.org
parents: 26421
diff changeset
   241
                    "'histedit' extension (see \"%s\")") % help
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26496
diff changeset
   242
            raise error.Abort(msg)
22382
d5b04ee8ecf7 rebase: add a deprecated -i/--interactive flag
David Soria Parra <davidsp@fb.com>
parents: 22251
diff changeset
   243
13661
ee349e228835 rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents: 13609
diff changeset
   244
        if collapsemsg and not collapsef:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26496
diff changeset
   245
            raise error.Abort(
13661
ee349e228835 rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents: 13609
diff changeset
   246
                _('message can only be specified with collapse'))
ee349e228835 rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents: 13609
diff changeset
   247
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   248
        if contf or abortf:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   249
            if contf and abortf:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26496
diff changeset
   250
                raise error.Abort(_('cannot use both abort and continue'))
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   251
            if collapsef:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26496
diff changeset
   252
                raise error.Abort(
11285
f118029e534c rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents: 11205
diff changeset
   253
                    _('cannot use collapse with continue or abort'))
8117
2b30d8488819 remove unnecessary outer parenthesis in if-statements
Martin Geisler <mg@lazybytes.net>
parents: 8112
diff changeset
   254
            if srcf or basef or destf:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26496
diff changeset
   255
                raise error.Abort(
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   256
                    _('abort and continue do not allow specifying revisions'))
26165
927c0d84e09f rebase: fix warning about ignoring tool option on rebase continue (issue4698)
liscju <piotr.listkiewicz@gmail.com>
parents: 26029
diff changeset
   257
            if abortf and opts.get('tool', False):
13856
0995eee8ffe4 rebase: add --tool argument for specifying merge tool
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 13778
diff changeset
   258
                ui.warn(_('tool option will be ignored\n'))
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   259
19848
577f4c562d52 rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19641
diff changeset
   260
            try:
577f4c562d52 rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19641
diff changeset
   261
                (originalwd, target, state, skipped, collapsef, keepf,
577f4c562d52 rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19641
diff changeset
   262
                 keepbranchesf, external, activebookmark) = restorestatus(repo)
577f4c562d52 rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19641
diff changeset
   263
            except error.RepoLookupError:
577f4c562d52 rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19641
diff changeset
   264
                if abortf:
577f4c562d52 rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19641
diff changeset
   265
                    clearstatus(repo)
577f4c562d52 rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19641
diff changeset
   266
                    repo.ui.warn(_('rebase aborted (no revision is removed,'
577f4c562d52 rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19641
diff changeset
   267
                                   ' only broken state is cleared)\n'))
577f4c562d52 rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19641
diff changeset
   268
                    return 0
577f4c562d52 rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19641
diff changeset
   269
                else:
577f4c562d52 rebase: catch RepoLookupError at restoring rebase state for abort/continue
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19641
diff changeset
   270
                    msg = _('cannot continue inconsistent rebase')
20313
dcd65ce87260 hgext: fix one typo in rebase
Simon Heimberg <simohe@besonet.ch>
parents: 20250
diff changeset
   271
                    hint = _('use "hg rebase --abort" to clear broken state')
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26496
diff changeset
   272
                    raise error.Abort(msg, hint=hint)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   273
            if abortf:
24758
d7451adc72f6 rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents: 23970
diff changeset
   274
                return abort(repo, originalwd, target, state,
d7451adc72f6 rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents: 23970
diff changeset
   275
                             activebookmark=activebookmark)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   276
        else:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   277
            if srcf and basef:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26496
diff changeset
   278
                raise error.Abort(_('cannot specify both a '
15270
6cb6064f1d50 rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15269
diff changeset
   279
                                   'source and a base'))
6cb6064f1d50 rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15269
diff changeset
   280
            if revf and basef:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26496
diff changeset
   281
                raise error.Abort(_('cannot specify both a '
11285
f118029e534c rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents: 11205
diff changeset
   282
                                   'revision and a base'))
15270
6cb6064f1d50 rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15269
diff changeset
   283
            if revf and srcf:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26496
diff changeset
   284
                raise error.Abort(_('cannot specify both a '
15270
6cb6064f1d50 rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15269
diff changeset
   285
                                   'revision and a source'))
10352
66d954e76ffb rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10351
diff changeset
   286
19478
e5a5790a3185 rebase: add checkunfinished support (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19477
diff changeset
   287
            cmdutil.checkunfinished(repo)
14289
d68ddccf276b cmdutil: bail_if_changed to bailifchanged
Matt Mackall <mpm@selenic.com>
parents: 13895
diff changeset
   288
            cmdutil.bailifchanged(repo)
15267
3bfdfefea2fc rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15219
diff changeset
   289
26718
806ca3a37858 rebase: directly use '_destrebase'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26717
diff changeset
   290
            if destf:
806ca3a37858 rebase: directly use '_destrebase'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26717
diff changeset
   291
                dest = scmutil.revsingle(repo, destf)
806ca3a37858 rebase: directly use '_destrebase'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26717
diff changeset
   292
            else:
806ca3a37858 rebase: directly use '_destrebase'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26717
diff changeset
   293
                dest = repo[_destrebase(repo)]
806ca3a37858 rebase: directly use '_destrebase'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26717
diff changeset
   294
                destf = str(dest)
15267
3bfdfefea2fc rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15219
diff changeset
   295
15271
84d4a4ce45fd rebase: simplify set generation
Matt Mackall <mpm@selenic.com>
parents: 15270
diff changeset
   296
            if revf:
19641
5528c31c629c rebase: handle bookmarks matching revset function names (issue3950)
Bryan O'Sullivan <bryano@fb.com>
parents: 19518
diff changeset
   297
                rebaseset = scmutil.revrange(repo, revf)
20247
a259f7b488ab rebase: improve error message for empty --rev set
Mads Kiilerich <madski@unity3d.com>
parents: 19986
diff changeset
   298
                if not rebaseset:
21197
cb4223c65f79 rebase: don't abort if we're asked to rebase an empty revset
Julien Cristau <julien.cristau@logilab.fr>
parents: 21027
diff changeset
   299
                    ui.status(_('empty "rev" revision set - '
cb4223c65f79 rebase: don't abort if we're asked to rebase an empty revset
Julien Cristau <julien.cristau@logilab.fr>
parents: 21027
diff changeset
   300
                                'nothing to rebase\n'))
26671
66dc39cd7d06 rebase: factor out nothing to rebase return code
Ryan McElroy <rmcelroy@fb.com>
parents: 26669
diff changeset
   301
                    return _nothingtorebase()
15271
84d4a4ce45fd rebase: simplify set generation
Matt Mackall <mpm@selenic.com>
parents: 15270
diff changeset
   302
            elif srcf:
15800
e4fc0f0b4f7e rebase: reinstate old-style rev spec support for the source and base (issue3181)
Steven Brown <StevenGBrown@gmail.com>
parents: 15469
diff changeset
   303
                src = scmutil.revrange(repo, [srcf])
20248
3bff26f67169 rebase: improve error message for empty --source set
Mads Kiilerich <madski@unity3d.com>
parents: 20247
diff changeset
   304
                if not src:
21210
799c494189a9 rebase: empty revset should be a gentle no-op with exit code 1, not an error
Mads Kiilerich <madski@unity3d.com>
parents: 21197
diff changeset
   305
                    ui.status(_('empty "source" revision set - '
799c494189a9 rebase: empty revset should be a gentle no-op with exit code 1, not an error
Mads Kiilerich <madski@unity3d.com>
parents: 21197
diff changeset
   306
                                'nothing to rebase\n'))
26671
66dc39cd7d06 rebase: factor out nothing to rebase return code
Ryan McElroy <rmcelroy@fb.com>
parents: 26669
diff changeset
   307
                    return _nothingtorebase()
15801
bfd3ce759682 merge with stable
Matt Mackall <mpm@selenic.com>
parents: 15777 15800
diff changeset
   308
                rebaseset = repo.revs('(%ld)::', src)
20248
3bff26f67169 rebase: improve error message for empty --source set
Mads Kiilerich <madski@unity3d.com>
parents: 20247
diff changeset
   309
                assert rebaseset
15267
3bfdfefea2fc rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15219
diff changeset
   310
            else:
15800
e4fc0f0b4f7e rebase: reinstate old-style rev spec support for the source and base (issue3181)
Steven Brown <StevenGBrown@gmail.com>
parents: 15469
diff changeset
   311
                base = scmutil.revrange(repo, [basef or '.'])
20249
dc5157841361 rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents: 20248
diff changeset
   312
                if not base:
21210
799c494189a9 rebase: empty revset should be a gentle no-op with exit code 1, not an error
Mads Kiilerich <madski@unity3d.com>
parents: 21197
diff changeset
   313
                    ui.status(_('empty "base" revision set - '
799c494189a9 rebase: empty revset should be a gentle no-op with exit code 1, not an error
Mads Kiilerich <madski@unity3d.com>
parents: 21197
diff changeset
   314
                                "can't compute rebase set\n"))
26671
66dc39cd7d06 rebase: factor out nothing to rebase return code
Ryan McElroy <rmcelroy@fb.com>
parents: 26669
diff changeset
   315
                    return _nothingtorebase()
23072
d583f1cfca96 rebase: improve base revset performance
Durham Goode <durham@fb.com>
parents: 22952
diff changeset
   316
                commonanc = repo.revs('ancestor(%ld, %d)', base, dest).first()
23246
643c58303fb0 rebase: fix rebase with no common ancestors (issue4446)
Durham Goode <durham@fb.com>
parents: 23072
diff changeset
   317
                if commonanc is not None:
643c58303fb0 rebase: fix rebase with no common ancestors (issue4446)
Durham Goode <durham@fb.com>
parents: 23072
diff changeset
   318
                    rebaseset = repo.revs('(%d::(%ld) - %d)::',
643c58303fb0 rebase: fix rebase with no common ancestors (issue4446)
Durham Goode <durham@fb.com>
parents: 23072
diff changeset
   319
                                          commonanc, base, commonanc)
643c58303fb0 rebase: fix rebase with no common ancestors (issue4446)
Durham Goode <durham@fb.com>
parents: 23072
diff changeset
   320
                else:
643c58303fb0 rebase: fix rebase with no common ancestors (issue4446)
Durham Goode <durham@fb.com>
parents: 23072
diff changeset
   321
                    rebaseset = []
643c58303fb0 rebase: fix rebase with no common ancestors (issue4446)
Durham Goode <durham@fb.com>
parents: 23072
diff changeset
   322
20249
dc5157841361 rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents: 20248
diff changeset
   323
                if not rebaseset:
22823
18ac67b0814c rebase: transform the smartset to a list before comparing with a list
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22820
diff changeset
   324
                    # transform to list because smartsets are not comparable to
23139
e53f6b72a0e4 spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 23072
diff changeset
   325
                    # lists. This should be improved to honor laziness of
22823
18ac67b0814c rebase: transform the smartset to a list before comparing with a list
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22820
diff changeset
   326
                    # smartset.
18ac67b0814c rebase: transform the smartset to a list before comparing with a list
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22820
diff changeset
   327
                    if list(base) == [dest.rev()]:
20249
dc5157841361 rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents: 20248
diff changeset
   328
                        if basef:
dc5157841361 rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents: 20248
diff changeset
   329
                            ui.status(_('nothing to rebase - %s is both "base"'
dc5157841361 rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents: 20248
diff changeset
   330
                                        ' and destination\n') % dest)
dc5157841361 rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents: 20248
diff changeset
   331
                        else:
dc5157841361 rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents: 20248
diff changeset
   332
                            ui.status(_('nothing to rebase - working directory '
dc5157841361 rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents: 20248
diff changeset
   333
                                        'parent is also destination\n'))
dc5157841361 rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents: 20248
diff changeset
   334
                    elif not repo.revs('%ld - ::%d', base, dest):
dc5157841361 rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents: 20248
diff changeset
   335
                        if basef:
dc5157841361 rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents: 20248
diff changeset
   336
                            ui.status(_('nothing to rebase - "base" %s is '
dc5157841361 rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents: 20248
diff changeset
   337
                                        'already an ancestor of destination '
dc5157841361 rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents: 20248
diff changeset
   338
                                        '%s\n') %
dc5157841361 rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents: 20248
diff changeset
   339
                                      ('+'.join(str(repo[r]) for r in base),
dc5157841361 rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents: 20248
diff changeset
   340
                                       dest))
dc5157841361 rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents: 20248
diff changeset
   341
                        else:
dc5157841361 rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents: 20248
diff changeset
   342
                            ui.status(_('nothing to rebase - working '
dc5157841361 rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents: 20248
diff changeset
   343
                                        'directory parent is already an '
dc5157841361 rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents: 20248
diff changeset
   344
                                        'ancestor of destination %s\n') % dest)
dc5157841361 rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents: 20248
diff changeset
   345
                    else: # can it happen?
dc5157841361 rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents: 20248
diff changeset
   346
                        ui.status(_('nothing to rebase from %s to %s\n') %
dc5157841361 rebase: improve error message for --base being empty or causing emptiness
Mads Kiilerich <madski@unity3d.com>
parents: 20248
diff changeset
   347
                                  ('+'.join(str(repo[r]) for r in base), dest))
26671
66dc39cd7d06 rebase: factor out nothing to rebase return code
Ryan McElroy <rmcelroy@fb.com>
parents: 26669
diff changeset
   348
                    return _nothingtorebase()
15271
84d4a4ce45fd rebase: simplify set generation
Matt Mackall <mpm@selenic.com>
parents: 15270
diff changeset
   349
22952
8792ac090e3b obsolete: add allowunstable option
Durham Goode <durham@fb.com>
parents: 22951
diff changeset
   350
            allowunstable = obsolete.isenabled(repo, obsolete.allowunstableopt)
8792ac090e3b obsolete: add allowunstable option
Durham Goode <durham@fb.com>
parents: 22951
diff changeset
   351
            if (not (keepf or allowunstable)
18269
9454e40e047b clfilter: drop unnecessary explicit filtering on rebase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18164
diff changeset
   352
                  and repo.revs('first(children(%ld) - %ld)',
18164
bacf55bd8f90 rebase: allow non-head rebase-set when obsolete is enabled
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18093
diff changeset
   353
                                rebaseset, rebaseset)):
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26496
diff changeset
   354
                raise error.Abort(
15272
2889d4574726 rebase: simplify check for orphaned descendants
Matt Mackall <mpm@selenic.com>
parents: 15271
diff changeset
   355
                    _("can't remove original changesets with"
2889d4574726 rebase: simplify check for orphaned descendants
Matt Mackall <mpm@selenic.com>
parents: 15271
diff changeset
   356
                      " unrebased descendants"),
2889d4574726 rebase: simplify check for orphaned descendants
Matt Mackall <mpm@selenic.com>
parents: 15271
diff changeset
   357
                    hint=_('use --keep to keep original changesets'))
2889d4574726 rebase: simplify check for orphaned descendants
Matt Mackall <mpm@selenic.com>
parents: 15271
diff changeset
   358
26349
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
   359
            obsoletenotrebased = {}
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
   360
            if ui.configbool('experimental', 'rebaseskipobsolete'):
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
   361
                rebasesetrevs = set(rebaseset)
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
   362
                obsoletenotrebased = _computeobsoletenotrebased(repo,
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
   363
                                                                rebasesetrevs,
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
   364
                                                                dest)
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
   365
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
   366
                # - plain prune (no successor) changesets are rebased
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
   367
                # - split changesets are not rebased if at least one of the
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
   368
                # changeset resulting from the split is an ancestor of dest
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
   369
                rebaseset = rebasesetrevs - set(obsoletenotrebased)
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
   370
            result = buildstate(repo, dest, rebaseset, collapsef,
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
   371
                                obsoletenotrebased)
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
   372
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   373
            if not result:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   374
                # 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
   375
                ui.status(_('nothing to rebase\n'))
26671
66dc39cd7d06 rebase: factor out nothing to rebase return code
Ryan McElroy <rmcelroy@fb.com>
parents: 26669
diff changeset
   376
                return _nothingtorebase()
20250
f380b191e085 rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents: 20249
diff changeset
   377
f380b191e085 rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents: 20249
diff changeset
   378
            root = min(rebaseset)
f380b191e085 rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents: 20249
diff changeset
   379
            if not keepf and not repo[root].mutable():
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26496
diff changeset
   380
                raise error.Abort(_("can't rebase public changeset %s")
19059
53eadcb814fd rebase: check no-op before checking phase (issue3891)
Siddharth Agarwal <sid0@fb.com>
parents: 18933
diff changeset
   381
                                 % repo[root],
23917
3cbb5bf4035d messages: quote "hg help" hints consistently
Wagner Bruna <wbruna@yahoo.com>
parents: 23877
diff changeset
   382
                                 hint=_('see "hg help phases" for details'))
20250
f380b191e085 rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents: 20249
diff changeset
   383
f380b191e085 rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents: 20249
diff changeset
   384
            originalwd, target, state = result
f380b191e085 rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents: 20249
diff changeset
   385
            if collapsef:
f380b191e085 rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents: 20249
diff changeset
   386
                targetancestors = repo.changelog.ancestors([target],
f380b191e085 rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents: 20249
diff changeset
   387
                                                           inclusive=True)
f380b191e085 rebase: remove old code for handling empty rebaseset
Mads Kiilerich <madski@unity3d.com>
parents: 20249
diff changeset
   388
                external = externalparent(repo, state, targetancestors)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   389
21027
25ee5dbebc6b rebase: tell when reopening a closed branch head
Mads Kiilerich <madski@unity3d.com>
parents: 20790
diff changeset
   390
            if dest.closesbranch() and not keepbranchesf:
25ee5dbebc6b rebase: tell when reopening a closed branch head
Mads Kiilerich <madski@unity3d.com>
parents: 20790
diff changeset
   391
                ui.status(_('reopening closed branch head %s\n') % dest)
25ee5dbebc6b rebase: tell when reopening a closed branch head
Mads Kiilerich <madski@unity3d.com>
parents: 20790
diff changeset
   392
7952
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
   393
        if keepbranchesf:
19860
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
   394
            # insert _savebranch at the start of extrafns so if
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
   395
            # there's a user-provided extrafn it can clobber branch if
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
   396
            # desired
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
   397
            extrafns.insert(0, _savebranch)
14897
b9daa5b7a3af rebase: block collapse with keepbranches on multiple named branches (issue2112)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14884
diff changeset
   398
            if collapsef:
b9daa5b7a3af rebase: block collapse with keepbranches on multiple named branches (issue2112)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14884
diff changeset
   399
                branches = set()
b9daa5b7a3af rebase: block collapse with keepbranches on multiple named branches (issue2112)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14884
diff changeset
   400
                for rev in state:
b9daa5b7a3af rebase: block collapse with keepbranches on multiple named branches (issue2112)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14884
diff changeset
   401
                    branches.add(repo[rev].branch())
b9daa5b7a3af rebase: block collapse with keepbranches on multiple named branches (issue2112)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14884
diff changeset
   402
                    if len(branches) > 1:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26496
diff changeset
   403
                        raise error.Abort(_('cannot collapse multiple named '
14897
b9daa5b7a3af rebase: block collapse with keepbranches on multiple named branches (issue2112)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14884
diff changeset
   404
                            'branches'))
b9daa5b7a3af rebase: block collapse with keepbranches on multiple named branches (issue2112)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14884
diff changeset
   405
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   406
        # Rebase
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   407
        if not targetancestors:
18093
9c76da468a19 rebase: use lazy ancestor membership testing
Siddharth Agarwal <sid0@fb.com>
parents: 17989
diff changeset
   408
            targetancestors = repo.changelog.ancestors([target], inclusive=True)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   409
14884
c0ccd70df52c rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14635
diff changeset
   410
        # Keep track of the current bookmarks in order to reset them later
c0ccd70df52c rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14635
diff changeset
   411
        currentbookmarks = repo._bookmarks.copy()
24947
a02d293a1079 bookmarks: rename bookmarkcurrent to activebookmark (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24945
diff changeset
   412
        activebookmark = activebookmark or repo._activebookmark
17046
4116504d1ec4 bookmarks: correctly update current bookmarks on rebase (issue2277)
David Schleimer <dschleimer@fb.com>
parents: 17026
diff changeset
   413
        if activebookmark:
24944
08ec11e3ae4c bookmarks: rename unsetcurrent to deactivate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24870
diff changeset
   414
            bookmarks.deactivate(repo)
14884
c0ccd70df52c rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14635
diff changeset
   415
19860
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
   416
        extrafn = _makeextrafn(extrafns)
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
   417
11729
c91b86a291b0 rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents: 11546
diff changeset
   418
        sortedstate = sorted(state)
c91b86a291b0 rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents: 11546
diff changeset
   419
        total = len(sortedstate)
c91b86a291b0 rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents: 11546
diff changeset
   420
        pos = 0
c91b86a291b0 rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents: 11546
diff changeset
   421
        for rev in sortedstate:
23517
4f18e80d9c30 rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents: 23491
diff changeset
   422
            ctx = repo[rev]
4f18e80d9c30 rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents: 23491
diff changeset
   423
            desc = '%d:%s "%s"' % (ctx.rev(), ctx,
4f18e80d9c30 rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents: 23491
diff changeset
   424
                                   ctx.description().split('\n', 1)[0])
4f18e80d9c30 rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents: 23491
diff changeset
   425
            names = repo.nodetags(ctx.node()) + repo.nodebookmarks(ctx.node())
4f18e80d9c30 rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents: 23491
diff changeset
   426
            if names:
4f18e80d9c30 rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents: 23491
diff changeset
   427
                desc += ' (%s)' % ' '.join(names)
11729
c91b86a291b0 rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents: 11546
diff changeset
   428
            pos += 1
23490
102f144f6e02 rebase: add a 'revtodo' constant
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23489
diff changeset
   429
            if state[rev] == revtodo:
23517
4f18e80d9c30 rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents: 23491
diff changeset
   430
                ui.status(_('rebasing %s\n') % desc)
4f18e80d9c30 rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents: 23491
diff changeset
   431
                ui.progress(_("rebasing"), pos, ("%d:%s" % (rev, ctx)),
12744
0793d763e413 progress: dropping superfluous space from units
timeless <timeless@gmail.com>
parents: 12062
diff changeset
   432
                            _('changesets'), total)
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   433
                p1, p2, base = defineparents(repo, rev, target, state,
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   434
                                             targetancestors)
7952
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
   435
                storestatus(repo, originalwd, target, state, collapsef, keepf,
18755
72412afe4c28 rebase: restore active bookmark after rebase --continue
Durham Goode <durham@fb.com>
parents: 18549
diff changeset
   436
                            keepbranchesf, external, activebookmark)
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   437
                if len(repo.parents()) == 2:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   438
                    repo.ui.debug('resuming interrupted rebase\n')
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   439
                else:
13856
0995eee8ffe4 rebase: add --tool argument for specifying merge tool
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 13778
diff changeset
   440
                    try:
20790
49f2d5644f04 config: set a 'source' in most cases where config don't come from file but code
Mads Kiilerich <madski@unity3d.com>
parents: 20773
diff changeset
   441
                        ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
49f2d5644f04 config: set a 'source' in most cases where config don't come from file but code
Mads Kiilerich <madski@unity3d.com>
parents: 20773
diff changeset
   442
                                     'rebase')
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   443
                        stats = rebasenode(repo, rev, p1, base, state,
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   444
                                           collapsef, target)
13856
0995eee8ffe4 rebase: add --tool argument for specifying merge tool
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 13778
diff changeset
   445
                        if stats and stats[3] > 0:
18933
42b620fc89e2 rebase: switch from util.Abort to util.InterventionRequired where appropriate (bc)
Augie Fackler <raf@durin42.com>
parents: 18764
diff changeset
   446
                            raise error.InterventionRequired(
42b620fc89e2 rebase: switch from util.Abort to util.InterventionRequired where appropriate (bc)
Augie Fackler <raf@durin42.com>
parents: 18764
diff changeset
   447
                                _('unresolved conflicts (see hg '
42b620fc89e2 rebase: switch from util.Abort to util.InterventionRequired where appropriate (bc)
Augie Fackler <raf@durin42.com>
parents: 18764
diff changeset
   448
                                  'resolve, then hg rebase --continue)'))
13856
0995eee8ffe4 rebase: add --tool argument for specifying merge tool
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 13778
diff changeset
   449
                    finally:
20790
49f2d5644f04 config: set a 'source' in most cases where config don't come from file but code
Mads Kiilerich <madski@unity3d.com>
parents: 20773
diff changeset
   450
                        ui.setconfig('ui', 'forcemerge', '', 'rebase')
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   451
                if not collapsef:
23461
ffef6d503ab2 rebase: avoid redundant repo[rev].rev() - just keep working in rev space
Mads Kiilerich <madski@unity3d.com>
parents: 23460
diff changeset
   452
                    merging = p2 != nullrev
22251
d0d3e5c6eb3c rebase: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22206
diff changeset
   453
                    editform = cmdutil.mergeeditform(merging, 'rebase')
d0d3e5c6eb3c rebase: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22206
diff changeset
   454
                    editor = cmdutil.getcommiteditor(editform=editform, **opts)
23459
2e047b1558a5 rebase: clarify naming of variables holding node hashes - don't call them rev
Mads Kiilerich <madski@unity3d.com>
parents: 23457
diff changeset
   455
                    newnode = concludenode(repo, rev, p1, p2, extrafn=extrafn,
26360
b2415e94b2f5 rebase: avoid losing branch commits with --keepbranch (issue4835)
timeless@mozdev.org
parents: 26349
diff changeset
   456
                                           editor=editor,
b2415e94b2f5 rebase: avoid losing branch commits with --keepbranch (issue4835)
timeless@mozdev.org
parents: 26349
diff changeset
   457
                                           keepbranches=keepbranchesf)
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   458
                else:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   459
                    # Skip commit if we are collapsing
22405
6f63c47cbb86 dirstate: wrap setparent calls with begin/endparentchange (issue4353)
Durham Goode <durham@fb.com>
parents: 22388
diff changeset
   460
                    repo.dirstate.beginparentchange()
16551
ebf6d38c9063 localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents: 16531
diff changeset
   461
                    repo.setparents(repo[p1].node())
22405
6f63c47cbb86 dirstate: wrap setparent calls with begin/endparentchange (issue4353)
Durham Goode <durham@fb.com>
parents: 22388
diff changeset
   462
                    repo.dirstate.endparentchange()
23459
2e047b1558a5 rebase: clarify naming of variables holding node hashes - don't call them rev
Mads Kiilerich <madski@unity3d.com>
parents: 23457
diff changeset
   463
                    newnode = None
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   464
                # Update the state
23459
2e047b1558a5 rebase: clarify naming of variables holding node hashes - don't call them rev
Mads Kiilerich <madski@unity3d.com>
parents: 23457
diff changeset
   465
                if newnode is not None:
2e047b1558a5 rebase: clarify naming of variables holding node hashes - don't call them rev
Mads Kiilerich <madski@unity3d.com>
parents: 23457
diff changeset
   466
                    state[rev] = repo[newnode].rev()
23519
8872d1bf30da rebase: improve debug messages while processing the list of rebases
Mads Kiilerich <madski@unity3d.com>
parents: 23518
diff changeset
   467
                    ui.debug('rebased as %s\n' % short(newnode))
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   468
                else:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   469
                    if not collapsef:
26811
d1561a422748 rebase: fix wrong 'no changes to commit' when using --collapse
Mads Kiilerich <madski@unity3d.com>
parents: 26781
diff changeset
   470
                        ui.warn(_('note: rebase of %d:%s created no changes '
d1561a422748 rebase: fix wrong 'no changes to commit' when using --collapse
Mads Kiilerich <madski@unity3d.com>
parents: 26781
diff changeset
   471
                                  'to commit\n') % (rev, ctx))
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   472
                        skipped.add(rev)
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   473
                    state[rev] = p1
23519
8872d1bf30da rebase: improve debug messages while processing the list of rebases
Mads Kiilerich <madski@unity3d.com>
parents: 23518
diff changeset
   474
                    ui.debug('next revision set to %s\n' % p1)
23517
4f18e80d9c30 rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents: 23491
diff changeset
   475
            elif state[rev] == nullmerge:
23519
8872d1bf30da rebase: improve debug messages while processing the list of rebases
Mads Kiilerich <madski@unity3d.com>
parents: 23518
diff changeset
   476
                ui.debug('ignoring null merge rebase of %s\n' % rev)
23517
4f18e80d9c30 rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents: 23491
diff changeset
   477
            elif state[rev] == revignored:
4f18e80d9c30 rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents: 23491
diff changeset
   478
                ui.status(_('not rebasing ignored %s\n') % desc)
26349
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
   479
            elif state[rev] == revprecursor:
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
   480
                targetctx = repo[obsoletenotrebased[rev]]
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
   481
                desctarget = '%d:%s "%s"' % (targetctx.rev(), targetctx,
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
   482
                             targetctx.description().split('\n', 1)[0])
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
   483
                msg = _('note: not rebasing %s, already in destination as %s\n')
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
   484
                ui.status(msg % (desc, desctarget))
23517
4f18e80d9c30 rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents: 23491
diff changeset
   485
            else:
4f18e80d9c30 rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents: 23491
diff changeset
   486
                ui.status(_('already rebased %s as %s\n') %
4f18e80d9c30 rebase: show more useful status information while rebasing
Mads Kiilerich <madski@unity3d.com>
parents: 23491
diff changeset
   487
                          (desc, repo[state[rev]]))
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   488
11729
c91b86a291b0 rebase/progress: Adding progress for rebasing
timeless <timeless@gmail.com>
parents: 11546
diff changeset
   489
        ui.progress(_('rebasing'), None)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   490
        ui.note(_('rebase merging completed\n'))
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   491
10677
f2558a8228be rebase: add option to not commit after a collapsing
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10676
diff changeset
   492
        if collapsef and not keepopen:
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   493
            p1, p2, _base = defineparents(repo, min(state), target,
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   494
                                          state, targetancestors)
22206
6122ad50e38f rebase: use "rebase.collapse" as "editform" for "--collapse" always
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22038
diff changeset
   495
            editopt = opts.get('edit')
6122ad50e38f rebase: use "rebase.collapse" as "editform" for "--collapse" always
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22038
diff changeset
   496
            editform = 'rebase.collapse'
13661
ee349e228835 rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents: 13609
diff changeset
   497
            if collapsemsg:
ee349e228835 rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents: 13609
diff changeset
   498
                commitmsg = collapsemsg
ee349e228835 rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents: 13609
diff changeset
   499
            else:
ee349e228835 rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents: 13609
diff changeset
   500
                commitmsg = 'Collapsed revision'
ee349e228835 rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents: 13609
diff changeset
   501
                for rebased in state:
18446
c83d36b81df1 rebase: lose the comparison to `nullmerge`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18444
diff changeset
   502
                    if rebased not in skipped and state[rebased] > nullmerge:
13661
ee349e228835 rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents: 13609
diff changeset
   503
                        commitmsg += '\n* %s' % repo[rebased].description()
22206
6122ad50e38f rebase: use "rebase.collapse" as "editform" for "--collapse" always
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22038
diff changeset
   504
                editopt = True
6122ad50e38f rebase: use "rebase.collapse" as "editform" for "--collapse" always
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22038
diff changeset
   505
            editor = cmdutil.getcommiteditor(edit=editopt, editform=editform)
23459
2e047b1558a5 rebase: clarify naming of variables holding node hashes - don't call them rev
Mads Kiilerich <madski@unity3d.com>
parents: 23457
diff changeset
   506
            newnode = concludenode(repo, rev, p1, external, commitmsg=commitmsg,
26360
b2415e94b2f5 rebase: avoid losing branch commits with --keepbranch (issue4835)
timeless@mozdev.org
parents: 26349
diff changeset
   507
                                   extrafn=extrafn, editor=editor,
b2415e94b2f5 rebase: avoid losing branch commits with --keepbranch (issue4835)
timeless@mozdev.org
parents: 26349
diff changeset
   508
                                   keepbranches=keepbranchesf)
23460
8dc45c905989 rebase: always store rev in state, also when collapsing
Mads Kiilerich <madski@unity3d.com>
parents: 23459
diff changeset
   509
            if newnode is None:
8dc45c905989 rebase: always store rev in state, also when collapsing
Mads Kiilerich <madski@unity3d.com>
parents: 23459
diff changeset
   510
                newrev = target
8dc45c905989 rebase: always store rev in state, also when collapsing
Mads Kiilerich <madski@unity3d.com>
parents: 23459
diff changeset
   511
            else:
8dc45c905989 rebase: always store rev in state, also when collapsing
Mads Kiilerich <madski@unity3d.com>
parents: 23459
diff changeset
   512
                newrev = repo[newnode].rev()
19986
ea81f8b2364e rebase: fix working copy location after a --collapse (issue4080)
Durham Goode <durham@fb.com>
parents: 19984
diff changeset
   513
            for oldrev in state.iterkeys():
ea81f8b2364e rebase: fix working copy location after a --collapse (issue4080)
Durham Goode <durham@fb.com>
parents: 19984
diff changeset
   514
                if state[oldrev] > nullmerge:
23460
8dc45c905989 rebase: always store rev in state, also when collapsing
Mads Kiilerich <madski@unity3d.com>
parents: 23459
diff changeset
   515
                    state[oldrev] = newrev
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   516
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   517
        if 'qtip' in repo.tags():
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   518
            updatemq(repo, state, skipped, **opts)
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   519
14884
c0ccd70df52c rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14635
diff changeset
   520
        if currentbookmarks:
c0ccd70df52c rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14635
diff changeset
   521
            # Nodeids are needed to reset bookmarks
c0ccd70df52c rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14635
diff changeset
   522
            nstate = {}
c0ccd70df52c rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14635
diff changeset
   523
            for k, v in state.iteritems():
18446
c83d36b81df1 rebase: lose the comparison to `nullmerge`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18444
diff changeset
   524
                if v > nullmerge:
14884
c0ccd70df52c rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14635
diff changeset
   525
                    nstate[repo[k].node()] = repo[v].node()
18549
12de53323e59 rebase: derive node from target rev (issue3802)
Siddharth Agarwal <sid0@fb.com>
parents: 18518
diff changeset
   526
            # XXX this is the same as dest.node() for the non-continue path --
12de53323e59 rebase: derive node from target rev (issue3802)
Siddharth Agarwal <sid0@fb.com>
parents: 18518
diff changeset
   527
            # this should probably be cleaned up
12de53323e59 rebase: derive node from target rev (issue3802)
Siddharth Agarwal <sid0@fb.com>
parents: 18518
diff changeset
   528
            targetnode = repo[target].node()
14884
c0ccd70df52c rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14635
diff changeset
   529
19925
9c78ed396075 rebase: preserve working directory parent (BC)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19861
diff changeset
   530
        # restore original working directory
9c78ed396075 rebase: preserve working directory parent (BC)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19861
diff changeset
   531
        # (we do this before stripping)
9c78ed396075 rebase: preserve working directory parent (BC)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19861
diff changeset
   532
        newwd = state.get(originalwd, originalwd)
23440
57d35d3c1cf1 rebase: ignore negative state when updating back to original wc parent
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23246
diff changeset
   533
        if newwd < 0:
57d35d3c1cf1 rebase: ignore negative state when updating back to original wc parent
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23246
diff changeset
   534
            # original directory is a parent of rebase set root or ignored
57d35d3c1cf1 rebase: ignore negative state when updating back to original wc parent
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23246
diff changeset
   535
            newwd = originalwd
19925
9c78ed396075 rebase: preserve working directory parent (BC)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19861
diff changeset
   536
        if newwd not in [c.rev() for c in repo[None].parents()]:
9c78ed396075 rebase: preserve working directory parent (BC)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19861
diff changeset
   537
            ui.note(_("update back to initial working directory parent\n"))
9c78ed396075 rebase: preserve working directory parent (BC)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19861
diff changeset
   538
            hg.updaterepo(repo, newwd, False)
9c78ed396075 rebase: preserve working directory parent (BC)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19861
diff changeset
   539
7952
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
   540
        if not keepf:
17613
aafc521668d8 rebase: properly handle --collapse when creating obsolescence marker
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17612
diff changeset
   541
            collapsedas = None
aafc521668d8 rebase: properly handle --collapse when creating obsolescence marker
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17612
diff changeset
   542
            if collapsef:
23459
2e047b1558a5 rebase: clarify naming of variables holding node hashes - don't call them rev
Mads Kiilerich <madski@unity3d.com>
parents: 23457
diff changeset
   543
                collapsedas = newnode
18444
55aff0c2b73c rebase: do not invent successor to skipped changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18424
diff changeset
   544
            clearrebased(ui, repo, state, skipped, collapsedas)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   545
14884
c0ccd70df52c rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14635
diff changeset
   546
        if currentbookmarks:
18549
12de53323e59 rebase: derive node from target rev (issue3802)
Siddharth Agarwal <sid0@fb.com>
parents: 18518
diff changeset
   547
            updatebookmarks(repo, targetnode, nstate, currentbookmarks)
20523
f2a0a0e76b4c rebase: do not try to reactivate deleted divergent bookmark
Yuya Nishihara <yuya@tcha.org>
parents: 20327
diff changeset
   548
            if activebookmark not in repo._bookmarks:
f2a0a0e76b4c rebase: do not try to reactivate deleted divergent bookmark
Yuya Nishihara <yuya@tcha.org>
parents: 20327
diff changeset
   549
                # active bookmark was divergent one and has been deleted
f2a0a0e76b4c rebase: do not try to reactivate deleted divergent bookmark
Yuya Nishihara <yuya@tcha.org>
parents: 20327
diff changeset
   550
                activebookmark = None
14884
c0ccd70df52c rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14635
diff changeset
   551
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   552
        clearstatus(repo)
11203
7a9cf012dddc rebase: only show "rebase completed" message with -v
Matt Mackall <mpm@selenic.com>
parents: 11201
diff changeset
   553
        ui.note(_("rebase completed\n"))
18386
03442135dff4 refactoring: use unlinkpath with ignoremissing
Mads Kiilerich <madski@unity3d.com>
parents: 18269
diff changeset
   554
        util.unlinkpath(repo.sjoin('undo'), ignoremissing=True)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   555
        if skipped:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   556
            ui.note(_("%d revisions have been skipped\n") % len(skipped))
17046
4116504d1ec4 bookmarks: correctly update current bookmarks on rebase (issue2277)
David Schleimer <dschleimer@fb.com>
parents: 17026
diff changeset
   557
4116504d1ec4 bookmarks: correctly update current bookmarks on rebase (issue2277)
David Schleimer <dschleimer@fb.com>
parents: 17026
diff changeset
   558
        if (activebookmark and
19926
0f99747202f9 rebase: preserve active bookmark when not at head (issue3813)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19925
diff changeset
   559
            repo['.'].node() == repo._bookmarks[activebookmark]):
24945
e0b0fbd47491 bookmarks: rename setcurrent to activate (API)
Ryan McElroy <rmcelroy@fb.com>
parents: 24944
diff changeset
   560
                bookmarks.activate(repo, activebookmark)
17046
4116504d1ec4 bookmarks: correctly update current bookmarks on rebase (issue2277)
David Schleimer <dschleimer@fb.com>
parents: 17026
diff changeset
   561
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   562
    finally:
8112
6ee71f78497c switch lock releasing in the extensions from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 8076
diff changeset
   563
        release(lock, wlock)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   564
19955
2160c2e0d7d1 rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents: 19951
diff changeset
   565
def externalparent(repo, state, targetancestors):
2160c2e0d7d1 rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents: 19951
diff changeset
   566
    """Return the revision that should be used as the second parent
2160c2e0d7d1 rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents: 19951
diff changeset
   567
    when the revisions in state is collapsed on top of targetancestors.
2160c2e0d7d1 rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents: 19951
diff changeset
   568
    Abort if there is more than one parent.
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   569
    """
19955
2160c2e0d7d1 rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents: 19951
diff changeset
   570
    parents = set()
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   571
    source = min(state)
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   572
    for rev in state:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   573
        if rev == source:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   574
            continue
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   575
        for p in repo[rev].parents():
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   576
            if (p.rev() not in state
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   577
                        and p.rev() not in targetancestors):
19955
2160c2e0d7d1 rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents: 19951
diff changeset
   578
                parents.add(p.rev())
2160c2e0d7d1 rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents: 19951
diff changeset
   579
    if not parents:
2160c2e0d7d1 rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents: 19951
diff changeset
   580
        return nullrev
2160c2e0d7d1 rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents: 19951
diff changeset
   581
    if len(parents) == 1:
2160c2e0d7d1 rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents: 19951
diff changeset
   582
        return parents.pop()
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26496
diff changeset
   583
    raise error.Abort(_('unable to collapse on top of %s, there is more '
19956
78ab0f85e249 rebase: improve error message for more than one external parent
Mads Kiilerich <madski@unity3d.com>
parents: 19955
diff changeset
   584
                       'than one external parent: %s') %
78ab0f85e249 rebase: improve error message for more than one external parent
Mads Kiilerich <madski@unity3d.com>
parents: 19955
diff changeset
   585
                     (max(targetancestors),
78ab0f85e249 rebase: improve error message for more than one external parent
Mads Kiilerich <madski@unity3d.com>
parents: 19955
diff changeset
   586
                      ', '.join(str(p) for p in sorted(parents))))
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   587
26360
b2415e94b2f5 rebase: avoid losing branch commits with --keepbranch (issue4835)
timeless@mozdev.org
parents: 26349
diff changeset
   588
def concludenode(repo, rev, p1, p2, commitmsg=None, editor=None, extrafn=None,
b2415e94b2f5 rebase: avoid losing branch commits with --keepbranch (issue4835)
timeless@mozdev.org
parents: 26349
diff changeset
   589
                 keepbranches=False):
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   590
    '''Commit the wd changes with parents p1 and p2. Reuse commit info from rev
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   591
    but also store useful information in extra.
23459
2e047b1558a5 rebase: clarify naming of variables holding node hashes - don't call them rev
Mads Kiilerich <madski@unity3d.com>
parents: 23457
diff changeset
   592
    Return node of committed revision.'''
24998
c8a97fa742b7 rebase: use dirstateguard instead of dirstate.invalidate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24947
diff changeset
   593
    dsguard = cmdutil.dirstateguard(repo, 'rebase')
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   594
    try:
16551
ebf6d38c9063 localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents: 16531
diff changeset
   595
        repo.setparents(repo[p1].node(), repo[p2].node())
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
   596
        ctx = repo[rev]
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   597
        if commitmsg is None:
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
   598
            commitmsg = ctx.description()
26360
b2415e94b2f5 rebase: avoid losing branch commits with --keepbranch (issue4835)
timeless@mozdev.org
parents: 26349
diff changeset
   599
        keepbranch = keepbranches and repo[p1].branch() != ctx.branch()
10762
129e96f7a87a rebase: fix --collapse with --keepbranches (issue2100)
Patrick Mezard <pmezard@gmail.com>
parents: 10672
diff changeset
   600
        extra = {'rebase_source': ctx.hex()}
129e96f7a87a rebase: fix --collapse with --keepbranches (issue2100)
Patrick Mezard <pmezard@gmail.com>
parents: 10672
diff changeset
   601
        if extrafn:
129e96f7a87a rebase: fix --collapse with --keepbranches (issue2100)
Patrick Mezard <pmezard@gmail.com>
parents: 10672
diff changeset
   602
            extrafn(ctx, extra)
22038
021becbf024a rebase: do not retract phase boundary by hand
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22004
diff changeset
   603
021becbf024a rebase: do not retract phase boundary by hand
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22004
diff changeset
   604
        backup = repo.ui.backupconfig('phases', 'new-commit')
021becbf024a rebase: do not retract phase boundary by hand
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22004
diff changeset
   605
        try:
021becbf024a rebase: do not retract phase boundary by hand
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22004
diff changeset
   606
            targetphase = max(ctx.phase(), phases.draft)
021becbf024a rebase: do not retract phase boundary by hand
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22004
diff changeset
   607
            repo.ui.setconfig('phases', 'new-commit', targetphase, 'rebase')
26360
b2415e94b2f5 rebase: avoid losing branch commits with --keepbranch (issue4835)
timeless@mozdev.org
parents: 26349
diff changeset
   608
            if keepbranch:
b2415e94b2f5 rebase: avoid losing branch commits with --keepbranch (issue4835)
timeless@mozdev.org
parents: 26349
diff changeset
   609
                repo.ui.setconfig('ui', 'allowemptycommit', True)
22038
021becbf024a rebase: do not retract phase boundary by hand
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22004
diff changeset
   610
            # Commit might fail if unresolved files exist
23459
2e047b1558a5 rebase: clarify naming of variables holding node hashes - don't call them rev
Mads Kiilerich <madski@unity3d.com>
parents: 23457
diff changeset
   611
            newnode = repo.commit(text=commitmsg, user=ctx.user(),
2e047b1558a5 rebase: clarify naming of variables holding node hashes - don't call them rev
Mads Kiilerich <madski@unity3d.com>
parents: 23457
diff changeset
   612
                                  date=ctx.date(), extra=extra, editor=editor)
22038
021becbf024a rebase: do not retract phase boundary by hand
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22004
diff changeset
   613
        finally:
021becbf024a rebase: do not retract phase boundary by hand
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22004
diff changeset
   614
            repo.ui.restoreconfig(backup)
021becbf024a rebase: do not retract phase boundary by hand
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22004
diff changeset
   615
23459
2e047b1558a5 rebase: clarify naming of variables holding node hashes - don't call them rev
Mads Kiilerich <madski@unity3d.com>
parents: 23457
diff changeset
   616
        repo.dirstate.setbranch(repo[newnode].branch())
24998
c8a97fa742b7 rebase: use dirstateguard instead of dirstate.invalidate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24947
diff changeset
   617
        dsguard.close()
23459
2e047b1558a5 rebase: clarify naming of variables holding node hashes - don't call them rev
Mads Kiilerich <madski@unity3d.com>
parents: 23457
diff changeset
   618
        return newnode
24998
c8a97fa742b7 rebase: use dirstateguard instead of dirstate.invalidate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24947
diff changeset
   619
    finally:
c8a97fa742b7 rebase: use dirstateguard instead of dirstate.invalidate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24947
diff changeset
   620
        release(dsguard)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   621
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   622
def rebasenode(repo, rev, p1, base, state, collapse, target):
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   623
    'Rebase a single revision rev on top of p1 using base as merge ancestor'
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   624
    # Merge phase
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   625
    # Update to target and merge it with local
23461
ffef6d503ab2 rebase: avoid redundant repo[rev].rev() - just keep working in rev space
Mads Kiilerich <madski@unity3d.com>
parents: 23460
diff changeset
   626
    if repo['.'].rev() != p1:
ffef6d503ab2 rebase: avoid redundant repo[rev].rev() - just keep working in rev space
Mads Kiilerich <madski@unity3d.com>
parents: 23460
diff changeset
   627
        repo.ui.debug(" update to %d:%s\n" % (p1, repo[p1]))
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   628
        merge.update(repo, p1, False, True, False)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   629
    else:
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   630
        repo.ui.debug(" already in target\n")
26748
5ba0a99ff27f dirstate: make dirstate.write() callers pass transaction object to it
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26745
diff changeset
   631
    repo.dirstate.write(repo.currenttransaction())
23461
ffef6d503ab2 rebase: avoid redundant repo[rev].rev() - just keep working in rev space
Mads Kiilerich <madski@unity3d.com>
parents: 23460
diff changeset
   632
    repo.ui.debug(" merge against %d:%s\n" % (rev, repo[rev]))
19969
ad9db007656f rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 19956
diff changeset
   633
    if base is not None:
23461
ffef6d503ab2 rebase: avoid redundant repo[rev].rev() - just keep working in rev space
Mads Kiilerich <madski@unity3d.com>
parents: 23460
diff changeset
   634
        repo.ui.debug("   detach base %d:%s\n" % (base, repo[base]))
16696
d1afbf03e69a rebase: allow collapsing branches in place (issue3111)
Patrick Mezard <patrick@mezard.eu>
parents: 16566
diff changeset
   635
    # When collapsing in-place, the parent is the common ancestor, we
d1afbf03e69a rebase: allow collapsing branches in place (issue3111)
Patrick Mezard <patrick@mezard.eu>
parents: 16566
diff changeset
   636
    # have to allow merging with it.
22905
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
   637
    stats = merge.update(repo, rev, True, True, False, base, collapse,
21526
3b40e32e88c3 rebase: specify custom conflict marker labels for rebase (BC)
Durham Goode <durham@fb.com>
parents: 21410
diff changeset
   638
                        labels=['dest', 'source'])
22905
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
   639
    if collapse:
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
   640
        copies.duplicatecopies(repo, rev, target)
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
   641
    else:
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
   642
        # If we're not using --collapse, we need to
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
   643
        # duplicate copies between the revision we're
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
   644
        # rebasing and its first parent, but *not*
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
   645
        # duplicate any copies that have already been
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
   646
        # performed in the destination.
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
   647
        p1rev = repo[rev].p1().rev()
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
   648
        copies.duplicatecopies(repo, rev, p1rev, skiprev=target)
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
   649
    return stats
6923
ebf1462f2145 strip trailing whitespace, replace tabs by spaces
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6906
diff changeset
   650
18447
7159426c8d13 rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18446
diff changeset
   651
def nearestrebased(repo, rev, state):
7159426c8d13 rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18446
diff changeset
   652
    """return the nearest ancestors of rev in the rebase result"""
7159426c8d13 rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18446
diff changeset
   653
    rebased = [r for r in state if state[r] > nullmerge]
7159426c8d13 rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18446
diff changeset
   654
    candidates = repo.revs('max(%ld  and (::%d))', rebased, rev)
7159426c8d13 rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18446
diff changeset
   655
    if candidates:
22820
103dcfbb385f rebase: use `last` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22790
diff changeset
   656
        return state[candidates.first()]
18447
7159426c8d13 rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18446
diff changeset
   657
    else:
7159426c8d13 rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18446
diff changeset
   658
        return None
7159426c8d13 rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18446
diff changeset
   659
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   660
def defineparents(repo, rev, target, state, targetancestors):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   661
    '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
   662
    parents = repo[rev].parents()
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   663
    p1 = p2 = nullrev
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   664
22906
75d0edb68b41 rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents: 22905
diff changeset
   665
    p1n = parents[0].rev()
75d0edb68b41 rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents: 22905
diff changeset
   666
    if p1n in targetancestors:
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   667
        p1 = target
22906
75d0edb68b41 rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents: 22905
diff changeset
   668
    elif p1n in state:
75d0edb68b41 rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents: 22905
diff changeset
   669
        if state[p1n] == nullmerge:
10352
66d954e76ffb rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10351
diff changeset
   670
            p1 = target
26349
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
   671
        elif state[p1n] in (revignored, revprecursor):
22906
75d0edb68b41 rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents: 22905
diff changeset
   672
            p1 = nearestrebased(repo, p1n, state)
18447
7159426c8d13 rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18446
diff changeset
   673
            if p1 is None:
7159426c8d13 rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18446
diff changeset
   674
                p1 = target
10352
66d954e76ffb rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10351
diff changeset
   675
        else:
22906
75d0edb68b41 rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents: 22905
diff changeset
   676
            p1 = state[p1n]
75d0edb68b41 rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents: 22905
diff changeset
   677
    else: # p1n external
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   678
        p1 = target
22906
75d0edb68b41 rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents: 22905
diff changeset
   679
        p2 = p1n
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   680
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   681
    if len(parents) == 2 and parents[1].rev() not in targetancestors:
22906
75d0edb68b41 rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents: 22905
diff changeset
   682
        p2n = parents[1].rev()
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   683
        # interesting second parent
22906
75d0edb68b41 rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents: 22905
diff changeset
   684
        if p2n in state:
75d0edb68b41 rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents: 22905
diff changeset
   685
            if p1 == target: # p1n in targetancestors or external
75d0edb68b41 rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents: 22905
diff changeset
   686
                p1 = state[p2n]
26349
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
   687
            elif state[p2n] in (revignored, revprecursor):
22906
75d0edb68b41 rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents: 22905
diff changeset
   688
                p2 = nearestrebased(repo, p2n, state)
18447
7159426c8d13 rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18446
diff changeset
   689
                if p2 is None:
7159426c8d13 rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18446
diff changeset
   690
                    # no ancestors rebased yet, detach
7159426c8d13 rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18446
diff changeset
   691
                    p2 = target
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   692
            else:
22906
75d0edb68b41 rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents: 22905
diff changeset
   693
                p2 = state[p2n]
75d0edb68b41 rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents: 22905
diff changeset
   694
        else: # p2n external
75d0edb68b41 rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents: 22905
diff changeset
   695
            if p2 != nullrev: # p1n external too => rev is a merged revision
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26496
diff changeset
   696
                raise error.Abort(_('cannot use revision %d as base, result '
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   697
                        'would have 3 parents') % rev)
22906
75d0edb68b41 rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents: 22905
diff changeset
   698
            p2 = p2n
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   699
    repo.ui.debug(" future parents are %d and %d\n" %
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   700
                            (repo[p1].rev(), repo[p2].rev()))
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   701
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   702
    if rev == min(state):
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   703
        # Case (1) initial changeset of a non-detaching rebase.
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   704
        # Let the merge mechanism find the base itself.
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   705
        base = None
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   706
    elif not repo[rev].p2():
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   707
        # Case (2) detaching the node with a single parent, use this parent
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   708
        base = repo[rev].p1().rev()
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   709
    else:
23732
c51d6c043bb1 rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents: 23520
diff changeset
   710
        # Assuming there is a p1, this is the case where there also is a p2.
c51d6c043bb1 rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents: 23520
diff changeset
   711
        # We are thus rebasing a merge and need to pick the right merge base.
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   712
        #
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   713
        # Imagine we have:
23732
c51d6c043bb1 rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents: 23520
diff changeset
   714
        # - M: current rebase revision in this step
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   715
        # - A: one parent of M
23732
c51d6c043bb1 rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents: 23520
diff changeset
   716
        # - B: other parent of M
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   717
        # - D: destination of this merge step (p1 var)
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   718
        #
23732
c51d6c043bb1 rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents: 23520
diff changeset
   719
        # Consider the case where D is a descendant of A or B and the other is
c51d6c043bb1 rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents: 23520
diff changeset
   720
        # 'outside'. In this case, the right merge base is the D ancestor.
c51d6c043bb1 rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents: 23520
diff changeset
   721
        #
c51d6c043bb1 rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents: 23520
diff changeset
   722
        # An informal proof, assuming A is 'outside' and B is the D ancestor:
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   723
        #
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   724
        # If we pick B as the base, the merge involves:
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   725
        # - changes from B to M (actual changeset payload)
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   726
        # - changes from B to D (induced by rebase) as D is a rebased
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   727
        #   version of B)
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   728
        # Which exactly represent the rebase operation.
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   729
        #
23732
c51d6c043bb1 rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents: 23520
diff changeset
   730
        # If we pick A as the base, the merge involves:
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   731
        # - changes from A to M (actual changeset payload)
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   732
        # - changes from A to D (with include changes between unrelated A and B
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   733
        #   plus changes induced by rebase)
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   734
        # Which does not represent anything sensible and creates a lot of
23732
c51d6c043bb1 rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents: 23520
diff changeset
   735
        # conflicts. A is thus not the right choice - B is.
c51d6c043bb1 rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents: 23520
diff changeset
   736
        #
c51d6c043bb1 rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents: 23520
diff changeset
   737
        # Note: The base found in this 'proof' is only correct in the specified
c51d6c043bb1 rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents: 23520
diff changeset
   738
        # case. This base does not make sense if is not D a descendant of A or B
c51d6c043bb1 rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents: 23520
diff changeset
   739
        # or if the other is not parent 'outside' (especially not if the other
c51d6c043bb1 rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents: 23520
diff changeset
   740
        # parent has been rebased). The current implementation does not
c51d6c043bb1 rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents: 23520
diff changeset
   741
        # make it feasible to consider different cases separately. In these
c51d6c043bb1 rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents: 23520
diff changeset
   742
        # other cases we currently just leave it to the user to correctly
c51d6c043bb1 rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents: 23520
diff changeset
   743
        # resolve an impossible merge using a wrong ancestor.
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   744
        for p in repo[rev].parents():
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   745
            if state.get(p.rev()) == p1:
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   746
                base = p.rev()
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   747
                break
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   748
        else: # fallback when base not found
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   749
            base = None
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   750
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   751
            # Raise because this function is called wrong (see issue 4106)
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   752
            raise AssertionError('no base found to rebase on '
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   753
                                 '(defineparents called wrong)')
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   754
    return p1, p2, base
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   755
7955
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
   756
def isagitpatch(repo, patchname):
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
   757
    '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
   758
    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
   759
    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
   760
        if line.startswith('diff --git'):
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
   761
            return True
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
   762
    return False
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
   763
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   764
def updatemq(repo, state, skipped, **opts):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   765
    'Update rebased mq patches - finalize and then import them'
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   766
    mqrebase = {}
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
   767
    mq = repo.mq
14572
8ff2957c1d82 mq: rename full_series to fullseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14509
diff changeset
   768
    original_series = mq.fullseries[:]
16531
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
   769
    skippedpatches = set()
14497
ea585f2b1adc rebase: restore mq guards after rebasing (issue2107)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 13894
diff changeset
   770
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
   771
    for p in mq.applied:
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
   772
        rev = repo[p.node].rev()
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
   773
        if rev in state:
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9301
diff changeset
   774
            repo.ui.debug('revision %d is an mq patch (%s), finalize it.\n' %
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
   775
                                        (rev, p.name))
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
   776
            mqrebase[rev] = (p.name, isagitpatch(repo, p.name))
16531
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
   777
        else:
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
   778
            # Applied but not rebased, not sure this should happen
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
   779
            skippedpatches.add(p.name)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   780
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   781
    if mqrebase:
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
   782
        mq.finish(repo, mqrebase.keys())
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   783
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   784
        # 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
   785
        for rev in sorted(mqrebase, reverse=True):
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   786
            if rev not in skipped:
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
   787
                name, isgit = mqrebase[rev]
23520
de143427c499 rebase: show a note for updated mq patches
Mads Kiilerich <mads@kiilerich.com>
parents: 23519
diff changeset
   788
                repo.ui.note(_('updating mq patch %s to %s:%s\n') %
de143427c499 rebase: show a note for updated mq patches
Mads Kiilerich <mads@kiilerich.com>
parents: 23519
diff changeset
   789
                             (name, state[rev], repo[state[rev]]))
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
   790
                mq.qimport(repo, (), patchname=name, git=isgit,
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
   791
                                rev=[str(state[rev])])
16531
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
   792
            else:
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
   793
                # Rebased and skipped
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
   794
                skippedpatches.add(mqrebase[rev][0])
14497
ea585f2b1adc rebase: restore mq guards after rebasing (issue2107)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 13894
diff changeset
   795
16531
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
   796
        # Patches were either applied and rebased and imported in
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
   797
        # order, applied and removed or unapplied. Discard the removed
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
   798
        # ones while preserving the original series order and guards.
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
   799
        newseries = [s for s in original_series
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
   800
                     if mq.guard_re.split(s, 1)[0] not in skippedpatches]
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
   801
        mq.fullseries[:] = newseries
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
   802
        mq.seriesdirty = True
14580
92101ea35015 mq: rename save_dirty to savedirty
Adrian Buehlmann <adrian@cadifra.com>
parents: 14572
diff changeset
   803
        mq.savedirty()
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   804
18549
12de53323e59 rebase: derive node from target rev (issue3802)
Siddharth Agarwal <sid0@fb.com>
parents: 18518
diff changeset
   805
def updatebookmarks(repo, targetnode, nstate, originalbookmarks):
18514
2a1fac3650a5 rebase: delete divergent bookmarks on destination (issue3685)
Siddharth Agarwal <sid0@fb.com>
parents: 18512
diff changeset
   806
    'Move bookmarks to their correct changesets, and delete divergent ones'
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17615
diff changeset
   807
    marks = repo._bookmarks
14884
c0ccd70df52c rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14635
diff changeset
   808
    for k, v in originalbookmarks.iteritems():
c0ccd70df52c rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14635
diff changeset
   809
        if v in nstate:
18512
22978b82ab4b rebase: remove bogus nullmerge check in updatebookmarks
Siddharth Agarwal <sid0@fb.com>
parents: 18447
diff changeset
   810
            # update the bookmarks for revs that have moved
22978b82ab4b rebase: remove bogus nullmerge check in updatebookmarks
Siddharth Agarwal <sid0@fb.com>
parents: 18447
diff changeset
   811
            marks[k] = nstate[v]
18549
12de53323e59 rebase: derive node from target rev (issue3802)
Siddharth Agarwal <sid0@fb.com>
parents: 18518
diff changeset
   812
            bookmarks.deletedivergent(repo, [targetnode], k)
14884
c0ccd70df52c rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14635
diff changeset
   813
17922
7f5dab94e48c bookmarks: introduce a bmstore to manage bookmark persistence
Augie Fackler <raf@durin42.com>
parents: 17615
diff changeset
   814
    marks.write()
14884
c0ccd70df52c rebase: reset bookmarks (issue2265 and issue2873)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 14635
diff changeset
   815
7952
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
   816
def storestatus(repo, originalwd, target, state, collapse, keep, keepbranches,
18755
72412afe4c28 rebase: restore active bookmark after rebase --continue
Durham Goode <durham@fb.com>
parents: 18549
diff changeset
   817
                external, activebookmark):
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   818
    'Store the current status to allow recovery'
23877
7cc77030c557 localrepo: remove all external users of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23732
diff changeset
   819
    f = repo.vfs("rebasestate", "w")
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   820
    f.write(repo[originalwd].hex() + '\n')
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   821
    f.write(repo[target].hex() + '\n')
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   822
    f.write(repo[external].hex() + '\n')
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   823
    f.write('%d\n' % int(collapse))
7952
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
   824
    f.write('%d\n' % int(keep))
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
   825
    f.write('%d\n' % int(keepbranches))
18755
72412afe4c28 rebase: restore active bookmark after rebase --continue
Durham Goode <durham@fb.com>
parents: 18549
diff changeset
   826
    f.write('%s\n' % (activebookmark or ''))
7622
4dd7b28003d2 use dict.iteritems() rather than dict.items()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7599
diff changeset
   827
    for d, v in state.iteritems():
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   828
        oldrev = repo[d].hex()
23491
9972758ab4c5 rebase: handle revtodo as a special value when storing/restoring state
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23490
diff changeset
   829
        if v >= 0:
15464
3411a83e232a rebase: treat nullmerge as a special case in rebasestate (issue3046)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 15289
diff changeset
   830
            newrev = repo[v].hex()
23491
9972758ab4c5 rebase: handle revtodo as a special value when storing/restoring state
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23490
diff changeset
   831
        elif v == revtodo:
9972758ab4c5 rebase: handle revtodo as a special value when storing/restoring state
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23490
diff changeset
   832
            # To maintain format compatibility, we have to use nullid.
9972758ab4c5 rebase: handle revtodo as a special value when storing/restoring state
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23490
diff changeset
   833
            # Please do remove this special case when upgrading the format.
9972758ab4c5 rebase: handle revtodo as a special value when storing/restoring state
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23490
diff changeset
   834
            newrev = hex(nullid)
15464
3411a83e232a rebase: treat nullmerge as a special case in rebasestate (issue3046)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 15289
diff changeset
   835
        else:
3411a83e232a rebase: treat nullmerge as a special case in rebasestate (issue3046)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 15289
diff changeset
   836
            newrev = v
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   837
        f.write("%s:%s\n" % (oldrev, newrev))
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   838
    f.close()
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9301
diff changeset
   839
    repo.ui.debug('rebase status stored\n')
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   840
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   841
def clearstatus(repo):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   842
    'Remove the status files'
23970
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
   843
    _clearrebasesetvisibiliy(repo)
18386
03442135dff4 refactoring: use unlinkpath with ignoremissing
Mads Kiilerich <madski@unity3d.com>
parents: 18269
diff changeset
   844
    util.unlinkpath(repo.join("rebasestate"), ignoremissing=True)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   845
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   846
def restorestatus(repo):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   847
    'Restore a previously stored status'
26745
8af610bce239 rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents: 26744
diff changeset
   848
    keepbranches = None
8af610bce239 rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents: 26744
diff changeset
   849
    target = None
8af610bce239 rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents: 26744
diff changeset
   850
    collapse = False
8af610bce239 rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents: 26744
diff changeset
   851
    external = nullrev
8af610bce239 rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents: 26744
diff changeset
   852
    activebookmark = None
8af610bce239 rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents: 26744
diff changeset
   853
    state = {}
8af610bce239 rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents: 26744
diff changeset
   854
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   855
    try:
23877
7cc77030c557 localrepo: remove all external users of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23732
diff changeset
   856
        f = repo.vfs("rebasestate")
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   857
        for i, l in enumerate(f.read().splitlines()):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   858
            if i == 0:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   859
                originalwd = repo[l].rev()
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   860
            elif i == 1:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   861
                target = repo[l].rev()
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   862
            elif i == 2:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   863
                external = repo[l].rev()
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   864
            elif i == 3:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   865
                collapse = bool(int(l))
7952
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
   866
            elif i == 4:
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
   867
                keep = bool(int(l))
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
   868
            elif i == 5:
b214066b7e1d rebase: store/restore arguments correctly
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7951
diff changeset
   869
                keepbranches = bool(int(l))
18755
72412afe4c28 rebase: restore active bookmark after rebase --continue
Durham Goode <durham@fb.com>
parents: 18549
diff changeset
   870
            elif i == 6 and not (len(l) == 81 and ':' in l):
72412afe4c28 rebase: restore active bookmark after rebase --continue
Durham Goode <durham@fb.com>
parents: 18549
diff changeset
   871
                # line 6 is a recent addition, so for backwards compatibility
72412afe4c28 rebase: restore active bookmark after rebase --continue
Durham Goode <durham@fb.com>
parents: 18549
diff changeset
   872
                # check that the line doesn't look like the oldrev:newrev lines
72412afe4c28 rebase: restore active bookmark after rebase --continue
Durham Goode <durham@fb.com>
parents: 18549
diff changeset
   873
                activebookmark = l
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   874
            else:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   875
                oldrev, newrev = l.split(':')
26349
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
   876
                if newrev in (str(nullmerge), str(revignored),
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
   877
                              str(revprecursor)):
18447
7159426c8d13 rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18446
diff changeset
   878
                    state[repo[oldrev].rev()] = int(newrev)
23491
9972758ab4c5 rebase: handle revtodo as a special value when storing/restoring state
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23490
diff changeset
   879
                elif newrev == nullid:
9972758ab4c5 rebase: handle revtodo as a special value when storing/restoring state
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23490
diff changeset
   880
                    state[repo[oldrev].rev()] = revtodo
9972758ab4c5 rebase: handle revtodo as a special value when storing/restoring state
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23490
diff changeset
   881
                    # Legacy compat special case
18447
7159426c8d13 rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18446
diff changeset
   882
                else:
15464
3411a83e232a rebase: treat nullmerge as a special case in rebasestate (issue3046)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 15289
diff changeset
   883
                    state[repo[oldrev].rev()] = repo[newrev].rev()
20327
46c2331fc750 rebase: abort cleanly when we encounter a damaged rebasestate (issue4155)
Matt Mackall <mpm@selenic.com>
parents: 20313
diff changeset
   884
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25411
diff changeset
   885
    except IOError as err:
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   886
        if err.errno != errno.ENOENT:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   887
            raise
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26496
diff changeset
   888
        raise error.Abort(_('no rebase in progress'))
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   889
26745
8af610bce239 rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents: 26744
diff changeset
   890
    if keepbranches is None:
8af610bce239 rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents: 26744
diff changeset
   891
        raise error.Abort(_('.hg/rebasestate is incomplete'))
8af610bce239 rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents: 26744
diff changeset
   892
8af610bce239 rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents: 26744
diff changeset
   893
    skipped = set()
8af610bce239 rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents: 26744
diff changeset
   894
    # recompute the set of skipped revs
8af610bce239 rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents: 26744
diff changeset
   895
    if not collapse:
8af610bce239 rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents: 26744
diff changeset
   896
        seen = set([target])
8af610bce239 rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents: 26744
diff changeset
   897
        for old, new in sorted(state.items()):
8af610bce239 rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents: 26744
diff changeset
   898
            if new != revtodo and new in seen:
8af610bce239 rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents: 26744
diff changeset
   899
                skipped.add(old)
8af610bce239 rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents: 26744
diff changeset
   900
            seen.add(new)
8af610bce239 rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents: 26744
diff changeset
   901
    repo.ui.debug('computed skipped revs: %s\n' %
8af610bce239 rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents: 26744
diff changeset
   902
                    (' '.join(str(r) for r in sorted(skipped)) or None))
8af610bce239 rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents: 26744
diff changeset
   903
    repo.ui.debug('rebase status resumed\n')
8af610bce239 rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents: 26744
diff changeset
   904
    _setrebasesetvisibility(repo, state.keys())
8af610bce239 rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents: 26744
diff changeset
   905
    return (originalwd, target, state, skipped,
8af610bce239 rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents: 26744
diff changeset
   906
            collapse, keep, keepbranches, external, activebookmark)
8af610bce239 rebase: reduce scope of try catch in restorestate
Christian Delahousse <cdelahousse@fb.com>
parents: 26744
diff changeset
   907
25070
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
   908
def needupdate(repo, state):
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
   909
    '''check whether we should `update --clean` away from a merge, or if
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
   910
    somehow the working dir got forcibly updated, e.g. by older hg'''
19516
fe78eb7bcca0 rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents: 19496
diff changeset
   911
    parents = [p.rev() for p in repo.parents()]
25070
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
   912
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
   913
    # Are we in a merge state at all?
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
   914
    if len(parents) < 2:
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
   915
        return False
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
   916
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
   917
    # We should be standing on the first as-of-yet unrebased commit.
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
   918
    firstunrebased = min([old for old, new in state.iteritems()
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
   919
                          if new == nullrev])
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
   920
    if firstunrebased in parents:
19516
fe78eb7bcca0 rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents: 19496
diff changeset
   921
        return True
fe78eb7bcca0 rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents: 19496
diff changeset
   922
fe78eb7bcca0 rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents: 19496
diff changeset
   923
    return False
fe78eb7bcca0 rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents: 19496
diff changeset
   924
24758
d7451adc72f6 rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents: 23970
diff changeset
   925
def abort(repo, originalwd, target, state, activebookmark=None):
d7451adc72f6 rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents: 23970
diff changeset
   926
    '''Restore the repository to its original state.  Additional args:
d7451adc72f6 rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents: 23970
diff changeset
   927
d7451adc72f6 rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents: 23970
diff changeset
   928
    activebookmark: the name of the bookmark that should be active after the
d7451adc72f6 rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents: 23970
diff changeset
   929
        restore'''
26677
e9b3d523f2e6 rebase: properly abort when destination is public (issue4896)
Christian Delahousse <cdelahousse@fb.com>
parents: 26675
diff changeset
   930
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   931
    try:
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   932
        # If the first commits in the rebased set get skipped during the rebase,
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   933
        # their values within the state mapping will be the target rev id. The
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   934
        # dstates list must must not contain the target rev (issue4896)
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   935
        dstates = [s for s in state.values() if s >= 0 and s != target]
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   936
        immutable = [d for d in dstates if not repo[d].mutable()]
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   937
        cleanup = True
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   938
        if immutable:
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   939
            repo.ui.warn(_("warning: can't clean up public changesets %s\n")
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   940
                        % ', '.join(str(repo[r]) for r in immutable),
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   941
                        hint=_('see "hg help phases" for details'))
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   942
            cleanup = False
16280
0806823370d8 rebase: properly calculate descendant set when aborting (issue3332)
Matt Mackall <mpm@selenic.com>
parents: 16228
diff changeset
   943
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   944
        descendants = set()
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   945
        if dstates:
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   946
            descendants = set(repo.changelog.descendants(dstates))
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   947
        if descendants - set(dstates):
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   948
            repo.ui.warn(_("warning: new changesets detected on target branch, "
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   949
                        "can't strip\n"))
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   950
            cleanup = False
19518
12843143663d rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents: 19517
diff changeset
   951
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   952
        if cleanup:
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   953
            # Update away from the rebase if necessary
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   954
            if needupdate(repo, state):
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   955
                merge.update(repo, originalwd, False, True, False)
19516
fe78eb7bcca0 rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents: 19496
diff changeset
   956
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   957
            # Strip from the first rebased revision
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   958
            rebased = filter(lambda x: x >= 0 and x != target, state.values())
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   959
            if rebased:
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   960
                strippoints = [
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   961
                        c.node()  for c in repo.set('roots(%ld)', rebased)]
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   962
                # no backup of rebased cset versions needed
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   963
                repair.strip(repo.ui, repo, strippoints)
19518
12843143663d rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents: 19517
diff changeset
   964
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   965
        if activebookmark and activebookmark in repo._bookmarks:
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   966
            bookmarks.activate(repo, activebookmark)
24758
d7451adc72f6 rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents: 23970
diff changeset
   967
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   968
    finally:
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   969
        clearstatus(repo)
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
   970
        repo.ui.warn(_('rebase aborted\n'))
19518
12843143663d rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents: 19517
diff changeset
   971
    return 0
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   972
26349
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
   973
def buildstate(repo, dest, rebaseset, collapse, obsoletenotrebased):
15267
3bfdfefea2fc rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15219
diff changeset
   974
    '''Define which revisions are going to be rebased and where
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   975
15267
3bfdfefea2fc rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15219
diff changeset
   976
    repo: repo
3bfdfefea2fc rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15219
diff changeset
   977
    dest: context
3bfdfefea2fc rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15219
diff changeset
   978
    rebaseset: set of rev
17005
50f434510da6 rebase: do not add second parent to rebased changeset (drop detach option) (BC)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 16867
diff changeset
   979
    '''
23970
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
   980
    _setrebasesetvisibility(repo, rebaseset)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   981
10672
c2e1e637d4da rebase: always check if rebasing onto an applied mq patch.
Greg Ward <greg-hg@gerg.ca>
parents: 10659
diff changeset
   982
    # 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
   983
    # 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
   984
    # a partially completed rebase is blocked by mq.
15267
3bfdfefea2fc rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15219
diff changeset
   985
    if 'qtip' in repo.tags() and (dest.node() in
10678
da2a0c9c895d mq: avoid many hex/bin conversions, keep the binary node when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10677
diff changeset
   986
                            [s.node for s in repo.mq.applied]):
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26496
diff changeset
   987
        raise error.Abort(_('cannot rebase onto an applied mq patch'))
10672
c2e1e637d4da rebase: always check if rebasing onto an applied mq patch.
Greg Ward <greg-hg@gerg.ca>
parents: 10659
diff changeset
   988
15267
3bfdfefea2fc rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15219
diff changeset
   989
    roots = list(repo.set('roots(%ld)', rebaseset))
3bfdfefea2fc rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15219
diff changeset
   990
    if not roots:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26496
diff changeset
   991
        raise error.Abort(_('no matching revisions'))
18424
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
   992
    roots.sort()
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
   993
    state = {}
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
   994
    detachset = set()
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
   995
    for root in roots:
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
   996
        commonbase = root.ancestor(dest)
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
   997
        if commonbase == root:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26496
diff changeset
   998
            raise error.Abort(_('source is ancestor of destination'))
18424
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
   999
        if commonbase == dest:
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1000
            samebranch = root.branch() == dest.branch()
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1001
            if not collapse and samebranch and root in dest.children():
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1002
                repo.ui.debug('source is a child of destination\n')
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1003
                return None
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1004
20545
5936058f6bad rebase: fix 'rebase onto %d starting from %s' - show root instead of list repr
Mads Kiilerich <madski@unity3d.com>
parents: 20523
diff changeset
  1005
        repo.ui.debug('rebase onto %d starting from %s\n' % (dest, root))
23490
102f144f6e02 rebase: add a 'revtodo' constant
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23489
diff changeset
  1006
        state.update(dict.fromkeys(rebaseset, revtodo))
18424
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1007
        # Rebase tries to turn <dest> into a parent of <root> while
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1008
        # preserving the number of parents of rebased changesets:
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1009
        #
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1010
        # - A changeset with a single parent will always be rebased as a
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1011
        #   changeset with a single parent.
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1012
        #
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1013
        # - A merge will be rebased as merge unless its parents are both
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1014
        #   ancestors of <dest> or are themselves in the rebased set and
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1015
        #   pruned while rebased.
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1016
        #
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1017
        # If one parent of <root> is an ancestor of <dest>, the rebased
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1018
        # version of this parent will be <dest>. This is always true with
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1019
        # --base option.
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1020
        #
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1021
        # Otherwise, we need to *replace* the original parents with
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1022
        # <dest>. This "detaches" the rebased set from its former location
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1023
        # and rebases it onto <dest>. Changes introduced by ancestors of
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1024
        # <root> not common with <dest> (the detachset, marked as
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1025
        # nullmerge) are "removed" from the rebased changesets.
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1026
        #
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1027
        # - If <root> has a single parent, set it to <dest>.
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1028
        #
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1029
        # - If <root> is a merge, we cannot decide which parent to
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1030
        #   replace, the rebase operation is not clearly defined.
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1031
        #
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1032
        # The table below sums up this behavior:
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1033
        #
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1034
        # +------------------+----------------------+-------------------------+
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1035
        # |                  |     one parent       |  merge                  |
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1036
        # +------------------+----------------------+-------------------------+
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1037
        # | parent in        | new parent is <dest> | parents in ::<dest> are |
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1038
        # | ::<dest>         |                      | remapped to <dest>      |
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1039
        # +------------------+----------------------+-------------------------+
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1040
        # | unrelated source | new parent is <dest> | ambiguous, abort        |
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1041
        # +------------------+----------------------+-------------------------+
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1042
        #
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1043
        # The actual abort is handled by `defineparents`
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1044
        if len(root.parents()) <= 1:
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1045
            # ancestors of <root> not ancestors of <dest>
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1046
            detachset.update(repo.changelog.findmissingrevs([commonbase.rev()],
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1047
                                                            [root.rev()]))
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1048
    for r in detachset:
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1049
        if r not in state:
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1050
            state[r] = nullmerge
18447
7159426c8d13 rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18446
diff changeset
  1051
    if len(roots) > 1:
7159426c8d13 rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18446
diff changeset
  1052
        # If we have multiple roots, we may have "hole" in the rebase set.
7159426c8d13 rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18446
diff changeset
  1053
        # Rebase roots that descend from those "hole" should not be detached as
7159426c8d13 rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18446
diff changeset
  1054
        # other root are. We use the special `revignored` to inform rebase that
18644
3e92772d5383 spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents: 18549
diff changeset
  1055
        # the revision should be ignored but that `defineparents` should search
3e92772d5383 spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents: 18549
diff changeset
  1056
        # a rebase destination that make sense regarding rebased topology.
18447
7159426c8d13 rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18446
diff changeset
  1057
        rebasedomain = set(repo.revs('%ld::%ld', rebaseset, rebaseset))
7159426c8d13 rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18446
diff changeset
  1058
        for ignored in set(rebasedomain) - set(rebaseset):
7159426c8d13 rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18446
diff changeset
  1059
            state[ignored] = revignored
26349
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
  1060
    for r in obsoletenotrebased:
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
  1061
        state[r] = revprecursor
15267
3bfdfefea2fc rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15219
diff changeset
  1062
    return repo['.'].rev(), dest.rev(), state
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1063
18444
55aff0c2b73c rebase: do not invent successor to skipped changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18424
diff changeset
  1064
def clearrebased(ui, repo, state, skipped, collapsedas=None):
17613
aafc521668d8 rebase: properly handle --collapse when creating obsolescence marker
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17612
diff changeset
  1065
    """dispose of rebased revision at the end of the rebase
aafc521668d8 rebase: properly handle --collapse when creating obsolescence marker
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17612
diff changeset
  1066
aafc521668d8 rebase: properly handle --collapse when creating obsolescence marker
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17612
diff changeset
  1067
    If `collapsedas` is not None, the rebase was a collapse whose result if the
aafc521668d8 rebase: properly handle --collapse when creating obsolescence marker
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17612
diff changeset
  1068
    `collapsedas` node."""
22951
6c86c673dde6 obsolete: add createmarkers option
Durham Goode <durham@fb.com>
parents: 22906
diff changeset
  1069
    if obsolete.isenabled(repo, obsolete.createmarkersopt):
17612
fc2a6114f0a0 rebase: allow creation obsolescence relation instead of stripping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17611
diff changeset
  1070
        markers = []
fc2a6114f0a0 rebase: allow creation obsolescence relation instead of stripping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17611
diff changeset
  1071
        for rev, newrev in sorted(state.items()):
fc2a6114f0a0 rebase: allow creation obsolescence relation instead of stripping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17611
diff changeset
  1072
            if newrev >= 0:
18444
55aff0c2b73c rebase: do not invent successor to skipped changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18424
diff changeset
  1073
                if rev in skipped:
55aff0c2b73c rebase: do not invent successor to skipped changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18424
diff changeset
  1074
                    succs = ()
55aff0c2b73c rebase: do not invent successor to skipped changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18424
diff changeset
  1075
                elif collapsedas is not None:
55aff0c2b73c rebase: do not invent successor to skipped changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18424
diff changeset
  1076
                    succs = (repo[collapsedas],)
55aff0c2b73c rebase: do not invent successor to skipped changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18424
diff changeset
  1077
                else:
55aff0c2b73c rebase: do not invent successor to skipped changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18424
diff changeset
  1078
                    succs = (repo[newrev],)
55aff0c2b73c rebase: do not invent successor to skipped changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18424
diff changeset
  1079
                markers.append((repo[rev], succs))
17612
fc2a6114f0a0 rebase: allow creation obsolescence relation instead of stripping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17611
diff changeset
  1080
        if markers:
fc2a6114f0a0 rebase: allow creation obsolescence relation instead of stripping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17611
diff changeset
  1081
            obsolete.createmarkers(repo, markers)
fc2a6114f0a0 rebase: allow creation obsolescence relation instead of stripping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17611
diff changeset
  1082
    else:
18446
c83d36b81df1 rebase: lose the comparison to `nullmerge`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18444
diff changeset
  1083
        rebased = [rev for rev in state if state[rev] > nullmerge]
17612
fc2a6114f0a0 rebase: allow creation obsolescence relation instead of stripping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17611
diff changeset
  1084
        if rebased:
18424
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1085
            stripped = []
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1086
            for root in repo.set('roots(%ld)', rebased):
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1087
                if set(repo.changelog.descendants([root.rev()])) - set(state):
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1088
                    ui.warn(_("warning: new changesets detected "
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1089
                              "on source branch, not stripping\n"))
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1090
                else:
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1091
                    stripped.append(root.node())
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1092
            if stripped:
17612
fc2a6114f0a0 rebase: allow creation obsolescence relation instead of stripping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17611
diff changeset
  1093
                # backup the old csets by default
18424
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1094
                repair.strip(ui, repo, stripped, "all")
17611
910123eac887 rebase: extract final changesets cleanup logic in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17325
diff changeset
  1095
910123eac887 rebase: extract final changesets cleanup logic in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17325
diff changeset
  1096
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
  1097
def pullrebase(orig, ui, repo, *args, **opts):
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1098
    'Call rebase after pull if the latter has been invoked with --rebase'
26960
6979fe2a6d75 rebase: add returning value from pullrebase function
liscju <piotr.listkiewicz@gmail.com>
parents: 26811
diff changeset
  1099
    ret = None
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1100
    if opts.get('rebase'):
26029
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1101
        wlock = lock = None
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1102
        try:
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1103
            wlock = repo.wlock()
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1104
            lock = repo.lock()
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1105
            if opts.get('update'):
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1106
                del opts['update']
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1107
                ui.debug('--update and --rebase are not compatible, ignoring '
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1108
                         'the update flag\n')
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1109
26029
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1110
            movemarkfrom = repo['.'].node()
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1111
            revsprepull = len(repo)
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1112
            origpostincoming = commands.postincoming
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1113
            def _dummy(*args, **kwargs):
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1114
                pass
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1115
            commands.postincoming = _dummy
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1116
            try:
26960
6979fe2a6d75 rebase: add returning value from pullrebase function
liscju <piotr.listkiewicz@gmail.com>
parents: 26811
diff changeset
  1117
                ret = orig(ui, repo, *args, **opts)
26029
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1118
            finally:
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1119
                commands.postincoming = origpostincoming
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1120
            revspostpull = len(repo)
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1121
            if revspostpull > revsprepull:
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1122
                # --rev option from pull conflict with rebase own --rev
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1123
                # dropping it
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1124
                if 'rev' in opts:
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1125
                    del opts['rev']
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1126
                # positional argument from pull conflicts with rebase's own
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1127
                # --source.
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1128
                if 'source' in opts:
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1129
                    del opts['source']
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1130
                rebase(ui, repo, **opts)
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1131
                branch = repo[None].branch()
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1132
                dest = repo[branch].rev()
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1133
                if dest != repo['.'].rev():
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1134
                    # there was nothing to rebase we force an update
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1135
                    hg.update(repo, dest)
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1136
                    if bookmarks.update(repo, [movemarkfrom], repo['.'].node()):
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1137
                        ui.status(_("updating bookmark %s\n")
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1138
                                  % repo._activebookmark)
10628
6227c8d669d5 rebase: improve output of hg pull --rebase (issue2072)
Sune Foldager <cryo@cyanite.org>
parents: 10436
diff changeset
  1139
        finally:
26029
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1140
            release(lock, wlock)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1141
    else:
14444
1f997134a9d1 rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents: 14306
diff changeset
  1142
        if opts.get('tool'):
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26496
diff changeset
  1143
            raise error.Abort(_('--tool can only be used with --rebase'))
26960
6979fe2a6d75 rebase: add returning value from pullrebase function
liscju <piotr.listkiewicz@gmail.com>
parents: 26811
diff changeset
  1144
        ret = orig(ui, repo, *args, **opts)
6979fe2a6d75 rebase: add returning value from pullrebase function
liscju <piotr.listkiewicz@gmail.com>
parents: 26811
diff changeset
  1145
6979fe2a6d75 rebase: add returning value from pullrebase function
liscju <piotr.listkiewicz@gmail.com>
parents: 26811
diff changeset
  1146
    return ret
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1147
23970
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
  1148
def _setrebasesetvisibility(repo, revs):
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
  1149
    """store the currently rebased set on the repo object
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
  1150
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
  1151
    This is used by another function to prevent rebased revision to because
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
  1152
    hidden (see issue4505)"""
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
  1153
    repo = repo.unfiltered()
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
  1154
    revs = set(revs)
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
  1155
    repo._rebaseset = revs
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
  1156
    # invalidate cache if visibility changes
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
  1157
    hiddens = repo.filteredrevcache.get('visible', set())
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
  1158
    if revs & hiddens:
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
  1159
        repo.invalidatevolatilesets()
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
  1160
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
  1161
def _clearrebasesetvisibiliy(repo):
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
  1162
    """remove rebaseset data from the repo"""
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
  1163
    repo = repo.unfiltered()
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
  1164
    if '_rebaseset' in vars(repo):
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
  1165
        del repo._rebaseset
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
  1166
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
  1167
def _rebasedvisible(orig, repo):
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
  1168
    """ensure rebased revs stay visible (see issue4505)"""
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
  1169
    blockers = orig(repo)
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
  1170
    blockers.update(getattr(repo, '_rebaseset', ()))
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
  1171
    return blockers
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
  1172
26349
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
  1173
def _computeobsoletenotrebased(repo, rebasesetrevs, dest):
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
  1174
    """return a mapping obsolete => successor for all obsolete nodes to be
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
  1175
    rebased that have a successors in the destination"""
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
  1176
    obsoletenotrebased = {}
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
  1177
26781
1aee2ab0f902 spelling: trivial spell checking
Mads Kiilerich <madski@unity3d.com>
parents: 26748
diff changeset
  1178
    # Build a mapping successor => obsolete nodes for the obsolete
26349
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
  1179
    # nodes to be rebased
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
  1180
    allsuccessors = {}
26674
fd4a38bd7e49 rebase: use a direct reference to repo.changelog
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26671
diff changeset
  1181
    cl = repo.changelog
26349
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
  1182
    for r in rebasesetrevs:
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
  1183
        n = repo[r]
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
  1184
        if n.obsolete():
26674
fd4a38bd7e49 rebase: use a direct reference to repo.changelog
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26671
diff changeset
  1185
            node = cl.node(r)
26349
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
  1186
            for s in obsolete.allsuccessors(repo.obsstore, [node]):
26675
b73eb98c0243 rebase: properly handle chains of markers with missing nodes
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26674
diff changeset
  1187
                try:
b73eb98c0243 rebase: properly handle chains of markers with missing nodes
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26674
diff changeset
  1188
                    allsuccessors[cl.rev(s)] = cl.rev(node)
b73eb98c0243 rebase: properly handle chains of markers with missing nodes
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26674
diff changeset
  1189
                except LookupError:
b73eb98c0243 rebase: properly handle chains of markers with missing nodes
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26674
diff changeset
  1190
                    pass
26349
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
  1191
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
  1192
    if allsuccessors:
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
  1193
        # Look for successors of obsolete nodes to be rebased among
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
  1194
        # the ancestors of dest
26674
fd4a38bd7e49 rebase: use a direct reference to repo.changelog
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26671
diff changeset
  1195
        ancs = cl.ancestors([repo[dest].rev()],
fd4a38bd7e49 rebase: use a direct reference to repo.changelog
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26671
diff changeset
  1196
                            stoprev=min(allsuccessors),
fd4a38bd7e49 rebase: use a direct reference to repo.changelog
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26671
diff changeset
  1197
                            inclusive=True)
26349
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
  1198
        for s in allsuccessors:
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
  1199
            if s in ancs:
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
  1200
                obsoletenotrebased[allsuccessors[s]] = s
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
  1201
    return obsoletenotrebased
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
  1202
19214
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
  1203
def summaryhook(ui, repo):
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
  1204
    if not os.path.exists(repo.join('rebasestate')):
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
  1205
        return
19849
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
  1206
    try:
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
  1207
        state = restorestatus(repo)[2]
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
  1208
    except error.RepoLookupError:
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
  1209
        # i18n: column positioning for "hg summary"
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
  1210
        msg = _('rebase: (use "hg rebase --abort" to clear broken state)\n')
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
  1211
        ui.write(msg)
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
  1212
        return
23489
fe4157d839ac rebase: use '>= 0' to know is a revision was rebased
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23484
diff changeset
  1213
    numrebased = len([i for i in state.itervalues() if i >= 0])
19214
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
  1214
    # i18n: column positioning for "hg summary"
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
  1215
    ui.write(_('rebase: %s, %s (rebase --continue)\n') %
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
  1216
             (ui.label(_('%d rebased'), 'rebase.rebased') % numrebased,
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
  1217
              ui.label(_('%d remaining'), 'rebase.remaining') %
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
  1218
              (len(state) - numrebased)))
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
  1219
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1220
def uisetup(ui):
23970
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
  1221
    #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
  1222
    entry = extensions.wrapcommand(commands.table, 'pull', pullrebase)
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
  1223
    entry[1].append(('', 'rebase', None,
14444
1f997134a9d1 rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents: 14306
diff changeset
  1224
                     _("rebase working directory to branch head")))
1f997134a9d1 rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents: 14306
diff changeset
  1225
    entry[1].append(('t', 'tool', '',
1f997134a9d1 rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents: 14306
diff changeset
  1226
                     _("specify merge tool for rebase")))
19214
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
  1227
    cmdutil.summaryhooks.add('rebase', summaryhook)
19478
e5a5790a3185 rebase: add checkunfinished support (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19477
diff changeset
  1228
    cmdutil.unfinishedstates.append(
19496
607191a45f8c checkunfinished: accommodate histedit quirk
Matt Mackall <mpm@selenic.com>
parents: 19478
diff changeset
  1229
        ['rebasestate', False, False, _('rebase in progress'),
19478
e5a5790a3185 rebase: add checkunfinished support (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19477
diff changeset
  1230
         _("use 'hg rebase --continue' or 'hg rebase --abort'")])
23970
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
  1231
    # ensure rebased rev are not hidden
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
  1232
    extensions.wrapfunction(repoview, '_getdynamicblockers', _rebasedvisible)
26719
8bed1eae99df rebase: rename and test '_destrebase'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26718
diff changeset
  1233
    revset.symbols['_destrebase'] = _revsetdestrebase