hgext/rebase.py
author Boris Feld <boris.feld@octobus.net>
Fri, 13 Oct 2017 23:00:31 +0200
changeset 34831 44c4ed4ad032
parent 34787 754b5117622f
child 34872 29f52e7966dd
permissions -rw-r--r--
configitems: move rebase config into core The shelve extensions import and call rebase content without loading the extension. This is problematic as the config items rebase uses are not declared and the default value are not set, etc... The shelve extension should be using core utilities only and the necessary bit should be moved from rebase into core. In the meantime, I'm taking a small step to get config registration completed with minimal overhead. The rebase extension is shipped with core so registering its config option within core is not a big issue. This is the last step needed before we can install a warning that enforces all config to be registered.
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
29128
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    17
from __future__ import absolute_import
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    18
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    19
import errno
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    20
import os
29205
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 29128
diff changeset
    21
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 29128
diff changeset
    22
from mercurial.i18n import _
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 29128
diff changeset
    23
from mercurial.node import (
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 29128
diff changeset
    24
    nullid,
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 29128
diff changeset
    25
    nullrev,
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 29128
diff changeset
    26
    short,
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 29128
diff changeset
    27
)
29128
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    28
from mercurial import (
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    29
    bookmarks,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    30
    cmdutil,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    31
    commands,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    32
    copies,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    33
    destutil,
30490
ee2097c560c1 rebase: refer to dirstateguard by its new name
Augie Fackler <augie@google.com>
parents: 30459
diff changeset
    34
    dirstateguard,
29128
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    35
    error,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    36
    extensions,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    37
    hg,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    38
    lock,
30271
0fa1a41d04e4 rebase: rename merge to mergemod
timeless <timeless@mozdev.org>
parents: 30007
diff changeset
    39
    merge as mergemod,
30495
d528ddc11b33 rebase: refer to checkunresolved by its new name
Augie Fackler <augie@google.com>
parents: 30490
diff changeset
    40
    mergeutil,
29128
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    41
    obsolete,
33145
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33139
diff changeset
    42
    obsutil,
29128
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    43
    patch,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    44
    phases,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    45
    registrar,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    46
    repair,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    47
    revset,
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
    48
    revsetlang,
29128
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    49
    scmutil,
31023
aea06029919e revset: import set classes directly from smartset module
Yuya Nishihara <yuya@tcha.org>
parents: 30865
diff changeset
    50
    smartset,
29128
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    51
    util,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    52
)
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    53
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    54
release = lock.release
32375
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32348
diff changeset
    55
templateopts = cmdutil.templateopts
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
    56
26669
07db7e95c464 rebase: added comments
Christian Delahousse <cdelahousse@fb.com>
parents: 26587
diff changeset
    57
# 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
    58
# their values must be maintained.
07db7e95c464 rebase: added comments
Christian Delahousse <cdelahousse@fb.com>
parents: 26587
diff changeset
    59
07db7e95c464 rebase: added comments
Christian Delahousse <cdelahousse@fb.com>
parents: 26587
diff changeset
    60
# 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
    61
revtodo = -1
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
    62
revtodostr = '-1'
33843
d8d0ef5f5975 rebase: remove revprecursor and revpruned states (BC)
Jun Wu <quark@fb.com>
parents: 33842
diff changeset
    63
d8d0ef5f5975 rebase: remove revprecursor and revpruned states (BC)
Jun Wu <quark@fb.com>
parents: 33842
diff changeset
    64
# legacy revstates no longer needed in current code
33845
3ddbab49efcf rebase: remove revignored and nullmerge states
Jun Wu <quark@fb.com>
parents: 33844
diff changeset
    65
# -2: nullmerge, -3: revignored, -4: revprecursor, -5: revpruned
3ddbab49efcf rebase: remove revignored and nullmerge states
Jun Wu <quark@fb.com>
parents: 33844
diff changeset
    66
legacystates = {'-2', '-3', '-4', '-5'}
10352
66d954e76ffb rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10351
diff changeset
    67
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
    68
cmdtable = {}
32337
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32327
diff changeset
    69
command = registrar.command(cmdtable)
29841
d5883fd055c6 extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents: 29610
diff changeset
    70
# Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
25186
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 25102
diff changeset
    71
# 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
    72
# 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
    73
# leave the attribute unspecified.
29841
d5883fd055c6 extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents: 29610
diff changeset
    74
testedwith = 'ships-with-hg-core'
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
    75
26671
66dc39cd7d06 rebase: factor out nothing to rebase return code
Ryan McElroy <rmcelroy@fb.com>
parents: 26669
diff changeset
    76
def _nothingtorebase():
66dc39cd7d06 rebase: factor out nothing to rebase return code
Ryan McElroy <rmcelroy@fb.com>
parents: 26669
diff changeset
    77
    return 1
66dc39cd7d06 rebase: factor out nothing to rebase return code
Ryan McElroy <rmcelroy@fb.com>
parents: 26669
diff changeset
    78
27976
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
    79
def _savegraft(ctx, extra):
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
    80
    s = ctx.extra().get('source', None)
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
    81
    if s is not None:
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
    82
        extra['source'] = s
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
    83
    s = ctx.extra().get('intermediate-source', None)
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
    84
    if s is not None:
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
    85
        extra['intermediate-source'] = s
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
    86
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
    87
def _savebranch(ctx, extra):
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
    88
    extra['branch'] = ctx.branch()
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
    89
19860
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
    90
def _makeextrafn(copiers):
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
    91
    """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
    92
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
    93
    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
    94
    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
    95
    """
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
    96
    def extrafn(ctx, extra):
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
    97
        for c in copiers:
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
    98
            c(ctx, extra)
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
    99
    return extrafn
6cd9b8428104 rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents: 19852
diff changeset
   100
29043
cf7de4aeb86b destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 28686
diff changeset
   101
def _destrebase(repo, sourceset, destspace=None):
28189
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
   102
    """small wrapper around destmerge to pass the right extra args
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
   103
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
   104
    Please wrap destutil.destmerge instead."""
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
   105
    return destutil.destmerge(repo, action='rebase', sourceset=sourceset,
29043
cf7de4aeb86b destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 28686
diff changeset
   106
                              onheadcheck=False, destspace=destspace)
26717
1755e1d9d1c3 rebase: extra default destination in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26677
diff changeset
   107
28394
dcb4209bd30d revset: replace extpredicate by revsetpredicate of registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28280
diff changeset
   108
revsetpredicate = registrar.revsetpredicate()
27586
42910f9fffeb revset: use delayregistrar to register predicate in extension easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 27577
diff changeset
   109
42910f9fffeb revset: use delayregistrar to register predicate in extension easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 27577
diff changeset
   110
@revsetpredicate('_destrebase')
26719
8bed1eae99df rebase: rename and test '_destrebase'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26718
diff changeset
   111
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
   112
    # ``_rebasedefaultdest()``
3f8c5c284c86 rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26165
diff changeset
   113
3f8c5c284c86 rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26165
diff changeset
   114
    # default destination for rebase.
3f8c5c284c86 rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26165
diff changeset
   115
    # # 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
   116
    # # 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
   117
    # i18n: "_rebasedefaultdest" is a keyword
28189
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
   118
    sourceset = None
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
   119
    if x is not None:
31023
aea06029919e revset: import set classes directly from smartset module
Yuya Nishihara <yuya@tcha.org>
parents: 30865
diff changeset
   120
        sourceset = revset.getset(repo, smartset.fullreposet(repo), x)
aea06029919e revset: import set classes directly from smartset module
Yuya Nishihara <yuya@tcha.org>
parents: 30865
diff changeset
   121
    return subset & smartset.baseset([_destrebase(repo, sourceset)])
26301
3f8c5c284c86 rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26165
diff changeset
   122
33841
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33789
diff changeset
   123
def _ctxdesc(ctx):
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33789
diff changeset
   124
    """short description for a context"""
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33789
diff changeset
   125
    desc = '%d:%s "%s"' % (ctx.rev(), ctx,
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33789
diff changeset
   126
                           ctx.description().split('\n', 1)[0])
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33789
diff changeset
   127
    repo = ctx.repo()
34290
4f969b9e0cf5 rebase: also include other namespaces in changeset description
Martin von Zweigbergk <martinvonz@google.com>
parents: 34095
diff changeset
   128
    names = []
4f969b9e0cf5 rebase: also include other namespaces in changeset description
Martin von Zweigbergk <martinvonz@google.com>
parents: 34095
diff changeset
   129
    for nsname, ns in repo.names.iteritems():
4f969b9e0cf5 rebase: also include other namespaces in changeset description
Martin von Zweigbergk <martinvonz@google.com>
parents: 34095
diff changeset
   130
        if nsname == 'branches':
4f969b9e0cf5 rebase: also include other namespaces in changeset description
Martin von Zweigbergk <martinvonz@google.com>
parents: 34095
diff changeset
   131
            continue
4f969b9e0cf5 rebase: also include other namespaces in changeset description
Martin von Zweigbergk <martinvonz@google.com>
parents: 34095
diff changeset
   132
        names.extend(ns.names(repo, ctx.node()))
33841
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33789
diff changeset
   133
    if names:
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33789
diff changeset
   134
        desc += ' (%s)' % ' '.join(names)
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33789
diff changeset
   135
    return desc
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33789
diff changeset
   136
29358
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
   137
class rebaseruntime(object):
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
   138
    """This class is a container for rebase runtime state"""
29399
adb0d58b8b0b rebase: pass repo, ui and opts objects to the RR class constructor
Kostia Balytskyi <ikostia@fb.com>
parents: 29372
diff changeset
   139
    def __init__(self, repo, ui, opts=None):
adb0d58b8b0b rebase: pass repo, ui and opts objects to the RR class constructor
Kostia Balytskyi <ikostia@fb.com>
parents: 29372
diff changeset
   140
        if opts is None:
adb0d58b8b0b rebase: pass repo, ui and opts objects to the RR class constructor
Kostia Balytskyi <ikostia@fb.com>
parents: 29372
diff changeset
   141
            opts = {}
adb0d58b8b0b rebase: pass repo, ui and opts objects to the RR class constructor
Kostia Balytskyi <ikostia@fb.com>
parents: 29372
diff changeset
   142
34094
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   143
        # prepared: whether we have rebasestate prepared or not. Currently it
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   144
        # decides whether "self.repo" is unfiltered or not.
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   145
        # The rebasestate has explicit hash to hash instructions not depending
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   146
        # on visibility. If rebasestate exists (in-memory or on-disk), use
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   147
        # unfiltered repo to avoid visibility issues.
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   148
        # Before knowing rebasestate (i.e. when starting a new rebase (not
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   149
        # --continue or --abort)), the original repo should be used so
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   150
        # visibility-dependent revsets are correct.
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   151
        self.prepared = False
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   152
        self._repo = repo
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   153
29399
adb0d58b8b0b rebase: pass repo, ui and opts objects to the RR class constructor
Kostia Balytskyi <ikostia@fb.com>
parents: 29372
diff changeset
   154
        self.ui = ui
adb0d58b8b0b rebase: pass repo, ui and opts objects to the RR class constructor
Kostia Balytskyi <ikostia@fb.com>
parents: 29372
diff changeset
   155
        self.opts = opts
29358
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
   156
        self.originalwd = None
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
   157
        self.external = nullrev
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
   158
        # Mapping between the old revision id and either what is the new rebased
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
   159
        # revision or what needs to be done with the old revision. The state
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
   160
        # dict will be what contains most of the rebase progress state.
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
   161
        self.state = {}
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
   162
        self.activebookmark = None
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   163
        self.destmap = {}
29360
4cbe62ab5c97 rebase: move local variable 'skipped' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29359
diff changeset
   164
        self.skipped = set()
29358
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
   165
29400
c79da70a4659 rebase: move collapse-related local variables to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29399
diff changeset
   166
        self.collapsef = opts.get('collapse', False)
c79da70a4659 rebase: move collapse-related local variables to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29399
diff changeset
   167
        self.collapsemsg = cmdutil.logmessage(ui, opts)
29401
87acd047711e rebase: move local variables 'date' and 'extrafns' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29400
diff changeset
   168
        self.date = opts.get('date', None)
87acd047711e rebase: move local variables 'date' and 'extrafns' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29400
diff changeset
   169
87acd047711e rebase: move local variables 'date' and 'extrafns' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29400
diff changeset
   170
        e = opts.get('extrafn') # internal, used by e.g. hgsubversion
87acd047711e rebase: move local variables 'date' and 'extrafns' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29400
diff changeset
   171
        self.extrafns = [_savegraft]
87acd047711e rebase: move local variables 'date' and 'extrafns' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29400
diff changeset
   172
        if e:
87acd047711e rebase: move local variables 'date' and 'extrafns' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29400
diff changeset
   173
            self.extrafns = [e]
29400
c79da70a4659 rebase: move collapse-related local variables to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29399
diff changeset
   174
29402
7481ffb7ff83 rebase: move local variables related to keeping things unchanged to the RR
Kostia Balytskyi <ikostia@fb.com>
parents: 29401
diff changeset
   175
        self.keepf = opts.get('keep', False)
7481ffb7ff83 rebase: move local variables related to keeping things unchanged to the RR
Kostia Balytskyi <ikostia@fb.com>
parents: 29401
diff changeset
   176
        self.keepbranchesf = opts.get('keepbranches', False)
7481ffb7ff83 rebase: move local variables related to keeping things unchanged to the RR
Kostia Balytskyi <ikostia@fb.com>
parents: 29401
diff changeset
   177
        # keepopen is not meant for use on the command line, but by
7481ffb7ff83 rebase: move local variables related to keeping things unchanged to the RR
Kostia Balytskyi <ikostia@fb.com>
parents: 29401
diff changeset
   178
        # other extensions
