hgext/rebase.py
author Martin von Zweigbergk <martinvonz@google.com>
Thu, 01 Nov 2018 16:28:11 -0700
branchstable
changeset 40423 d049ee8eee00
parent 40366 b14fdf1fb615
child 40452 f07d4f94f098
child 40693 ea84c2b286a2
permissions -rw-r--r--
tests: demonstrate broken copies._fullcopytracing() Turns out copies._fullcopytracing() was also broken. Differential Revision: https://phab.mercurial-scm.org/D5212
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
    nullrev,
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 29128
diff changeset
    25
    short,
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 29128
diff changeset
    26
)
29128
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    27
from mercurial import (
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    28
    bookmarks,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    29
    cmdutil,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    30
    commands,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    31
    copies,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    32
    destutil,
30499
ee2097c560c1 rebase: refer to dirstateguard by its new name
Augie Fackler <augie@google.com>
parents: 30468
diff changeset
    33
    dirstateguard,
29128
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    34
    error,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    35
    extensions,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    36
    hg,
30285
0fa1a41d04e4 rebase: rename merge to mergemod
timeless <timeless@mozdev.org>
parents: 30011
diff changeset
    37
    merge as mergemod,
30504
d528ddc11b33 rebase: refer to checkunresolved by its new name
Augie Fackler <augie@google.com>
parents: 30499
diff changeset
    38
    mergeutil,
29128
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    39
    obsolete,
33151
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33146
diff changeset
    40
    obsutil,
29128
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    41
    patch,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    42
    phases,
35043
1a07f9187831 py3: handle keyword arguments in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35019
diff changeset
    43
    pycompat,
29128
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    44
    registrar,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    45
    repair,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    46
    revset,
34023
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
    47
    revsetlang,
29128
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    48
    scmutil,
31043
aea06029919e revset: import set classes directly from smartset module
Yuya Nishihara <yuya@tcha.org>
parents: 30899
diff changeset
    49
    smartset,
38520
7c853edcf4ed rebase: add a stateobj variable to rebaseruntime class
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38519
diff changeset
    50
    state as statemod,
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
26669
07db7e95c464 rebase: added comments
Christian Delahousse <cdelahousse@fb.com>
parents: 26587
diff changeset
    54
# 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
    55
# their values must be maintained.
07db7e95c464 rebase: added comments
Christian Delahousse <cdelahousse@fb.com>
parents: 26587
diff changeset
    56
07db7e95c464 rebase: added comments
Christian Delahousse <cdelahousse@fb.com>
parents: 26587
diff changeset
    57
# 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
    58
revtodo = -1
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
    59
revtodostr = '-1'
33864
d8d0ef5f5975 rebase: remove revprecursor and revpruned states (BC)
Jun Wu <quark@fb.com>
parents: 33863
diff changeset
    60
d8d0ef5f5975 rebase: remove revprecursor and revpruned states (BC)
Jun Wu <quark@fb.com>
parents: 33863
diff changeset
    61
# legacy revstates no longer needed in current code
33866
3ddbab49efcf rebase: remove revignored and nullmerge states
Jun Wu <quark@fb.com>
parents: 33865
diff changeset
    62
# -2: nullmerge, -3: revignored, -4: revprecursor, -5: revpruned
3ddbab49efcf rebase: remove revignored and nullmerge states
Jun Wu <quark@fb.com>
parents: 33865
diff changeset
    63
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
    64
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
    65
cmdtable = {}
32376
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32366
diff changeset
    66
command = registrar.command(cmdtable)
29852
d5883fd055c6 extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents: 29610
diff changeset
    67
# 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
    68
# 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
    69
# 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
    70
# leave the attribute unspecified.
29852
d5883fd055c6 extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents: 29610
diff changeset
    71
testedwith = 'ships-with-hg-core'
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
    72
26671
66dc39cd7d06 rebase: factor out nothing to rebase return code
Ryan McElroy <rmcelroy@fb.com>
parents: 26669
diff changeset
    73
def _nothingtorebase():
66dc39cd7d06 rebase: factor out nothing to rebase return code
Ryan McElroy <rmcelroy@fb.com>
parents: 26669
diff changeset
    74
    return 1
66dc39cd7d06 rebase: factor out nothing to rebase return code
Ryan McElroy <rmcelroy@fb.com>
parents: 26669
diff changeset
    75
27976
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
    76
def _savegraft(ctx, extra):
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
    77
    s = ctx.extra().get('source', None)
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
    78
    if s is not None:
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
    79
        extra['source'] = s
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
    80
    s = ctx.extra().get('intermediate-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['intermediate-source'] = s
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
    83
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
    84
def _savebranch(ctx, extra):
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
    85
    extra['branch'] = ctx.branch()
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
    86
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
    87
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
    88
    """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
    89
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
    90
    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
    91
    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
    92
                              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
    93
28394
dcb4209bd30d revset: replace extpredicate by revsetpredicate of registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28280
diff changeset
    94
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
    95
42910f9fffeb revset: use delayregistrar to register predicate in extension easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 27577
diff changeset
    96
@revsetpredicate('_destrebase')
26719
8bed1eae99df rebase: rename and test '_destrebase'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26718
diff changeset
    97
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
    98
    # ``_rebasedefaultdest()``
3f8c5c284c86 rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26165
diff changeset
    99
3f8c5c284c86 rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26165
diff changeset
   100
    # default destination for rebase.
3f8c5c284c86 rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26165
diff changeset
   101
    # # 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
   102
    # # 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
   103
    # 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
   104
    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
   105
    if x is not None:
31043
aea06029919e revset: import set classes directly from smartset module
Yuya Nishihara <yuya@tcha.org>
parents: 30899
diff changeset
   106
        sourceset = revset.getset(repo, smartset.fullreposet(repo), x)
aea06029919e revset: import set classes directly from smartset module
Yuya Nishihara <yuya@tcha.org>
parents: 30899
diff changeset
   107
    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
   108
37787
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
   109
@revsetpredicate('_destautoorphanrebase')
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
   110
def _revsetdestautoorphanrebase(repo, subset, x):
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
   111
    """automatic rebase destination for a single orphan revision"""
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
   112
    unfi = repo.unfiltered()
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
   113
    obsoleted = unfi.revs('obsolete()')
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
   114
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
   115
    src = revset.getset(repo, subset, x).first()
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
   116
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
   117
    # Empty src or already obsoleted - Do not return a destination
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
   118
    if not src or src in obsoleted:
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
   119
        return smartset.baseset()
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
   120
    dests = destutil.orphanpossibledestination(repo, src)
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
   121
    if len(dests) > 1:
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
   122
        raise error.Abort(
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
   123
            _("ambiguous automatic rebase: %r could end up on any of %r") % (
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
   124
                src, dests))
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
   125
    # We have zero or one destination, so we can just return here.
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
   126
    return smartset.baseset(dests)
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
   127
33862
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33810
diff changeset
   128
def _ctxdesc(ctx):
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33810
diff changeset
   129
    """short description for a context"""
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33810
diff changeset
   130
    desc = '%d:%s "%s"' % (ctx.rev(), ctx,
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33810
diff changeset
   131
                           ctx.description().split('\n', 1)[0])
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33810
diff changeset
   132
    repo = ctx.repo()
34297
4f969b9e0cf5 rebase: also include other namespaces in changeset description
Martin von Zweigbergk <martinvonz@google.com>
parents: 34110
diff changeset
   133
    names = []
4f969b9e0cf5 rebase: also include other namespaces in changeset description
Martin von Zweigbergk <martinvonz@google.com>
parents: 34110
diff changeset
   134
    for nsname, ns in repo.names.iteritems():
4f969b9e0cf5 rebase: also include other namespaces in changeset description
Martin von Zweigbergk <martinvonz@google.com>
parents: 34110
diff changeset
   135
        if nsname == 'branches':
4f969b9e0cf5 rebase: also include other namespaces in changeset description
Martin von Zweigbergk <martinvonz@google.com>
parents: 34110
diff changeset
   136
            continue
4f969b9e0cf5 rebase: also include other namespaces in changeset description
Martin von Zweigbergk <martinvonz@google.com>
parents: 34110
diff changeset
   137
        names.extend(ns.names(repo, ctx.node()))
33862
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33810
diff changeset
   138
    if names:
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33810
diff changeset
   139
        desc += ' (%s)' % ' '.join(names)
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33810
diff changeset
   140
    return desc
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33810
diff changeset
   141
29358
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
   142
class rebaseruntime(object):
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
   143
    """This class is a container for rebase runtime state"""
35396
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35393
diff changeset
   144
    def __init__(self, repo, ui, inmemory=False, opts=None):
29399
adb0d58b8b0b rebase: pass repo, ui and opts objects to the RR class constructor
Kostia Balytskyi <ikostia@fb.com>
parents: 29372
diff changeset
   145
        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
   146
            opts = {}
adb0d58b8b0b rebase: pass repo, ui and opts objects to the RR class constructor
Kostia Balytskyi <ikostia@fb.com>
parents: 29372
diff changeset
   147
34109
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34108
diff changeset
   148
        # prepared: whether we have rebasestate prepared or not. Currently it
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34108
diff changeset
   149
        # decides whether "self.repo" is unfiltered or not.
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34108
diff changeset
   150
        # The rebasestate has explicit hash to hash instructions not depending
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34108
diff changeset
   151
        # on visibility. If rebasestate exists (in-memory or on-disk), use
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34108
diff changeset
   152
        # unfiltered repo to avoid visibility issues.
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34108
diff changeset
   153
        # Before knowing rebasestate (i.e. when starting a new rebase (not
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34108
diff changeset
   154
        # --continue or --abort)), the original repo should be used so
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34108
diff changeset
   155
        # visibility-dependent revsets are correct.
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34108
diff changeset
   156
        self.prepared = False
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34108
diff changeset
   157
        self._repo = repo
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34108
diff changeset
   158
29399
adb0d58b8b0b rebase: pass repo, ui and opts objects to the RR class constructor
Kostia Balytskyi <ikostia@fb.com>
parents: 29372
diff changeset
   159
        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
   160
        self.opts = opts
29358
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
   161
        self.originalwd = None
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
   162
        self.external = nullrev
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
   163
        # 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
   164
        # 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
   165
        # 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
   166
        self.state = {}
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
   167
        self.activebookmark = None
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
   168
        self.destmap = {}
29360
4cbe62ab5c97 rebase: move local variable 'skipped' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29359
diff changeset
   169
        self.skipped = set()
29358
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
   170
29400
c79da70a4659 rebase: move collapse-related local variables to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29399
diff changeset
   171
        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
   172
        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
   173
        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
   174
87acd047711e rebase: move local variables 'date' and 'extrafns' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29400
diff changeset
   175
        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
   176
        self.extrafns = [_savegraft]
87acd047711e rebase: move local variables 'date' and 'extrafns' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29400
diff changeset
   177
        if e:
87acd047711e rebase: move local variables 'date' and 'extrafns' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29400
diff changeset
   178
            self.extrafns = [e]
29400
c79da70a4659 rebase: move collapse-related local variables to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29399
diff changeset
   179
38856
2b728789edfd rebase: move "backup" flag to rebaseruntime
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38839
diff changeset
   180
        self.backupf = ui.configbool('ui', 'history-editing-backup')
29402
7481ffb7ff83 rebase: move local variables related to keeping things unchanged to the RR
Kostia Balytskyi <ikostia@fb.com>
parents: 29401
diff changeset
   181
        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
   182
        self.keepbranchesf = opts.get('keepbranches', False)
29404
591a8069b60e rebase: move local variable 'obsoletenotrebased' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29403
diff changeset
   183
        self.obsoletenotrebased = {}
35081
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35043
diff changeset
   184
        self.obsoletewithoutsuccessorindestination = set()
35396
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35393
diff changeset
   185
        self.inmemory = inmemory
38520
7c853edcf4ed rebase: add a stateobj variable to rebaseruntime class
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38519
diff changeset
   186
        self.stateobj = statemod.cmdstate(repo, 'rebasestate')
29402
7481ffb7ff83 rebase: move local variables related to keeping things unchanged to the RR
Kostia Balytskyi <ikostia@fb.com>
parents: 29401
diff changeset
   187
34109
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34108
diff changeset
   188
    @property
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34108
diff changeset
   189
    def repo(self):
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34108
diff changeset
   190
        if self.prepared:
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34108
diff changeset
   191
            return self._repo.unfiltered()
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34108
diff changeset
   192
        else:
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34108
diff changeset
   193
            return self._repo
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34108
diff changeset
   194
31234
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31233
diff changeset
   195
    def storestatus(self, tr=None):
31233
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31232
diff changeset
   196
        """Store the current status to allow recovery"""
31234
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31233
diff changeset
   197
        if tr:
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31233
diff changeset
   198
            tr.addfilegenerator('rebasestate', ('rebasestate',),
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31233
diff changeset
   199
                                self._writestatus, location='plain')
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31233
diff changeset
   200
        else:
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31233
diff changeset
   201
            with self.repo.vfs("rebasestate", "w") as f:
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31233
diff changeset
   202
                self._writestatus(f)
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31233
diff changeset
   203
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31233
diff changeset
   204
    def _writestatus(self, f):
34110
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34109
diff changeset
   205
        repo = self.repo
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34109
diff changeset
   206
        assert repo.filtername is None
31233
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31232
diff changeset
   207
        f.write(repo[self.originalwd].hex() + '\n')
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
   208
        # 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: 34021
diff changeset
   209
        f.write('\n')
31233
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31232
diff changeset
   210
        f.write(repo[self.external].hex() + '\n')
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31232
diff changeset
   211
        f.write('%d\n' % int(self.collapsef))
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31232
diff changeset
   212
        f.write('%d\n' % int(self.keepf))
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31232
diff changeset
   213
        f.write('%d\n' % int(self.keepbranchesf))
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31232
diff changeset
   214
        f.write('%s\n' % (self.activebookmark or ''))
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
   215
        destmap = self.destmap
31233
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31232
diff changeset
   216
        for d, v in self.state.iteritems():
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31232
diff changeset
   217
            oldrev = repo[d].hex()
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31232
diff changeset
   218
            if v >= 0:
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31232
diff changeset
   219
                newrev = repo[v].hex()
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31232
diff changeset
   220
            else:
35955
83b9f96ce20f py3: use "%d" to convert integer to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35701
diff changeset
   221
                newrev = "%d" % v
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
   222
            destnode = repo[destmap[d]].hex()
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
   223
            f.write("%s:%s:%s\n" % (oldrev, newrev, destnode))
31233
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31232
diff changeset
   224
        repo.ui.debug('rebase status stored\n')
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31232
diff changeset
   225
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   226
    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
   227
        """Restore a previously stored status"""
38522
cf24f678adda rebase: check whether the rebasestate exists or not a bit early
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38521
diff changeset
   228
        if not self.stateobj.exists():
cf24f678adda rebase: check whether the rebasestate exists or not a bit early
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38521
diff changeset
   229
            cmdutil.wrongtooltocontinue(self.repo, _('rebase'))
cf24f678adda rebase: check whether the rebasestate exists or not a bit early
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38521
diff changeset
   230
38519
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38512
diff changeset
   231
        data = self._read()
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38512
diff changeset
   232
        self.repo.ui.debug('rebase status resumed\n')
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38512
diff changeset
   233
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38512
diff changeset
   234
        self.originalwd = data['originalwd']
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38512
diff changeset
   235
        self.destmap = data['destmap']
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38512
diff changeset
   236
        self.state = data['state']
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38512
diff changeset
   237
        self.skipped = data['skipped']
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38512
diff changeset
   238
        self.collapsef = data['collapse']
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38512
diff changeset
   239
        self.keepf = data['keep']
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38512
diff changeset
   240
        self.keepbranchesf = data['keepbranches']
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38512
diff changeset
   241
        self.external = data['external']
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38512
diff changeset
   242
        self.activebookmark = data['activebookmark']
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38512
diff changeset
   243
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38512
diff changeset
   244
    def _read(self):
34109
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34108
diff changeset
   245
        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
   246
        repo = self.repo
34110
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34109
diff changeset
   247
        assert repo.filtername is None
38519
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38512
diff changeset
   248
        data = {'keepbranches': None, 'collapse': None, 'activebookmark': None,
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38512
diff changeset
   249
                'external': nullrev, 'keep': None, 'originalwd': None}
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
   250
        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
   251
        state = {}
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
   252
        destmap = {}
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   253
38522
cf24f678adda rebase: check whether the rebasestate exists or not a bit early
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38521
diff changeset
   254
        if True:
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   255
            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
   256
            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
   257
                if i == 0:
38519
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38512
diff changeset
   258
                    data['originalwd'] = 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
   259
                elif i == 1:
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
   260
                    # 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: 34021
diff changeset
   261
                    # clients may still use it
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
   262
                    if l:
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
   263
                        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
   264
                elif i == 2:
38519
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38512
diff changeset
   265
                    data['external'] = 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
   266
                elif i == 3:
38519
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38512
diff changeset
   267
                    data['collapse'] = bool(int(l))
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   268
                elif i == 4:
38519
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38512
diff changeset
   269
                    data['keep'] = bool(int(l))
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   270
                elif i == 5:
38519
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38512
diff changeset
   271
                    data['keepbranches'] = bool(int(l))
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   272
                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
   273
                    # 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
   274
                    # 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
   275
                    # oldrev:newrev lines
38519
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38512
diff changeset
   276
                    data['activebookmark'] = l
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   277
                else:
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
   278
                    args = l.split(':')
37377
3dfd7f018c69 rebase: convert "oldrev" to revnum earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 37376
diff changeset
   279
                    oldrev = repo[args[0]].rev()
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
   280
                    newrev = args[1]
33864
d8d0ef5f5975 rebase: remove revprecursor and revpruned states (BC)
Jun Wu <quark@fb.com>
parents: 33863
diff changeset
   281
                    if newrev in legacystates:
d8d0ef5f5975 rebase: remove revprecursor and revpruned states (BC)
Jun Wu <quark@fb.com>
parents: 33863
diff changeset
   282
                        continue
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
   283
                    if len(args) > 2:
37376
25940470c7e6 rebase: make "destnode" consistently a revnum and rename it to "destrev"
Martin von Zweigbergk <martinvonz@google.com>
parents: 37332
diff changeset
   284
                        destrev = repo[args[2]].rev()
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
   285
                    else:
37376
25940470c7e6 rebase: make "destnode" consistently a revnum and rename it to "destrev"
Martin von Zweigbergk <martinvonz@google.com>
parents: 37332
diff changeset
   286
                        destrev = legacydest
37377
3dfd7f018c69 rebase: convert "oldrev" to revnum earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 37376
diff changeset
   287
                    destmap[oldrev] = destrev
37378
953db9e00eeb rebase: remove unnecessary and incorrect handling of nullid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37377
diff changeset
   288
                    if newrev == revtodostr:
37377
3dfd7f018c69 rebase: convert "oldrev" to revnum earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 37376
diff changeset
   289
                        state[oldrev] = revtodo
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   290
                        # 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
   291
                    else:
37377
3dfd7f018c69 rebase: convert "oldrev" to revnum earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 37376
diff changeset
   292
                        state[oldrev] = repo[newrev].rev()
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   293
38519
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38512
diff changeset
   294
        if data['keepbranches'] 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
   295
            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
   296
38519
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38512
diff changeset
   297
        data['destmap'] = destmap
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38512
diff changeset
   298
        data['state'] = state
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   299
        skipped = set()
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   300
        # recompute the set of skipped revs
38519
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38512
diff changeset
   301
        if not data['collapse']:
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
   302
            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
   303
            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
   304
                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
   305
                    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
   306
                seen.add(new)
38519
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38512
diff changeset
   307
        data['skipped'] = skipped
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   308
        repo.ui.debug('computed skipped revs: %s\n' %
36185
6eb7d95f8970 py3: port string formatting
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36036
diff changeset
   309
                        (' '.join('%d' % r for r in sorted(skipped)) or ''))
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   310
38519
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38512
diff changeset
   311
        return data
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   312
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
   313
    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
   314
        """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
   315
5d16ebe7b14f rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents: 29478
diff changeset
   316
        obsoleterevs:   iterable of all obsolete revisions in rebaseset
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
   317
        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
   318
        """
5d16ebe7b14f rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents: 29478
diff changeset
   319
        self.obsoletenotrebased = {}
34492
a5a810df4c81 configitems: register the 'experimental.rebaseskipobsolete' config
Boris Feld <boris.feld@octobus.net>
parents: 34368
diff changeset
   320
        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
   321
            return
5d16ebe7b14f rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents: 29478
diff changeset
   322
        obsoleteset = set(obsoleterevs)
36034
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 36033
diff changeset
   323
        (self.obsoletenotrebased,
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 36033
diff changeset
   324
         self.obsoletewithoutsuccessorindestination,
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 36033
diff changeset
   325
         obsoleteextinctsuccessors) = _computeobsoletenotrebased(
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 36033
diff changeset
   326
             self.repo, 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
   327
        skippedset = set(self.obsoletenotrebased)
35081
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35043
diff changeset
   328
        skippedset.update(self.obsoletewithoutsuccessorindestination)
36034
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 36033
diff changeset
   329
        skippedset.update(obsoleteextinctsuccessors)
33867
3b04a6ff625c rebase: remove rebaseset from _checkobsrebase
Jun Wu <quark@fb.com>
parents: 33866
diff changeset
   330
        _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
   331
38503
999e5c218daf rebase: suppress warning thrown when aborting rebase in case of dryrun
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38502
diff changeset
   332
    def _prepareabortorcontinue(self, isabort, backup=True, suppwarns=False):
29472
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
   333
        try:
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
   334
            self.restorestatus()
31235
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31234
diff changeset
   335
            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
   336
        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
   337
            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
   338
                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
   339
                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
   340
                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
   341
                                    ' 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
   342
                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
   343
            else:
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
   344
                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
   345
                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
   346
                raise error.Abort(msg, hint=hint)
38856
2b728789edfd rebase: move "backup" flag to rebaseruntime
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38839
diff changeset
   347
29472
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
   348
        if isabort:
38856
2b728789edfd rebase: move "backup" flag to rebaseruntime
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38839
diff changeset
   349
            backup = backup and self.backupf
38502
c892a30bafb9 rebase: no need to store backup in case of dryrun
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38501
diff changeset
   350
            return abort(self.repo, self.originalwd, self.destmap, self.state,
38503
999e5c218daf rebase: suppress warning thrown when aborting rebase in case of dryrun
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38502
diff changeset
   351
                         activebookmark=self.activebookmark, backup=backup,
999e5c218daf rebase: suppress warning thrown when aborting rebase in case of dryrun
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38502
diff changeset
   352
                         suppwarns=suppwarns)
29472
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
   353
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
   354
    def _preparenewrebase(self, destmap):
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
   355
        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
   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
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
   358
        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
   359
        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
   360
        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
   361
              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
   362
                                 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
   363
            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
   364
                _("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
   365
                  " 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
   366
                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
   367
34026
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34025
diff changeset
   368
        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
   369
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
   370
        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
   371
            # 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
   372
            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
   373
            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
   374
31311
681046de87f1 rebase: abort if *any* commit in rebase set is public
Martin von Zweigbergk <martinvonz@google.com>
parents: 31306
diff changeset
   375
        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: 31306
diff changeset
   376
            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: 31306
diff changeset
   377
                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: 31306
diff changeset
   378
                                  % root,
681046de87f1 rebase: abort if *any* commit in rebase set is public
Martin von Zweigbergk <martinvonz@google.com>
parents: 31306
diff changeset
   379
                                  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
   380
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
   381
        (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
   382
        if self.collapsef:
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
   383
            dests = set(self.destmap.values())
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
   384
            if len(dests) != 1:
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
   385
                raise error.Abort(
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
   386
                    _('--collapse does not work with multiple destinations'))
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
   387
            destrev = next(iter(dests))
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
   388
            destancestors = self.repo.changelog.ancestors([destrev],
33868
ddf77c0cc169 rebase: remove self.destancestors
Jun Wu <quark@fb.com>
parents: 33867
diff changeset
   389
                                                          inclusive=True)
ddf77c0cc169 rebase: remove self.destancestors
Jun Wu <quark@fb.com>
parents: 33867
diff changeset
   390
            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
   391
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
   392
        for destrev in sorted(set(destmap.values())):
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
   393
            dest = self.repo[destrev]
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
   394
            if dest.closesbranch() and not self.keepbranchesf:
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
   395
                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
   396
34109
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34108
diff changeset
   397
        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
   398
35342
8dba17546016 rebase: extract _assignworkingcopy
Phil Cohen <phillco@fb.com>
parents: 35341
diff changeset
   399
    def _assignworkingcopy(self):
35299
482614b3802a rebase: add the --inmemory option flag; assign a wctx object for the rebase
Phil Cohen <phillco@fb.com>
parents: 35296
diff changeset
   400
        if self.inmemory:
482614b3802a rebase: add the --inmemory option flag; assign a wctx object for the rebase
Phil Cohen <phillco@fb.com>
parents: 35296
diff changeset
   401
            from mercurial.context import overlayworkingctx
482614b3802a rebase: add the --inmemory option flag; assign a wctx object for the rebase
Phil Cohen <phillco@fb.com>
parents: 35296
diff changeset
   402
            self.wctx = overlayworkingctx(self.repo)
35393
b9bdee046cc2 tests: add a simple test for in-memory rebase
Phil Cohen <phillco@fb.com>
parents: 35342
diff changeset
   403
            self.repo.ui.debug("rebasing in-memory\n")
35299
482614b3802a rebase: add the --inmemory option flag; assign a wctx object for the rebase
Phil Cohen <phillco@fb.com>
parents: 35296
diff changeset
   404
        else:
482614b3802a rebase: add the --inmemory option flag; assign a wctx object for the rebase
Phil Cohen <phillco@fb.com>
parents: 35296
diff changeset
   405
            self.wctx = self.repo[None]
35393
b9bdee046cc2 tests: add a simple test for in-memory rebase
Phil Cohen <phillco@fb.com>
parents: 35342
diff changeset
   406
            self.repo.ui.debug("rebasing on disk\n")
37030
81b35d275a60 rebase: get "inmemory" state directly from rebase runtime
Martin von Zweigbergk <martinvonz@google.com>
parents: 37028
diff changeset
   407
        self.repo.ui.log("rebase", "", rebase_imm_used=self.inmemory)
35342
8dba17546016 rebase: extract _assignworkingcopy
Phil Cohen <phillco@fb.com>
parents: 35341
diff changeset
   408
8dba17546016 rebase: extract _assignworkingcopy
Phil Cohen <phillco@fb.com>
parents: 35341
diff changeset
   409
    def _performrebase(self, tr):
8dba17546016 rebase: extract _assignworkingcopy
Phil Cohen <phillco@fb.com>
parents: 35341
diff changeset
   410
        self._assignworkingcopy()
8dba17546016 rebase: extract _assignworkingcopy
Phil Cohen <phillco@fb.com>
parents: 35341
diff changeset
   411
        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
   412
        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
   413
            # 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
   414
            # 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
   415
            # desired
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   416
            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
   417
            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
   418
                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
   419
                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
   420
                    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
   421
                    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
   422
                        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
   423
                            'branches'))
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   424
34026
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34025
diff changeset
   425
        # Calculate self.obsoletenotrebased
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34025
diff changeset
   426
        obsrevs = _filterobsoleterevs(self.repo, self.state)
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34025
diff changeset
   427
        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
   428
33332
3b7cb3d17137 rebase: use scmutil.cleanupnodes (issue5606) (BC)
Jun Wu <quark@fb.com>
parents: 33163
diff changeset
   429
        # 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
   430
        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
   431
        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
   432
            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
   433
31235
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31234
diff changeset
   434
        # 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: 31234
diff changeset
   435
        # if we fail before the transaction closes.
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31234
diff changeset
   436
        self.storestatus()
37034
74f91bec6991 rebase: register status file generator only once when using single transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 37031
diff changeset
   437
        if tr:
74f91bec6991 rebase: register status file generator only once when using single transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 37031
diff changeset
   438
            # When using single transaction, store state when transaction
74f91bec6991 rebase: register status file generator only once when using single transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 37031
diff changeset
   439
            # commits.
74f91bec6991 rebase: register status file generator only once when using single transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 37031
diff changeset
   440
            self.storestatus(tr)
31235
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31234
diff changeset
   441
29876
58db005d870e rebase: properly calculate total commits to rebase (issue5347)
timeless <timeless@mozdev.org>
parents: 29852
diff changeset
   442
        cands = [k for k, v in self.state.iteritems() if v == revtodo]
38383
a73eab7d6575 rebase: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38378
diff changeset
   443
        p = repo.ui.makeprogress(_("rebasing"), unit=_('changesets'),
a73eab7d6575 rebase: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38378
diff changeset
   444
                                 total=len(cands))
36939
61600b024a70 rebase: move constant expressions out of inner loop in _performrebase()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36938
diff changeset
   445
        def progress(ctx):
38383
a73eab7d6575 rebase: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38378
diff changeset
   446
            p.increment(item=("%d:%s" % (ctx.rev(), ctx)))
36939
61600b024a70 rebase: move constant expressions out of inner loop in _performrebase()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36938
diff changeset
   447
        allowdivergence = self.ui.configbool(
61600b024a70 rebase: move constant expressions out of inner loop in _performrebase()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36938
diff changeset
   448
            'experimental', 'evolution.allowdivergence')
34024
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
   449
        for subset in sortsource(self.destmap):
36938
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36937
diff changeset
   450
            sortedrevs = self.repo.revs('sort(%ld, -topo)', subset)
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36937
diff changeset
   451
            if not allowdivergence:
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36937
diff changeset
   452
                sortedrevs -= self.repo.revs(
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36937
diff changeset
   453
                    'descendants(%ld) and not %ld',
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36937
diff changeset
   454
                    self.obsoletewithoutsuccessorindestination,
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36937
diff changeset
   455
                    self.obsoletewithoutsuccessorindestination,
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36937
diff changeset
   456
                )
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36937
diff changeset
   457
            for rev in sortedrevs:
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36937
diff changeset
   458
                self._rebasenode(tr, rev, allowdivergence, progress)
38383
a73eab7d6575 rebase: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38378
diff changeset
   459
        p.complete()
34024
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
   460
        ui.note(_('rebase merging completed\n'))
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
   461
37036
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37035
diff changeset
   462
    def _concludenode(self, rev, p1, p2, editor, commitmsg=None):
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37035
diff changeset
   463
        '''Commit the wd changes with parents p1 and p2.
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37035
diff changeset
   464
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37035
diff changeset
   465
        Reuse commit info from rev but also store useful information in extra.
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37035
diff changeset
   466
        Return node of committed revision.'''
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37035
diff changeset
   467
        repo = self.repo
37037
fbc82a08bdcb rebase: pass in ctx, not rev, to conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37036
diff changeset
   468
        ctx = repo[rev]
37038
b7f5d03e1e54 rebase: look up commit message to reuse outside of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37037
diff changeset
   469
        if commitmsg is None:
b7f5d03e1e54 rebase: look up commit message to reuse outside of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37037
diff changeset
   470
            commitmsg = ctx.description()
37044
0b1230a5a958 rebase: look up default date outside of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37043
diff changeset
   471
        date = self.date
0b1230a5a958 rebase: look up default date outside of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37043
diff changeset
   472
        if date is None:
0b1230a5a958 rebase: look up default date outside of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37043
diff changeset
   473
            date = ctx.date()
37039
0ab0d94ead72 rebase: pass in "extra" itself into conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37038
diff changeset
   474
        extra = {'rebase_source': ctx.hex()}
37040
bd0086bd3af4 rebase: inline _makextrafn() now that we have only one caller
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
   475
        for c in self.extrafns:
bd0086bd3af4 rebase: inline _makextrafn() now that we have only one caller
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
   476
            c(ctx, extra)
37041
7db86856f27f rebase: pass in "keepbranch" to conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37040
diff changeset
   477
        keepbranch = self.keepbranchesf and repo[p1].branch() != ctx.branch()
37042
7616073a4cf1 rebase: pass in entire "overrides" dict to conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37041
diff changeset
   478
        destphase = max(ctx.phase(), phases.draft)
7616073a4cf1 rebase: pass in entire "overrides" dict to conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37041
diff changeset
   479
        overrides = {('phases', 'new-commit'): destphase}
7616073a4cf1 rebase: pass in entire "overrides" dict to conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37041
diff changeset
   480
        if keepbranch:
7616073a4cf1 rebase: pass in entire "overrides" dict to conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37041
diff changeset
   481
            overrides[('ui', 'allowemptycommit')] = True
37043
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
   482
        with repo.ui.configoverride(overrides, 'rebase'):
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
   483
            if self.inmemory:
37046
a8d8cdafe29c rebase: rename conclude[memory]node() to commit[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37045
diff changeset
   484
                newnode = commitmemorynode(repo, p1, p2,
37043
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
   485
                    wctx=self.wctx,
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
   486
                    extra=extra,
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
   487
                    commitmsg=commitmsg,
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
   488
                    editor=editor,
37045
8ff5772711fa rebase: pass in "user" instead of "ctx" to conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37044
diff changeset
   489
                    user=ctx.user(),
37044
0b1230a5a958 rebase: look up default date outside of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37043
diff changeset
   490
                    date=date)
37043
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
   491
                mergemod.mergestate.clean(repo)
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
   492
            else:
37046
a8d8cdafe29c rebase: rename conclude[memory]node() to commit[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37045
diff changeset
   493
                newnode = commitnode(repo, p1, p2,
37043
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
   494
                    extra=extra,
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
   495
                    commitmsg=commitmsg,
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
   496
                    editor=editor,
37045
8ff5772711fa rebase: pass in "user" instead of "ctx" to conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37044
diff changeset
   497
                    user=ctx.user(),
37044
0b1230a5a958 rebase: look up default date outside of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37043
diff changeset
   498
                    date=date)
37036
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37035
diff changeset
   499
37043
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
   500
            if newnode is None:
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
   501
                # If it ended up being a no-op commit, then the normal
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
   502
                # merge state clean-up path doesn't happen, so do it
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
   503
                # here. Fix issue5494
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
   504
                mergemod.mergestate.clean(repo)
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
   505
            return newnode
37036
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37035
diff changeset
   506
36937
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   507
    def _rebasenode(self, tr, rev, allowdivergence, progressfn):
34024
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
   508
        repo, ui, opts = self.repo, self.ui, self.opts
36937
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   509
        dest = self.destmap[rev]
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   510
        ctx = repo[rev]
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   511
        desc = _ctxdesc(ctx)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   512
        if self.state[rev] == rev:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   513
            ui.status(_('already rebased %s\n') % desc)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   514
        elif (not allowdivergence
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   515
              and rev in self.obsoletewithoutsuccessorindestination):
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   516
            msg = _('note: not rebasing %s and its descendants as '
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   517
                    'this would cause divergence\n') % desc
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   518
            repo.ui.status(msg)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   519
            self.skipped.add(rev)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   520
        elif rev in self.obsoletenotrebased:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   521
            succ = self.obsoletenotrebased[rev]
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   522
            if succ is None:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   523
                msg = _('note: not rebasing %s, it has no '
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   524
                        'successor\n') % desc
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   525
            else:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   526
                succdesc = _ctxdesc(repo[succ])
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   527
                msg = (_('note: not rebasing %s, already in '
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   528
                         'destination as %s\n') % (desc, succdesc))
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   529
            repo.ui.status(msg)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   530
            # Make clearrebased aware state[rev] is not a true successor
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   531
            self.skipped.add(rev)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   532
            # Record rev as moved to its desired destination in self.state.
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   533
            # This helps bookmark and working parent movement.
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   534
            dest = max(adjustdest(repo, rev, self.destmap, self.state,
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   535
                                  self.skipped))
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   536
            self.state[rev] = dest
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   537
        elif self.state[rev] == revtodo:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   538
            ui.status(_('rebasing %s\n') % desc)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   539
            progressfn(ctx)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   540
            p1, p2, base = defineparents(repo, rev, self.destmap,
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   541
                                         self.state, self.skipped,
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   542
                                         self.obsoletenotrebased)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   543
            if len(repo[None].parents()) == 2:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   544
                repo.ui.debug('resuming interrupted rebase\n')
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   545
            else:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   546
                overrides = {('ui', 'forcemerge'): opts.get('tool', '')}
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   547
                with ui.configoverride(overrides, 'rebase'):
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   548
                    stats = rebasenode(repo, rev, p1, base, self.collapsef,
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   549
                                       dest, wctx=self.wctx)
37128
6f570c501e3e merge: deprecate accessing update results by index
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37046
diff changeset
   550
                    if stats.unresolvedcount > 0:
37030
81b35d275a60 rebase: get "inmemory" state directly from rebase runtime
Martin von Zweigbergk <martinvonz@google.com>
parents: 37028
diff changeset
   551
                        if self.inmemory:
36937
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   552
                            raise error.InMemoryMergeConflictsError()
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   553
                        else:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   554
                            raise error.InterventionRequired(
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   555
                                _('unresolved conflicts (see hg '
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   556
                                  'resolve, then hg rebase --continue)'))
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   557
            if not self.collapsef:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   558
                merging = p2 != nullrev
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   559
                editform = cmdutil.mergeeditform(merging, 'rebase')
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   560
                editor = cmdutil.getcommiteditor(editform=editform,
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   561
                                                 **pycompat.strkwargs(opts))
37036
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37035
diff changeset
   562
                newnode = self._concludenode(rev, p1, p2, editor)
36937
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   563
            else:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   564
                # Skip commit if we are collapsing
37030
81b35d275a60 rebase: get "inmemory" state directly from rebase runtime
Martin von Zweigbergk <martinvonz@google.com>
parents: 37028
diff changeset
   565
                if self.inmemory:
36937
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   566
                    self.wctx.setbase(repo[p1])
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   567
                else:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   568
                    repo.setparents(repo[p1].node())
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   569
                newnode = None
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   570
            # Update the state
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   571
            if newnode is not None:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   572
                self.state[rev] = repo[newnode].rev()
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   573
                ui.debug('rebased as %s\n' % short(newnode))
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   574
            else:
29477
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   575
                if not self.collapsef:
36937
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   576
                    ui.warn(_('note: rebase of %d:%s created no changes '
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   577
                              'to commit\n') % (rev, ctx))
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   578
                    self.skipped.add(rev)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   579
                self.state[rev] = p1
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   580
                ui.debug('next revision set to %d\n' % p1)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   581
        else:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   582
            ui.status(_('already rebased %s as %s\n') %
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36936
diff changeset
   583
                      (desc, repo[self.state[rev]]))
37035
98663bed146e rebase: store rebase state after each commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 37034
diff changeset
   584
        if not tr:
98663bed146e rebase: store rebase state after each commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 37034
diff changeset
   585
            # When not using single transaction, store state after each
98663bed146e rebase: store rebase state after each commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 37034
diff changeset
   586
            # commit is completely done. On InterventionRequired, we thus
98663bed146e rebase: store rebase state after each commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 37034
diff changeset
   587
            # won't store the status. Instead, we'll hit the "len(parents) == 2"
98663bed146e rebase: store rebase state after each commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 37034
diff changeset
   588
            # case and realize that the commit was in progress.
98663bed146e rebase: store rebase state after each commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 37034
diff changeset
   589
            self.storestatus()
29477
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   590
38856
2b728789edfd rebase: move "backup" flag to rebaseruntime
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38839
diff changeset
   591
    def _finishrebase(self):
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   592
        repo, ui, opts = self.repo, self.ui, self.opts
34883
c858afe9c59b rebase: add support to output nodechanges
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34872
diff changeset
   593
        fm = ui.formatter('rebase', opts)
c858afe9c59b rebase: add support to output nodechanges
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34872
diff changeset
   594
        fm.startitem()
36779
f7e3fe95b663 rebase: delete obsolete internal "keepopen" option
Martin von Zweigbergk <martinvonz@google.com>
parents: 36508
diff changeset
   595
        if self.collapsef:
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
   596
            p1, p2, _base = defineparents(repo, min(self.state), self.destmap,
34026
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34025
diff changeset
   597
                                          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
   598
                                          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
   599
            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
   600
            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
   601
            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
   602
                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
   603
            else:
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   604
                commitmsg = 'Collapsed revision'
33620
5a5f600b06ad rebase: sort collapsed revisions in commit message (issue5643)
Yuya Nishihara <yuya@tcha.org>
parents: 33590
diff changeset
   605
                for rebased in sorted(self.state):
33869
bc9e075133c9 rebase: remove "state >= revtodo" condition
Jun Wu <quark@fb.com>
parents: 33868
diff changeset
   606
                    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
   607
                        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
   608
                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
   609
            editor = cmdutil.getcommiteditor(edit=editopt, editform=editform)
29552
db26925bdbb0 rebase: remove sortedstate-related confusion
Kostia Balytskyi <ikostia@fb.com>
parents: 29551
diff changeset
   610
            revtoreuse = max(self.state)
33691
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
   611
37036
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37035
diff changeset
   612
            newnode = self._concludenode(revtoreuse, p1, self.external,
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37035
diff changeset
   613
                                         editor, commitmsg=commitmsg)
36934
9457c395fcbb rebase: fix issue 5494 also with --collapse
Martin von Zweigbergk <martinvonz@google.com>
parents: 36933
diff changeset
   614
33883
70354bd4f19b rebase: only change self.state when collapsing in _finishrebase
Jun Wu <quark@fb.com>
parents: 33882
diff changeset
   615
            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
   616
                newrev = repo[newnode].rev()
36332
238646784294 py3: use default dict iterator instead of iterkeys
Augie Fackler <augie@google.com>
parents: 36304
diff changeset
   617
                for oldrev in self.state:
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   618
                    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
   619
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   620
        if 'qtip' in repo.tags():
36430
7b86aa31b004 py3: fix handling of keyword arguments at more places
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36424
diff changeset
   621
            updatemq(repo, self.state, self.skipped,
7b86aa31b004 py3: fix handling of keyword arguments at more places
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36424
diff changeset
   622
                     **pycompat.strkwargs(opts))
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   623
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   624
        # 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
   625
        # (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
   626
        newwd = self.state.get(self.originalwd, self.originalwd)
33864
d8d0ef5f5975 rebase: remove revprecursor and revpruned states (BC)
Jun Wu <quark@fb.com>
parents: 33863
diff changeset
   627
        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
   628
            # 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
   629
            newwd = self.originalwd
36981
795eb53f1d3e rebase: allow in-memory merge of the working copy parent
Martin von Zweigbergk <martinvonz@google.com>
parents: 36966
diff changeset
   630
        if newwd not in [c.rev() for c in repo[None].parents()]:
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   631
            ui.note(_("update back to initial working directory parent\n"))
38512
39db5a01cd53 cleanup: pass in overwrite flag to hg.updaterepo() as named argument
Yuya Nishihara <yuya@tcha.org>
parents: 38505
diff changeset
   632
            hg.updaterepo(repo, newwd, overwrite=False)
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   633
33686
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33620
diff changeset
   634
        collapsedas = None
36782
a835bf3fe40a rebase: collapse two nested if-conditions
Martin von Zweigbergk <martinvonz@google.com>
parents: 36781
diff changeset
   635
        if self.collapsef and not self.keepf:
a835bf3fe40a rebase: collapse two nested if-conditions
Martin von Zweigbergk <martinvonz@google.com>
parents: 36781
diff changeset
   636
            collapsedas = newnode
34368
f61f5af5ed31 merge with stable
Martin von Zweigbergk <martinvonz@google.com>
parents: 34297 33686
diff changeset
   637
        clearrebased(ui, repo, self.destmap, self.state, self.skipped,
38856
2b728789edfd rebase: move "backup" flag to rebaseruntime
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38839
diff changeset
   638
                     collapsedas, self.keepf, fm=fm, backup=self.backupf)
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   639
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   640
        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
   641
        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
   642
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   643
        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
   644
        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
   645
        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
   646
            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
   647
            ui.note(_("%d revisions have been skipped\n") % skippedlen)
34883
c858afe9c59b rebase: add support to output nodechanges
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34872
diff changeset
   648
        fm.end()
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   649
33332
3b7cb3d17137 rebase: use scmutil.cleanupnodes (issue5606) (BC)
Jun Wu <quark@fb.com>
parents: 33163
diff changeset
   650
        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
   651
            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
   652
                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
   653
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   654
@command('rebase',
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   655
    [('s', 'source', '',
22789
5f4934487382 rebase: attempt to clarify --base
Matt Mackall <mpm@selenic.com>
parents: 22405
diff changeset
   656
     _('rebase the specified changeset and descendants'), _('REV')),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   657
    ('b', 'base', '',
22789
5f4934487382 rebase: attempt to clarify --base
Matt Mackall <mpm@selenic.com>
parents: 22405
diff changeset
   658
     _('rebase everything from branching point of specified changeset'),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   659
     _('REV')),
15270
6cb6064f1d50 rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15269
diff changeset
   660
    ('r', 'rev', [],
6cb6064f1d50 rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15269
diff changeset
   661
     _('rebase these revisions'),
6cb6064f1d50 rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 15269
diff changeset
   662
     _('REV')),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   663
    ('d', 'dest', '',
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   664
     _('rebase onto the specified changeset'), _('REV')),
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   665
    ('', 'collapse', False, _('collapse the rebased changesets')),
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   666
    ('m', 'message', '',
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   667
     _('use text as collapse commit message'), _('TEXT')),
15219
9d58569a8b92 rebase: add --edit switch
Matt Mackall <mpm@selenic.com>
parents: 15214
diff changeset
   668
    ('e', 'edit', False, _('invoke editor on commit messages')),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   669
    ('l', 'logfile', '',
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   670
     _('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
   671
    ('k', 'keep', False, _('keep original changesets')),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   672
    ('', '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
   673
    ('D', 'detach', False, _('(DEPRECATED)')),
22382
d5b04ee8ecf7 rebase: add a deprecated -i/--interactive flag
David Soria Parra <davidsp@fb.com>
parents: 22251
diff changeset
   674
    ('i', 'interactive', False, _('(DEPRECATED)')),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   675
    ('t', 'tool', '', _('specify merge tool')),
39130
cc37009e95ca rebase: add --stop option to stop rebase at any point (issue5206)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38856
diff changeset
   676
    ('', 'stop', False, _('stop interrupted rebase')),
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
   677
    ('c', 'continue', False, _('continue an interrupted rebase')),
37787
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
   678
    ('a', 'abort', False, _('abort an interrupted rebase')),
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
   679
    ('', 'auto-orphans', '', _('automatically rebase orphan revisions '
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
   680
                               'in the specified revset (EXPERIMENTAL)')),
38667
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
   681
     ] + cmdutil.dryrunopts + cmdutil.formatteropts + cmdutil.confirmopts,
40293
c303d65d2e34 help: assigning categories to existing commands
rdamazio@google.com
parents: 39924
diff changeset
   682
    _('[-s REV | -b REV] [-d REV] [OPTION]'),
c303d65d2e34 help: assigning categories to existing commands
rdamazio@google.com
parents: 39924
diff changeset
   683
    helpcategory=command.CATEGORY_CHANGE_MANAGEMENT)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   684
def rebase(ui, repo, **opts):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   685
    """move changeset (and descendants) to a different branch
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   686
7999
b25110140573 rebase: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7955
diff changeset
   687
    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
   688
    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
   689
    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
   690
    development tree.
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
   691
27454
3e3be524a712 rebase: simplify documentation about public commits
timeless <timeless@mozdev.org>
parents: 27344
diff changeset
   692
    Published commits cannot be rebased (see :hg:`help phases`).
3e3be524a712 rebase: simplify documentation about public commits
timeless <timeless@mozdev.org>
parents: 27344
diff changeset
   693
    To copy commits, see :hg:`help graft`.
18516
9fbeb61b8ad2 rebase: mention phases in the help
Kevin Bullock <kbullock@ringworld.org>
parents: 18514
diff changeset
   694
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
   695
    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
   696
    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
   697
    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
   698
    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
   699
    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
   700
    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
   701
    descendants.)
10646
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
   702
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
   703
    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
   704
a9a047878e14 rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents: 27454
diff changeset
   705
      1. Explicitly select them using ``--rev``.
10646
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
   706
27455
a9a047878e14 rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents: 27454
diff changeset
   707
      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
   708
         descendants.
27455
a9a047878e14 rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents: 27454
diff changeset
   709
a9a047878e14 rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents: 27454
diff changeset
   710
      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
   711
         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
   712
27932
6bc2299cc12f rebase: restore help for rebase w/o args (issue5059)
timeless <timeless@mozdev.org>
parents: 27866
diff changeset
   713
      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
   714
         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
   715
35296
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35146
diff changeset
   716
    If ``--source`` or ``--rev`` is used, special names ``SRC`` and ``ALLSRC``
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35146
diff changeset
   717
    can be used in ``--dest``. Destination would be calculated per source
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35146
diff changeset
   718
    revision with ``SRC`` substituted by that single source revision and
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35146
diff changeset
   719
    ``ALLSRC`` substituted by all source revisions.
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35146
diff changeset
   720
27456
2337958596e3 rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents: 27455
diff changeset
   721
    Rebase will destroy original changesets unless you use ``--keep``.
2337958596e3 rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents: 27455
diff changeset
   722
    It will also move your bookmarks (even if you do).
2337958596e3 rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents: 27455
diff changeset
   723
2337958596e3 rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents: 27455
diff changeset
   724
    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
   725
    (e.g. merges from the destination branch).
10646
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
   726
27457
97cc045f1cfe rebase: simplify documentation about heads
timeless <timeless@mozdev.org>
parents: 27456
diff changeset
   727
    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
   728
    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
   729
    and/or destination.
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   730
28001
ade12bf2bf0e rebase: mention help merge-tools in help
timeless <timeless@mozdev.org>
parents: 27977
diff changeset
   731
    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
   732
    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
   733
    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
   734
    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
   735
27458
d39e743e3578 rebase: mention conflict in documentation instead of merge
timeless <timeless@mozdev.org>
parents: 27457
diff changeset
   736
    If a rebase is interrupted to manually resolve a conflict, it can be
39132
571361e47137 rebase: include --stop option in documentation
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39131
diff changeset
   737
    continued with --continue/-c, aborted with --abort/-a, or stopped with
571361e47137 rebase: include --stop option in documentation
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39131
diff changeset
   738
    --stop.
11205
d26f662bfbf5 rebase: add error codes
Matt Mackall <mpm@selenic.com>
parents: 11204
diff changeset
   739
22790
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   740
    .. container:: verbose
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   741
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   742
      Examples:
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   743
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   744
      - move "local changes" (current commit back to branching point)
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   745
        to the current branch tip after a pull::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   746
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   747
          hg rebase
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   748
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   749
      - move a single changeset to the stable branch::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   750
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   751
          hg rebase -r 5f493448 -d stable
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   752
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   753
      - 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
   754
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   755
          hg rebase --source c0c3 --dest 4cf9
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   756
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   757
      - 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
   758
        default branch::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   759
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   760
          hg rebase --base myfeature --dest default
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   761
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   762
      - collapse a sequence of changes into a single commit::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   763
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   764
          hg rebase --collapse -r 1520:1525 -d .
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   765
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   766
      - move a named branch while preserving its name::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   767
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   768
          hg rebase -r "branch(featureX)" -d 1.3 --keepbranches
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   769
35296
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35146
diff changeset
   770
      - stabilize orphaned changesets so history looks linear::
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35146
diff changeset
   771
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35146
diff changeset
   772
          hg rebase -r 'orphan()-obsolete()'\
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35146
diff changeset
   773
 -d 'first(max((successors(max(roots(ALLSRC) & ::SRC)^)-obsolete())::) +\
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35146
diff changeset
   774
 max(::((roots(ALLSRC) & ::SRC)^)-obsolete()))'
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35146
diff changeset
   775