7481ffb7ff83 rebase: move local variables related to keeping things unchanged to the RR
Kostia Balytskyi <ikostia@fb.com>
parents: 29401
diff changeset
   179
        self.keepopen = opts.get('keepopen', False)
29404
591a8069b60e rebase: move local variable 'obsoletenotrebased' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29403
diff changeset
   180
        self.obsoletenotrebased = {}
29402
7481ffb7ff83 rebase: move local variables related to keeping things unchanged to the RR
Kostia Balytskyi <ikostia@fb.com>
parents: 29401
diff changeset
   181
34094
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   182
    @property
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   183
    def repo(self):
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   184
        if self.prepared:
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   185
            return self._repo.unfiltered()
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   186
        else:
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   187
            return self._repo
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   188
31224
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31223
diff changeset
   189
    def storestatus(self, tr=None):
31223
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
   190
        """Store the current status to allow recovery"""
31224
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31223
diff changeset
   191
        if tr:
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31223
diff changeset
   192
            tr.addfilegenerator('rebasestate', ('rebasestate',),
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31223
diff changeset
   193
                                self._writestatus, location='plain')
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31223
diff changeset
   194
        else:
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31223
diff changeset
   195
            with self.repo.vfs("rebasestate", "w") as f:
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31223
diff changeset
   196
                self._writestatus(f)
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31223
diff changeset
   197
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31223
diff changeset
   198
    def _writestatus(self, f):
34095
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34094
diff changeset
   199
        repo = self.repo
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34094
diff changeset
   200
        assert repo.filtername is None
31223
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
   201
        f.write(repo[self.originalwd].hex() + '\n')
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   202
        # was "dest". we now write dest per src root below.
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   203
        f.write('\n')
31223
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
   204
        f.write(repo[self.external].hex() + '\n')
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
   205
        f.write('%d\n' % int(self.collapsef))
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
   206
        f.write('%d\n' % int(self.keepf))
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
   207
        f.write('%d\n' % int(self.keepbranchesf))
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
   208
        f.write('%s\n' % (self.activebookmark or ''))
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   209
        destmap = self.destmap
31223
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
   210
        for d, v in self.state.iteritems():
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
   211
            oldrev = repo[d].hex()
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
   212
            if v >= 0:
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
   213
                newrev = repo[v].hex()
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
   214
            else:
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
   215
                newrev = v
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   216
            destnode = repo[destmap[d]].hex()
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   217
            f.write("%s:%s:%s\n" % (oldrev, newrev, destnode))
31223
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
   218
        repo.ui.debug('rebase status stored\n')
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
   219
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   220
    def restorestatus(self):
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   221
        """Restore a previously stored status"""
34094
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   222
        self.prepared = True
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   223
        repo = self.repo
34095
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34094
diff changeset
   224
        assert repo.filtername is None
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   225
        keepbranches = None
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   226
        legacydest = None
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   227
        collapse = False
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   228
        external = nullrev
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   229
        activebookmark = None
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   230
        state = {}
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   231
        destmap = {}
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   232
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   233
        try:
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   234
            f = repo.vfs("rebasestate")
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   235
            for i, l in enumerate(f.read().splitlines()):
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   236
                if i == 0:
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   237
                    originalwd = repo[l].rev()
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   238
                elif i == 1:
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   239
                    # this line should be empty in newer version. but legacy
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   240
                    # clients may still use it
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   241
                    if l:
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   242
                        legacydest = repo[l].rev()
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   243
                elif i == 2:
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   244
                    external = repo[l].rev()
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   245
                elif i == 3:
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   246
                    collapse = bool(int(l))
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   247
                elif i == 4:
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   248
                    keep = bool(int(l))
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   249
                elif i == 5:
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   250
                    keepbranches = bool(int(l))
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   251
                elif i == 6 and not (len(l) == 81 and ':' in l):
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   252
                    # line 6 is a recent addition, so for backwards
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   253
                    # compatibility check that the line doesn't look like the
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   254
                    # oldrev:newrev lines
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   255
                    activebookmark = l
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   256
                else:
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   257
                    args = l.split(':')
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   258
                    oldrev = args[0]
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   259
                    newrev = args[1]
33843
d8d0ef5f5975 rebase: remove revprecursor and revpruned states (BC)
Jun Wu <quark@fb.com>
parents: 33842
diff changeset
   260
                    if newrev in legacystates:
d8d0ef5f5975 rebase: remove revprecursor and revpruned states (BC)
Jun Wu <quark@fb.com>
parents: 33842
diff changeset
   261
                        continue
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   262
                    if len(args) > 2:
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   263
                        destnode = args[2]
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   264
                    else:
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   265
                        destnode = legacydest
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   266
                    destmap[repo[oldrev].rev()] = repo[destnode].rev()
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   267
                    if newrev in (nullid, revtodostr):
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   268
                        state[repo[oldrev].rev()] = revtodo
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   269
                        # Legacy compat special case
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   270
                    else:
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   271
                        state[repo[oldrev].rev()] = repo[newrev].rev()
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   272
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   273
        except IOError as err:
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   274
            if err.errno != errno.ENOENT:
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   275
                raise
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   276
            cmdutil.wrongtooltocontinue(repo, _('rebase'))
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   277
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   278
        if keepbranches is None:
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   279
            raise error.Abort(_('.hg/rebasestate is incomplete'))
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   280
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   281
        skipped = set()
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   282
        # recompute the set of skipped revs
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   283
        if not collapse:
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   284
            seen = set(destmap.values())
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   285
            for old, new in sorted(state.items()):
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   286
                if new != revtodo and new in seen:
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   287
                    skipped.add(old)
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   288
                seen.add(new)
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   289
        repo.ui.debug('computed skipped revs: %s\n' %
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   290
                        (' '.join(str(r) for r in sorted(skipped)) or None))
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   291
        repo.ui.debug('rebase status resumed\n')
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   292
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   293
        self.originalwd = originalwd
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   294
        self.destmap = destmap
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   295
        self.state = state
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   296
        self.skipped = skipped
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   297
        self.collapsef = collapse
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   298
        self.keepf = keep
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   299
        self.keepbranchesf = keepbranches
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   300
        self.external = external
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   301
        self.activebookmark = activebookmark
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   302
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   303
    def _handleskippingobsolete(self, obsoleterevs, destmap):
29479
5d16ebe7b14f rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents: 29478
diff changeset
   304
        """Compute structures necessary for skipping obsolete revisions
5d16ebe7b14f rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents: 29478
diff changeset
   305
5d16ebe7b14f rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents: 29478
diff changeset
   306
        obsoleterevs:   iterable of all obsolete revisions in rebaseset
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   307
        destmap:        {srcrev: destrev} destination revisions
29479
5d16ebe7b14f rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents: 29478
diff changeset
   308
        """
5d16ebe7b14f rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents: 29478
diff changeset
   309
        self.obsoletenotrebased = {}
34492
a5a810df4c81 configitems: register the 'experimental.rebaseskipobsolete' config
Boris Feld <boris.feld@octobus.net>
parents: 34367
diff changeset
   310
        if not self.ui.configbool('experimental', 'rebaseskipobsolete'):
29479
5d16ebe7b14f rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents: 29478
diff changeset
   311
            return
5d16ebe7b14f rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents: 29478
diff changeset
   312
        obsoleteset = set(obsoleterevs)
5d16ebe7b14f rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents: 29478
diff changeset
   313
        self.obsoletenotrebased = _computeobsoletenotrebased(self.repo,
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   314
                                    obsoleteset, destmap)
29479
5d16ebe7b14f rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents: 29478
diff changeset
   315
        skippedset = set(self.obsoletenotrebased)
33846
3b04a6ff625c rebase: remove rebaseset from _checkobsrebase
Jun Wu <quark@fb.com>
parents: 33845
diff changeset
   316
        _checkobsrebase(self.repo, self.ui, obsoleteset, skippedset)
29479
5d16ebe7b14f rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents: 29478
diff changeset
   317
29472
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
   318
    def _prepareabortorcontinue(self, isabort):
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
   319
        try:
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
   320
            self.restorestatus()
31225
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
   321
            self.collapsemsg = restorecollapsemsg(self.repo, isabort)
29472
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
   322
        except error.RepoLookupError:
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
   323
            if isabort:
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
   324
                clearstatus(self.repo)
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
   325
                clearcollapsemsg(self.repo)
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
   326
                self.repo.ui.warn(_('rebase aborted (no revision is removed,'
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
   327
                                    ' only broken state is cleared)\n'))
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
   328
                return 0
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
   329
            else:
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
   330
                msg = _('cannot continue inconsistent rebase')
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
   331
                hint = _('use "hg rebase --abort" to clear broken state')
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
   332
                raise error.Abort(msg, hint=hint)
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
   333
        if isabort:
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   334
            return abort(self.repo, self.originalwd, self.destmap,
29472
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
   335
                         self.state, activebookmark=self.activebookmark)
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
   336
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   337
    def _preparenewrebase(self, destmap):
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   338
        if not destmap:
29473
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
   339
            return _nothingtorebase()
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
   340
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   341
        rebaseset = destmap.keys()
29473
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
   342
        allowunstable = obsolete.isenabled(self.repo, obsolete.allowunstableopt)
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
   343
        if (not (self.keepf or allowunstable)
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
   344
              and self.repo.revs('first(children(%ld) - %ld)',
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
   345
                                 rebaseset, rebaseset)):
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
   346
            raise error.Abort(
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
   347
                _("can't remove original changesets with"
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
   348
                  " unrebased descendants"),
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
   349
                hint=_('use --keep to keep original changesets'))
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
   350
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
   351
        result = buildstate(self.repo, destmap, self.collapsef)
29473
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
   352
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
   353
        if not result:
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
   354
            # Empty state built, nothing to rebase
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
   355
            self.ui.status(_('nothing to rebase\n'))
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
   356
            return _nothingtorebase()
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
   357
31302
681046de87f1 rebase: abort if *any* commit in rebase set is public
Martin von Zweigbergk <martinvonz@google.com>
parents: 31297
diff changeset
   358
        for root in self.repo.set('roots(%ld)', rebaseset):
681046de87f1 rebase: abort if *any* commit in rebase set is public
Martin von Zweigbergk <martinvonz@google.com>
parents: 31297
diff changeset
   359
            if not self.keepf and not root.mutable():
681046de87f1 rebase: abort if *any* commit in rebase set is public
Martin von Zweigbergk <martinvonz@google.com>
parents: 31297
diff changeset
   360
                raise error.Abort(_("can't rebase public changeset %s")
681046de87f1 rebase: abort if *any* commit in rebase set is public
Martin von Zweigbergk <martinvonz@google.com>
parents: 31297
diff changeset
   361
                                  % root,
681046de87f1 rebase: abort if *any* commit in rebase set is public
Martin von Zweigbergk <martinvonz@google.com>
parents: 31297
diff changeset
   362
                                  hint=_("see 'hg help phases' for details"))
29473
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
   363
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   364
        (self.originalwd, self.destmap, self.state) = result
29473
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
   365
        if self.collapsef:
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   366
            dests = set(self.destmap.values())
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   367
            if len(dests) != 1:
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   368
                raise error.Abort(
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   369
                    _('--collapse does not work with multiple destinations'))
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   370
            destrev = next(iter(dests))
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   371
            destancestors = self.repo.changelog.ancestors([destrev],
33847
ddf77c0cc169 rebase: remove self.destancestors
Jun Wu <quark@fb.com>
parents: 33846
diff changeset
   372
                                                          inclusive=True)
ddf77c0cc169 rebase: remove self.destancestors
Jun Wu <quark@fb.com>
parents: 33846
diff changeset
   373
            self.external = externalparent(self.repo, self.state, destancestors)
29473
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
   374
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   375
        for destrev in sorted(set(destmap.values())):
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   376
            dest = self.repo[destrev]
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   377
            if dest.closesbranch() and not self.keepbranchesf:
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   378
                self.ui.status(_('reopening closed branch head %s\n') % dest)
29473
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
   379
34094
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   380
        self.prepared = True
29473
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
   381
33569
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
   382
    def _performrebase(self, tr):
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
   383
        repo, ui = self.repo, self.ui
29477
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   384
        if self.keepbranchesf:
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   385
            # insert _savebranch at the start of extrafns so if
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   386
            # there's a user-provided extrafn it can clobber branch if
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   387
            # desired
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   388
            self.extrafns.insert(0, _savebranch)
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   389
            if self.collapsef:
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   390
                branches = set()
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   391
                for rev in self.state:
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   392
                    branches.add(repo[rev].branch())
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   393
                    if len(branches) > 1:
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   394
                        raise error.Abort(_('cannot collapse multiple named '
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   395
                            'branches'))
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   396
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
   397
        # Calculate self.obsoletenotrebased
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
   398
        obsrevs = _filterobsoleterevs(self.repo, self.state)
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
   399
        self._handleskippingobsolete(obsrevs, self.destmap)
29477
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   400
33332
3b7cb3d17137 rebase: use scmutil.cleanupnodes (issue5606) (BC)
Jun Wu <quark@fb.com>
parents: 33157
diff changeset
   401
        # Keep track of the active bookmarks in order to reset them later
29477
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   402
        self.activebookmark = self.activebookmark or repo._activebookmark
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   403
        if self.activebookmark:
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   404
            bookmarks.deactivate(repo)
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   405
31225
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
   406
        # Store the state before we begin so users can run 'hg rebase --abort'
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
   407
        # if we fail before the transaction closes.
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
   408
        self.storestatus()
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
   409
29872
58db005d870e rebase: properly calculate total commits to rebase (issue5347)
timeless <timeless@mozdev.org>
parents: 29841
diff changeset
   410
        cands = [k for k, v in self.state.iteritems() if v == revtodo]