31564
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31521
diff changeset
   776
    Configuration Options:
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31521
diff changeset
   777
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31521
diff changeset
   778
    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
   779
    option::
31564
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31521
diff changeset
   780
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31521
diff changeset
   781
      [commands]
32083
1c911adebf48 rebase: fix incorrect configuration example
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31738
diff changeset
   782
      rebase.requiredest = True
31564
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31521
diff changeset
   783
33569
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
   784
    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
   785
    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
   786
    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
   787
    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
   788
    unexpectedly::
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
   789
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
   790
      [rebase]
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
   791
      singletransaction = True
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
   792
35396
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35393
diff changeset
   793
    By default, rebase writes to the working copy, but you can configure it to
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35393
diff changeset
   794
    run in-memory for for better performance, and to allow it to run if the
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35393
diff changeset
   795
    working copy is dirty::
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35393
diff changeset
   796
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35393
diff changeset
   797
      [rebase]
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35393
diff changeset
   798
      experimental.inmemory = True
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35393
diff changeset
   799
31564
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31521
diff changeset
   800
    Return Values:
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31521
diff changeset
   801
19971
2a9bb64faa0b rebase: add description about exit code when there are unresolved conflicts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19969
diff changeset
   802
    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
   803
    unresolved conflicts.
22790
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   804
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   805
    """
38505
53800d6eed26 rebase: convert opts dict to bytes at once
Yuya Nishihara <yuya@tcha.org>
parents: 38504
diff changeset
   806
    opts = pycompat.byteskwargs(opts)
35396
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35393
diff changeset
   807
    inmemory = ui.configbool('rebase', 'experimental.inmemory')
38505
53800d6eed26 rebase: convert opts dict to bytes at once
Yuya Nishihara <yuya@tcha.org>
parents: 38504
diff changeset
   808
    dryrun = opts.get('dry_run')
39134
c1a1fb389b4d rebase: do not set internal dryrun flag by --confirm
Yuya Nishihara <yuya@tcha.org>
parents: 39132
diff changeset
   809
    confirm = opts.get('confirm')
39135
a42506059522 rebase: consolidate check for --abort/--stop/--continue conflicts
Yuya Nishihara <yuya@tcha.org>
parents: 39134
diff changeset
   810
    selactions = [k for k in ['abort', 'stop', 'continue'] if opts.get(k)]
a42506059522 rebase: consolidate check for --abort/--stop/--continue conflicts
Yuya Nishihara <yuya@tcha.org>
parents: 39134
diff changeset
   811
    if len(selactions) > 1:
a42506059522 rebase: consolidate check for --abort/--stop/--continue conflicts
Yuya Nishihara <yuya@tcha.org>
parents: 39134
diff changeset
   812
        raise error.Abort(_('cannot use --%s with --%s')
a42506059522 rebase: consolidate check for --abort/--stop/--continue conflicts
Yuya Nishihara <yuya@tcha.org>
parents: 39134
diff changeset
   813
                          % tuple(selactions[:2]))
39136
3f9a5d746cf6 rebase: consolidate check for --dry-run/--confirm on abort/stop/continue
Yuya Nishihara <yuya@tcha.org>
parents: 39135
diff changeset
   814
    action = selactions[0] if selactions else None
3f9a5d746cf6 rebase: consolidate check for --dry-run/--confirm on abort/stop/continue
Yuya Nishihara <yuya@tcha.org>
parents: 39135
diff changeset
   815
    if dryrun and action:
3f9a5d746cf6 rebase: consolidate check for --dry-run/--confirm on abort/stop/continue
Yuya Nishihara <yuya@tcha.org>
parents: 39135
diff changeset
   816
        raise error.Abort(_('cannot specify both --dry-run and --%s') % action)
3f9a5d746cf6 rebase: consolidate check for --dry-run/--confirm on abort/stop/continue
Yuya Nishihara <yuya@tcha.org>
parents: 39135
diff changeset
   817
    if confirm and action:
3f9a5d746cf6 rebase: consolidate check for --dry-run/--confirm on abort/stop/continue
Yuya Nishihara <yuya@tcha.org>
parents: 39135
diff changeset
   818
        raise error.Abort(_('cannot specify both --confirm and --%s') % action)
3f9a5d746cf6 rebase: consolidate check for --dry-run/--confirm on abort/stop/continue
Yuya Nishihara <yuya@tcha.org>
parents: 39135
diff changeset
   819
    if dryrun and confirm:
3f9a5d746cf6 rebase: consolidate check for --dry-run/--confirm on abort/stop/continue
Yuya Nishihara <yuya@tcha.org>
parents: 39135
diff changeset
   820
        raise error.Abort(_('cannot specify both --confirm and --dry-run'))
38378
f4f1fb1cbfb4 rebase: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38251
diff changeset
   821
39138
18cbe2d872d3 rebase: turn off inmemory flag on --stop
Yuya Nishihara <yuya@tcha.org>
parents: 39137
diff changeset
   822
    if action or repo.currenttransaction() is not None:
35329
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
   823
        # in-memory rebase is not compatible with resuming rebases.
35701
c5d220a621e7 rebase: don't run IMM if running rebase in a transaction
Phil Cohen <phillco@fb.com>
parents: 35491
diff changeset
   824
        # (Or if it is run within a transaction, since the restart logic can
c5d220a621e7 rebase: don't run IMM if running rebase in a transaction
Phil Cohen <phillco@fb.com>
parents: 35491
diff changeset
   825
        # fail the entire transaction.)
35396
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35393
diff changeset
   826
        inmemory = False
35329
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
   827
38505
53800d6eed26 rebase: convert opts dict to bytes at once
Yuya Nishihara <yuya@tcha.org>
parents: 38504
diff changeset
   828
    if opts.get('auto_orphans'):
37787
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
   829
        for key in opts:
38505
53800d6eed26 rebase: convert opts dict to bytes at once
Yuya Nishihara <yuya@tcha.org>
parents: 38504
diff changeset
   830
            if key != 'auto_orphans' and opts.get(key):
37787
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
   831
                raise error.Abort(_('--auto-orphans is incompatible with %s') %
38505
53800d6eed26 rebase: convert opts dict to bytes at once
Yuya Nishihara <yuya@tcha.org>
parents: 38504
diff changeset
   832
                                  ('--' + key))
53800d6eed26 rebase: convert opts dict to bytes at once
Yuya Nishihara <yuya@tcha.org>
parents: 38504
diff changeset
   833
        userrevs = list(repo.revs(opts.get('auto_orphans')))
53800d6eed26 rebase: convert opts dict to bytes at once
Yuya Nishihara <yuya@tcha.org>
parents: 38504
diff changeset
   834
        opts['rev'] = [revsetlang.formatspec('%ld and orphan()', userrevs)]
53800d6eed26 rebase: convert opts dict to bytes at once
Yuya Nishihara <yuya@tcha.org>
parents: 38504
diff changeset
   835
        opts['dest'] = '_destautoorphanrebase(SRC)'
37787
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
   836
39134
c1a1fb389b4d rebase: do not set internal dryrun flag by --confirm
Yuya Nishihara <yuya@tcha.org>
parents: 39132
diff changeset
   837
    if dryrun or confirm:
39137
e9e742bd0501 rebase: use action variable to select things to do
Yuya Nishihara <yuya@tcha.org>
parents: 39136
diff changeset
   838
        return _dryrunrebase(ui, repo, action, opts)
e9e742bd0501 rebase: use action variable to select things to do
Yuya Nishihara <yuya@tcha.org>
parents: 39136
diff changeset
   839
    elif action == 'stop':
39130
cc37009e95ca rebase: add --stop option to stop rebase at any point (issue5206)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38856
diff changeset
   840
        rbsrt = rebaseruntime(repo, ui)
cc37009e95ca rebase: add --stop option to stop rebase at any point (issue5206)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38856
diff changeset
   841
        with repo.wlock(), repo.lock():
39153
ffb34ee6de9e rebase: cover restorestatus() by lock to prevent it from being updated
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39138
diff changeset
   842
            rbsrt.restorestatus()
ffb34ee6de9e rebase: cover restorestatus() by lock to prevent it from being updated
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39138
diff changeset
   843
            if rbsrt.collapsef:
ffb34ee6de9e rebase: cover restorestatus() by lock to prevent it from being updated
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39138
diff changeset
   844
                raise error.Abort(_("cannot stop in --collapse session"))
ffb34ee6de9e rebase: cover restorestatus() by lock to prevent it from being updated
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39138
diff changeset
   845
            allowunstable = obsolete.isenabled(repo, obsolete.allowunstableopt)
ffb34ee6de9e rebase: cover restorestatus() by lock to prevent it from being updated
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39138
diff changeset
   846
            if not (rbsrt.keepf or allowunstable):
ffb34ee6de9e rebase: cover restorestatus() by lock to prevent it from being updated
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39138
diff changeset
   847
                raise error.Abort(_("cannot remove original changesets with"
ffb34ee6de9e rebase: cover restorestatus() by lock to prevent it from being updated
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39138
diff changeset
   848
                                    " unrebased descendants"),
ffb34ee6de9e rebase: cover restorestatus() by lock to prevent it from being updated
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39138
diff changeset
   849
                    hint=_('either enable obsmarkers to allow unstable '
ffb34ee6de9e rebase: cover restorestatus() by lock to prevent it from being updated
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39138
diff changeset
   850
                           'revisions or use --keep to keep original '
ffb34ee6de9e rebase: cover restorestatus() by lock to prevent it from being updated
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39138
diff changeset
   851
                           'changesets'))
39130
cc37009e95ca rebase: add --stop option to stop rebase at any point (issue5206)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38856
diff changeset
   852
            if needupdate(repo, rbsrt.state):
cc37009e95ca rebase: add --stop option to stop rebase at any point (issue5206)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38856
diff changeset
   853
                # update to the current working revision
cc37009e95ca rebase: add --stop option to stop rebase at any point (issue5206)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38856
diff changeset
   854
                # to clear interrupted merge
cc37009e95ca rebase: add --stop option to stop rebase at any point (issue5206)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38856
diff changeset
   855
                hg.updaterepo(repo, rbsrt.originalwd, overwrite=True)
cc37009e95ca rebase: add --stop option to stop rebase at any point (issue5206)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38856
diff changeset
   856
            rbsrt._finishrebase()
cc37009e95ca rebase: add --stop option to stop rebase at any point (issue5206)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38856
diff changeset
   857
            return 0
38378
f4f1fb1cbfb4 rebase: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38251
diff changeset
   858
    elif inmemory:
35329
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
   859
        try:
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
   860
            # in-memory merge doesn't support conflicts, so if we hit any, abort
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
   861
            # and re-run as an on-disk merge.
37332
b48b7b130d08 rebase: use single transaction when running in memory
Martin von Zweigbergk <martinvonz@google.com>
parents: 37128
diff changeset
   862
            overrides = {('rebase', 'singletransaction'): True}
b48b7b130d08 rebase: use single transaction when running in memory
Martin von Zweigbergk <martinvonz@google.com>
parents: 37128
diff changeset
   863
            with ui.configoverride(overrides, 'rebase'):
39137
e9e742bd0501 rebase: use action variable to select things to do
Yuya Nishihara <yuya@tcha.org>
parents: 39136
diff changeset
   864
                return _dorebase(ui, repo, action, opts, inmemory=inmemory)
35329
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
   865
        except error.InMemoryMergeConflictsError:
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
   866
            ui.warn(_('hit merge conflicts; re-running rebase without in-memory'
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
   867
                      ' merge\n'))
39172
485a3349d5ee rebase: do not pass in user option to rollback in-memory merge conflict
Yuya Nishihara <yuya@tcha.org>
parents: 39170
diff changeset
   868
            _dorebase(ui, repo, action='abort', opts={})
39137
e9e742bd0501 rebase: use action variable to select things to do
Yuya Nishihara <yuya@tcha.org>
parents: 39136
diff changeset
   869
            return _dorebase(ui, repo, action, opts, inmemory=False)
35329
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
   870
    else:
39137
e9e742bd0501 rebase: use action variable to select things to do
Yuya Nishihara <yuya@tcha.org>
parents: 39136
diff changeset
   871
        return _dorebase(ui, repo, action, opts)
35329
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
   872
39137
e9e742bd0501 rebase: use action variable to select things to do
Yuya Nishihara <yuya@tcha.org>
parents: 39136
diff changeset
   873
def _dryrunrebase(ui, repo, action, opts):
38505
53800d6eed26 rebase: convert opts dict to bytes at once
Yuya Nishihara <yuya@tcha.org>
parents: 38504
diff changeset
   874
    rbsrt = rebaseruntime(repo, ui, inmemory=True, opts=opts)
38667
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
   875
    confirm = opts.get('confirm')
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
   876
    if confirm:
38675
35b3f686157a rebase: correct misleading message in --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38674
diff changeset
   877
        ui.status(_('starting in-memory rebase\n'))
38667
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
   878
    else:
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
   879
        ui.status(_('starting dry-run rebase; repository will not be '
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
   880
                    'changed\n'))
38500
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38499
diff changeset
   881
    with repo.wlock(), repo.lock():
38667
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
   882
        needsabort = True
38500
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38499
diff changeset
   883
        try:
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38499
diff changeset
   884
            overrides = {('rebase', 'singletransaction'): True}
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38499
diff changeset
   885
            with ui.configoverride(overrides, 'rebase'):
39137
e9e742bd0501 rebase: use action variable to select things to do
Yuya Nishihara <yuya@tcha.org>
parents: 39136
diff changeset
   886
                _origrebase(ui, repo, action, opts, rbsrt, inmemory=True,
38504
02004e5c6b56 rebase: isolate command options from internal flags
Yuya Nishihara <yuya@tcha.org>
parents: 38503
diff changeset
   887
                            leaveunfinished=True)
38500
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38499
diff changeset
   888
        except error.InMemoryMergeConflictsError:
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38499
diff changeset
   889
            ui.status(_('hit a merge conflict\n'))
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38499
diff changeset
   890
            return 1
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38499
diff changeset
   891
        else:
38667
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
   892
            if confirm:
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
   893
                ui.status(_('rebase completed successfully\n'))
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
   894
                if not ui.promptchoice(_(b'apply changes (yn)?'
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
   895
                                         b'$$ &Yes $$ &No')):
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
   896
                    # finish unfinished rebase
38856
2b728789edfd rebase: move "backup" flag to rebaseruntime
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38839
diff changeset
   897
                    rbsrt._finishrebase()
38667
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
   898
                else:
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
   899
                    rbsrt._prepareabortorcontinue(isabort=True, backup=False,
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
   900
                                                  suppwarns=True)
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
   901
                needsabort = False
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
   902
            else:
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
   903
                ui.status(_('dry-run rebase completed successfully; run without'
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
   904
                            ' -n/--dry-run to perform this rebase\n'))
38500
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38499
diff changeset
   905
            return 0
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38499
diff changeset
   906
        finally:
38667
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
   907
            if needsabort:
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
   908
                # no need to store backup in case of dryrun
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
   909
                rbsrt._prepareabortorcontinue(isabort=True, backup=False,
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
   910
                                              suppwarns=True)
38500
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38499
diff changeset
   911
39137
e9e742bd0501 rebase: use action variable to select things to do
Yuya Nishihara <yuya@tcha.org>
parents: 39136
diff changeset
   912
def _dorebase(ui, repo, action, opts, inmemory=False):
38505
53800d6eed26 rebase: convert opts dict to bytes at once
Yuya Nishihara <yuya@tcha.org>
parents: 38504
diff changeset
   913
    rbsrt = rebaseruntime(repo, ui, inmemory, opts)
39137
e9e742bd0501 rebase: use action variable to select things to do
Yuya Nishihara <yuya@tcha.org>
parents: 39136
diff changeset
   914
    return _origrebase(ui, repo, action, opts, rbsrt, inmemory=inmemory)
38501
9c3b48fb7ac5 rebase: split _origrebase() for conveniece in dryrun
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38500
diff changeset
   915
39137
e9e742bd0501 rebase: use action variable to select things to do
Yuya Nishihara <yuya@tcha.org>
parents: 39136
diff changeset
   916
def _origrebase(ui, repo, action, opts, rbsrt, inmemory=False,
e9e742bd0501 rebase: use action variable to select things to do
Yuya Nishihara <yuya@tcha.org>
parents: 39136
diff changeset
   917
                leaveunfinished=False):
e9e742bd0501 rebase: use action variable to select things to do
Yuya Nishihara <yuya@tcha.org>
parents: 39136
diff changeset
   918
    assert action != 'stop'
32935
070920db8b87 rebase: use context manager for locking in rebase()
Martin von Zweigbergk <martinvonz@google.com>
parents: 32918
diff changeset
   919
    with repo.wlock(), repo.lock():
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   920
        # Validate input and define rebasing points
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   921
        destf = opts.get('dest', None)
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   922
        srcf = opts.get('source', None)
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   923
        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
   924
        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
   925
        # 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
   926
        # 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
   927
        destspace = opts.get('_destspace')
22382
d5b04ee8ecf7 rebase: add a deprecated -i/--interactive flag
David Soria Parra <davidsp@fb.com>
parents: 22251
diff changeset
   928
        if opts.get('interactive'):
26496
b885ab9ca182 rebase: enable histedit for useful help with it
timeless@mozdev.org
parents: 26495
diff changeset
   929
            try:
b885ab9ca182 rebase: enable histedit for useful help with it
timeless@mozdev.org
parents: 26495
diff changeset
   930
                if extensions.find('histedit'):
b885ab9ca182 rebase: enable histedit for useful help with it
timeless@mozdev.org
parents: 26495
diff changeset
   931
                    enablehistedit = ''
b885ab9ca182 rebase: enable histedit for useful help with it
timeless@mozdev.org
parents: 26495
diff changeset
   932
            except KeyError:
b885ab9ca182 rebase: enable histedit for useful help with it
timeless@mozdev.org
parents: 26495
diff changeset
   933
                enablehistedit = " --config extensions.histedit="
b885ab9ca182 rebase: enable histedit for useful help with it
timeless@mozdev.org
parents: 26495
diff changeset
   934
            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
   935
            msg = _("interactive history editing is supported by the "
26494
832f40d2af53 rebase: factor out histedit help command
timeless@mozdev.org
parents: 26421
diff changeset
   936
                    "'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
   937
            raise error.Abort(msg)
22382
d5b04ee8ecf7 rebase: add a deprecated -i/--interactive flag
David Soria Parra <davidsp@fb.com>
parents: 22251
diff changeset
   938
29400
c79da70a4659 rebase: move collapse-related local variables to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29399
diff changeset
   939
        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
   940
            raise error.Abort(
13661
ee349e228835 rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents: 13609
diff changeset
   941
                _('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
   942
39137
e9e742bd0501 rebase: use action variable to select things to do
Yuya Nishihara <yuya@tcha.org>
parents: 39136
diff changeset
   943
        if action:
29400
c79da70a4659 rebase: move collapse-related local variables to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29399
diff changeset
   944
            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
   945
                raise error.Abort(
11285
f118029e534c rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents: 11205
diff changeset
   946
                    _('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
   947
            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
   948
                raise error.Abort(
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   949
                    _('abort and continue do not allow specifying revisions'))
39137
e9e742bd0501 rebase: use action variable to select things to do
Yuya Nishihara <yuya@tcha.org>
parents: 39136
diff changeset
   950
            if action == 'abort' 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
   951
                ui.warn(_('tool option will be ignored\n'))
39137
e9e742bd0501 rebase: use action variable to select things to do
Yuya Nishihara <yuya@tcha.org>
parents: 39136
diff changeset
   952
            if action == 'continue':
30287
86f4ef63d507 rebase: check for conflicts before continuing
timeless <timeless@mozdev.org>
parents: 30285
diff changeset
   953
                ms = mergemod.mergestate.read(repo)
30504
d528ddc11b33 rebase: refer to checkunresolved by its new name
Augie Fackler <augie@google.com>
parents: 30499
diff changeset
   954
                mergeutil.checkunresolved(ms)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   955
39137
e9e742bd0501 rebase: use action variable to select things to do
Yuya Nishihara <yuya@tcha.org>
parents: 39136
diff changeset
   956
            retcode = rbsrt._prepareabortorcontinue(isabort=(action == 'abort'))
29472
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
   957
            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
   958
                return retcode
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   959
        else:
37028
0782ac132a41 rebase: pass "inmemory" directly to _definedestmap()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37024
diff changeset
   960
            destmap = _definedestmap(ui, repo, inmemory, destf, srcf, basef,
0782ac132a41 rebase: pass "inmemory" directly to _definedestmap()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37024
diff changeset
   961
                                     revf, destspace=destspace)
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
   962
            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
   963
            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
   964
                return retcode
36783
6dab3bdb1f00 rebase: only store collapse message once
Martin von Zweigbergk <martinvonz@google.com>
parents: 36782
diff changeset
   965
            storecollapsemsg(repo, rbsrt.collapsemsg)
21027
25ee5dbebc6b rebase: tell when reopening a closed branch head
Mads Kiilerich <madski@unity3d.com>
parents: 20790
diff changeset
   966
33569
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
   967
        tr = None
33691
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
   968
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
   969
        singletr = ui.configbool('rebase', 'singletransaction')
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
   970
        if singletr:
33569
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
   971
            tr = repo.transaction('rebase')
35484
01b084914a60 rebase: don't take out a dirstate guard for in-memory rebase
Phil Cohen <phillco@fb.com>
parents: 35438
diff changeset
   972
01b084914a60 rebase: don't take out a dirstate guard for in-memory rebase
Phil Cohen <phillco@fb.com>
parents: 35438
diff changeset
   973
        # If `rebase.singletransaction` is enabled, wrap the entire operation in
01b084914a60 rebase: don't take out a dirstate guard for in-memory rebase
Phil Cohen <phillco@fb.com>
parents: 35438
diff changeset
   974
        # one transaction here. Otherwise, transactions are obtained when
01b084914a60 rebase: don't take out a dirstate guard for in-memory rebase
Phil Cohen <phillco@fb.com>
parents: 35438
diff changeset
   975
        # committing each node, which is slower but allows partial success.
33569
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
   976
        with util.acceptintervention(tr):
35484
01b084914a60 rebase: don't take out a dirstate guard for in-memory rebase
Phil Cohen <phillco@fb.com>
parents: 35438
diff changeset
   977
            # Same logic for the dirstate guard, except we don't create one when
01b084914a60 rebase: don't take out a dirstate guard for in-memory rebase
Phil Cohen <phillco@fb.com>
parents: 35438
diff changeset
   978
            # rebasing in-memory (it's not needed).
36781
1004fd71810f rebase: reduce scope of "dsguard" variables a bit
Martin von Zweigbergk <martinvonz@google.com>
parents: 36780
diff changeset
   979
            dsguard = None
35484
01b084914a60 rebase: don't take out a dirstate guard for in-memory rebase
Phil Cohen <phillco@fb.com>
parents: 35438
diff changeset
   980
            if singletr and not inmemory:
33691
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
   981
                dsguard = dirstateguard.dirstateguard(repo, 'rebase')
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
   982
            with util.acceptintervention(dsguard):
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
   983
                rbsrt._performrebase(tr)
38378
f4f1fb1cbfb4 rebase: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38251
diff changeset
   984
                if not leaveunfinished:
38856
2b728789edfd rebase: move "backup" flag to rebaseruntime
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38839
diff changeset
   985
                    rbsrt._finishrebase()
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   986
37028
0782ac132a41 rebase: pass "inmemory" directly to _definedestmap()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37024
diff changeset
   987
def _definedestmap(ui, repo, inmemory, destf=None, srcf=None, basef=None,
35396
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35393
diff changeset
   988
                   revf=None, destspace=None):
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
   989
    """use revisions argument to define destmap {srcrev: destrev}"""
31440
406705701c2d rebase: explicitly tests for None
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31404
diff changeset
   990
    if revf is None:
406705701c2d rebase: explicitly tests for None
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31404
diff changeset
   991
        revf = []
31404
361bccce566a rebase: don't use mutable default argument value
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31389
diff changeset
   992
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
   993
    # 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
   994
    # 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
   995
    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
   996
        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
   997
    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
   998
        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
   999
    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
  1000
        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
  1001
37028
0782ac132a41 rebase: pass "inmemory" directly to _definedestmap()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37024
diff changeset
  1002
    if not inmemory:
35300
aa660c1203a9 rebase: do not bail on uncomitted changes if rebasing in-memory
Phil Cohen <phillco@fb.com>
parents: 35299
diff changeset
  1003
        cmdutil.checkunfinished(repo)
aa660c1203a9 rebase: do not bail on uncomitted changes if rebasing in-memory
Phil Cohen <phillco@fb.com>
parents: 35299
diff changeset
  1004
        cmdutil.bailifchanged(repo)
28136
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
  1005
31736
b5afec71c1f9 rebase: allow destination-free continue and abort (issue5513)
Ryan McElroy <rmcelroy@fb.com>
parents: 31626
diff changeset
  1006
    if ui.configbool('commands', 'rebase.requiredest') and not destf:
b5afec71c1f9 rebase: allow destination-free continue and abort (issue5513)
Ryan McElroy <rmcelroy@fb.com>
parents: 31626
diff changeset
  1007
        raise error.Abort(_('you must specify a destination'),
b5afec71c1f9 rebase: allow destination-free continue and abort (issue5513)
Ryan McElroy <rmcelroy@fb.com>
parents: 31626
diff changeset
  1008
                          hint=_('use: hg rebase -d REV'))
b5afec71c1f9 rebase: allow destination-free continue and abort (issue5513)
Ryan McElroy <rmcelroy@fb.com>
parents: 31626
diff changeset
  1009
34023
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1010
    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
  1011
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
  1012
    if revf:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
  1013
        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
  1014
        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
  1015
            ui.status(_('empty "rev" revision set - nothing to rebase\n'))
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
  1016
            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
  1017
    elif srcf:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
  1018
        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
  1019
        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
  1020
            ui.status(_('empty "source" revision set - nothing to rebase\n'))
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
  1021
            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
  1022
        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
  1023
        assert rebaseset
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
  1024
    else:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
  1025
        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
  1026
        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
  1027
            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
  1028
                        "can't compute rebase set\n"))
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
  1029
            return None
34023
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1030
        if destf:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1031
            # --base does not support multiple destinations
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1032
            dest = scmutil.revsingle(repo, destf)
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1033
        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
  1034
            dest = repo[_destrebase(repo, base, destspace=destspace)]
36505
7b84b737352d py3: replace str() calls with their preferred bytes equivalent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36435
diff changeset
  1035
            destf = bytes(dest)
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
  1036
30585
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30504
diff changeset
  1037
        roots = [] # selected children of branching points
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30504
diff changeset
  1038
        bpbase = {} # {branchingpoint: [origbase]}
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30504
diff changeset
  1039
        for b in base: # group bases by branching points
36435
0b57596253b8 rebase: use ctx.rev() instead of %d % ctx
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36430
diff changeset
  1040
            bp = repo.revs('ancestor(%d, %d)', b, dest.rev()).first()
30585
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30504
diff changeset
  1041
            bpbase[bp] = bpbase.get(bp, []) + [b]
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30504
diff changeset
  1042
        if None in bpbase:
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30504
diff changeset
  1043
            # emulate the old behavior, showing "nothing to rebase" (a better
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30504
diff changeset
  1044
            # behavior may be abort with "cannot find branching point" error)
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30504
diff changeset
  1045
            bpbase.clear()
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30504
diff changeset
  1046
        for bp, bs in bpbase.iteritems(): # calculate roots
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30504
diff changeset
  1047
            roots += list(repo.revs('children(%d) & ancestors(%ld)', bp, bs))
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30504
diff changeset
  1048
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30504
diff changeset
  1049
        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
  1050
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
  1051
        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
  1052
            # 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
  1053
            # 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
  1054
            # smartset.
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
  1055
            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
  1056
                if basef:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
  1057
                    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
  1058
                                ' 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
  1059
                else:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
  1060
                    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
  1061
                                'parent is also destination\n'))
36435
0b57596253b8 rebase: use ctx.rev() instead of %d % ctx
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36430
diff changeset
  1062
            elif not repo.revs('%ld - ::%d', base, dest.rev()):
28136
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
  1063
                if basef:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
  1064
                    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
  1065
                                '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
  1066
                                '%s\n') %
36505
7b84b737352d py3: replace str() calls with their preferred bytes equivalent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36435
diff changeset
  1067
                              ('+'.join(bytes(repo[r]) for r in base),
28136
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
  1068
                               dest))
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
  1069
                else:
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
  1070
                    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
  1071
                                '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
  1072
                                '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
  1073
            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
  1074
                ui.status(_('nothing to rebase from %s to %s\n') %
36505
7b84b737352d py3: replace str() calls with their preferred bytes equivalent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36435
diff changeset
  1075
                          ('+'.join(bytes(repo[r]) for r in base), dest))
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
  1076
            return None
36981
795eb53f1d3e rebase: allow in-memory merge of the working copy parent
Martin von Zweigbergk <martinvonz@google.com>
parents: 36966
diff changeset
  1077
35341
03bec089e105 rebase: disable `inmemory` if the rebaseset contains the working copy
Phil Cohen <phillco@fb.com>
parents: 35329
diff changeset
  1078
    rebasingwcp = repo['.'].rev() in rebaseset
35491
bf556bd2f589 rebase: switch ui.log calls to common style
Phil Cohen <phillco@fb.com>
parents: 35484
diff changeset
  1079
    ui.log("rebase", "", rebase_rebasing_wcp=rebasingwcp)
37028
0782ac132a41 rebase: pass "inmemory" directly to _definedestmap()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37024
diff changeset
  1080
    if inmemory and rebasingwcp:
35341
03bec089e105 rebase: disable `inmemory` if the rebaseset contains the working copy
Phil Cohen <phillco@fb.com>
parents: 35329
diff changeset
  1081
        # Check these since we did not before.
03bec089e105 rebase: disable `inmemory` if the rebaseset contains the working copy
Phil Cohen <phillco@fb.com>
parents: 35329
diff changeset
  1082
        cmdutil.checkunfinished(repo)
03bec089e105 rebase: disable `inmemory` if the rebaseset contains the working copy
Phil Cohen <phillco@fb.com>
parents: 35329
diff changeset
  1083
        cmdutil.bailifchanged(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
  1084
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
  1085
    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
  1086
        dest = repo[_destrebase(repo, rebaseset, destspace=destspace)]
36505
7b84b737352d py3: replace str() calls with their preferred bytes equivalent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36435
diff changeset
  1087
        destf = bytes(dest)
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
  1088
34023
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1089
    allsrc = revsetlang.formatspec('%ld', rebaseset)
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1090
    alias = {'ALLSRC': allsrc}
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1091
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1092
    if dest is None:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1093
        try:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1094
            # fast path: try to resolve dest without SRC alias
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1095
            dest = scmutil.revsingle(repo, destf, localalias=alias)
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1096
        except error.RepoLookupError:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1097
            # multi-dest path: resolve dest for each SRC separately
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1098
            destmap = {}
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1099
            for r in rebaseset:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1100
                alias['SRC'] = revsetlang.formatspec('%d', r)
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1101
                # use repo.anyrevs instead of scmutil.revsingle because we
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1102
                # don't want to abort if destset is empty.
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1103
                destset = repo.anyrevs([destf], user=True, localalias=alias)
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1104
                size = len(destset)
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1105
                if size == 1:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1106
                    destmap[r] = destset.first()
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1107
                elif size == 0:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1108
                    ui.note(_('skipping %s - empty destination\n') % repo[r])
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1109
                else:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1110
                    raise error.Abort(_('rebase destination for %s is not '
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1111
                                        'unique') % repo[r])
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1112
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1113
    if dest is not None:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1114
        # single-dest case: assign dest to each rev in rebaseset
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1115
        destrev = dest.rev()
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1116
        destmap = {r: destrev for r in rebaseset} # {srcrev: destrev}
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1117
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1118
    if not destmap:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1119
        ui.status(_('nothing to rebase - empty destination\n'))
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1120
        return None
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
  1121
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
  1122
    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
  1123
32288
b47e6b0ba6ca rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents: 32224
diff changeset
  1124
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
  1125
    """Return the revision that should be used as the second parent
32288
b47e6b0ba6ca rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents: 32224
diff changeset
  1126
    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
  1127
    Abort if there is more than one parent.
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
  1128
    """
19955
2160c2e0d7d1 rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents: 19951
diff changeset
  1129
    parents = set()
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
  1130
    source = min(state)
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
  1131
    for rev in state:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
  1132
        if rev == source:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
  1133
            continue
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
  1134
        for p in repo[rev].parents():
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
  1135
            if (p.rev() not in state
32288
b47e6b0ba6ca rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents: 32224
diff changeset
  1136
                        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
  1137
                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
  1138
    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
  1139
        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
  1140
    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
  1141
        return parents.pop()
36508
a6e9a360ccd8 py3: use '%d' for integers instead of b'%s'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36505
diff changeset
  1142
    raise error.Abort(_('unable to collapse on top of %d, there is more '
19956
78ab0f85e249 rebase: improve error message for more than one external parent
Mads Kiilerich <madski@unity3d.com>
parents: 19955
diff changeset
  1143
                       'than one external parent: %s') %
32288
b47e6b0ba6ca rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents: 32224
diff changeset
  1144
                     (max(destancestors),
36505
7b84b737352d py3: replace str() calls with their preferred bytes equivalent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36435
diff changeset
  1145
                      ', '.join("%d" % p for p in sorted(parents))))
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
  1146
37046
a8d8cdafe29c rebase: rename conclude[memory]node() to commit[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37045
diff changeset
  1147
def commitmemorynode(repo, p1, p2, wctx, editor, extra, user, date, commitmsg):
37045
8ff5772711fa rebase: pass in "user" instead of "ctx" to conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37044
diff changeset
  1148
    '''Commit the memory changes with parents p1 and p2.
35328
228916ca12b5 rebase: add concludememorynode(), and call it when rebasing in-memory
Phil Cohen <phillco@fb.com>
parents: 35327
diff changeset
  1149
    Return node of committed revision.'''
37043
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
  1150
    # Replicates the empty check in ``repo.commit``.
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
  1151
    if wctx.isempty() and not repo.ui.configbool('ui', 'allowemptycommit'):
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
  1152
        return None
35328
228916ca12b5 rebase: add concludememorynode(), and call it when rebasing in-memory
Phil Cohen <phillco@fb.com>
parents: 35327
diff changeset
  1153
37043
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
  1154
    # By convention, ``extra['branch']`` (set by extrafn) clobbers
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
  1155
    # ``branch`` (used when passing ``--keepbranches``).
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
  1156
    branch = repo[p1].branch()
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
  1157
    if 'branch' in extra:
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
  1158
        branch = extra['branch']
35328
228916ca12b5 rebase: add concludememorynode(), and call it when rebasing in-memory
Phil Cohen <phillco@fb.com>
parents: 35327
diff changeset
  1159
37043
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
  1160
    memctx = wctx.tomemctx(commitmsg, parents=(p1, p2), date=date,
37045
8ff5772711fa rebase: pass in "user" instead of "ctx" to conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37044
diff changeset
  1161
        extra=extra, user=user, branch=branch, editor=editor)
37043
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
  1162
    commitres = repo.commitctx(memctx)
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
  1163
    wctx.clean() # Might be reused
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
  1164
    return commitres
35328
228916ca12b5 rebase: add concludememorynode(), and call it when rebasing in-memory
Phil Cohen <phillco@fb.com>
parents: 35327
diff changeset
  1165
37046
a8d8cdafe29c rebase: rename conclude[memory]node() to commit[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37045
diff changeset
  1166
def commitnode(repo, p1, p2, editor, extra, user, date, commitmsg):
37045
8ff5772711fa rebase: pass in "user" instead of "ctx" to conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37044
diff changeset
  1167
    '''Commit the wd changes with parents p1 and p2.
23459
2e047b1558a5 rebase: clarify naming of variables holding node hashes - don't call them rev
Mads Kiilerich <madski@unity3d.com>
parents: 23457
diff changeset
  1168
    Return node of committed revision.'''
33691
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
  1169
    dsguard = util.nullcontextmanager()
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
  1170
    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
  1171
        dsguard = dirstateguard.dirstateguard(repo, 'rebase')
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
  1172
    with dsguard:
32152
b63351f6a246 rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32084
diff changeset
  1173
        repo.setparents(repo[p1].node(), repo[p2].node())
22038
021becbf024a rebase: do not retract phase boundary by hand
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22004
diff changeset
  1174
37043
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37042
diff changeset
  1175
        # Commit might fail if unresolved files exist
37045
8ff5772711fa rebase: pass in "user" instead of "ctx" to conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37044
diff changeset
  1176
        newnode = repo.commit(text=commitmsg, user=user, date=date,
8ff5772711fa rebase: pass in "user" instead of "ctx" to conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37044
diff changeset
  1177
                              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
  1178
32152
b63351f6a246 rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32084
diff changeset
  1179
        repo.dirstate.setbranch(repo[newnode].branch())
b63351f6a246 rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32084
diff changeset
  1180
        return newnode
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1181
36780
0f3116c08e65 rebase: remove unused argument "state" from rebasenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36779
diff changeset
  1182
def rebasenode(repo, rev, p1, base, collapse, dest, wctx):
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
  1183
    '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
  1184
    # Merge phase
32288
b47e6b0ba6ca rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents: 32224
diff changeset
  1185
    # Update to destination and merge it with local
35326
5c25fe7fb1e6 rebase: do not update if IMM; instead, set the overlaywctx's parents
Phil Cohen <phillco@fb.com>
parents: 35325
diff changeset
  1186
    if wctx.isinmemory():
5c25fe7fb1e6 rebase: do not update if IMM; instead, set the overlaywctx's parents
Phil Cohen <phillco@fb.com>
parents: 35325
diff changeset
  1187
        wctx.setbase(repo[p1])
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1188
    else:
35326
5c25fe7fb1e6 rebase: do not update if IMM; instead, set the overlaywctx's parents
Phil Cohen <phillco@fb.com>
parents: 35325
diff changeset
  1189
        if repo['.'].rev() != p1:
5c25fe7fb1e6 rebase: do not update if IMM; instead, set the overlaywctx's parents
Phil Cohen <phillco@fb.com>
parents: 35325
diff changeset
  1190
            repo.ui.debug(" update to %d:%s\n" % (p1, repo[p1]))
40366
b14fdf1fb615 update: clarify update() call sites by specifying argument names
Martin von Zweigbergk <martinvonz@google.com>
parents: 40293
diff changeset
  1191
            mergemod.update(repo, p1, branchmerge=False, force=True)
35326
5c25fe7fb1e6 rebase: do not update if IMM; instead, set the overlaywctx's parents
Phil Cohen <phillco@fb.com>
parents: 35325
diff changeset
  1192
        else:
5c25fe7fb1e6 rebase: do not update if IMM; instead, set the overlaywctx's parents
Phil Cohen <phillco@fb.com>
parents: 35325
diff changeset
  1193
            repo.ui.debug(" already in destination\n")
35417
83014fa95435 rebase: fix for hgsubversion
Phil Cohen <phillco@fb.com>
parents: 35396
diff changeset
  1194
        # This is, alas, necessary to invalidate workingctx's manifest cache,
83014fa95435 rebase: fix for hgsubversion
Phil Cohen <phillco@fb.com>
parents: 35396
diff changeset
  1195
        # as well as other data we litter on it in other places.
83014fa95435 rebase: fix for hgsubversion
Phil Cohen <phillco@fb.com>
parents: 35396
diff changeset
  1196
        wctx = repo[None]
35326
5c25fe7fb1e6 rebase: do not update if IMM; instead, set the overlaywctx's parents
Phil Cohen <phillco@fb.com>
parents: 35325
diff changeset
  1197
        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
  1198
    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
  1199
    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
  1200
        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
  1201
    # 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
  1202
    # have to allow merging with it.
40366
b14fdf1fb615 update: clarify update() call sites by specifying argument names
Martin von Zweigbergk <martinvonz@google.com>
parents: 40293
diff changeset
  1203
    stats = mergemod.update(repo, rev, branchmerge=True, force=True,
b14fdf1fb615 update: clarify update() call sites by specifying argument names
Martin von Zweigbergk <martinvonz@google.com>
parents: 40293
diff changeset
  1204
                            ancestor=base, mergeancestor=collapse,
35327
2bac2d836ce0 rebase: pass the wctx object (IMM or on-disk) to merge.update
Phil Cohen <phillco@fb.com>
parents: 35326
diff changeset
  1205
                            labels=['dest', 'source'], wc=wctx)
22905
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
  1206
    if collapse:
34787
754b5117622f context: add workingfilectx.markcopied
Phil Cohen <phillco@fb.com>
parents: 34614
diff changeset
  1207
        copies.duplicatecopies(repo, wctx, rev, dest)
22905
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
  1208
    else:
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
  1209
        # 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
  1210
        # duplicate copies between the revision we're
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
  1211
        # rebasing and its first parent, but *not*
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
  1212
        # duplicate any copies that have already been
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
  1213
        # performed in the destination.
63e889cc610d rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents: 22901
diff changeset
  1214
        p1rev = repo[rev].p1().rev()
34787
754b5117622f context: add workingfilectx.markcopied
Phil Cohen <phillco@fb.com>
parents: 34614
diff changeset
  1215
        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
  1216
    return stats
6923
ebf1462f2145 strip trailing whitespace, replace tabs by spaces
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6906
diff changeset
  1217
34026
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34025
diff changeset
  1218
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
  1219
    """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
  1220
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1221
    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
  1222
    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
  1223
    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
  1224