58db005d870e rebase: properly calculate total commits to rebase (issue5347)
timeless <timeless@mozdev.org>
parents: 29841
diff changeset
   411
        total = len(cands)
29477
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   412
        pos = 0
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
   413
        for subset in sortsource(self.destmap):
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
   414
            pos = self._performrebasesubset(tr, subset, pos, total)
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
   415
        ui.progress(_('rebasing'), None)
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
   416
        ui.note(_('rebase merging completed\n'))
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
   417
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
   418
    def _performrebasesubset(self, tr, subset, pos, total):
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
   419
        repo, ui, opts = self.repo, self.ui, self.opts
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
   420
        sortedrevs = repo.revs('sort(%ld, -topo)', subset)
29552
db26925bdbb0 rebase: remove sortedstate-related confusion
Kostia Balytskyi <ikostia@fb.com>
parents: 29551
diff changeset
   421
        for rev in sortedrevs:
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   422
            dest = self.destmap[rev]
29477
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   423
            ctx = repo[rev]
33841
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33789
diff changeset
   424
            desc = _ctxdesc(ctx)
32272
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
   425
            if self.state[rev] == rev:
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
   426
                ui.status(_('already rebased %s\n') % desc)
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
   427
            elif rev in self.obsoletenotrebased:
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
   428
                succ = self.obsoletenotrebased[rev]
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
   429
                if succ is None:
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
   430
                    msg = _('note: not rebasing %s, it has no '
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
   431
                            'successor\n') % desc
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
   432
                else:
34009
79ab5369d55a rebase: use _ctxdesc in one more place
Jun Wu <quark@fb.com>
parents: 34008
diff changeset
   433
                    succdesc = _ctxdesc(repo[succ])
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
   434
                    msg = (_('note: not rebasing %s, already in '
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
   435
                             'destination as %s\n') % (desc, succdesc))
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
   436
                repo.ui.status(msg)
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
   437
                # Make clearrebased aware state[rev] is not a true successor
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
   438
                self.skipped.add(rev)
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
   439
                # Record rev as moved to its desired destination in self.state.
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
   440
                # This helps bookmark and working parent movement.
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
   441
                dest = max(adjustdest(repo, rev, self.destmap, self.state,
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
   442
                                      self.skipped))
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
   443
                self.state[rev] = dest
32272
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
   444
            elif self.state[rev] == revtodo:
29872
58db005d870e rebase: properly calculate total commits to rebase (issue5347)
timeless <timeless@mozdev.org>
parents: 29841
diff changeset
   445
                pos += 1
29477
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   446
                ui.status(_('rebasing %s\n') % desc)
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   447
                ui.progress(_("rebasing"), pos, ("%d:%s" % (rev, ctx)),
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   448
                            _('changesets'), total)
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   449
                p1, p2, base = defineparents(repo, rev, self.destmap,
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
   450
                                             self.state, self.skipped,
29477
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   451
                                             self.obsoletenotrebased)
33569
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
   452
                self.storestatus(tr=tr)
29477
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   453
                storecollapsemsg(repo, self.collapsemsg)
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   454
                if len(repo[None].parents()) == 2:
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   455
                    repo.ui.debug('resuming interrupted rebase\n')
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   456
                else:
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   457
                    try:
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   458
                        ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   459
                                     'rebase')
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   460
                        stats = rebasenode(repo, rev, p1, base, self.state,
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   461
                                           self.collapsef, dest)
29477
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   462
                        if stats and stats[3] > 0:
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   463
                            raise error.InterventionRequired(
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   464
                                _('unresolved conflicts (see hg '
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   465
                                  'resolve, then hg rebase --continue)'))
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   466
                    finally:
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   467
                        ui.setconfig('ui', 'forcemerge', '', 'rebase')
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   468
                if not self.collapsef:
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   469
                    merging = p2 != nullrev
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   470
                    editform = cmdutil.mergeeditform(merging, 'rebase')
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   471
                    editor = cmdutil.getcommiteditor(editform=editform, **opts)
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   472
                    newnode = concludenode(repo, rev, p1, p2,
29551
333dd3ab8fb2 rebase: replace extrafn field with _makeextrafn invocations
Kostia Balytskyi <ikostia@fb.com>
parents: 29479
diff changeset
   473
                                           extrafn=_makeextrafn(self.extrafns),
29477
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   474
                                           editor=editor,
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   475
                                           keepbranches=self.keepbranchesf,
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   476
                                           date=self.date)
32313
a580b2d65ded rebase: make sure merge state is cleaned up for no-op rebases (issue5494)
Jeremy Fitzhardinge <jsgf@fb.com>
parents: 32291
diff changeset
   477
                    if newnode is None:
a580b2d65ded rebase: make sure merge state is cleaned up for no-op rebases (issue5494)
Jeremy Fitzhardinge <jsgf@fb.com>
parents: 32291
diff changeset
   478
                        # If it ended up being a no-op commit, then the normal
a580b2d65ded rebase: make sure merge state is cleaned up for no-op rebases (issue5494)
Jeremy Fitzhardinge <jsgf@fb.com>
parents: 32291
diff changeset
   479
                        # merge state clean-up path doesn't happen, so do it
a580b2d65ded rebase: make sure merge state is cleaned up for no-op rebases (issue5494)
Jeremy Fitzhardinge <jsgf@fb.com>
parents: 32291
diff changeset
   480
                        # here. Fix issue5494
a580b2d65ded rebase: make sure merge state is cleaned up for no-op rebases (issue5494)
Jeremy Fitzhardinge <jsgf@fb.com>
parents: 32291
diff changeset
   481
                        mergemod.mergestate.clean(repo)
29477
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   482
                else:
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   483
                    # Skip commit if we are collapsing
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   484
                    repo.setparents(repo[p1].node())
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   485
                    newnode = None
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   486
                # Update the state
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   487
                if newnode is not None:
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   488
                    self.state[rev] = repo[newnode].rev()
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   489
                    ui.debug('rebased as %s\n' % short(newnode))
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   490
                else:
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   491
                    if not self.collapsef:
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   492
                        ui.warn(_('note: rebase of %d:%s created no changes '
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   493
                                  'to commit\n') % (rev, ctx))
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   494
                        self.skipped.add(rev)
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   495
                    self.state[rev] = p1
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   496
                    ui.debug('next revision set to %s\n' % p1)
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   497
            else:
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   498
                ui.status(_('already rebased %s as %s\n') %
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   499
                          (desc, repo[self.state[rev]]))
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
   500
        return pos
29477
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   501
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   502
    def _finishrebase(self):
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   503
        repo, ui, opts = self.repo, self.ui, self.opts
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   504
        if self.collapsef and not self.keepopen:
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   505
            p1, p2, _base = defineparents(repo, min(self.state), self.destmap,
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
   506
                                          self.state, self.skipped,
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   507
                                          self.obsoletenotrebased)
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   508
            editopt = opts.get('edit')
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   509
            editform = 'rebase.collapse'
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   510
            if self.collapsemsg:
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   511
                commitmsg = self.collapsemsg
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   512
            else:
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   513
                commitmsg = 'Collapsed revision'
33622
5a5f600b06ad rebase: sort collapsed revisions in commit message (issue5643)
Yuya Nishihara <yuya@tcha.org>
parents: 33590
diff changeset
   514
                for rebased in sorted(self.state):
33848
bc9e075133c9 rebase: remove "state >= revtodo" condition
Jun Wu <quark@fb.com>
parents: 33847
diff changeset
   515
                    if rebased not in self.skipped:
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   516
                        commitmsg += '\n* %s' % repo[rebased].description()
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   517
                editopt = True
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   518
            editor = cmdutil.getcommiteditor(edit=editopt, editform=editform)
29552
db26925bdbb0 rebase: remove sortedstate-related confusion
Kostia Balytskyi <ikostia@fb.com>
parents: 29551
diff changeset
   519
            revtoreuse = max(self.state)
33619
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
   520
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
   521
            dsguard = None
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
   522
            if ui.configbool('rebase', 'singletransaction'):
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
   523
                dsguard = dirstateguard.dirstateguard(repo, 'rebase')
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
   524
            with util.acceptintervention(dsguard):
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
   525
                newnode = concludenode(repo, revtoreuse, p1, self.external,
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
   526
                                       commitmsg=commitmsg,
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
   527
                                       extrafn=_makeextrafn(self.extrafns),
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
   528
                                       editor=editor,
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
   529
                                       keepbranches=self.keepbranchesf,
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
   530
                                       date=self.date)
33864
70354bd4f19b rebase: only change self.state when collapsing in _finishrebase
Jun Wu <quark@fb.com>
parents: 33863
diff changeset
   531
            if newnode is not None:
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   532
                newrev = repo[newnode].rev()
33864
70354bd4f19b rebase: only change self.state when collapsing in _finishrebase
Jun Wu <quark@fb.com>
parents: 33863
diff changeset
   533
                for oldrev in self.state.iterkeys():
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   534
                    self.state[oldrev] = newrev
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   535
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   536
        if 'qtip' in repo.tags():
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   537
            updatemq(repo, self.state, self.skipped, **opts)
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   538
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   539
        # restore original working directory
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   540
        # (we do this before stripping)
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   541
        newwd = self.state.get(self.originalwd, self.originalwd)
33843
d8d0ef5f5975 rebase: remove revprecursor and revpruned states (BC)
Jun Wu <quark@fb.com>
parents: 33842
diff changeset
   542
        if newwd < 0:
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   543
            # original directory is a parent of rebase set root or ignored
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   544
            newwd = self.originalwd
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   545
        if newwd not in [c.rev() for c in repo[None].parents()]:
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   546
            ui.note(_("update back to initial working directory parent\n"))
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   547
            hg.updaterepo(repo, newwd, False)
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   548
34354
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
   549
        collapsedas = None
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   550
        if not self.keepf:
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   551
            if self.collapsef:
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   552
                collapsedas = newnode
34367
f61f5af5ed31 merge with stable
Martin von Zweigbergk <martinvonz@google.com>
parents: 34290 34354
diff changeset
   553
        clearrebased(ui, repo, self.destmap, self.state, self.skipped,
34354
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
   554
                     collapsedas, self.keepf)
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   555
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   556
        clearstatus(repo)
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   557
        clearcollapsemsg(repo)
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   558
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   559
        ui.note(_("rebase completed\n"))
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   560
        util.unlinkpath(repo.sjoin('undo'), ignoremissing=True)
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   561
        if self.skipped:
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   562
            skippedlen = len(self.skipped)
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   563
            ui.note(_("%d revisions have been skipped\n") % skippedlen)
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   564
33332
3b7cb3d17137 rebase: use scmutil.cleanupnodes (issue5606) (BC)
Jun Wu <quark@fb.com>
parents: 33157
diff changeset
   565
        if (self.activebookmark and self.activebookmark in repo._bookmarks and
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   566
            repo['.'].node() == repo._bookmarks[self.activebookmark]):
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   567
                bookmarks.activate(repo, self.activebookmark)
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   568
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   569
@command('rebase',
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   570
    [('s', 'source', '',
22789
5f4934487382 rebase: attempt to clarify --base
Matt Mackall <mpm@selenic.com>
parents: 22405
diff changeset
   571
     _('rebase the specified changeset and descendants'), _('REV')),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   572
    ('b', 'base', '',
22789
5f4934487382 rebase: attempt to clarify --base
Matt Mackall <mpm@selenic.com>
parents: 22405
diff changeset
   573
     _('rebase everything from branching point of specified changeset'),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   574
     _('REV')),
15270
6cb6064f1d50 rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15269
diff changeset
   575
    ('r', 'rev', [],
6cb6064f1d50 rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15269
diff changeset
   576
     _('rebase these revisions'),
6cb6064f1d50 rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15269
diff changeset
   577
     _('REV')),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   578
    ('d', 'dest', '',
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   579
     _('rebase onto the specified changeset'), _('REV')),
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   580
    ('', 'collapse', False, _('collapse the rebased changesets')),
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   581
    ('m', 'message', '',
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   582
     _('use text as collapse commit message'), _('TEXT')),
15219
9d58569a8b92 rebase: add --edit switch
Matt Mackall <mpm@selenic.com>
parents: 15214
diff changeset
   583
    ('e', 'edit', False, _('invoke editor on commit messages')),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   584
    ('l', 'logfile', '',
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   585
     _('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
   586
    ('k', 'keep', False, _('keep original changesets')),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   587
    ('', '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
   588
    ('D', 'detach', False, _('(DEPRECATED)')),
22382
d5b04ee8ecf7 rebase: add a deprecated -i/--interactive flag
David Soria Parra <davidsp@fb.com>
parents: 22251
diff changeset
   589
    ('i', 'interactive', False, _('(DEPRECATED)')),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   590
    ('t', 'tool', '', _('specify merge tool')),
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   591
    ('c', 'continue', False, _('continue an interrupted rebase')),
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   592
    ('a', 'abort', False, _('abort an interrupted rebase'))] +
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   593
     templateopts,
17325
e4db509c08ec rebase: remove second broken synopsis line (issue3172)
Patrick Mezard <patrick@mezard.eu>
parents: 17059
diff changeset
   594
    _('[-s REV | -b REV] [-d REV] [OPTION]'))
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   595
def rebase(ui, repo, **opts):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   596
    """move changeset (and descendants) to a different branch
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   597
7999
b25110140573 rebase: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7955
diff changeset
   598
    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
   599
    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
   600
    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
   601
    development tree.
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
   602
27454
3e3be524a712 rebase: simplify documentation about public commits
timeless <timeless@mozdev.org>
parents: 27344
diff changeset
   603
    Published commits cannot be rebased (see :hg:`help phases`).
3e3be524a712 rebase: simplify documentation about public commits
timeless <timeless@mozdev.org>
parents: 27344
diff changeset
   604
    To copy commits, see :hg:`help graft`.
18516
9fbeb61b8ad2 rebase: mention phases in the help
Kevin Bullock <kbullock@ringworld.org>
parents: 18514
diff changeset
   605
28189
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
   606
    If you don't specify a destination changeset (``-d/--dest``), rebase
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
   607
    will use the same logic as :hg:`merge` to pick a destination.  if
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
   608
    the current branch contains exactly one other head, the other head
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
   609
    is merged with by default.  Otherwise, an explicit revision with
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
   610
    which to merge with must be provided.  (destination changeset is not
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
   611
    modified by rebasing, but new changesets are added as its
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
   612
    descendants.)
10646
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
   613
27956
f3eb98b8fe12 doc: prevent non-literal text block from being treated as literal one
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 27932
diff changeset
   614
    Here are the ways to select changesets:
27455
a9a047878e14 rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents: 27454
diff changeset
   615
a9a047878e14 rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents: 27454
diff changeset
   616
      1. Explicitly select them using ``--rev``.
10646
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
   617
27455
a9a047878e14 rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents: 27454
diff changeset
   618
      2. Use ``--source`` to select a root changeset and include all of its
27959
4322849a5357 doc: use correct indentation for enumeration
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 27956
diff changeset
   619
         descendants.
27455
a9a047878e14 rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents: 27454
diff changeset
   620
a9a047878e14 rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents: 27454
diff changeset
   621
      3. Use ``--base`` to select a changeset; rebase will find ancestors
27959
4322849a5357 doc: use correct indentation for enumeration
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 27956
diff changeset
   622
         and their descendants which are not also ancestors of the destination.
18518
0324a1d88a53 rebase: mention --rev in the help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18516
diff changeset
   623
27932
6bc2299cc12f rebase: restore help for rebase w/o args (issue5059)
timeless <timeless@mozdev.org>
parents: 27866
diff changeset
   624
      4. If you do not specify any of ``--rev``, ``source``, or ``--base``,
27959
4322849a5357 doc: use correct indentation for enumeration
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 27956
diff changeset
   625
         rebase will use ``--base .`` as above.
27932
6bc2299cc12f rebase: restore help for rebase w/o args (issue5059)
timeless <timeless@mozdev.org>
parents: 27866
diff changeset
   626
27456
2337958596e3 rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents: 27455
diff changeset
   627
    Rebase will destroy original changesets unless you use ``--keep``.
2337958596e3 rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents: 27455
diff changeset
   628
    It will also move your bookmarks (even if you do).
2337958596e3 rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents: 27455
diff changeset
   629
2337958596e3 rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents: 27455
diff changeset
   630
    Some changesets may be dropped if they do not contribute changes
2337958596e3 rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents: 27455
diff changeset
   631
    (e.g. merges from the destination branch).
10646
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
   632
27457
97cc045f1cfe rebase: simplify documentation about heads
timeless <timeless@mozdev.org>
parents: 27456
diff changeset
   633
    Unlike ``merge``, rebase will do nothing if you are at the branch tip of
97cc045f1cfe rebase: simplify documentation about heads
timeless <timeless@mozdev.org>
parents: 27456
diff changeset
   634
    a named branch with two heads. You will need to explicitly specify source
97cc045f1cfe rebase: simplify documentation about heads
timeless <timeless@mozdev.org>
parents: 27456
diff changeset
   635
    and/or destination.
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   636
28001
ade12bf2bf0e rebase: mention help merge-tools in help
timeless <timeless@mozdev.org>
parents: 27977
diff changeset
   637
    If you need to use a tool to automate merge/conflict decisions, you
ade12bf2bf0e rebase: mention help merge-tools in help
timeless <timeless@mozdev.org>
parents: 27977
diff changeset
   638
    can specify one with ``--tool``, see :hg:`help merge-tools`.
28002
e862b1fd33a8 rebase: document that tool does not apply to deleted files
timeless <timeless@mozdev.org>
parents: 28001
diff changeset
   639
    As a caveat: the tool will not be used to mediate when a file was
e862b1fd33a8 rebase: document that tool does not apply to deleted files
timeless <timeless@mozdev.org>
parents: 28001
diff changeset
   640
    deleted, there is no hook presently available for this.
28001
ade12bf2bf0e rebase: mention help merge-tools in help
timeless <timeless@mozdev.org>
parents: 27977
diff changeset
   641
27458
d39e743e3578 rebase: mention conflict in documentation instead of merge
timeless <timeless@mozdev.org>
parents: 27457
diff changeset
   642
    If a rebase is interrupted to manually resolve a conflict, it can be
8076
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8031
diff changeset
   643
    continued with --continue/-c or aborted with --abort/-a.
11205
d26f662bfbf5 rebase: add error codes
Matt Mackall <mpm@selenic.com>
parents: 11204
diff changeset
   644
22790
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   645
    .. container:: verbose
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   646
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   647
      Examples:
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   648
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   649
      - move "local changes" (current commit back to branching point)
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   650
        to the current branch tip after a pull::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   651
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   652
          hg rebase
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   653
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   654
      - move a single changeset to the stable branch::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   655
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   656
          hg rebase -r 5f493448 -d stable
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   657
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   658
      - 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
   659
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   660
          hg rebase --source c0c3 --dest 4cf9
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   661
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   662
      - 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
   663
        default branch::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   664
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   665
          hg rebase --base myfeature --dest default
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   666
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   667
      - collapse a sequence of changes into a single commit::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   668
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   669
          hg rebase --collapse -r 1520:1525 -d .
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   670
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   671
      - move a named branch while preserving its name::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   672
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   673
          hg rebase -r "branch(featureX)" -d 1.3 --keepbranches
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   674
31558
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
   675
    Configuration Options:
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
   676
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
   677
    You can make rebase require a destination if you set the following config
32084
091d6b9157da help: apply bulk fixes for indentation and literal blocking issues
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32083
diff changeset
   678
    option::
31558
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
   679
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
   680
      [commands]
32083
1c911adebf48 rebase: fix incorrect configuration example
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31733
diff changeset
   681
      rebase.requiredest = True
31558
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
   682
33569
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
   683
    By default, rebase will close the transaction after each commit. For
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
   684
    performance purposes, you can configure rebase to use a single transaction
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
   685
    across the entire rebase. WARNING: This setting introduces a significant
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
   686
    risk of losing the work you've done in a rebase if the rebase aborts
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
   687
    unexpectedly::
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
   688
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
   689
      [rebase]
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
   690
      singletransaction = True
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
   691
31558
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
   692
    Return Values:
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
   693
19971
2a9bb64faa0b rebase: add description about exit code when there are unresolved conflicts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19969
diff changeset
   694
    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
   695
    unresolved conflicts.
22790
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   696
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   697
    """
29399
adb0d58b8b0b rebase: pass repo, ui and opts objects to the RR class constructor
Kostia Balytskyi <ikostia@fb.com>
parents: 29372
diff changeset
   698
    rbsrt = rebaseruntime(repo, ui, opts)
15219
9d58569a8b92 rebase: add --edit switch
Matt Mackall <mpm@selenic.com>
parents: 15214
diff changeset
   699
32917
070920db8b87 rebase: use context manager for locking in rebase()
Martin von Zweigbergk <martinvonz@google.com>
parents: 32900
diff changeset
   700
    with repo.wlock(), repo.lock():
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   701
        # Validate input and define rebasing points
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   702
        destf = opts.get('dest', None)
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   703
        srcf = opts.get('source', None)
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   704
        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
   705
        revf = opts.get('rev', [])
29043
cf7de4aeb86b destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 28686
diff changeset
   706
        # search default destination in this space
cf7de4aeb86b destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 28686
diff changeset
   707
        # used in the 'hg pull --rebase' case, see issue 5214.
cf7de4aeb86b destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 28686
diff changeset
   708
        destspace = opts.get('_destspace')
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   709
        contf = opts.get('continue')
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   710
        abortf = opts.get('abort')
22382
d5b04ee8ecf7 rebase: add a deprecated -i/--interactive flag
David Soria Parra <davidsp@fb.com>
parents: 22251
diff changeset
   711
        if opts.get('interactive'):
26496
b885ab9ca182 rebase: enable histedit for useful help with it
timeless@mozdev.org
parents: 26495
diff changeset
   712
            try:
b885ab9ca182 rebase: enable histedit for useful help with it
timeless@mozdev.org
parents: 26495
diff changeset
   713
                if extensions.find('histedit'):
b885ab9ca182 rebase: enable histedit for useful help with it
timeless@mozdev.org
parents: 26495
diff changeset
   714
                    enablehistedit = ''
b885ab9ca182 rebase: enable histedit for useful help with it
timeless@mozdev.org
parents: 26495
diff changeset
   715
            except KeyError:
b885ab9ca182 rebase: enable histedit for useful help with it
timeless@mozdev.org
parents: 26495
diff changeset
   716
                enablehistedit = " --config extensions.histedit="
b885ab9ca182 rebase: enable histedit for useful help with it
timeless@mozdev.org
parents: 26495
diff changeset
   717
            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
   718
            msg = _("interactive history editing is supported by the "
26494
832f40d2af53 rebase: factor out histedit help command
timeless@mozdev.org
parents: 26421
diff changeset
   719
                    "'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
   720
            raise error.Abort(msg)
22382
d5b04ee8ecf7 rebase: add a deprecated -i/--interactive flag
David Soria Parra <davidsp@fb.com>
parents: 22251
diff changeset
   721
29400
c79da70a4659 rebase: move collapse-related local variables to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29399
diff changeset
   722
        if rbsrt.collapsemsg and not rbsrt.collapsef:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26496
diff changeset
   723
            raise error.Abort(
13661
ee349e228835 rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents: 13609
diff changeset
   724
                _('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
   725
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   726
        if contf or abortf:
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   727
            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
   728
                raise error.Abort(_('cannot use both abort and continue'))
29400
c79da70a4659 rebase: move collapse-related local variables to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29399
diff changeset
   729
            if rbsrt.collapsef:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26496
diff changeset
   730
                raise error.Abort(
11285
f118029e534c rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents: 11205
diff changeset
   731
                    _('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
   732
            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
   733
                raise error.Abort(
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   734
                    _('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
   735
            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
   736
                ui.warn(_('tool option will be ignored\n'))
30273
86f4ef63d507 rebase: check for conflicts before continuing
timeless <timeless@mozdev.org>
parents: 30271
diff changeset
   737
            if contf:
86f4ef63d507 rebase: check for conflicts before continuing
timeless <timeless@mozdev.org>
parents: 30271
diff changeset
   738
                ms = mergemod.mergestate.read(repo)
30495
d528ddc11b33 rebase: refer to checkunresolved by its new name
Augie Fackler <augie@google.com>
parents: 30490
diff changeset
   739
                mergeutil.checkunresolved(ms)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   740
29472
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
   741
            retcode = rbsrt._prepareabortorcontinue(abortf)
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
   742
            if retcode is not None:
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
   743
                return retcode
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   744
        else:
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   745
            destmap = _definedestmap(ui, repo, destf, srcf, basef, revf,
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   746
                                     destspace=destspace)
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   747
            retcode = rbsrt._preparenewrebase(destmap)
29473
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
   748
            if retcode is not None:
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
   749
                return retcode
21027
25ee5dbebc6b rebase: tell when reopening a closed branch head
Mads Kiilerich <madski@unity3d.com>
parents: 20790
diff changeset
   750
33569
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
   751
        tr = None
33619
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
   752
        dsguard = None
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
   753
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
   754
        singletr = ui.configbool('rebase', 'singletransaction')
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
   755
        if singletr:
33569
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
   756
            tr = repo.transaction('rebase')
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
   757
        with util.acceptintervention(tr):
33619
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
   758
            if singletr:
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
   759
                dsguard = dirstateguard.dirstateguard(repo, 'rebase')
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
   760
            with util.acceptintervention(dsguard):
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
   761
                rbsrt._performrebase(tr)
33569
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
   762
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   763
        rbsrt._finishrebase()
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   764
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   765
def _definedestmap(ui, repo, destf=None, srcf=None, basef=None, revf=None,
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   766
                   destspace=None):
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   767
    """use revisions argument to define destmap {srcrev: destrev}"""
31431
406705701c2d rebase: explicitly tests for None
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31395
diff changeset
   768
    if revf is None:
406705701c2d rebase: explicitly tests for None
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31395
diff changeset
   769
        revf = []
31395
361bccce566a rebase: don't use mutable default argument value
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31380
diff changeset
   770
29043
cf7de4aeb86b destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 28686
diff changeset
   771
    # destspace is here to work around issues with `hg pull --rebase` see
cf7de4aeb86b destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 28686
diff changeset
   772
    # issue5214 for details
28136
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   773
    if srcf and basef:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   774
        raise error.Abort(_('cannot specify both a source and a base'))
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   775
    if revf and basef:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   776
        raise error.Abort(_('cannot specify both a revision and a base'))
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   777
    if revf and srcf:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   778
        raise error.Abort(_('cannot specify both a revision and a source'))
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   779
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   780
    cmdutil.checkunfinished(repo)
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   781
    cmdutil.bailifchanged(repo)
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   782
31731
b5afec71c1f9 rebase: allow destination-free continue and abort (issue5513)
Ryan McElroy <rmcelroy@fb.com>
parents: 31621
diff changeset
   783
    if ui.configbool('commands', 'rebase.requiredest') and not destf:
b5afec71c1f9 rebase: allow destination-free continue and abort (issue5513)
Ryan McElroy <rmcelroy@fb.com>
parents: 31621
diff changeset
   784
        raise error.Abort(_('you must specify a destination'),
b5afec71c1f9 rebase: allow destination-free continue and abort (issue5513)
Ryan McElroy <rmcelroy@fb.com>
parents: 31621
diff changeset
   785
                          hint=_('use: hg rebase -d REV'))
b5afec71c1f9 rebase: allow destination-free continue and abort (issue5513)
Ryan McElroy <rmcelroy@fb.com>
parents: 31621
diff changeset
   786
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   787
    dest = None
28136
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   788
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   789
    if revf:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   790
        rebaseset = scmutil.revrange(repo, revf)
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   791
        if not rebaseset:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   792
            ui.status(_('empty "rev" revision set - nothing to rebase\n'))
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   793
            return None
28136
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   794
    elif srcf:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   795
        src = scmutil.revrange(repo, [srcf])
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   796
        if not src:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   797
            ui.status(_('empty "source" revision set - nothing to rebase\n'))
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   798
            return None
28136
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   799
        rebaseset = repo.revs('(%ld)::', src)
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   800
        assert rebaseset
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   801
    else:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   802
        base = scmutil.revrange(repo, [basef or '.'])
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   803
        if not base:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   804
            ui.status(_('empty "base" revision set - '
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   805
                        "can't compute rebase set\n"))
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   806
            return None
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   807
        if destf:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   808
            # --base does not support multiple destinations
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   809
            dest = scmutil.revsingle(repo, destf)
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   810
        else:
29043
cf7de4aeb86b destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 28686
diff changeset
   811
            dest = repo[_destrebase(repo, base, destspace=destspace)]
28189
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
   812
            destf = str(dest)
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
   813
30580
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
   814
        roots = [] # selected children of branching points
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
   815
        bpbase = {} # {branchingpoint: [origbase]}
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
   816
        for b in base: # group bases by branching points
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
   817
            bp = repo.revs('ancestor(%d, %d)', b, dest).first()
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
   818
            bpbase[bp] = bpbase.get(bp, []) + [b]
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
   819
        if None in bpbase:
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
   820
            # emulate the old behavior, showing "nothing to rebase" (a better
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
   821
            # behavior may be abort with "cannot find branching point" error)
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
   822
            bpbase.clear()
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
   823
        for bp, bs in bpbase.iteritems(): # calculate roots
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
   824
            roots += list(repo.revs('children(%d) & ancestors(%ld)', bp, bs))
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
   825
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
   826
        rebaseset = repo.revs('%ld::', roots)
28136
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   827
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   828
        if not rebaseset:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   829
            # transform to list because smartsets are not comparable to
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   830
            # lists. This should be improved to honor laziness of
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   831
            # smartset.
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   832
            if list(base) == [dest.rev()]:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   833
                if basef:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   834
                    ui.status(_('nothing to rebase - %s is both "base"'
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   835
                                ' and destination\n') % dest)
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   836
                else:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   837
                    ui.status(_('nothing to rebase - working directory '
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   838
                                'parent is also destination\n'))
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   839
            elif not repo.revs('%ld - ::%d', base, dest):
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   840
                if basef:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   841
                    ui.status(_('nothing to rebase - "base" %s is '
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   842
                                'already an ancestor of destination '
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   843
                                '%s\n') %
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   844
                              ('+'.join(str(repo[r]) for r in base),
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   845
                               dest))
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   846
                else:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   847
                    ui.status(_('nothing to rebase - working '
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   848
                                'directory parent is already an '
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   849
                                'ancestor of destination %s\n') % dest)
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   850
            else: # can it happen?
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   851
                ui.status(_('nothing to rebase from %s to %s\n') %
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   852
                          ('+'.join(str(repo[r]) for r in base), dest))
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   853
            return None
28189
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
   854
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
   855
    if not destf:
29043
cf7de4aeb86b destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 28686
diff changeset
   856
        dest = repo[_destrebase(repo, rebaseset, destspace=destspace)]
28189
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
   857
        destf = str(dest)
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
   858
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   859
    allsrc = revsetlang.formatspec('%ld', rebaseset)
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   860
    alias = {'ALLSRC': allsrc}
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   861
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   862
    if dest is None:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   863
        try:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   864
            # fast path: try to resolve dest without SRC alias
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   865
            dest = scmutil.revsingle(repo, destf, localalias=alias)
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   866
        except error.RepoLookupError:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   867
            if not ui.configbool('experimental', 'rebase.multidest'):
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   868
                raise
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   869
            # multi-dest path: resolve dest for each SRC separately
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   870
            destmap = {}
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   871
            for r in rebaseset:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   872
                alias['SRC'] = revsetlang.formatspec('%d', r)
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   873
                # use repo.anyrevs instead of scmutil.revsingle because we
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   874
                # don't want to abort if destset is empty.
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   875
                destset = repo.anyrevs([destf], user=True, localalias=alias)
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   876
                size = len(destset)
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   877
                if size == 1:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   878
                    destmap[r] = destset.first()
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   879
                elif size == 0:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   880
                    ui.note(_('skipping %s - empty destination\n') % repo[r])
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   881
                else:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   882
                    raise error.Abort(_('rebase destination for %s is not '
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   883
                                        'unique') % repo[r])
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   884
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   885
    if dest is not None:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   886
        # single-dest case: assign dest to each rev in rebaseset
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   887
        destrev = dest.rev()
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   888
        destmap = {r: destrev for r in rebaseset} # {srcrev: destrev}
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   889
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   890
    if not destmap:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   891
        ui.status(_('nothing to rebase - empty destination\n'))
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   892
        return None
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   893
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   894
    return destmap
28136
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
   895
32248
b47e6b0ba6ca rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents: 32175
diff changeset
   896
def externalparent(repo, state, destancestors):
19955
2160c2e0d7d1 rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents: 19951
diff changeset
   897
    """Return the revision that should be used as the second parent
32248
b47e6b0ba6ca rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents: 32175
diff changeset
   898
    when the revisions in state is collapsed on top of destancestors.
19955
2160c2e0d7d1 rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents: 19951
diff changeset
   899
    Abort if there is more than one parent.
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   900
    """
19955
2160c2e0d7d1 rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents: 19951
diff changeset
   901
    parents = set()
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   902
    source = min(state)
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   903
    for rev in state:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   904
        if rev == source:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   905
            continue
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   906
        for p in repo[rev].parents():
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   907
            if (p.rev() not in state
32248
b47e6b0ba6ca rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents: 32175
diff changeset
   908
                        and p.rev() not in destancestors):
19955
2160c2e0d7d1 rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents: 19951
diff changeset
   909
                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
   910
    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
   911
        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
   912
    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
   913
        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
   914
    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
   915
                       'than one external parent: %s') %
32248
b47e6b0ba6ca rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents: 32175
diff changeset
   916
                     (max(destancestors),
19956
78ab0f85e249 rebase: improve error message for more than one external parent
Mads Kiilerich <madski@unity3d.com>
parents: 19955
diff changeset
   917
                      ', '.join(str(p) for p in sorted(parents))))
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
   918
26360
b2415e94b2f5 rebase: avoid losing branch commits with --keepbranch (issue4835)
timeless@mozdev.org
parents: 26349
diff changeset
   919
def concludenode(repo, rev, p1, p2, commitmsg=None, editor=None, extrafn=None,
26868
a2aa39a725a1 rebase: add date parameter to concludenode function
Stanislau Hlebik <stash@fb.com>
parents: 26811
diff changeset
   920
                 keepbranches=False, date=None):
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   921
    '''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
   922
    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
   923
    Return node of committed revision.'''
33619
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
   924
    dsguard = util.nullcontextmanager()
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
   925
    if not repo.ui.configbool('rebase', 'singletransaction'):
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
   926
        dsguard = dirstateguard.dirstateguard(repo, 'rebase')
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
   927
    with dsguard:
33120
b63351f6a246 rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32084
diff changeset
   928
        repo.setparents(repo[p1].node(), repo[p2].node())
b63351f6a246 rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32084
diff changeset
   929
        ctx = repo[rev]
b63351f6a246 rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32084
diff changeset
   930
        if commitmsg is None:
b63351f6a246 rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32084
diff changeset
   931
            commitmsg = ctx.description()
b63351f6a246 rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32084
diff changeset
   932
        keepbranch = keepbranches and repo[p1].branch() != ctx.branch()
b63351f6a246 rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32084
diff changeset
   933
        extra = {'rebase_source': ctx.hex()}
b63351f6a246 rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32084
diff changeset
   934
        if extrafn:
b63351f6a246 rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32084
diff changeset
   935
            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
   936
33139
40ee74bfa111 merge with stable
Martin von Zweigbergk <martinvonz@google.com>
parents: 33056 33121
diff changeset
   937
        destphase = max(ctx.phase(), phases.draft)
40ee74bfa111 merge with stable
Martin von Zweigbergk <martinvonz@google.com>
parents: 33056 33121
diff changeset
   938
        overrides = {('phases', 'new-commit'): destphase}
33120
b63351f6a246 rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32084
diff changeset
   939
        with repo.ui.configoverride(overrides, 'rebase'):
b63351f6a246 rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32084
diff changeset
   940
            if keepbranch:
b63351f6a246 rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32084
diff changeset
   941
                repo.ui.setconfig('ui', 'allowemptycommit', True)
b63351f6a246 rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32084
diff changeset
   942
            # Commit might fail if unresolved files exist
b63351f6a246 rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32084
diff changeset
   943
            if date is None:
b63351f6a246 rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32084
diff changeset
   944
                date = ctx.date()
b63351f6a246 rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32084
diff changeset
   945
            newnode = repo.commit(text=commitmsg, user=ctx.user(),
b63351f6a246 rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32084
diff changeset
   946
                                  date=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
   947
33120
b63351f6a246 rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32084
diff changeset
   948
        repo.dirstate.setbranch(repo[newnode].branch())
b63351f6a246 rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32084
diff changeset
   949
        return newnode
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   950
32248
b47e6b0ba6ca rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents: 32175
diff changeset
   951
def rebasenode(repo, rev, p1, base, state, collapse, dest):
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
   952
    '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
   953
    # Merge phase
32248
b47e6b0ba6ca rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents: 32175
diff changeset
   954
    # Update to destination 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
   955
    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
   956
        repo.ui.debug(" update to %d:%s\n" % (p1, repo[p1]))
30271
0fa1a41d04e4 rebase: rename merge to mergemod
timeless <timeless@mozdev.org>
parents: 30007
diff changeset
   957
        mergemod.update(repo, p1, False, True)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   958
    else:
32249
27e67cfea27f rebase: rename "target" to "destination" in messages
Martin von Zweigbergk <martinvonz@google.com>
parents: 32248
diff changeset
   959
        repo.ui.debug(" already in destination\n")
26748
5ba0a99ff27f dirstate: make dirstate.write() callers pass transaction object to it
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26745
diff changeset
   960
    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
   961
    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
   962
    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
   963
        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
   964
    # 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
   965
    # have to allow merging with it.
34787
754b5117622f context: add workingfilectx.markcopied
Phil Cohen <phillco@fb.com>
parents: 34614
diff changeset
   966
    wctx = repo[None]
30271
0fa1a41d04e4 rebase: rename merge to mergemod
timeless <timeless@mozdev.org>
parents: 30007
diff changeset
   967
    stats = mergemod.update(repo, rev, True, True, base, collapse,
0fa1a41d04e4 rebase: rename merge to mergemod
timeless <timeless@mozdev.org>
parents: 30007
diff changeset
   968
                            labels=['dest', 'source'])
22905
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
   969
    if collapse:
34787
754b5117622f context: add workingfilectx.markcopied
Phil Cohen <phillco@fb.com>
parents: 34614
diff changeset
   970
        copies.duplicatecopies(repo, wctx, rev, dest)
22905
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
   971
    else:
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
   972
        # 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
   973
        # duplicate copies between the revision we're
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
   974
        # rebasing and its first parent, but *not*
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
   975
        # duplicate any copies that have already been
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
   976
        # performed in the destination.
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
   977
        p1rev = repo[rev].p1().rev()
34787
754b5117622f context: add workingfilectx.markcopied
Phil Cohen <phillco@fb.com>
parents: 34614
diff changeset
   978
        copies.duplicatecopies(repo, wctx, rev, p1rev, skiprev=dest)
22905
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
   979
    return stats
6923
ebf1462f2145 strip trailing whitespace, replace tabs by spaces
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6906
diff changeset
   980
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
   981
def adjustdest(repo, rev, destmap, state, skipped):
33590
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
   982
    """adjust rebase destination given the current rebase state
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
   983
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
   984
    rev is what is being rebased. Return a list of two revs, which are the
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
   985
    adjusted destinations for rev's p1 and p2, respectively. If a parent is
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
   986
    nullrev, return dest without adjustment for it.
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
   987
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   988
    For example, when doing rebasing B+E to F, C to G, rebase will first move B
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
   989
    to B1, and E's destination will be adjusted from F to B1.
33590
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
   990
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
   991
        B1 <- written during rebasing B
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
   992
        |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
   993
        F <- original destination of B, E
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
   994
        |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
   995
        | E <- rev, which is being rebased
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
   996
        | |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
   997
        | D <- prev, one parent of rev being checked
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
   998
        | |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
   999
        | x <- skipped, ex. no successor or successor in (::dest)
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1000
        | |
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1001
        | C <- rebased as C', different destination
33590
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1002
        | |
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1003
        | B <- rebased as B1     C'
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1004
        |/                       |
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1005
        A                        G <- destination of C, different
33590
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1006
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1007
    Another example about merge changeset, rebase -r C+G+H -d K, rebase will
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1008
    first move C to C1, G to G1, and when it's checking H, the adjusted
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1009
    destinations will be [C1, G1].
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1010
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1011
            H       C1 G1
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1012
           /|       | /
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1013
          F G       |/
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1014
        K | |  ->   K
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1015
        | C D       |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1016
        | |/        |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1017
        | B         | ...
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1018
        |/          |/
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1019
        A           A
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1020
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1021
    Besides, adjust dest according to existing rebase information. For example,
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1022
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1023
      B C D    B needs to be rebased on top of C, C needs to be rebased on top
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1024
       \|/     of D. We will rebase C first.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1025
        A
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1026
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1027
          C'   After rebasing C, when considering B's destination, use C'
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1028
          |    instead of the original C.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1029
      B   D
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1030
       \ /
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1031
        A
33590
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1032
    """
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
  1033
    # pick already rebased revs with same dest from state as interesting source
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
  1034
    dest = destmap[rev]
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
  1035
    source = [s for s, d in state.items()
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
  1036
              if d > 0 and destmap[s] == dest and s not in skipped]
33849
3ae2eaecb49e rebase: optimize "source" calculation in adjustdest
Jun Wu <quark@fb.com>
parents: 33848
diff changeset
  1037
33590
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1038
    result = []
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1039
    for prev in repo.changelog.parentrevs(rev):
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1040
        adjusted = dest
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1041
        if prev != nullrev:
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1042
            candidate = repo.revs('max(%ld and (::%d))', source, prev).first()
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1043
            if candidate is not None:
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1044
                adjusted = state[candidate]
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1045
        if adjusted == dest and dest in state:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1046
            adjusted = state[dest]
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1047
            if adjusted == revtodo:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1048
                # sortsource should produce an order that makes this impossible
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1049
                raise error.ProgrammingError(
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1050
                    'rev %d should be rebased already at this time' % dest)
33590
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1051
        result.append(adjusted)
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1052
    return result
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1053
33846
3b04a6ff625c rebase: remove rebaseset from _checkobsrebase
Jun Wu <quark@fb.com>
parents: 33845
diff changeset
  1054
def _checkobsrebase(repo, ui, rebaseobsrevs, rebaseobsskipped):
28685
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1055
    """
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1056
    Abort if rebase will create divergence or rebase is noop because of markers
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1057
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1058
    `rebaseobsrevs`: set of obsolete revision in source
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1059
    `rebaseobsskipped`: set of revisions from source skipped because they have
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1060
    successors in destination
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1061
    """
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1062
    # Obsolete node with successors not in dest leads to divergence
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1063
    divergenceok = ui.configbool('experimental',
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1064
                                 'allowdivergence')
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1065
    divergencebasecandidates = rebaseobsrevs - rebaseobsskipped
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1066
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1067
    if divergencebasecandidates and not divergenceok:
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1068
        divhashes = (str(repo[r])
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1069
                     for r in divergencebasecandidates)
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1070
        msg = _("this rebase will cause "
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1071
                "divergences from: %s")
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1072
        h = _("to force the rebase please set "
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1073
              "experimental.allowdivergence=True")
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1074
        raise error.Abort(msg % (",".join(divhashes),), hint=h)
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1075
34095
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34094
diff changeset
  1076
def successorrevs(unfi, rev):
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1077
    """yield revision numbers for successors of rev"""
34095
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34094
diff changeset
  1078
    assert unfi.filtername is None
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1079
    nodemap = unfi.changelog.nodemap
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1080
    for s in obsutil.allsuccessors(unfi.obsstore, [unfi[rev].node()]):
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1081
        if s in nodemap:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1082
            yield nodemap[s]
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1083
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
  1084
def defineparents(repo, rev, destmap, state, skipped, obsskipped):
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1085
    """Return new parents and optionally a merge base for rev being rebased
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1086
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1087
    The destination specified by "dest" cannot always be used directly because
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1088
    previously rebase result could affect destination. For example,
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1089
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1090
          D E    rebase -r C+D+E -d B
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1091
          |/     C will be rebased to C'
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1092
        B C      D's new destination will be C' instead of B
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1093
        |/       E's new destination will be C' instead of B
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1094
        A
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1095
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1096
    The new parents of a merge is slightly more complicated. See the comment
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1097
    block below.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1098
    """
34092
8a8e7a94ba07 rebase: do not crash rebasing merge with a parent having hidden successor
Jun Wu <quark@fb.com>
parents: 34009
diff changeset
  1099
    # use unfiltered changelog since successorrevs may return filtered nodes
34095
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34094
diff changeset
  1100
    assert repo.filtername is None
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34094
diff changeset
  1101
    cl = repo.changelog
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1102
    def isancestor(a, b):
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1103
        # take revision numbers instead of nodes
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1104
        if a == b:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1105
            return True
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1106
        elif a > b:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1107
            return False
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1108
        return cl.isancestor(cl.node(a), cl.node(b))
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1109
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
  1110
    dest = destmap[rev]
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1111
    oldps = repo.changelog.parentrevs(rev) # old parents
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1112
    newps = [nullrev, nullrev] # new parents
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
  1113
    dests = adjustdest(repo, rev, destmap, state, skipped)
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1114
    bases = list(oldps) # merge base candidates, initially just old parents
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1115
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1116
    if all(r == nullrev for r in oldps[1:]):
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1117
        # For non-merge changeset, just move p to adjusted dest as requested.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1118
        newps[0] = dests[0]
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1119
    else:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1120
        # For merge changeset, if we move p to dests[i] unconditionally, both
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1121
        # parents may change and the end result looks like "the merge loses a
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1122
        # parent", which is a surprise. This is a limit because "--dest" only
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1123
        # accepts one dest per src.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1124
        #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1125
        # Therefore, only move p with reasonable conditions (in this order):
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1126
        #   1. use dest, if dest is a descendent of (p or one of p's successors)
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1127
        #   2. use p's rebased result, if p is rebased (state[p] > 0)
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1128
        #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1129
        # Comparing with adjustdest, the logic here does some additional work:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1130
        #   1. decide which parents will not be moved towards dest
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1131
        #   2. if the above decision is "no", should a parent still be moved
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1132
        #      because it was rebased?
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1133
        #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1134
        # For example:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1135
        #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1136
        #     C    # "rebase -r C -d D" is an error since none of the parents
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1137
        #    /|    # can be moved. "rebase -r B+C -d D" will move C's parent
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1138
        #   A B D  # B (using rule "2."), since B will be rebased.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1139
        #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1140
        # The loop tries to be not rely on the fact that a Mercurial node has
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1141
        # at most 2 parents.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1142
        for i, p in enumerate(oldps):
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1143
            np = p # new parent
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1144
            if any(isancestor(x, dests[i]) for x in successorrevs(repo, p)):
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1145
                np = dests[i]
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1146
            elif p in state and state[p] > 0:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1147
                np = state[p]
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
  1148
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1149
            # "bases" only record "special" merge bases that cannot be
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1150
            # calculated from changelog DAG (i.e. isancestor(p, np) is False).
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1151
            # For example:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1152
            #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1153
            #   B'   # rebase -s B -d D, when B was rebased to B'. dest for C
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1154
            #   | C  # is B', but merge base for C is B, instead of
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1155
            #   D |  # changelog.ancestor(C, B') == A. If changelog DAG and
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1156
            #   | B  # "state" edges are merged (so there will be an edge from
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1157
            #   |/   # B to B'), the merge base is still ancestor(C, B') in
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1158
            #   A    # the merged graph.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1159
            #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1160
            # Also see https://bz.mercurial-scm.org/show_bug.cgi?id=1950#c8
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1161
            # which uses "virtual null merge" to explain this situation.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1162
            if isancestor(p, np):
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1163
                bases[i] = nullrev
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1164
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1165
            # If one parent becomes an ancestor of the other, drop the ancestor
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1166
            for j, x in enumerate(newps[:i]):
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1167
                if x == nullrev:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1168
                    continue
33863
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1169
                if isancestor(np, x): # CASE-1
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1170
                    np = nullrev
33863
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1171
                elif isancestor(x, np): # CASE-2
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1172
                    newps[j] = np
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1173
                    np = nullrev
33863
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1174
                    # New parents forming an ancestor relationship does not
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1175
                    # mean the old parents have a similar relationship. Do not
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1176
                    # set bases[x] to nullrev.
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1177
                    bases[j], bases[i] = bases[i], bases[j]
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1178
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1179
            newps[i] = np
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1180
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1181
        # "rebasenode" updates to new p1, and the old p1 will be used as merge
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1182
        # base. If only p2 changes, merging using unchanged p1 as merge base is
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1183
        # suboptimal. Therefore swap parents to make the merge sane.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1184
        if newps[1] != nullrev and oldps[0] == newps[0]:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1185
            assert len(newps) == 2 and len(oldps) == 2
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1186
            newps.reverse()
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1187
            bases.reverse()
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1188
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1189
        # No parent change might be an error because we fail to make rev a
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1190
        # descendent of requested dest. This can happen, for example:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1191
        #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1192
        #     C    # rebase -r C -d D
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1193
        #    /|    # None of A and B will be changed to D and rebase fails.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1194
        #   A B D
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1195
        if set(newps) == set(oldps) and dest not in newps:
33789
19f495fef0a3 rebase: change "result would have 3 parent" error message (BC)
Jun Wu <quark@fb.com>
parents: 33786
diff changeset
  1196
            raise error.Abort(_('cannot rebase %d:%s without '
19f495fef0a3 rebase: change "result would have 3 parent" error message (BC)
Jun Wu <quark@fb.com>
parents: 33786
diff changeset
  1197
                                'moving at least one of its parents')
19f495fef0a3 rebase: change "result would have 3 parent" error message (BC)
Jun Wu <quark@fb.com>
parents: 33786
diff changeset
  1198
                              % (rev, repo[rev]))
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1199
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1200
    # Source should not be ancestor of dest. The check here guarantees it's
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1201
    # impossible. With multi-dest, the initial check does not cover complex
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1202
    # cases since we don't have abstractions to dry-run rebase cheaply.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1203
    if any(p != nullrev and isancestor(rev, p) for p in newps):
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1204
        raise error.Abort(_('source is ancestor of destination'))
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1205
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1206
    # "rebasenode" updates to new p1, use the corresponding merge base.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1207
    if bases[0] != nullrev:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1208
        base = bases[0]
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1209
    else:
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
  1210
        base = None
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1211
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1212
    # Check if the merge will contain unwanted changes. That may happen if
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1213
    # there are multiple special (non-changelog ancestor) merge bases, which
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1214
    # cannot be handled well by the 3-way merge algorithm. For example:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1215
    #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1216
    #     F
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1217
    #    /|
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1218
    #   D E  # "rebase -r D+E+F -d Z", when rebasing F, if "D" was chosen
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1219
    #   | |  # as merge base, the difference between D and F will include
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1220
    #   B C  # C, so the rebased F will contain C surprisingly. If "E" was
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1221
    #   |/   #  chosen, the rebased F will contain B.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1222
    #   A Z
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1223
    #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1224
    # But our merge base candidates (D and E in above case) could still be
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1225
    # better than the default (ancestor(F, Z) == null). Therefore still
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1226
    # pick one (so choose p1 above).
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1227
    if sum(1 for b in bases if b != nullrev) > 1:
33863
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1228
        unwanted = [None, None] # unwanted[i]: unwanted revs if choose bases[i]
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1229
        for i, base in enumerate(bases):
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1230
            if base == nullrev:
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1231
                continue
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1232
            # Revisions in the side (not chosen as merge base) branch that
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1233
            # might contain "surprising" contents
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1234
            siderevs = list(repo.revs('((%ld-%d) %% (%d+%d))',
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1235
                                      bases, base, base, dest))
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
  1236
33863
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1237
            # If those revisions are covered by rebaseset, the result is good.
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1238
            # A merge in rebaseset would be considered to cover its ancestors.
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1239
            if siderevs:
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
  1240
                rebaseset = [r for r, d in state.items()
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
  1241
                             if d > 0 and r not in obsskipped]
33863
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1242
                merges = [r for r in rebaseset
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1243
                          if cl.parentrevs(r)[1] != nullrev]
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1244
                unwanted[i] = list(repo.revs('%ld - (::%ld) - %ld',
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1245
                                             siderevs, merges, rebaseset))
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1246
33863
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1247
        # Choose a merge base that has a minimal number of unwanted revs.
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1248
        l, i = min((len(revs), i)
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1249
                   for i, revs in enumerate(unwanted) if revs is not None)
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1250
        base = bases[i]
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1251
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1252
        # newps[0] should match merge base if possible. Currently, if newps[i]
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1253
        # is nullrev, the only case is newps[i] and newps[j] (j < i), one is
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1254
        # the other's ancestor. In that case, it's fine to not swap newps here.
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1255
        # (see CASE-1 and CASE-2 above)
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1256
        if i != 0 and newps[i] != nullrev:
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1257
            newps[0], newps[i] = newps[i], newps[0]
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1258
33863
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1259
        # The merge will include unwanted revisions. Abort now. Revisit this if
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1260
        # we have a more advanced merge algorithm that handles multiple bases.
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1261
        if l > 0:
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1262
            unwanteddesc = _(' or ').join(
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1263
                (', '.join('%d:%s' % (r, repo[r]) for r in revs)
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1264
                 for revs in unwanted if revs is not None))
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1265
            raise error.Abort(
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1266
                _('rebasing %d:%s will include unwanted changes from %s')
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1267
                % (rev, repo[rev], unwanteddesc))
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1268
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1269
    repo.ui.debug(" future parents are %d and %d\n" % tuple(newps))
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1270
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1271
    return newps[0], newps[1], base
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1272
7955
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
  1273
def isagitpatch(repo, patchname):
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
  1274
    '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
  1275
    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
  1276
    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
  1277
        if line.startswith('diff --git'):
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
  1278
            return True
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
  1279
    return False
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
  1280
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1281
def updatemq(repo, state, skipped, **opts):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1282
    'Update rebased mq patches - finalize and then import them'
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1283
    mqrebase = {}
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
  1284
    mq = repo.mq
14572
8ff2957c1d82 mq: rename full_series to fullseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14509
diff changeset
  1285
    original_series = mq.fullseries[:]
16531
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
  1286
    skippedpatches = set()
14497
ea585f2b1adc rebase: restore mq guards after rebasing (issue2107)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 13894
diff changeset
  1287
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
  1288
    for p in mq.applied:
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
  1289
        rev = repo[p.node].rev()
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
  1290
        if rev in state:
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9301
diff changeset
  1291
            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
  1292
                                        (rev, p.name))
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
  1293
            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
  1294
        else:
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
  1295
            # 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
  1296
            skippedpatches.add(p.name)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1297
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1298
    if mqrebase:
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
  1299
        mq.finish(repo, mqrebase.keys())
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1300
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1301
        # 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
  1302
        for rev in sorted(mqrebase, reverse=True):
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1303
            if rev not in skipped:
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
  1304
                name, isgit = mqrebase[rev]
23520
de143427c499 rebase: show a note for updated mq patches
Mads Kiilerich <mads@kiilerich.com>
parents: 23519
diff changeset
  1305
                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
  1306
                             (name, state[rev], repo[state[rev]]))
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
  1307
                mq.qimport(repo, (), patchname=name, git=isgit,
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
  1308
                                rev=[str(state[rev])])
16531
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
  1309
            else:
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
  1310
                # Rebased and skipped
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
  1311
                skippedpatches.add(mqrebase[rev][0])
14497
ea585f2b1adc rebase: restore mq guards after rebasing (issue2107)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 13894
diff changeset
  1312
16531
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
  1313
        # 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
  1314
        # 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
  1315
        # 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
  1316
        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
  1317
                     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
  1318
        mq.fullseries[:] = newseries
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
  1319
        mq.seriesdirty = True
14580
92101ea35015 mq: rename save_dirty to savedirty
Adrian Buehlmann <adrian@cadifra.com>
parents: 14572
diff changeset
  1320
        mq.savedirty()
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1321
28185
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1322
def storecollapsemsg(repo, collapsemsg):
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1323
    'Store the collapse message to allow recovery'
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1324
    collapsemsg = collapsemsg or ''
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1325
    f = repo.vfs("last-message.txt", "w")
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1326
    f.write("%s\n" % collapsemsg)
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1327
    f.close()
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1328
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1329
def clearcollapsemsg(repo):
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1330
    'Remove collapse message file'
31311
f59b6cf663a9 vfs: use repo.vfs.unlinkpath
Mads Kiilerich <mads@kiilerich.com>
parents: 31302
diff changeset
  1331
    repo.vfs.unlinkpath("last-message.txt", ignoremissing=True)
28185
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1332
31225
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
  1333
def restorecollapsemsg(repo, isabort):
28185
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1334
    'Restore previously stored collapse message'
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1335
    try:
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1336
        f = repo.vfs("last-message.txt")
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1337
        collapsemsg = f.readline().strip()
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1338
        f.close()
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1339
    except IOError as err:
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1340
        if err.errno != errno.ENOENT:
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1341
            raise
31225
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
  1342
        if isabort:
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
  1343
            # Oh well, just abort like normal
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
  1344
            collapsemsg = ''
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
  1345
        else:
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
  1346
            raise error.Abort(_('missing .hg/last-message.txt for rebase'))
28185
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1347
    return collapsemsg
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1348
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1349
def clearstatus(repo):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1350
    'Remove the status files'
33056
2312e70cf78b rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents: 32918
diff changeset
  1351
    # Make sure the active transaction won't write the state file
2312e70cf78b rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents: 32918
diff changeset
  1352
    tr = repo.currenttransaction()
2312e70cf78b rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents: 32918
diff changeset
  1353
    if tr:
2312e70cf78b rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents: 32918
diff changeset
  1354
        tr.removefilegenerator('rebasestate')
31311
f59b6cf663a9 vfs: use repo.vfs.unlinkpath
Mads Kiilerich <mads@kiilerich.com>
parents: 31302
diff changeset
  1355
    repo.vfs.unlinkpath("rebasestate", ignoremissing=True)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1356
25070
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
  1357
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
  1358
    '''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
  1359
    somehow the working dir got forcibly updated, e.g. by older hg'''
27167
3fe8cb40c9c5 commands: inline definition of localrepo.parents() and drop the method (API)
Augie Fackler <augie@google.com>
parents: 27146
diff changeset
  1360
    parents = [p.rev() for p in repo[None].parents()]
25070
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
  1361
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
  1362
    # 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
  1363
    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
  1364
        return False
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
  1365
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
  1366
    # 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
  1367
    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
  1368
                          if new == nullrev])
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
  1369
    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
  1370
        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
  1371
fe78eb7bcca0 rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents: 19496
diff changeset
  1372
    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
  1373
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
  1374
def abort(repo, originalwd, destmap, state, activebookmark=None):
24758
d7451adc72f6 rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents: 23970
diff changeset
  1375
    '''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
  1376
d7451adc72f6 rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents: 23970
diff changeset
  1377
    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
  1378
        restore'''
26677
e9b3d523f2e6 rebase: properly abort when destination is public (issue4896)
Christian Delahousse <cdelahousse@fb.com>
parents: 26675
diff changeset
  1379
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
  1380
    try:
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
  1381
        # If the first commits in the rebased set get skipped during the rebase,
32248
b47e6b0ba6ca rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents: 32175
diff changeset
  1382
        # their values within the state mapping will be the dest rev id. The
b47e6b0ba6ca rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents: 32175
diff changeset
  1383
        # dstates list must must not contain the dest rev (issue4896)
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
  1384
        dstates = [s for r, s in state.items() if s >= 0 and s != destmap[r]]
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
  1385
        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
  1386
        cleanup = True
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
  1387
        if immutable:
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
  1388
            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
  1389
                        % ', '.join(str(repo[r]) for r in immutable),
29966
11604da46982 rebase: use single quotes in use warning
timeless <timeless@mozdev.org>
parents: 29936
diff changeset
  1390
                        hint=_("see 'hg help phases' for details"))
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
  1391
            cleanup = False
16280
0806823370d8 rebase: properly calculate descendant set when aborting (issue3332)
Matt Mackall <mpm@selenic.com>
parents: 16228
diff changeset
  1392
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
  1393
        descendants = set()
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
  1394
        if dstates:
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
  1395
            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
  1396
        if descendants - set(dstates):
32249
27e67cfea27f rebase: rename "target" to "destination" in messages
Martin von Zweigbergk <martinvonz@google.com>
parents: 32248
diff changeset
  1397
            repo.ui.warn(_("warning: new changesets detected on destination "
27e67cfea27f rebase: rename "target" to "destination" in messages
Martin von Zweigbergk <martinvonz@google.com>
parents: 32248
diff changeset
  1398
                           "branch, can't strip\n"))
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
  1399
            cleanup = False
19518
12843143663d rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents: 19517
diff changeset
  1400
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
  1401
        if cleanup:
27988
61f4d59e9a0b rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents: 27977
diff changeset
  1402
            shouldupdate = False
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
  1403
            rebased = [s for r, s in state.items()
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
  1404
                       if s >= 0 and s != destmap[r]]
27988
61f4d59e9a0b rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents: 27977
diff changeset
  1405
            if rebased:
61f4d59e9a0b rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents: 27977
diff changeset
  1406
                strippoints = [
61f4d59e9a0b rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents: 27977
diff changeset
  1407
                        c.node() for c in repo.set('roots(%ld)', rebased)]
31222
56d3e0b499df rebase: clear updatestate during rebase --abort in more cases
Durham Goode <durham@fb.com>
parents: 31023
diff changeset
  1408
56d3e0b499df rebase: clear updatestate during rebase --abort in more cases
Durham Goode <durham@fb.com>
parents: 31023
diff changeset
  1409
            updateifonnodes = set(rebased)
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
  1410
            updateifonnodes.update(destmap.values())
31222
56d3e0b499df rebase: clear updatestate during rebase --abort in more cases
Durham Goode <durham@fb.com>
parents: 31023
diff changeset
  1411
            updateifonnodes.add(originalwd)
56d3e0b499df rebase: clear updatestate during rebase --abort in more cases
Durham Goode <durham@fb.com>
parents: 31023
diff changeset
  1412
            shouldupdate = repo['.'].rev() in updateifonnodes
27988
61f4d59e9a0b rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents: 27977
diff changeset
  1413
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
  1414
            # Update away from the rebase if necessary
27988
61f4d59e9a0b rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents: 27977
diff changeset
  1415
            if shouldupdate or needupdate(repo, state):
30271
0fa1a41d04e4 rebase: rename merge to mergemod
timeless <timeless@mozdev.org>
parents: 30007
diff changeset
  1416
                mergemod.update(repo, originalwd, False, True)
19516
fe78eb7bcca0 rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents: 19496
diff changeset
  1417
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
  1418
            # 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
  1419
            if rebased:
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
  1420
                # 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
  1421
                repair.strip(repo.ui, repo, strippoints)
19518
12843143663d rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents: 19517
diff changeset
  1422
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
  1423
        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
  1424
            bookmarks.activate(repo, activebookmark)
24758
d7451adc72f6 rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents: 23970
diff changeset
  1425
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
  1426
    finally:
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
  1427
        clearstatus(repo)
28185
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1428
        clearcollapsemsg(repo)
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
  1429
        repo.ui.warn(_('rebase aborted\n'))
19518
12843143663d rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents: 19517
diff changeset
  1430
    return 0
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1431
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1432
def sortsource(destmap):
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1433
    """yield source revisions in an order that we only rebase things once
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1434
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1435
    If source and destination overlaps, we should filter out revisions
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1436
    depending on other revisions which hasn't been rebased yet.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1437
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1438
    Yield a sorted list of revisions each time.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1439
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1440
    For example, when rebasing A to B, B to C. This function yields [B], then
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1441
    [A], indicating B needs to be rebased first.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1442
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1443
    Raise if there is a cycle so the rebase is impossible.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1444
    """
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1445
    srcset = set(destmap)
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1446
    while srcset:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1447
        srclist = sorted(srcset)
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1448
        result = []
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1449
        for r in srclist:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1450
            if destmap[r] not in srcset:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1451
                result.append(r)
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1452
        if not result:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1453
            raise error.Abort(_('source and destination form a cycle'))
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1454
        srcset -= set(result)
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1455
        yield result
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1456
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
  1457
def buildstate(repo, destmap, collapse):
15267
3bfdfefea2fc rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15219
diff changeset
  1458
    '''Define which revisions are going to be rebased and where
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1459
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
  1460
    repo: repo
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
  1461
    destmap: {srcrev: destrev}
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
  1462
    '''
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
  1463
    rebaseset = destmap.keys()
31297
f5c71e98f0f7 rebase: unhide original working directory node as well (issue5219)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31296
diff changeset
  1464
    originalwd = repo['.'].rev()
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1465
10672
c2e1e637d4da rebase: always check if rebasing onto an applied mq patch.
Greg Ward <greg-hg@gerg.ca>
parents: 10659
diff changeset
  1466
    # 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
  1467
    # 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
  1468
    # a partially completed rebase is blocked by mq.
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
  1469
    if 'qtip' in repo.tags():
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
  1470
        mqapplied = set(repo[s.node].rev() for s in repo.mq.applied)
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
  1471
        if set(destmap.values()) & mqapplied:
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
  1472
            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
  1473
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1474
    # Get "cycle" error early by exhausting the generator.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1475
    sortedsrc = list(sortsource(destmap)) # a list of sorted revs
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1476
    if not sortedsrc:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1477
        raise error.Abort(_('no matching revisions'))
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1478
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1479
    # Only check the first batch of revisions to rebase not depending on other
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1480
    # rebaseset. This means "source is ancestor of destination" for the second
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1481
    # (and following) batches of revisions are not checked here. We rely on
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1482
    # "defineparents" to do that check.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1483
    roots = list(repo.set('roots(%ld)', sortedsrc[0]))
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
  1484
    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
  1485
        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
  1486
    roots.sort()
32175
456b4a32d75f rebase: don't update state dict same way for each root
Martin von Zweigbergk <martinvonz@google.com>
parents: 32084
diff changeset
  1487
    state = dict.fromkeys(rebaseset, revtodo)
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1488
    emptyrebase = (len(sortedsrc) == 1)
18424
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1489
    for root in roots:
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
  1490
        dest = repo[destmap[root.rev()]]
18424
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1491
        commonbase = root.ancestor(dest)
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1492
        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
  1493
            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
  1494
        if commonbase == dest:
31380
65d93d712777 rebase: allow rebasing children of wd to wd if a new branch has been set (BC)
Mads Kiilerich <mads@kiilerich.com>
parents: 31311
diff changeset
  1495
            wctx = repo[None]
65d93d712777 rebase: allow rebasing children of wd to wd if a new branch has been set (BC)
Mads Kiilerich <mads@kiilerich.com>
parents: 31311
diff changeset
  1496
            if dest == wctx.p1():
65d93d712777 rebase: allow rebasing children of wd to wd if a new branch has been set (BC)
Mads Kiilerich <mads@kiilerich.com>
parents: 31311
diff changeset
  1497
                # when rebasing to '.', it will use the current wd branch name
65d93d712777 rebase: allow rebasing children of wd to wd if a new branch has been set (BC)
Mads Kiilerich <mads@kiilerich.com>
parents: 31311
diff changeset
  1498
                samebranch = root.branch() == wctx.branch()
65d93d712777 rebase: allow rebasing children of wd to wd if a new branch has been set (BC)
Mads Kiilerich <mads@kiilerich.com>
parents: 31311
diff changeset
  1499
            else:
65d93d712777 rebase: allow rebasing children of wd to wd if a new branch has been set (BC)
Mads Kiilerich <mads@kiilerich.com>
parents: 31311
diff changeset
  1500
                samebranch = root.branch() == dest.branch()
32900
07d5a503124c rebase: rewrite "x in y.children()" as "y in x.parents()"
Martin von Zweigbergk <martinvonz@google.com>
parents: 32594
diff changeset
  1501
            if not collapse and samebranch and dest in root.parents():
32272
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
  1502
                # mark the revision as done by setting its new revision
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
  1503
                # equal to its old (current) revisions
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
  1504
                state[root.rev()] = root.rev()
18424
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1505
                repo.ui.debug('source is a child of destination\n')
32272
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
  1506
                continue
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1507
32272
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
  1508
        emptyrebase = False
29936
3e7ded768556 rebase: make debug logging more consistent
Martin von Zweigbergk <martinvonz@google.com>
parents: 29872
diff changeset
  1509
        repo.ui.debug('rebase onto %s starting from %s\n' % (dest, root))
32272
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
  1510
    if emptyrebase:
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
  1511
        return None
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
  1512
    for rev in sorted(state):
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
  1513
        parents = [p for p in repo.changelog.parentrevs(rev) if p != nullrev]
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
  1514
        # if all parents of this revision are done, then so is this revision
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
  1515
        if parents and all((state.get(p) == p for p in parents)):
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
  1516
            state[rev] = rev
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
  1517
    return originalwd, destmap, state
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1518
34367
f61f5af5ed31 merge with stable
Martin von Zweigbergk <martinvonz@google.com>
parents: 34290 34354
diff changeset
  1519
def clearrebased(ui, repo, destmap, state, skipped, collapsedas=None,
f61f5af5ed31 merge with stable
Martin von Zweigbergk <martinvonz@google.com>
parents: 34290 34354
diff changeset
  1520
                 keepf=False):
17613
aafc521668d8 rebase: properly handle --collapse when creating obsolescence marker
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17612
diff changeset
  1521
    """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
  1522
aafc521668d8 rebase: properly handle --collapse when creating obsolescence marker
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17612
diff changeset
  1523
    If `collapsedas` is not None, the rebase was a collapse whose result if the
34354
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
  1524
    `collapsedas` node.
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
  1525
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
  1526
    If `keepf` is not True, the rebase has --keep set and no nodes should be
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
  1527
    removed (but bookmarks still need to be moved).
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
  1528
    """
33332
3b7cb3d17137 rebase: use scmutil.cleanupnodes (issue5606) (BC)
Jun Wu <quark@fb.com>
parents: 33157
diff changeset
  1529
    tonode = repo.changelog.node
34354
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
  1530
    replacements = {}
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
  1531
    moves = {}
33333
8bfd10e4c55a rebase: remove "if True"
Jun Wu <quark@fb.com>
parents: 33332
diff changeset
  1532
    for rev, newrev in sorted(state.items()):
8bfd10e4c55a rebase: remove "if True"
Jun Wu <quark@fb.com>
parents: 33332
diff changeset
  1533
        if newrev >= 0 and newrev != rev:
34354
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
  1534
            oldnode = tonode(rev)
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
  1535
            newnode = collapsedas or tonode(newrev)
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
  1536
            moves[oldnode] = newnode
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
  1537
            if not keepf:
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
  1538
                if rev in skipped:
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
  1539
                    succs = ()
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
  1540
                else:
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
  1541
                    succs = (newnode,)
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
  1542
                replacements[oldnode] = succs
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
  1543
    scmutil.cleanupnodes(repo, replacements, 'rebase', moves)
17611
910123eac887 rebase: extract final changesets cleanup logic in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17325
diff changeset
  1544
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
  1545
def pullrebase(orig, ui, repo, *args, **opts):
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1546
    '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
  1547
    ret = None
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1548
    if opts.get('rebase'):
31733
ae6bab095c66 rebase: abort hg pull --rebase if rebase.requiredest is set (issue5514)
Ryan McElroy <rmcelroy@fb.com>
parents: 31731
diff changeset
  1549
        if ui.configbool('commands', 'rebase.requiredest'):
ae6bab095c66 rebase: abort hg pull --rebase if rebase.requiredest is set (issue5514)
Ryan McElroy <rmcelroy@fb.com>
parents: 31731
diff changeset
  1550
            msg = _('rebase destination required by configuration')
ae6bab095c66 rebase: abort hg pull --rebase if rebase.requiredest is set (issue5514)
Ryan McElroy <rmcelroy@fb.com>
parents: 31731
diff changeset
  1551
            hint = _('use hg pull followed by hg rebase -d DEST')
ae6bab095c66 rebase: abort hg pull --rebase if rebase.requiredest is set (issue5514)
Ryan McElroy <rmcelroy@fb.com>
parents: 31731
diff changeset
  1552
            raise error.Abort(msg, hint=hint)
ae6bab095c66 rebase: abort hg pull --rebase if rebase.requiredest is set (issue5514)
Ryan McElroy <rmcelroy@fb.com>
parents: 31731
diff changeset
  1553
32918
04c9dd951a41 rebase: use context manager for locking in pullrebase()
Martin von Zweigbergk <martinvonz@google.com>
parents: 32917
diff changeset
  1554
        with repo.wlock(), repo.lock():
26029
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1555
            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
  1556
                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
  1557
                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
  1558
                         'the update flag\n')
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1559
30725
c2bd2f77965b rebase: fail-fast the pull if working dir is not clean (BC)
Valters Vingolds <valters@vingolds.ch>
parents: 30709
diff changeset
  1560
            cmdutil.checkunfinished(repo)
30755
0fbb3a5c188e rebase: provide detailed hint to abort message if working dir is not clean
Valters Vingolds <valters@vingolds.ch>
parents: 30725
diff changeset
  1561
            cmdutil.bailifchanged(repo, hint=_('cannot pull with rebase: '
0fbb3a5c188e rebase: provide detailed hint to abort message if working dir is not clean
Valters Vingolds <valters@vingolds.ch>
parents: 30725
diff changeset
  1562
                'please commit or shelve your changes first'))
30725
c2bd2f77965b rebase: fail-fast the pull if working dir is not clean (BC)
Valters Vingolds <valters@vingolds.ch>
parents: 30709
diff changeset
  1563
26029
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1564
            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
  1565
            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
  1566
            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
  1567
                pass
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1568
            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
  1569
            try:
26960
6979fe2a6d75 rebase: add returning value from pullrebase function
liscju <piotr.listkiewicz@gmail.com>
parents: 26811
diff changeset
  1570
                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
  1571
            finally:
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1572
                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
  1573
            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
  1574
            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
  1575
                # --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
  1576
                # dropping it
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1577
                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
  1578
                    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
  1579
                # 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
  1580
                # --source.
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1581
                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
  1582
                    del opts['source']
29044
261c25372959 rebase: restrict rebase destination to the pulled set (issue5214)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29043
diff changeset
  1583
                # revsprepull is the len of the repo, not revnum of tip.
261c25372959 rebase: restrict rebase destination to the pulled set (issue5214)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29043
diff changeset
  1584
                destspace = list(repo.changelog.revs(start=revsprepull))
261c25372959 rebase: restrict rebase destination to the pulled set (issue5214)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29043
diff changeset
  1585
                opts['_destspace'] = destspace
28189
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
  1586
                try:
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
  1587
                    rebase(ui, repo, **opts)
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
  1588
                except error.NoMergeDestAbort:
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
  1589
                    # we can maybe update instead
28118
0e3835c7e1cf rebase: perform update through the 'update' command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28117
diff changeset
  1590
                    rev, _a, _b = destutil.destupdate(repo)
28189
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
  1591
                    if rev == repo['.'].rev():
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
  1592
                        ui.status(_('nothing to rebase\n'))
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
  1593
                    else:
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
  1594
                        ui.status(_('nothing to rebase - updating instead\n'))
28118
0e3835c7e1cf rebase: perform update through the 'update' command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28117
diff changeset
  1595
                        # not passing argument to get the bare update behavior
0e3835c7e1cf rebase: perform update through the 'update' command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28117
diff changeset
  1596
                        # with warning and trumpets
0e3835c7e1cf rebase: perform update through the 'update' command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28117
diff changeset
  1597
                        commands.update(ui, repo)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1598
    else:
14444
1f997134a9d1 rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents: 14306
diff changeset
  1599
        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
  1600
            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
  1601
        ret = orig(ui, repo, *args, **opts)
6979fe2a6d75 rebase: add returning value from pullrebase function
liscju <piotr.listkiewicz@gmail.com>
parents: 26811
diff changeset
  1602
6979fe2a6d75 rebase: add returning value from pullrebase function
liscju <piotr.listkiewicz@gmail.com>
parents: 26811
diff changeset
  1603
    return ret
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1604
27790
2d294dada4f8 rebase: small refactoring to allow better extensibility from extensions
Laurent Charignon <lcharignon@fb.com>
parents: 27746
diff changeset
  1605
def _filterobsoleterevs(repo, revs):
2d294dada4f8 rebase: small refactoring to allow better extensibility from extensions
Laurent Charignon <lcharignon@fb.com>
parents: 27746
diff changeset
  1606
    """returns a set of the obsolete revisions in revs"""
2d294dada4f8 rebase: small refactoring to allow better extensibility from extensions
Laurent Charignon <lcharignon@fb.com>
parents: 27746
diff changeset
  1607
    return set(r for r in revs if repo[r].obsolete())
2d294dada4f8 rebase: small refactoring to allow better extensibility from extensions
Laurent Charignon <lcharignon@fb.com>
parents: 27746
diff changeset
  1608
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
  1609
def _computeobsoletenotrebased(repo, rebaseobsrevs, destmap):
26349
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
  1610
    """return a mapping obsolete => successor for all obsolete nodes to be
27012
5eac7ab59b95 rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents: 27010
diff changeset
  1611
    rebased that have a successors in the destination
5eac7ab59b95 rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents: 27010
diff changeset
  1612
30332
318a24b52eeb spelling: fixes of non-dictionary words
Mads Kiilerich <madski@unity3d.com>
parents: 30273
diff changeset
  1613
    obsolete => None entries in the mapping indicate nodes with no successor"""
26349
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
  1614
    obsoletenotrebased = {}
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
  1615
34095
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34094
diff changeset
  1616
    assert repo.filtername is None
26674
fd4a38bd7e49 rebase: use a direct reference to repo.changelog
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26671
diff changeset
  1617
    cl = repo.changelog
34003
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
  1618
    nodemap = cl.nodemap
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
  1619
    for srcrev in rebaseobsrevs:
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
  1620
        srcnode = cl.node(srcrev)
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
  1621
        destnode = cl.node(destmap[srcrev])
34003
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
  1622
        # XXX: more advanced APIs are required to handle split correctly
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
  1623
        successors = list(obsutil.allsuccessors(repo.obsstore, [srcnode]))
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
  1624
        if len(successors) == 1:
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
  1625
            # obsutil.allsuccessors includes node itself. When the list only
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
  1626
            # contains one element, it means there are no successors.
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
  1627
            obsoletenotrebased[srcrev] = None
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
  1628
        else:
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
  1629
            for succnode in successors:
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
  1630
                if succnode == srcnode or succnode not in nodemap:
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
  1631
                    continue
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
  1632
                if cl.isancestor(succnode, destnode):
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
  1633
                    obsoletenotrebased[srcrev] = nodemap[succnode]
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
  1634
                    break
27012
5eac7ab59b95 rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents: 27010
diff changeset
  1635
26349
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
  1636
    return obsoletenotrebased
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
  1637
19214
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
  1638
def summaryhook(ui, repo):
30709
a932297febb7 rebase: use repo.vfs.exists in 'hg summary' hook
Valters Vingolds <valters@vingolds.ch>
parents: 30674
diff changeset
  1639
    if not repo.vfs.exists('rebasestate'):
19214
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
  1640
        return
19849
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
  1641
    try:
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
  1642
        rbsrt = rebaseruntime(repo, ui, {})
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
  1643
        rbsrt.restorestatus()
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
  1644
        state = rbsrt.state
19849
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
  1645
    except error.RepoLookupError:
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
  1646
        # 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
  1647
        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
  1648
        ui.write(msg)
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
  1649
        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
  1650
    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
  1651
    # i18n: column positioning for "hg summary"
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
  1652
    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
  1653
             (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
  1654
              ui.label(_('%d remaining'), 'rebase.remaining') %
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
  1655
              (len(state) - numrebased)))
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
  1656
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1657
def uisetup(ui):
23970
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
  1658
    #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
  1659
    entry = extensions.wrapcommand(commands.table, 'pull', pullrebase)
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
  1660
    entry[1].append(('', 'rebase', None,
14444
1f997134a9d1 rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents: 14306
diff changeset
  1661
                     _("rebase working directory to branch head")))
1f997134a9d1 rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents: 14306
diff changeset
  1662
    entry[1].append(('t', 'tool', '',
1f997134a9d1 rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents: 14306
diff changeset
  1663
                     _("specify merge tool for rebase")))
19214
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
  1664
    cmdutil.summaryhooks.add('rebase', summaryhook)
19478
e5a5790a3185 rebase: add checkunfinished support (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19477
diff changeset
  1665
    cmdutil.unfinishedstates.append(
19496
607191a45f8c checkunfinished: accommodate histedit quirk
Matt Mackall <mpm@selenic.com>
parents: 19478
diff changeset
  1666
        ['rebasestate', False, False, _('rebase in progress'),
19478
e5a5790a3185 rebase: add checkunfinished support (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19477
diff changeset
  1667
         _("use 'hg rebase --continue' or 'hg rebase --abort'")])
27626
157675d0f600 rebase: hook afterresolvedstates
timeless <timeless@mozdev.org>
parents: 27586
diff changeset
  1668
    cmdutil.afterresolvedstates.append(
157675d0f600 rebase: hook afterresolvedstates
timeless <timeless@mozdev.org>
parents: 27586
diff changeset
  1669
        ['rebasestate', _('hg rebase --continue')])