34023
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1225
    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: 34022
diff changeset
  1226
    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
  1227
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1228
        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
  1229
        |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1230
        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
  1231
        |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1232
        | 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
  1233
        | |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1234
        | 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
  1235
        | |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1236
        | 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
  1237
        | |
34023
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1238
        | 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
  1239
        | |
34023
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1240
        | B <- rebased as B1     C'
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1241
        |/                       |
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
  1242
        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
  1243
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1244
    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
  1245
    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
  1246
    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
  1247
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1248
            H       C1 G1
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1249
           /|       | /
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1250
          F G       |/
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1251
        K | |  ->   K
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1252
        | C D       |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1253
        | |/        |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1254
        | B         | ...
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1255
        |/          |/
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1256
        A           A
34024
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1257
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1258
    Besides, adjust dest according to existing rebase information. For example,
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1259
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1260
      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: 34023
diff changeset
  1261
       \|/     of D. We will rebase C first.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1262
        A
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1263
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1264
          C'   After rebasing C, when considering B's destination, use C'
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1265
          |    instead of the original C.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1266
      B   D
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1267
       \ /
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1268
        A
33590
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1269
    """
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
  1270
    # 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: 34021
diff changeset
  1271
    dest = destmap[rev]
34026
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34025
diff changeset
  1272
    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: 34025
diff changeset
  1273
              if d > 0 and destmap[s] == dest and s not in skipped]
33870
3ae2eaecb49e rebase: optimize "source" calculation in adjustdest
Jun Wu <quark@fb.com>
parents: 33869
diff changeset
  1274
33590
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1275
    result = []
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1276
    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
  1277
        adjusted = dest
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1278
        if prev != nullrev:
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1279
            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
  1280
            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
  1281
                adjusted = state[candidate]
34024
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1282
        if adjusted == dest and dest in state:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1283
            adjusted = state[dest]
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1284
            if adjusted == revtodo:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1285
                # sortsource should produce an order that makes this impossible
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1286
                raise error.ProgrammingError(
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1287
                    '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
  1288
        result.append(adjusted)
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1289
    return result
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1290
33867
3b04a6ff625c rebase: remove rebaseset from _checkobsrebase
Jun Wu <quark@fb.com>
parents: 33866
diff changeset
  1291
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
  1292
    """
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1293
    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
  1294
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1295
    `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
  1296
    `rebaseobsskipped`: set of revisions from source skipped because they have
36034
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 36033
diff changeset
  1297
    successors in destination or no non-obsolete successor.
28685
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1298
    """
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1299
    # 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
  1300
    divergenceok = ui.configbool('experimental',
34872
29f52e7966dd config: gather allowdivergence under the evolution namespace
Boris Feld <boris.feld@octobus.net>
parents: 34831
diff changeset
  1301
                                 'evolution.allowdivergence')
28685
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1302
    divergencebasecandidates = rebaseobsrevs - rebaseobsskipped
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1303
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1304
    if divergencebasecandidates and not divergenceok:
36505
7b84b737352d py3: replace str() calls with their preferred bytes equivalent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36435
diff changeset
  1305
        divhashes = (bytes(repo[r])
28685
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1306
                     for r in divergencebasecandidates)
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1307
        msg = _("this rebase will cause "
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1308
                "divergences from: %s")
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1309
        h = _("to force the rebase please set "
34872
29f52e7966dd config: gather allowdivergence under the evolution namespace
Boris Feld <boris.feld@octobus.net>
parents: 34831
diff changeset
  1310
              "experimental.evolution.allowdivergence=True")
28685
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1311
        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
  1312
34110
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34109
diff changeset
  1313
def successorrevs(unfi, rev):
33807
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1314
    """yield revision numbers for successors of rev"""
34110
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34109
diff changeset
  1315
    assert unfi.filtername is None
33807
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1316
    nodemap = unfi.changelog.nodemap
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1317
    for s in obsutil.allsuccessors(unfi.obsstore, [unfi[rev].node()]):
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1318
        if s in nodemap:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1319
            yield nodemap[s]
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1320
34026
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34025
diff changeset
  1321
def defineparents(repo, rev, destmap, state, skipped, obsskipped):
33807
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1322
    """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: 33762
diff changeset
  1323
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1324
    The destination specified by "dest" cannot always be used directly because
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1325
    previously rebase result could affect destination. For example,
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1326
33807
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1327
          D E    rebase -r C+D+E -d B
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1328
          |/     C will be rebased to C'
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1329
        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: 33762
diff changeset
  1330
        |/       E's new destination will be C' instead of B
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1331
        A
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1332
33807
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1333
    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: 33762
diff changeset
  1334
    block below.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1335
    """
34107
8a8e7a94ba07 rebase: do not crash rebasing merge with a parent having hidden successor
Jun Wu <quark@fb.com>
parents: 34027
diff changeset
  1336
    # use unfiltered changelog since successorrevs may return filtered nodes
34110
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34109
diff changeset
  1337
    assert repo.filtername is None
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34109
diff changeset
  1338
    cl = repo.changelog
38666
a06b2b032557 revlog: introduce a isancestorrev() and use it in rebase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38547
diff changeset
  1339
    isancestor = cl.isancestorrev
33807
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1340
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
  1341
    dest = destmap[rev]
33807
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1342
    oldps = repo.changelog.parentrevs(rev) # old parents
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1343
    newps = [nullrev, nullrev] # new parents
34026
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34025
diff changeset
  1344
    dests = adjustdest(repo, rev, destmap, state, skipped)
33807
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1345
    bases = list(oldps) # merge base candidates, initially just old parents
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1346
33807
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1347
    if all(r == nullrev for r in oldps[1:]):
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1348
        # 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: 33762
diff changeset
  1349
        newps[0] = dests[0]
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1350
    else:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1351
        # 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: 33762
diff changeset
  1352
        # 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: 33762
diff changeset
  1353
        # 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: 33762
diff changeset
  1354
        # accepts one dest per src.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1355
        #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1356
        # Therefore, only move p with reasonable conditions (in this order):
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1357
        #   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: 33762
diff changeset
  1358
        #   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: 33762
diff changeset
  1359
        #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1360
        # Comparing with adjustdest, the logic here does some additional work:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1361
        #   1. decide which parents will not be moved towards dest
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1362
        #   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: 33762
diff changeset
  1363
        #      because it was rebased?
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1364
        #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1365
        # For example:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1366
        #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1367
        #     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: 33762
diff changeset
  1368
        #    /|    # 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: 33762
diff changeset
  1369
        #   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: 33762
diff changeset
  1370
        #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1371
        # 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: 33762
diff changeset
  1372
        # at most 2 parents.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1373
        for i, p in enumerate(oldps):
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1374
            np = p # new parent
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1375
            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: 33762
diff changeset
  1376
                np = dests[i]
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1377
            elif p in state and state[p] > 0:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1378
                np = state[p]
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
  1379
33807
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1380
            # "bases" only record "special" merge bases that cannot be
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1381
            # calculated from changelog DAG (i.e. isancestor(p, np) is False).
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1382
            # For example:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1383
            #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1384
            #   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: 33762
diff changeset
  1385
            #   | 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: 33762
diff changeset
  1386
            #   D |  # changelog.ancestor(C, B') == A. If changelog DAG and
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1387
            #   | 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: 33762
diff changeset
  1388
            #   |/   # 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: 33762
diff changeset
  1389
            #   A    # the merged graph.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1390
            #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1391
            # 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: 33762
diff changeset
  1392
            # which uses "virtual null merge" to explain this situation.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1393
            if isancestor(p, np):
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1394
                bases[i] = nullrev
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1395
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1396
            # 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: 33762
diff changeset
  1397
            for j, x in enumerate(newps[:i]):
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1398
                if x == nullrev:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1399
                    continue
33882
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33870
diff changeset
  1400
                if isancestor(np, x): # CASE-1
33807
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1401
                    np = nullrev
33882
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33870
diff changeset
  1402
                elif isancestor(x, np): # CASE-2
33807
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1403
                    newps[j] = np
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1404
                    np = nullrev
33882
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33870
diff changeset
  1405
                    # New parents forming an ancestor relationship does not
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33870
diff changeset
  1406
                    # mean the old parents have a similar relationship. Do not
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33870
diff changeset
  1407
                    # set bases[x] to nullrev.
33807
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1408
                    bases[j], bases[i] = bases[i], bases[j]
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1409
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1410
            newps[i] = np
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1411
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1412
        # "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: 33762
diff changeset
  1413
        # 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: 33762
diff changeset
  1414
        # suboptimal. Therefore swap parents to make the merge sane.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1415
        if newps[1] != nullrev and oldps[0] == newps[0]:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1416
            assert len(newps) == 2 and len(oldps) == 2
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1417
            newps.reverse()
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1418
            bases.reverse()
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1419
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1420
        # 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: 33762
diff changeset
  1421
        # descendent of requested dest. This can happen, for example:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1422
        #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1423
        #     C    # rebase -r C -d D
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1424
        #    /|    # 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: 33762
diff changeset
  1425
        #   A B D
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1426
        if set(newps) == set(oldps) and dest not in newps:
33810
19f495fef0a3 rebase: change "result would have 3 parent" error message (BC)
Jun Wu <quark@fb.com>
parents: 33807
diff changeset
  1427
            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: 33807
diff changeset
  1428
                                'moving at least one of its parents')
19f495fef0a3 rebase: change "result would have 3 parent" error message (BC)
Jun Wu <quark@fb.com>
parents: 33807
diff changeset
  1429
                              % (rev, repo[rev]))
33807
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1430
34024
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1431
    # Source should not be ancestor of dest. The check here guarantees it's
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1432
    # impossible. With multi-dest, the initial check does not cover complex
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1433
    # cases since we don't have abstractions to dry-run rebase cheaply.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1434
    if any(p != nullrev and isancestor(rev, p) for p in newps):
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1435
        raise error.Abort(_('source is ancestor of destination'))
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1436
33807
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1437
    # "rebasenode" updates to new p1, use the corresponding merge base.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1438
    if bases[0] != nullrev:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1439
        base = bases[0]
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1440
    else:
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
  1441
        base = None
33807
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1442
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1443
    # 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: 33762
diff changeset
  1444
    # there are multiple special (non-changelog ancestor) merge bases, which
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1445
    # 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: 33762
diff changeset
  1446
    #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1447
    #     F
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1448
    #    /|
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1449
    #   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: 33762
diff changeset
  1450
    #   | |  # as merge base, the difference between D and F will include
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1451
    #   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: 33762
diff changeset
  1452
    #   |/   #  chosen, the rebased F will contain B.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1453
    #   A Z
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1454
    #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1455
    # 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: 33762
diff changeset
  1456
    # better than the default (ancestor(F, Z) == null). Therefore still
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1457
    # pick one (so choose p1 above).
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1458
    if sum(1 for b in bases if b != nullrev) > 1:
33882
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33870
diff changeset
  1459
        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: 33870
diff changeset
  1460
        for i, base in enumerate(bases):
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33870
diff changeset
  1461
            if base == nullrev:
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33870
diff changeset
  1462
                continue
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33870
diff changeset
  1463
            # 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: 33870
diff changeset
  1464
            # might contain "surprising" contents
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33870
diff changeset
  1465
            siderevs = list(repo.revs('((%ld-%d) %% (%d+%d))',
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33870
diff changeset
  1466
                                      bases, base, base, dest))
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
  1467
33882
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33870
diff changeset
  1468
            # 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: 33870
diff changeset
  1469
            # 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: 33870
diff changeset
  1470
            if siderevs:
34026
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34025
diff changeset
  1471
                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: 34025
diff changeset
  1472
                             if d > 0 and r not in obsskipped]
33882
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33870
diff changeset
  1473
                merges = [r for r in rebaseset
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33870
diff changeset
  1474
                          if cl.parentrevs(r)[1] != nullrev]
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33870
diff changeset
  1475
                unwanted[i] = list(repo.revs('%ld - (::%ld) - %ld',
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33870
diff changeset
  1476
                                             siderevs, merges, rebaseset))
33807
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1477
33882
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33870
diff changeset
  1478
        # 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: 33870
diff changeset
  1479
        l, i = min((len(revs), i)
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33870
diff changeset
  1480
                   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: 33870
diff changeset
  1481
        base = bases[i]
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33870
diff changeset
  1482
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33870
diff changeset
  1483
        # 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: 33870
diff changeset
  1484
        # 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: 33870
diff changeset
  1485
        # 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: 33870
diff changeset
  1486
        # (see CASE-1 and CASE-2 above)
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33870
diff changeset
  1487
        if i != 0 and newps[i] != nullrev:
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33870
diff changeset
  1488
            newps[0], newps[i] = newps[i], newps[0]
33807
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1489
33882
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33870
diff changeset
  1490
        # 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: 33870
diff changeset
  1491
        # 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: 33870
diff changeset
  1492
        if l > 0:
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33870
diff changeset
  1493
            unwanteddesc = _(' or ').join(
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33870
diff changeset
  1494
                (', '.join('%d:%s' % (r, repo[r]) for r in revs)
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33870
diff changeset
  1495
                 for revs in unwanted if revs is not None))
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33870
diff changeset
  1496
            raise error.Abort(
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33870
diff changeset
  1497
                _('rebasing %d:%s will include unwanted changes from %s')
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33870
diff changeset
  1498
                % (rev, repo[rev], unwanteddesc))
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33870
diff changeset
  1499
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33870
diff changeset
  1500
    repo.ui.debug(" future parents are %d and %d\n" % tuple(newps))
33807
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1501
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33762
diff changeset
  1502
    return newps[0], newps[1], base
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1503
7955
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
  1504
def isagitpatch(repo, patchname):
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
  1505
    '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
  1506
    mqpatch = os.path.join(repo.mq.path, patchname)
36424
4bc983568016 py3: replace file() with open()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36332
diff changeset
  1507
    for line in patch.linereader(open(mqpatch, 'rb')):
7955
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
  1508
        if line.startswith('diff --git'):
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
  1509
            return True
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
  1510
    return False
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
  1511
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1512
def updatemq(repo, state, skipped, **opts):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1513
    'Update rebased mq patches - finalize and then import them'
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1514
    mqrebase = {}
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
  1515
    mq = repo.mq
14572
8ff2957c1d82 mq: rename full_series to fullseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14509
diff changeset
  1516
    original_series = mq.fullseries[:]
16531
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
  1517
    skippedpatches = set()
14497
ea585f2b1adc rebase: restore mq guards after rebasing (issue2107)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 13894
diff changeset
  1518
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
  1519
    for p in mq.applied:
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
  1520
        rev = repo[p.node].rev()
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
  1521
        if rev in state:
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9301
diff changeset
  1522
            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
  1523
                                        (rev, p.name))
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
  1524
            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
  1525
        else:
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
  1526
            # 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
  1527
            skippedpatches.add(p.name)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1528
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1529
    if mqrebase:
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
  1530
        mq.finish(repo, mqrebase.keys())
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1531
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1532
        # 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
  1533
        for rev in sorted(mqrebase, reverse=True):
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1534
            if rev not in skipped:
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
  1535
                name, isgit = mqrebase[rev]
36505
7b84b737352d py3: replace str() calls with their preferred bytes equivalent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36435
diff changeset
  1536
                repo.ui.note(_('updating mq patch %s to %d:%s\n') %
23520
de143427c499 rebase: show a note for updated mq patches
Mads Kiilerich <mads@kiilerich.com>
parents: 23519
diff changeset
  1537
                             (name, state[rev], repo[state[rev]]))
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
  1538
                mq.qimport(repo, (), patchname=name, git=isgit,
36505
7b84b737352d py3: replace str() calls with their preferred bytes equivalent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36435
diff changeset
  1539
                                rev=["%d" % state[rev]])
16531
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
  1540
            else:
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
  1541
                # Rebased and skipped
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
  1542
                skippedpatches.add(mqrebase[rev][0])
14497
ea585f2b1adc rebase: restore mq guards after rebasing (issue2107)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 13894
diff changeset
  1543
16531
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
  1544
        # 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
  1545
        # 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
  1546
        # 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
  1547
        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
  1548
                     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
  1549
        mq.fullseries[:] = newseries
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
  1550
        mq.seriesdirty = True
14580
92101ea35015 mq: rename save_dirty to savedirty
Adrian Buehlmann <adrian@cadifra.com>
parents: 14572
diff changeset
  1551
        mq.savedirty()
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1552
28185
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1553
def storecollapsemsg(repo, collapsemsg):
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1554
    'Store the collapse message to allow recovery'
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1555
    collapsemsg = collapsemsg or ''
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1556
    f = repo.vfs("last-message.txt", "w")
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1557
    f.write("%s\n" % collapsemsg)
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1558
    f.close()
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1559
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1560
def clearcollapsemsg(repo):
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1561
    'Remove collapse message file'
31320
f59b6cf663a9 vfs: use repo.vfs.unlinkpath
Mads Kiilerich <mads@kiilerich.com>
parents: 31311
diff changeset
  1562
    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
  1563
31235
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31234
diff changeset
  1564
def restorecollapsemsg(repo, isabort):
28185
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1565
    'Restore previously stored collapse message'
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1566
    try:
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1567
        f = repo.vfs("last-message.txt")
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1568
        collapsemsg = f.readline().strip()
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1569
        f.close()
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1570
    except IOError as err:
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1571
        if err.errno != errno.ENOENT:
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1572
            raise
31235
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31234
diff changeset
  1573
        if isabort:
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31234
diff changeset
  1574
            # Oh well, just abort like normal
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31234
diff changeset
  1575
            collapsemsg = ''
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31234
diff changeset
  1576
        else:
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31234
diff changeset
  1577
            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
  1578
    return collapsemsg
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1579
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1580
def clearstatus(repo):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1581
    'Remove the status files'
33068
2312e70cf78b rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents: 32936
diff changeset
  1582
    # 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: 32936
diff changeset
  1583
    tr = repo.currenttransaction()
2312e70cf78b rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents: 32936
diff changeset
  1584
    if tr:
2312e70cf78b rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents: 32936
diff changeset
  1585
        tr.removefilegenerator('rebasestate')
31320
f59b6cf663a9 vfs: use repo.vfs.unlinkpath
Mads Kiilerich <mads@kiilerich.com>
parents: 31311
diff changeset
  1586
    repo.vfs.unlinkpath("rebasestate", ignoremissing=True)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1587
25070
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
  1588
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
  1589
    '''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
  1590
    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
  1591
    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
  1592
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
  1593
    # 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
  1594
    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
  1595
        return False
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
  1596
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
  1597
    # 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
  1598
    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
  1599
                          if new == nullrev])
bd98d073a34f rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24870
diff changeset
  1600
    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
  1601
        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
  1602
fe78eb7bcca0 rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents: 19496
diff changeset
  1603
    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
  1604
38503
999e5c218daf rebase: suppress warning thrown when aborting rebase in case of dryrun
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38502
diff changeset
  1605
def abort(repo, originalwd, destmap, state, activebookmark=None, backup=True,
999e5c218daf rebase: suppress warning thrown when aborting rebase in case of dryrun
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38502
diff changeset
  1606
          suppwarns=False):
24758
d7451adc72f6 rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents: 23970
diff changeset
  1607
    '''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
  1608
d7451adc72f6 rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents: 23970
diff changeset
  1609
    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
  1610
        restore'''
26677
e9b3d523f2e6 rebase: properly abort when destination is public (issue4896)
Christian Delahousse <cdelahousse@fb.com>
parents: 26675
diff changeset
  1611
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
  1612
    try:
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
  1613
        # If the first commits in the rebased set get skipped during the rebase,
32288
b47e6b0ba6ca rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents: 32224
diff changeset
  1614
        # their values within the state mapping will be the dest rev id. The
35856
a046d6890761 rebase: avoid defining two lists with the same contents
Martin von Zweigbergk <martinvonz@google.com>
parents: 35701
diff changeset
  1615
        # rebased list must must not contain the dest rev (issue4896)
35857
177f3b90335f rebase: on abort, don't strip commits that didn't need rebased (issue5822)
Martin von Zweigbergk <martinvonz@google.com>
parents: 35856
diff changeset
  1616
        rebased = [s for r, s in state.items()
177f3b90335f rebase: on abort, don't strip commits that didn't need rebased (issue5822)
Martin von Zweigbergk <martinvonz@google.com>
parents: 35856
diff changeset
  1617
                   if s >= 0 and s != r and s != destmap[r]]
35856
a046d6890761 rebase: avoid defining two lists with the same contents
Martin von Zweigbergk <martinvonz@google.com>
parents: 35701
diff changeset
  1618
        immutable = [d for d in rebased if not repo[d].mutable()]
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
  1619
        cleanup = True
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
  1620
        if immutable:
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
  1621
            repo.ui.warn(_("warning: can't clean up public changesets %s\n")
36505
7b84b737352d py3: replace str() calls with their preferred bytes equivalent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36435
diff changeset
  1622
                        % ', '.join(bytes(repo[r]) for r in immutable),
29970
11604da46982 rebase: use single quotes in use warning
timeless <timeless@mozdev.org>
parents: 29940
diff changeset
  1623
                        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
  1624
            cleanup = False
16280
0806823370d8 rebase: properly calculate descendant set when aborting (issue3332)
Matt Mackall <mpm@selenic.com>
parents: 16228
diff changeset
  1625
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
  1626
        descendants = set()
35856
a046d6890761 rebase: avoid defining two lists with the same contents
Martin von Zweigbergk <martinvonz@google.com>
parents: 35701
diff changeset
  1627
        if rebased:
a046d6890761 rebase: avoid defining two lists with the same contents
Martin von Zweigbergk <martinvonz@google.com>
parents: 35701
diff changeset
  1628
            descendants = set(repo.changelog.descendants(rebased))
a046d6890761 rebase: avoid defining two lists with the same contents
Martin von Zweigbergk <martinvonz@google.com>
parents: 35701
diff changeset
  1629
        if descendants - set(rebased):
32289
27e67cfea27f rebase: rename "target" to "destination" in messages
Martin von Zweigbergk <martinvonz@google.com>
parents: 32288
diff changeset
  1630
            repo.ui.warn(_("warning: new changesets detected on destination "
27e67cfea27f rebase: rename "target" to "destination" in messages
Martin von Zweigbergk <martinvonz@google.com>
parents: 32288
diff changeset
  1631
                           "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
  1632
            cleanup = False
19518
12843143663d rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents: 19517
diff changeset
  1633
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
  1634
        if cleanup:
27988
61f4d59e9a0b rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents: 27977
diff changeset
  1635
            shouldupdate = False
61f4d59e9a0b rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents: 27977
diff changeset
  1636
            if rebased:
61f4d59e9a0b rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents: 27977
diff changeset
  1637
                strippoints = [
61f4d59e9a0b rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents: 27977
diff changeset
  1638
                        c.node() for c in repo.set('roots(%ld)', rebased)]
31232
56d3e0b499df rebase: clear updatestate during rebase --abort in more cases
Durham Goode <durham@fb.com>
parents: 31043
diff changeset
  1639
56d3e0b499df rebase: clear updatestate during rebase --abort in more cases
Durham Goode <durham@fb.com>
parents: 31043
diff changeset
  1640
            updateifonnodes = set(rebased)
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
  1641
            updateifonnodes.update(destmap.values())
31232
56d3e0b499df rebase: clear updatestate during rebase --abort in more cases
Durham Goode <durham@fb.com>
parents: 31043
diff changeset
  1642
            updateifonnodes.add(originalwd)
56d3e0b499df rebase: clear updatestate during rebase --abort in more cases
Durham Goode <durham@fb.com>
parents: 31043
diff changeset
  1643
            shouldupdate = repo['.'].rev() in updateifonnodes
27988
61f4d59e9a0b rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents: 27977
diff changeset
  1644
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
  1645
            # Update away from the rebase if necessary
27988
61f4d59e9a0b rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents: 27977
diff changeset
  1646
            if shouldupdate or needupdate(repo, state):
40366
b14fdf1fb615 update: clarify update() call sites by specifying argument names
Martin von Zweigbergk <martinvonz@google.com>
parents: 40293
diff changeset
  1647
                mergemod.update(repo, originalwd, branchmerge=False, force=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
  1648
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
  1649
            # 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
  1650
            if rebased:
38502
c892a30bafb9 rebase: no need to store backup in case of dryrun
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38501
diff changeset
  1651
                repair.strip(repo.ui, repo, strippoints, backup=backup)
19518
12843143663d rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents: 19517
diff changeset
  1652
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
  1653
        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
  1654
            bookmarks.activate(repo, activebookmark)
24758
d7451adc72f6 rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents: 23970
diff changeset
  1655
26744
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
  1656
    finally:
21e50e36de02 rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents: 26719
diff changeset
  1657
        clearstatus(repo)
28185
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1658
        clearcollapsemsg(repo)
38503
999e5c218daf rebase: suppress warning thrown when aborting rebase in case of dryrun
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38502
diff changeset
  1659
        if not suppwarns:
999e5c218daf rebase: suppress warning thrown when aborting rebase in case of dryrun
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38502
diff changeset
  1660
            repo.ui.warn(_('rebase aborted\n'))
19518
12843143663d rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents: 19517
diff changeset
  1661
    return 0
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1662
34024
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1663
def sortsource(destmap):
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1664
    """yield source revisions in an order that we only rebase things once
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1665
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1666
    If source and destination overlaps, we should filter out revisions
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1667
    depending on other revisions which hasn't been rebased yet.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1668
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1669
    Yield a sorted list of revisions each time.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1670
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1671
    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: 34023
diff changeset
  1672
    [A], indicating B needs to be rebased first.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1673
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1674
    Raise if there is a cycle so the rebase is impossible.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1675
    """
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1676
    srcset = set(destmap)
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1677
    while srcset:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1678
        srclist = sorted(srcset)
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1679
        result = []
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1680
        for r in srclist:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1681
            if destmap[r] not in srcset:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1682
                result.append(r)
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1683
        if not result:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1684
            raise error.Abort(_('source and destination form a cycle'))
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1685
        srcset -= set(result)
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1686
        yield result
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1687
34026
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34025
diff changeset
  1688
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
  1689
    '''Define which revisions are going to be rebased and where
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1690
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
  1691
    repo: repo
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
  1692
    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
  1693
    '''
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
  1694
    rebaseset = destmap.keys()
31306
f5c71e98f0f7 rebase: unhide original working directory node as well (issue5219)
Martin von Zweigbergk <martinvonz@google.com>
parents: 31305
diff changeset
  1695
    originalwd = repo['.'].rev()
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1696
10672
c2e1e637d4da rebase: always check if rebasing onto an applied mq patch.
Greg Ward <greg-hg@gerg.ca>
parents: 10659
diff changeset
  1697
    # 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
  1698
    # 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
  1699
    # a partially completed rebase is blocked by mq.
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
  1700
    if 'qtip' in repo.tags():
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
  1701
        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: 34021
diff changeset
  1702
        if set(destmap.values()) & mqapplied:
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
  1703
            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
  1704
34024
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1705
    # Get "cycle" error early by exhausting the generator.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1706
    sortedsrc = list(sortsource(destmap)) # a list of sorted revs
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1707
    if not sortedsrc:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1708
        raise error.Abort(_('no matching revisions'))
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1709
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1710
    # Only check the first batch of revisions to rebase not depending on other
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1711
    # rebaseset. This means "source is ancestor of destination" for the second
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1712
    # (and following) batches of revisions are not checked here. We rely on
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1713
    # "defineparents" to do that check.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1714
    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
  1715
    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
  1716
        raise error.Abort(_('no matching revisions'))
36304
53be14874ee8 rebase: sort roots by revision
Augie Fackler <augie@google.com>
parents: 36223
diff changeset
  1717
    def revof(r):
53be14874ee8 rebase: sort roots by revision
Augie Fackler <augie@google.com>
parents: 36223
diff changeset
  1718
        return r.rev()
53be14874ee8 rebase: sort roots by revision
Augie Fackler <augie@google.com>
parents: 36223
diff changeset
  1719
    roots = sorted(roots, key=revof)
32224
456b4a32d75f rebase: don't update state dict same way for each root
Martin von Zweigbergk <martinvonz@google.com>
parents: 32084
diff changeset
  1720
    state = dict.fromkeys(rebaseset, revtodo)
34024
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34023
diff changeset
  1721
    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
  1722
    for root in roots:
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
  1723
        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
  1724
        commonbase = root.ancestor(dest)
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  1725
        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
  1726
            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
  1727
        if commonbase == dest:
31389
65d93d712777 rebase: allow rebasing children of wd to wd if a new branch has been set (BC)
Mads Kiilerich <mads@kiilerich.com>
parents: 31320
diff changeset
  1728
            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: 31320
diff changeset
  1729
            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: 31320
diff changeset
  1730
                # 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: 31320
diff changeset
  1731
                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: 31320
diff changeset
  1732
            else:
65d93d712777 rebase: allow rebasing children of wd to wd if a new branch has been set (BC)
Mads Kiilerich <mads@kiilerich.com>
parents: 31320
diff changeset
  1733
                samebranch = root.branch() == dest.branch()
32918
07d5a503124c rebase: rewrite "x in y.children()" as "y in x.parents()"
Martin von Zweigbergk <martinvonz@google.com>
parents: 32620
diff changeset
  1734
            if not collapse and samebranch and dest in root.parents():
32312
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32289
diff changeset
  1735
                # 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: 32289
diff changeset
  1736
                # 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: 32289
diff changeset
  1737
                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
  1738
                repo.ui.debug('source is a child of destination\n')
32312
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32289
diff changeset
  1739
                continue
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1740
32312
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32289
diff changeset
  1741
        emptyrebase = False
29940
3e7ded768556 rebase: make debug logging more consistent
Martin von Zweigbergk <martinvonz@google.com>
parents: 29876
diff changeset
  1742
        repo.ui.debug('rebase onto %s starting from %s\n' % (dest, root))
32312
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32289
diff changeset
  1743
    if emptyrebase:
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32289
diff changeset
  1744
        return None
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32289
diff changeset
  1745
    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: 32289
diff changeset
  1746
        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: 32289
diff changeset
  1747
        # 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: 32289
diff changeset
  1748
        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: 32289
diff changeset
  1749
            state[rev] = rev
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
  1750
    return originalwd, destmap, state
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1751
34368
f61f5af5ed31 merge with stable
Martin von Zweigbergk <martinvonz@google.com>
parents: 34297 33686
diff changeset
  1752
def clearrebased(ui, repo, destmap, state, skipped, collapsedas=None,
38839
2002c193f2bc rebase: support "history-editing-backup" config option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38681
diff changeset
  1753
                 keepf=False, fm=None, backup=True):
17613
aafc521668d8 rebase: properly handle --collapse when creating obsolescence marker
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17612
diff changeset
  1754
    """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
  1755
aafc521668d8 rebase: properly handle --collapse when creating obsolescence marker
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17612
diff changeset
  1756
    If `collapsedas` is not None, the rebase was a collapse whose result if the
33686
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33620
diff changeset
  1757
    `collapsedas` node.
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33620
diff changeset
  1758
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33620
diff changeset
  1759
    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: 33620
diff changeset
  1760
    removed (but bookmarks still need to be moved).
38839
2002c193f2bc rebase: support "history-editing-backup" config option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38681
diff changeset
  1761
2002c193f2bc rebase: support "history-editing-backup" config option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38681
diff changeset
  1762
    If `backup` is False, no backup will be stored when stripping rebased
2002c193f2bc rebase: support "history-editing-backup" config option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38681
diff changeset
  1763
    revisions.
33686
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33620
diff changeset
  1764
    """
33332
3b7cb3d17137 rebase: use scmutil.cleanupnodes (issue5606) (BC)
Jun Wu <quark@fb.com>
parents: 33163
diff changeset
  1765
    tonode = repo.changelog.node
33686
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33620
diff changeset
  1766
    replacements = {}
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33620
diff changeset
  1767
    moves = {}
39920
7198cdbbbde1 rebase: don't try to prune obsolete changeset already in the destination
Boris Feld <boris.feld@octobus.net>
parents: 39355
diff changeset
  1768
    stripcleanup = not obsolete.isenabled(repo, obsolete.createmarkersopt)
39924
0428feb1f0d7 rebase: explicitly track collapses as fold
Boris Feld <boris.feld@octobus.net>
parents: 39923
diff changeset
  1769
0428feb1f0d7 rebase: explicitly track collapses as fold
Boris Feld <boris.feld@octobus.net>
parents: 39923
diff changeset
  1770
    collapsednodes = []
33333
8bfd10e4c55a rebase: remove "if True"
Jun Wu <quark@fb.com>
parents: 33332
diff changeset
  1771
    for rev, newrev in sorted(state.items()):
8bfd10e4c55a rebase: remove "if True"
Jun Wu <quark@fb.com>
parents: 33332
diff changeset
  1772
        if newrev >= 0 and newrev != rev:
33686
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33620
diff changeset
  1773
            oldnode = tonode(rev)
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33620
diff changeset
  1774
            newnode = collapsedas or tonode(newrev)
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33620
diff changeset
  1775
            moves[oldnode] = newnode
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33620
diff changeset
  1776
            if not keepf:
39920
7198cdbbbde1 rebase: don't try to prune obsolete changeset already in the destination
Boris Feld <boris.feld@octobus.net>
parents: 39355
diff changeset
  1777
                succs = None
33686
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33620
diff changeset
  1778
                if rev in skipped:
39920
7198cdbbbde1 rebase: don't try to prune obsolete changeset already in the destination
Boris Feld <boris.feld@octobus.net>
parents: 39355
diff changeset
  1779
                    if stripcleanup or not repo[rev].obsolete():
7198cdbbbde1 rebase: don't try to prune obsolete changeset already in the destination
Boris Feld <boris.feld@octobus.net>
parents: 39355
diff changeset
  1780
                        succs = ()
39924
0428feb1f0d7 rebase: explicitly track collapses as fold
Boris Feld <boris.feld@octobus.net>
parents: 39923
diff changeset
  1781
                elif collapsedas:
0428feb1f0d7 rebase: explicitly track collapses as fold
Boris Feld <boris.feld@octobus.net>
parents: 39923
diff changeset
  1782
                    collapsednodes.append(oldnode)
33686
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33620
diff changeset
  1783
                else:
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33620
diff changeset
  1784
                    succs = (newnode,)
39920
7198cdbbbde1 rebase: don't try to prune obsolete changeset already in the destination
Boris Feld <boris.feld@octobus.net>
parents: 39355
diff changeset
  1785
                if succs is not None:
39923
a8318c9cb2ad rebase: use tuple as `replacement` keys
Boris Feld <boris.feld@octobus.net>
parents: 39922
diff changeset
  1786
                    replacements[(oldnode,)] = succs
39924
0428feb1f0d7 rebase: explicitly track collapses as fold
Boris Feld <boris.feld@octobus.net>
parents: 39923
diff changeset
  1787
    if collapsednodes:
0428feb1f0d7 rebase: explicitly track collapses as fold
Boris Feld <boris.feld@octobus.net>
parents: 39923
diff changeset
  1788
        replacements[tuple(collapsednodes)] = (collapsedas,)
38839
2002c193f2bc rebase: support "history-editing-backup" config option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38681
diff changeset
  1789
    scmutil.cleanupnodes(repo, replacements, 'rebase', moves, backup=backup)
34883
c858afe9c59b rebase: add support to output nodechanges
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34872
diff changeset
  1790
    if fm:
35146
f56a30b844aa rebase: use fm.formatlist() and fm.formatdict() to support user template
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35081
diff changeset
  1791
        hf = fm.hexfunc
f56a30b844aa rebase: use fm.formatlist() and fm.formatdict() to support user template
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35081
diff changeset
  1792
        fl = fm.formatlist
f56a30b844aa rebase: use fm.formatlist() and fm.formatdict() to support user template
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35081
diff changeset
  1793
        fd = fm.formatdict
39922
a8ccd9523d40 rebase: expand a long "one-liner"
Boris Feld <boris.feld@octobus.net>
parents: 39920
diff changeset
  1794
        changes = {}
39923
a8318c9cb2ad rebase: use tuple as `replacement` keys
Boris Feld <boris.feld@octobus.net>
parents: 39922
diff changeset
  1795
        for oldns, newn in replacements.iteritems():
a8318c9cb2ad rebase: use tuple as `replacement` keys
Boris Feld <boris.feld@octobus.net>
parents: 39922
diff changeset
  1796
            for oldn in oldns:
a8318c9cb2ad rebase: use tuple as `replacement` keys
Boris Feld <boris.feld@octobus.net>
parents: 39922
diff changeset
  1797
                changes[hf(oldn)] = fl([hf(n) for n in newn], name='node')
39922
a8ccd9523d40 rebase: expand a long "one-liner"
Boris Feld <boris.feld@octobus.net>
parents: 39920
diff changeset
  1798
        nodechanges = fd(changes, key="oldnode", value="newnodes")
34883
c858afe9c59b rebase: add support to output nodechanges
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34872
diff changeset
  1799
        fm.data(nodechanges=nodechanges)
17611
910123eac887 rebase: extract final changesets cleanup logic in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17325
diff changeset
  1800
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
  1801
def pullrebase(orig, ui, repo, *args, **opts):
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1802
    '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
  1803
    ret = None
35043
1a07f9187831 py3: handle keyword arguments in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35019
diff changeset
  1804
    if opts.get(r'rebase'):
31738
ae6bab095c66 rebase: abort hg pull --rebase if rebase.requiredest is set (issue5514)
Ryan McElroy <rmcelroy@fb.com>
parents: 31736
diff changeset
  1805
        if ui.configbool('commands', 'rebase.requiredest'):
ae6bab095c66 rebase: abort hg pull --rebase if rebase.requiredest is set (issue5514)
Ryan McElroy <rmcelroy@fb.com>
parents: 31736
diff changeset
  1806
            msg = _('rebase destination required by configuration')
ae6bab095c66 rebase: abort hg pull --rebase if rebase.requiredest is set (issue5514)
Ryan McElroy <rmcelroy@fb.com>
parents: 31736
diff changeset
  1807
            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: 31736
diff changeset
  1808
            raise error.Abort(msg, hint=hint)
ae6bab095c66 rebase: abort hg pull --rebase if rebase.requiredest is set (issue5514)
Ryan McElroy <rmcelroy@fb.com>
parents: 31736
diff changeset
  1809
32936
04c9dd951a41 rebase: use context manager for locking in pullrebase()
Martin von Zweigbergk <martinvonz@google.com>
parents: 32935
diff changeset
  1810
        with repo.wlock(), repo.lock():
35043
1a07f9187831 py3: handle keyword arguments in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35019
diff changeset
  1811
            if opts.get(r'update'):
1a07f9187831 py3: handle keyword arguments in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35019
diff changeset
  1812
                del opts[r'update']
26029
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1813
                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
  1814
                         'the update flag\n')
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1815
30725
c2bd2f77965b rebase: fail-fast the pull if working dir is not clean (BC)
Valters Vingolds <valters@vingolds.ch>
parents: 30709
diff changeset
  1816
            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
  1817
            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
  1818
                '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
  1819
26029
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1820
            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
  1821
            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
  1822
            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
  1823
                pass
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1824
            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
  1825
            try:
26960
6979fe2a6d75 rebase: add returning value from pullrebase function
liscju <piotr.listkiewicz@gmail.com>
parents: 26811
diff changeset
  1826
                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
  1827
            finally:
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1828
                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
  1829
            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
  1830
            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
  1831
                # --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
  1832
                # dropping it
35043
1a07f9187831 py3: handle keyword arguments in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35019
diff changeset
  1833
                if r'rev' in opts:
1a07f9187831 py3: handle keyword arguments in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35019
diff changeset
  1834
                    del opts[r'rev']
26029
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  1835
                # 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
  1836
                # --source.
35043
1a07f9187831 py3: handle keyword arguments in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35019
diff changeset
  1837
                if r'source' in opts:
1a07f9187831 py3: handle keyword arguments in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35019
diff changeset
  1838
                    del opts[r'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
  1839
                # 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
  1840
                destspace = list(repo.changelog.revs(start=revsprepull))
35043
1a07f9187831 py3: handle keyword arguments in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35019
diff changeset
  1841
                opts[r'_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
  1842
                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
  1843
                    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
  1844
                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
  1845
                    # 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
  1846
                    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
  1847
                    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
  1848
                        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
  1849
                    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
  1850
                        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
  1851
                        # 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
  1852
                        # with warning and trumpets
0e3835c7e1cf rebase: perform update through the 'update' command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28117
diff changeset
  1853
                        commands.update(ui, repo)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1854
    else:
35043
1a07f9187831 py3: handle keyword arguments in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35019
diff changeset
  1855
        if opts.get(r'tool'):
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26496
diff changeset
  1856
            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
  1857
        ret = orig(ui, repo, *args, **opts)
6979fe2a6d75 rebase: add returning value from pullrebase function
liscju <piotr.listkiewicz@gmail.com>
parents: 26811
diff changeset
  1858
6979fe2a6d75 rebase: add returning value from pullrebase function
liscju <piotr.listkiewicz@gmail.com>
parents: 26811
diff changeset
  1859
    return ret
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1860
27790
2d294dada4f8 rebase: small refactoring to allow better extensibility from extensions
Laurent Charignon <lcharignon@fb.com>
parents: 27746
diff changeset
  1861
def _filterobsoleterevs(repo, revs):
2d294dada4f8 rebase: small refactoring to allow better extensibility from extensions
Laurent Charignon <lcharignon@fb.com>
parents: 27746
diff changeset
  1862
    """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
  1863
    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
  1864
34022
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34021
diff changeset
  1865
def _computeobsoletenotrebased(repo, rebaseobsrevs, destmap):
35081
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35043
diff changeset
  1866
    """Return (obsoletenotrebased, obsoletewithoutsuccessorindestination).
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35043
diff changeset
  1867
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35043
diff changeset
  1868
    `obsoletenotrebased` is a mapping mapping obsolete => successor for all
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35043
diff changeset
  1869
    obsolete nodes to be rebased given in `rebaseobsrevs`.
27012
5eac7ab59b95 rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents: 27010
diff changeset
  1870
35081
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35043
diff changeset
  1871
    `obsoletewithoutsuccessorindestination` is a set with obsolete revisions
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35043
diff changeset
  1872
    without a successor in destination.
36034
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 36033
diff changeset
  1873
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 36033
diff changeset
  1874
    `obsoleteextinctsuccessors` is a set of obsolete revisions with only
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 36033
diff changeset
  1875
    obsolete successors.
35081
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35043
diff changeset
  1876
    """
26349
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
  1877
    obsoletenotrebased = {}
35081
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35043
diff changeset
  1878
    obsoletewithoutsuccessorindestination = set([])
36034
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 36033
diff changeset
  1879
    obsoleteextinctsuccessors = set([])
26349
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
  1880
34110
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34109
diff changeset
  1881
    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
  1882
    cl = repo.changelog
34021
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33883
diff changeset
  1883
    nodemap = cl.nodemap
38673
20a30bb8f276 rebase: use revnums (not nodes) for set of extinct revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 38672
diff changeset
  1884
    extinctrevs = set(repo.revs('extinct()'))
34021
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33883
diff changeset
  1885
    for srcrev in rebaseobsrevs:
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33883
diff changeset
  1886
        srcnode = cl.node(srcrev)
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33883
diff changeset
  1887
        # XXX: more advanced APIs are required to handle split correctly
36036
24f05489377b rebase: make "successors" a set in _computeobsoletenotrebased()
Denis Laxalde <denis@laxalde.org>
parents: 36034
diff changeset
  1888
        successors = set(obsutil.allsuccessors(repo.obsstore, [srcnode]))
36033
ae0d25071fca rebase: eliminate node from successors early in _computeobsoletenotrebased()
Denis Laxalde <denis@laxalde.org>
parents: 35957
diff changeset
  1889
        # obsutil.allsuccessors includes node itself
ae0d25071fca rebase: eliminate node from successors early in _computeobsoletenotrebased()
Denis Laxalde <denis@laxalde.org>
parents: 35957
diff changeset
  1890
        successors.remove(srcnode)
38673
20a30bb8f276 rebase: use revnums (not nodes) for set of extinct revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 38672
diff changeset
  1891
        succrevs = {nodemap[s] for s in successors if s in nodemap}
20a30bb8f276 rebase: use revnums (not nodes) for set of extinct revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 38672
diff changeset
  1892
        if succrevs.issubset(extinctrevs):
36034
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 36033
diff changeset
  1893
            # all successors are extinct
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 36033
diff changeset
  1894
            obsoleteextinctsuccessors.add(srcrev)
36033
ae0d25071fca rebase: eliminate node from successors early in _computeobsoletenotrebased()
Denis Laxalde <denis@laxalde.org>
parents: 35957
diff changeset
  1895
        if not successors:
ae0d25071fca rebase: eliminate node from successors early in _computeobsoletenotrebased()
Denis Laxalde <denis@laxalde.org>
parents: 35957
diff changeset
  1896
            # no successor
34021
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33883
diff changeset
  1897
            obsoletenotrebased[srcrev] = None
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33883
diff changeset
  1898
        else:
38672
0f8599afb92f rebase: avoid converting from nodes to revnums twice
Martin von Zweigbergk <martinvonz@google.com>
parents: 38671
diff changeset
  1899
            dstrev = destmap[srcrev]
0f8599afb92f rebase: avoid converting from nodes to revnums twice
Martin von Zweigbergk <martinvonz@google.com>
parents: 38671
diff changeset
  1900
            for succrev in succrevs:
0f8599afb92f rebase: avoid converting from nodes to revnums twice
Martin von Zweigbergk <martinvonz@google.com>
parents: 38671
diff changeset
  1901
                if cl.isancestorrev(succrev, dstrev):
0f8599afb92f rebase: avoid converting from nodes to revnums twice
Martin von Zweigbergk <martinvonz@google.com>
parents: 38671
diff changeset
  1902
                    obsoletenotrebased[srcrev] = succrev
34021
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33883
diff changeset
  1903
                    break
35081
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35043
diff changeset
  1904
            else:
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35043
diff changeset
  1905
                # If 'srcrev' has a successor in rebase set but none in
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35043
diff changeset
  1906
                # destination (which would be catched above), we shall skip it
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35043
diff changeset
  1907
                # and its descendants to avoid divergence.
39355
94a4980695f8 rebase: skip extinct revisions even if it has no successor in rebase set
Martin von Zweigbergk <martinvonz@google.com>
parents: 39172
diff changeset
  1908
                if srcrev in extinctrevs or any(s in destmap for s in succrevs):
35081
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35043
diff changeset
  1909
                    obsoletewithoutsuccessorindestination.add(srcrev)
27012
5eac7ab59b95 rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents: 27010
diff changeset
  1910
36034
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 36033
diff changeset
  1911
    return (
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 36033
diff changeset
  1912
        obsoletenotrebased,
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 36033
diff changeset
  1913
        obsoletewithoutsuccessorindestination,
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 36033
diff changeset
  1914
        obsoleteextinctsuccessors,
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 36033
diff changeset
  1915
    )
26349
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
  1916
19214
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
  1917
def summaryhook(ui, repo):
30709
a932297febb7 rebase: use repo.vfs.exists in 'hg summary' hook
Valters Vingolds <valters@vingolds.ch>
parents: 30677
diff changeset
  1918
    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
  1919
        return
19849
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
  1920
    try:
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
  1921
        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
  1922
        rbsrt.restorestatus()
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
  1923
        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
  1924
    except error.RepoLookupError:
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
  1925
        # 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
  1926
        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
  1927
        ui.write(msg)
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
  1928
        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
  1929
    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
  1930
    # i18n: column positioning for "hg summary"
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
  1931
    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
  1932
             (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
  1933
              ui.label(_('%d remaining'), 'rebase.remaining') %
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
  1934
              (len(state) - numrebased)))
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
  1935
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1936
def uisetup(ui):
23970
8a544fb645bb rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23917
diff changeset
  1937
    #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
  1938
    entry = extensions.wrapcommand(commands.table, 'pull', pullrebase)
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
  1939
    entry[1].append(('', 'rebase', None,
14444
1f997134a9d1 rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents: 14306
diff changeset
  1940
                     _("rebase working directory to branch head")))
1f997134a9d1 rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents: 14306
diff changeset
  1941
    entry[1].append(('t', 'tool', '',
1f997134a9d1 rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents: 14306
diff changeset
  1942
                     _("specify merge tool for rebase")))
19214
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
  1943
    cmdutil.summaryhooks.add('rebase', summaryhook)
19478
e5a5790a3185 rebase: add checkunfinished support (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19477
diff changeset
  1944
    cmdutil.unfinishedstates.append(
19496
607191a45f8c checkunfinished: accommodate histedit quirk
Matt Mackall <mpm@selenic.com>
parents: 19478
diff changeset
  1945
        ['rebasestate', False, False, _('rebase in progress'),
19478
e5a5790a3185 rebase: add checkunfinished support (issue3955)
Matt Mackall <mpm@selenic.com>
parents: 19477
diff changeset
  1946
         _("use 'hg rebase --continue' or 'hg rebase --abort'")])
27626
157675d0f600 rebase: hook afterresolvedstates
timeless <timeless@mozdev.org>
parents: 27586
diff changeset
  1947
    cmdutil.afterresolvedstates.append(
157675d0f600 rebase: hook afterresolvedstates
timeless <timeless@mozdev.org>
parents: 27586
diff changeset
  1948
        ['rebasestate', _('hg rebase --continue')])