hgext/rebase.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Thu, 02 Mar 2023 04:11:29 +0100
changeset 50386 db6d210e9618
parent 50259 a44e489940e0
child 50340 9f33d12f6f48
child 50406 2cd959fe631a
permissions -rw-r--r--
dirstate: remove _actual_file_name methode This is dead-code
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
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    18
import os
29205
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 29128
diff changeset
    19
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 29128
diff changeset
    20
from mercurial.i18n import _
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 29128
diff changeset
    21
from mercurial.node import (
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 29128
diff changeset
    22
    nullrev,
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 29128
diff changeset
    23
    short,
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46030
diff changeset
    24
    wdirrev,
29205
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 29128
diff changeset
    25
)
43085
eef9a2d67051 py3: manually import pycompat.open into files that need it
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43077
diff changeset
    26
from mercurial.pycompat import open
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,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    33
    error,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    34
    extensions,
48116
5ced12cfa41b errors: raise InputError on bad revset to revrange() iff provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 47793
diff changeset
    35
    logcmdutil,
30271
0fa1a41d04e4 rebase: rename merge to mergemod
timeless <timeless@mozdev.org>
parents: 30007
diff changeset
    36
    merge as mergemod,
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44666
diff changeset
    37
    mergestate as mergestatemod,
30495
d528ddc11b33 rebase: refer to checkunresolved by its new name
Augie Fackler <augie@google.com>
parents: 30490
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,
33145
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33139
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,
35002
1a07f9187831 py3: handle keyword arguments in hgext/rebase.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34963
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,
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
    47
    revsetlang,
43934
71fee4564410 rebase: use rewriteutil.precheck() instead of reimplementing it
Martin von Zweigbergk <martinvonz@google.com>
parents: 43932
diff changeset
    48
    rewriteutil,
29128
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    49
    scmutil,
31023
aea06029919e revset: import set classes directly from smartset module
Yuya Nishihara <yuya@tcha.org>
parents: 30865
diff changeset
    50
    smartset,
38516
7c853edcf4ed rebase: add a stateobj variable to rebaseruntime class
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38515
diff changeset
    51
    state as statemod,
29128
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    52
    util,
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    53
)
e521cb13d354 py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29063
diff changeset
    54
26669
07db7e95c464 rebase: added comments
Christian Delahousse <cdelahousse@fb.com>
parents: 26587
diff changeset
    55
# 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
    56
# their values must be maintained.
07db7e95c464 rebase: added comments
Christian Delahousse <cdelahousse@fb.com>
parents: 26587
diff changeset
    57
07db7e95c464 rebase: added comments
Christian Delahousse <cdelahousse@fb.com>
parents: 26587
diff changeset
    58
# 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
    59
revtodo = -1
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    60
revtodostr = b'-1'
33843
d8d0ef5f5975 rebase: remove revprecursor and revpruned states (BC)
Jun Wu <quark@fb.com>
parents: 33842
diff changeset
    61
d8d0ef5f5975 rebase: remove revprecursor and revpruned states (BC)
Jun Wu <quark@fb.com>
parents: 33842
diff changeset
    62
# legacy revstates no longer needed in current code
33845
3ddbab49efcf rebase: remove revignored and nullmerge states
Jun Wu <quark@fb.com>
parents: 33844
diff changeset
    63
# -2: nullmerge, -3: revignored, -4: revprecursor, -5: revpruned
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    64
legacystates = {b'-2', b'-3', b'-4', b'-5'}
10352
66d954e76ffb rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10351
diff changeset
    65
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
    66
cmdtable = {}
32337
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32327
diff changeset
    67
command = registrar.command(cmdtable)
46362
24a32dea6955 rebase: add a config knob for forcing in-memory rebasing
Augie Fackler <augie@google.com>
parents: 46180
diff changeset
    68
24a32dea6955 rebase: add a config knob for forcing in-memory rebasing
Augie Fackler <augie@google.com>
parents: 46180
diff changeset
    69
configtable = {}
24a32dea6955 rebase: add a config knob for forcing in-memory rebasing
Augie Fackler <augie@google.com>
parents: 46180
diff changeset
    70
configitem = registrar.configitem(configtable)
24a32dea6955 rebase: add a config knob for forcing in-memory rebasing
Augie Fackler <augie@google.com>
parents: 46180
diff changeset
    71
configitem(
24a32dea6955 rebase: add a config knob for forcing in-memory rebasing
Augie Fackler <augie@google.com>
parents: 46180
diff changeset
    72
    b'devel',
24a32dea6955 rebase: add a config knob for forcing in-memory rebasing
Augie Fackler <augie@google.com>
parents: 46180
diff changeset
    73
    b'rebase.force-in-memory-merge',
24a32dea6955 rebase: add a config knob for forcing in-memory rebasing
Augie Fackler <augie@google.com>
parents: 46180
diff changeset
    74
    default=False,
24a32dea6955 rebase: add a config knob for forcing in-memory rebasing
Augie Fackler <augie@google.com>
parents: 46180
diff changeset
    75
)
29841
d5883fd055c6 extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents: 29610
diff changeset
    76
# 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
    77
# 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
    78
# 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
    79
# leave the attribute unspecified.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    80
testedwith = b'ships-with-hg-core'
14306
db2a8eabe952 rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents: 14289
diff changeset
    81
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
    82
26671
66dc39cd7d06 rebase: factor out nothing to rebase return code
Ryan McElroy <rmcelroy@fb.com>
parents: 26669
diff changeset
    83
def _nothingtorebase():
66dc39cd7d06 rebase: factor out nothing to rebase return code
Ryan McElroy <rmcelroy@fb.com>
parents: 26669
diff changeset
    84
    return 1
66dc39cd7d06 rebase: factor out nothing to rebase return code
Ryan McElroy <rmcelroy@fb.com>
parents: 26669
diff changeset
    85
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
    86
27976
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
    87
def _savegraft(ctx, extra):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    88
    s = ctx.extra().get(b'source', None)
27976
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
    89
    if s is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    90
        extra[b'source'] = s
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    91
    s = ctx.extra().get(b'intermediate-source', None)
27976
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
    92
    if s is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    93
        extra[b'intermediate-source'] = s
27976
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
    94
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
    95
27976
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
    96
def _savebranch(ctx, extra):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    97
    extra[b'branch'] = ctx.branch()
27976
8f4d3eeb5198 rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents: 27975
diff changeset
    98
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
    99
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
   100
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
   101
    """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
   102
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
   103
    Please wrap destutil.destmerge instead."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   104
    return destutil.destmerge(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   105
        repo,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   106
        action=b'rebase',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   107
        sourceset=sourceset,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   108
        onheadcheck=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   109
        destspace=destspace,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   110
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   111
26717
1755e1d9d1c3 rebase: extra default destination in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26677
diff changeset
   112
28394
dcb4209bd30d revset: replace extpredicate by revsetpredicate of registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28280
diff changeset
   113
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
   114
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   115
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   116
@revsetpredicate(b'_destrebase')
26719
8bed1eae99df rebase: rename and test '_destrebase'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26718
diff changeset
   117
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
   118
    # ``_rebasedefaultdest()``
3f8c5c284c86 rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26165
diff changeset
   119
3f8c5c284c86 rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26165
diff changeset
   120
    # default destination for rebase.
3f8c5c284c86 rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26165
diff changeset
   121
    # # 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
   122
    # # 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
   123
    # 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
   124
    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
   125
    if x is not None:
31023
aea06029919e revset: import set classes directly from smartset module
Yuya Nishihara <yuya@tcha.org>
parents: 30865
diff changeset
   126
        sourceset = revset.getset(repo, smartset.fullreposet(repo), x)
aea06029919e revset: import set classes directly from smartset module
Yuya Nishihara <yuya@tcha.org>
parents: 30865
diff changeset
   127
    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
   128
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   129
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   130
@revsetpredicate(b'_destautoorphanrebase')
37787
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
   131
def _revsetdestautoorphanrebase(repo, subset, x):
42299
80a213f9ed87 rebase: hide help for revisions.Predicates._destautoorphanrebase
timeless <timeless@mozdev.org>
parents: 42108
diff changeset
   132
    # ``_destautoorphanrebase()``
80a213f9ed87 rebase: hide help for revisions.Predicates._destautoorphanrebase
timeless <timeless@mozdev.org>
parents: 42108
diff changeset
   133
80a213f9ed87 rebase: hide help for revisions.Predicates._destautoorphanrebase
timeless <timeless@mozdev.org>
parents: 42108
diff changeset
   134
    # automatic rebase destination for a single orphan revision.
37787
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
   135
    unfi = repo.unfiltered()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   136
    obsoleted = unfi.revs(b'obsolete()')
37787
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
   137
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
   138
    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
   139
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
   140
    # 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
   141
    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
   142
        return smartset.baseset()
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
   143
    dests = destutil.orphanpossibledestination(repo, src)
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
   144
    if len(dests) > 1:
46632
9989a276712f errors: use more specific errors in rebase extension
Martin von Zweigbergk <martinvonz@google.com>
parents: 46362
diff changeset
   145
        raise error.StateError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   146
            _(b"ambiguous automatic rebase: %r could end up on any of %r")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   147
            % (src, dests)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   148
        )
37787
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
   149
    # 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
   150
    return smartset.baseset(dests)
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
   151
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   152
33841
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33789
diff changeset
   153
def _ctxdesc(ctx):
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33789
diff changeset
   154
    """short description for a context"""
45770
96fcc37a9c80 rebase: make summary template configurable, with default to shared template
Martin von Zweigbergk <martinvonz@google.com>
parents: 45769
diff changeset
   155
    return cmdutil.format_changeset_summary(
45771
f90a5c211251 rebase: change and standarize template for rebase's one-line summary
Martin von Zweigbergk <martinvonz@google.com>
parents: 45770
diff changeset
   156
        ctx.repo().ui, ctx, command=b'rebase'
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   157
    )
33841
35fc5e919675 rebase: extract ctx description logic to a function
Jun Wu <quark@fb.com>
parents: 33789
diff changeset
   158
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   159
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48935
diff changeset
   160
class rebaseruntime:
29358
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
   161
    """This class is a container for rebase runtime state"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   162
45548
25e365d5aa8f rebase: add dryrun property to rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 45547
diff changeset
   163
    def __init__(self, repo, ui, inmemory=False, dryrun=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
   164
        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
   165
            opts = {}
adb0d58b8b0b rebase: pass repo, ui and opts objects to the RR class constructor
Kostia Balytskyi <ikostia@fb.com>
parents: 29372
diff changeset
   166
34094
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   167
        # prepared: whether we have rebasestate prepared or not. Currently it
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   168
        # decides whether "self.repo" is unfiltered or not.
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   169
        # The rebasestate has explicit hash to hash instructions not depending
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   170
        # on visibility. If rebasestate exists (in-memory or on-disk), use
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   171
        # unfiltered repo to avoid visibility issues.
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   172
        # Before knowing rebasestate (i.e. when starting a new rebase (not
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   173
        # --continue or --abort)), the original repo should be used so
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   174
        # visibility-dependent revsets are correct.
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   175
        self.prepared = False
44346
b42ce825308e rebase: stop relying on having two parents to resume rebase
Martin von Zweigbergk <martinvonz@google.com>
parents: 44341
diff changeset
   176
        self.resume = False
34094
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   177
        self._repo = repo
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   178
29399
adb0d58b8b0b rebase: pass repo, ui and opts objects to the RR class constructor
Kostia Balytskyi <ikostia@fb.com>
parents: 29372
diff changeset
   179
        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
   180
        self.opts = opts
29358
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
   181
        self.originalwd = None
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
   182
        self.external = nullrev
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
   183
        # 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
   184
        # 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
   185
        # 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
   186
        self.state = {}
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
   187
        self.activebookmark = None
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   188
        self.destmap = {}
29360
4cbe62ab5c97 rebase: move local variable 'skipped' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29359
diff changeset
   189
        self.skipped = set()
29358
6e83f5bbed8d rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents: 29205
diff changeset
   190
47460
c9cedb546262 rebase: use str-keyed opts in remaining places
Martin von Zweigbergk <martinvonz@google.com>
parents: 47459
diff changeset
   191
        self.collapsef = opts.get('collapse', False)
c9cedb546262 rebase: use str-keyed opts in remaining places
Martin von Zweigbergk <martinvonz@google.com>
parents: 47459
diff changeset
   192
        self.collapsemsg = cmdutil.logmessage(ui, pycompat.byteskwargs(opts))
c9cedb546262 rebase: use str-keyed opts in remaining places
Martin von Zweigbergk <martinvonz@google.com>
parents: 47459
diff changeset
   193
        self.date = opts.get('date', None)
29401
87acd047711e rebase: move local variables 'date' and 'extrafns' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29400
diff changeset
   194
47460
c9cedb546262 rebase: use str-keyed opts in remaining places
Martin von Zweigbergk <martinvonz@google.com>
parents: 47459
diff changeset
   195
        e = opts.get('extrafn')  # internal, used by e.g. hgsubversion
29401
87acd047711e rebase: move local variables 'date' and 'extrafns' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29400
diff changeset
   196
        self.extrafns = [_savegraft]
87acd047711e rebase: move local variables 'date' and 'extrafns' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29400
diff changeset
   197
        if e:
87acd047711e rebase: move local variables 'date' and 'extrafns' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29400
diff changeset
   198
            self.extrafns = [e]
29400
c79da70a4659 rebase: move collapse-related local variables to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29399
diff changeset
   199
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   200
        self.backupf = ui.configbool(b'rewrite', b'backup-bundle')
47460
c9cedb546262 rebase: use str-keyed opts in remaining places
Martin von Zweigbergk <martinvonz@google.com>
parents: 47459
diff changeset
   201
        self.keepf = opts.get('keep', False)
c9cedb546262 rebase: use str-keyed opts in remaining places
Martin von Zweigbergk <martinvonz@google.com>
parents: 47459
diff changeset
   202
        self.keepbranchesf = opts.get('keepbranches', False)
45123
1efbfa9b36a7 rebase: consider rewrite.empty-successor configuration
Manuel Jacob <me@manueljacob.de>
parents: 45090
diff changeset
   203
        self.skipemptysuccessorf = rewriteutil.skip_empty_successor(
1efbfa9b36a7 rebase: consider rewrite.empty-successor configuration
Manuel Jacob <me@manueljacob.de>
parents: 45090
diff changeset
   204
            repo.ui, b'rebase'
1efbfa9b36a7 rebase: consider rewrite.empty-successor configuration
Manuel Jacob <me@manueljacob.de>
parents: 45090
diff changeset
   205
        )
46833
47c251a14525 rebase: clarify names of variables and function related to obsolete revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 46832
diff changeset
   206
        self.obsolete_with_successor_in_destination = {}
47c251a14525 rebase: clarify names of variables and function related to obsolete revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 46832
diff changeset
   207
        self.obsolete_with_successor_in_rebase_set = set()
35388
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
   208
        self.inmemory = inmemory
45548
25e365d5aa8f rebase: add dryrun property to rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 45547
diff changeset
   209
        self.dryrun = dryrun
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   210
        self.stateobj = statemod.cmdstate(repo, b'rebasestate')
29402
7481ffb7ff83 rebase: move local variables related to keeping things unchanged to the RR
Kostia Balytskyi <ikostia@fb.com>
parents: 29401
diff changeset
   211
34094
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   212
    @property
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   213
    def repo(self):
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   214
        if self.prepared:
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   215
            return self._repo.unfiltered()
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   216
        else:
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   217
            return self._repo
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   218
31224
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31223
diff changeset
   219
    def storestatus(self, tr=None):
31223
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
   220
        """Store the current status to allow recovery"""
31224
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31223
diff changeset
   221
        if tr:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   222
            tr.addfilegenerator(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   223
                b'rebasestate',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   224
                (b'rebasestate',),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   225
                self._writestatus,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   226
                location=b'plain',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   227
            )
31224
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31223
diff changeset
   228
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   229
            with self.repo.vfs(b"rebasestate", b"w") as f:
31224
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31223
diff changeset
   230
                self._writestatus(f)
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31223
diff changeset
   231
183eb1d7f87d rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents: 31223
diff changeset
   232
    def _writestatus(self, f):
34095
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34094
diff changeset
   233
        repo = self.repo
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34094
diff changeset
   234
        assert repo.filtername is None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   235
        f.write(repo[self.originalwd].hex() + b'\n')
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   236
        # was "dest". we now write dest per src root below.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   237
        f.write(b'\n')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   238
        f.write(repo[self.external].hex() + b'\n')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   239
        f.write(b'%d\n' % int(self.collapsef))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   240
        f.write(b'%d\n' % int(self.keepf))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   241
        f.write(b'%d\n' % int(self.keepbranchesf))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   242
        f.write(b'%s\n' % (self.activebookmark or b''))
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   243
        destmap = self.destmap
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   244
        for d, v in self.state.items():
31223
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
   245
            oldrev = repo[d].hex()
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
   246
            if v >= 0:
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
   247
                newrev = repo[v].hex()
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
   248
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   249
                newrev = b"%d" % v
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   250
            destnode = repo[destmap[d]].hex()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   251
            f.write(b"%s:%s:%s\n" % (oldrev, newrev, destnode))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   252
        repo.ui.debug(b'rebase status stored\n')
31223
685b8d077577 rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents: 31222
diff changeset
   253
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   254
    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
   255
        """Restore a previously stored status"""
38518
cf24f678adda rebase: check whether the rebasestate exists or not a bit early
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38517
diff changeset
   256
        if not self.stateobj.exists():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   257
            cmdutil.wrongtooltocontinue(self.repo, _(b'rebase'))
38518
cf24f678adda rebase: check whether the rebasestate exists or not a bit early
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38517
diff changeset
   258
38515
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38508
diff changeset
   259
        data = self._read()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   260
        self.repo.ui.debug(b'rebase status resumed\n')
38515
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38508
diff changeset
   261
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   262
        self.originalwd = data[b'originalwd']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   263
        self.destmap = data[b'destmap']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   264
        self.state = data[b'state']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   265
        self.skipped = data[b'skipped']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   266
        self.collapsef = data[b'collapse']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   267
        self.keepf = data[b'keep']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   268
        self.keepbranchesf = data[b'keepbranches']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   269
        self.external = data[b'external']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   270
        self.activebookmark = data[b'activebookmark']
38515
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38508
diff changeset
   271
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38508
diff changeset
   272
    def _read(self):
34094
5d45a997d11d rebase: remove complex unhiding code
Jun Wu <quark@fb.com>
parents: 34093
diff changeset
   273
        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
   274
        repo = self.repo
34095
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34094
diff changeset
   275
        assert repo.filtername is None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   276
        data = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   277
            b'keepbranches': None,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   278
            b'collapse': None,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   279
            b'activebookmark': None,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   280
            b'external': nullrev,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   281
            b'keep': None,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   282
            b'originalwd': None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   283
        }
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   284
        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
   285
        state = {}
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   286
        destmap = {}
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   287
38518
cf24f678adda rebase: check whether the rebasestate exists or not a bit early
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38517
diff changeset
   288
        if True:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   289
            f = repo.vfs(b"rebasestate")
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   290
            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
   291
                if i == 0:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   292
                    data[b'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
   293
                elif i == 1:
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   294
                    # this line should be empty in newer version. but legacy
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   295
                    # clients may still use it
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   296
                    if l:
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   297
                        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
   298
                elif i == 2:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   299
                    data[b'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
   300
                elif i == 3:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   301
                    data[b'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
   302
                elif i == 4:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   303
                    data[b'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
   304
                elif i == 5:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   305
                    data[b'keepbranches'] = bool(int(l))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   306
                elif i == 6 and not (len(l) == 81 and b':' in l):
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   307
                    # 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
   308
                    # 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
   309
                    # oldrev:newrev lines
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   310
                    data[b'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
   311
                else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   312
                    args = l.split(b':')
37377
3dfd7f018c69 rebase: convert "oldrev" to revnum earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 37376
diff changeset
   313
                    oldrev = repo[args[0]].rev()
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   314
                    newrev = args[1]
33843
d8d0ef5f5975 rebase: remove revprecursor and revpruned states (BC)
Jun Wu <quark@fb.com>
parents: 33842
diff changeset
   315
                    if newrev in legacystates:
d8d0ef5f5975 rebase: remove revprecursor and revpruned states (BC)
Jun Wu <quark@fb.com>
parents: 33842
diff changeset
   316
                        continue
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   317
                    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
   318
                        destrev = repo[args[2]].rev()
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   319
                    else:
37376
25940470c7e6 rebase: make "destnode" consistently a revnum and rename it to "destrev"
Martin von Zweigbergk <martinvonz@google.com>
parents: 37332
diff changeset
   320
                        destrev = legacydest
37377
3dfd7f018c69 rebase: convert "oldrev" to revnum earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 37376
diff changeset
   321
                    destmap[oldrev] = destrev
37378
953db9e00eeb rebase: remove unnecessary and incorrect handling of nullid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37377
diff changeset
   322
                    if newrev == revtodostr:
37377
3dfd7f018c69 rebase: convert "oldrev" to revnum earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 37376
diff changeset
   323
                        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
   324
                        # 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
   325
                    else:
37377
3dfd7f018c69 rebase: convert "oldrev" to revnum earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 37376
diff changeset
   326
                        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
   327
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   328
        if data[b'keepbranches'] is None:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   329
            raise error.Abort(_(b'.hg/rebasestate is incomplete'))
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   330
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   331
        data[b'destmap'] = destmap
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   332
        data[b'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
   333
        skipped = set()
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   334
        # recompute the set of skipped revs
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   335
        if not data[b'collapse']:
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   336
            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
   337
            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
   338
                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
   339
                    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
   340
                seen.add(new)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   341
        data[b'skipped'] = skipped
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   342
        repo.ui.debug(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   343
            b'computed skipped revs: %s\n'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   344
            % (b' '.join(b'%d' % r for r in sorted(skipped)) or b'')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   345
        )
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
   346
38515
19076e2d62e7 rebase: refactor logic to read rebasestate in a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 38508
diff changeset
   347
        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
   348
46831
7d80622fc212 rebase: let _handleskippingobsolete(self) read directly from self
Martin von Zweigbergk <martinvonz@google.com>
parents: 46801
diff changeset
   349
    def _handleskippingobsolete(self):
7d80622fc212 rebase: let _handleskippingobsolete(self) read directly from self
Martin von Zweigbergk <martinvonz@google.com>
parents: 46801
diff changeset
   350
        """Compute structures necessary for skipping obsolete revisions"""
46863
d9601243b73c rebase: when using --keep, don't care about pruned commits or divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 46862
diff changeset
   351
        if self.keepf:
d9601243b73c rebase: when using --keep, don't care about pruned commits or divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 46862
diff changeset
   352
            return
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   353
        if not self.ui.configbool(b'experimental', b'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
   354
            return
46831
7d80622fc212 rebase: let _handleskippingobsolete(self) read directly from self
Martin von Zweigbergk <martinvonz@google.com>
parents: 46801
diff changeset
   355
        obsoleteset = {r for r in self.state if self.repo[r].obsolete()}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   356
        (
46833
47c251a14525 rebase: clarify names of variables and function related to obsolete revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 46832
diff changeset
   357
            self.obsolete_with_successor_in_destination,
47c251a14525 rebase: clarify names of variables and function related to obsolete revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 46832
diff changeset
   358
            self.obsolete_with_successor_in_rebase_set,
47c251a14525 rebase: clarify names of variables and function related to obsolete revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 46832
diff changeset
   359
        ) = _compute_obsolete_sets(self.repo, obsoleteset, self.destmap)
47c251a14525 rebase: clarify names of variables and function related to obsolete revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 46832
diff changeset
   360
        skippedset = set(self.obsolete_with_successor_in_destination)
47c251a14525 rebase: clarify names of variables and function related to obsolete revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 46832
diff changeset
   361
        skippedset.update(self.obsolete_with_successor_in_rebase_set)
33846
3b04a6ff625c rebase: remove rebaseset from _checkobsrebase
Jun Wu <quark@fb.com>
parents: 33845
diff changeset
   362
        _checkobsrebase(self.repo, self.ui, obsoleteset, skippedset)
47793
0044a7ad9f2f rebase: use obsolete.isenabled() to check for experimental.allowdivergence
Anton Shestakov <av6@dwimlabs.net>
parents: 47460
diff changeset
   363
        if obsolete.isenabled(self.repo, obsolete.allowdivergenceopt):
46834
535de0e34a79 rebase: filter out descendants of divergence-causing commits earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 46833
diff changeset
   364
            self.obsolete_with_successor_in_rebase_set = set()
535de0e34a79 rebase: filter out descendants of divergence-causing commits earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 46833
diff changeset
   365
        else:
535de0e34a79 rebase: filter out descendants of divergence-causing commits earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 46833
diff changeset
   366
            for rev in self.repo.revs(
535de0e34a79 rebase: filter out descendants of divergence-causing commits earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 46833
diff changeset
   367
                b'descendants(%ld) and not %ld',
535de0e34a79 rebase: filter out descendants of divergence-causing commits earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 46833
diff changeset
   368
                self.obsolete_with_successor_in_rebase_set,
535de0e34a79 rebase: filter out descendants of divergence-causing commits earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 46833
diff changeset
   369
                self.obsolete_with_successor_in_rebase_set,
535de0e34a79 rebase: filter out descendants of divergence-causing commits earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 46833
diff changeset
   370
            ):
535de0e34a79 rebase: filter out descendants of divergence-causing commits earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 46833
diff changeset
   371
                self.state.pop(rev, None)
535de0e34a79 rebase: filter out descendants of divergence-causing commits earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 46833
diff changeset
   372
                self.destmap.pop(rev, None)
29479
5d16ebe7b14f rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents: 29478
diff changeset
   373
44923
1f114c797961 rebase: avoid clobbering wdir() with --dry-run or --confirm (issue6291)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44666
diff changeset
   374
    def _prepareabortorcontinue(
1f114c797961 rebase: avoid clobbering wdir() with --dry-run or --confirm (issue6291)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44666
diff changeset
   375
        self, isabort, backup=True, suppwarns=False, dryrun=False, confirm=False
1f114c797961 rebase: avoid clobbering wdir() with --dry-run or --confirm (issue6291)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44666
diff changeset
   376
    ):
44346
b42ce825308e rebase: stop relying on having two parents to resume rebase
Martin von Zweigbergk <martinvonz@google.com>
parents: 44341
diff changeset
   377
        self.resume = True
29472
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
   378
        try:
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
   379
            self.restorestatus()
46833
47c251a14525 rebase: clarify names of variables and function related to obsolete revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 46832
diff changeset
   380
            # Calculate self.obsolete_* sets
46832
d95edcbe5c99 rebase: calculate obsolescense-related info earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 46831
diff changeset
   381
            self._handleskippingobsolete()
31225
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
   382
            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
   383
        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
   384
            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
   385
                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
   386
                clearcollapsemsg(self.repo)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   387
                self.repo.ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   388
                    _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   389
                        b'rebase aborted (no revision is removed,'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   390
                        b' only broken state is cleared)\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   391
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   392
                )
29472
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
   393
                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
   394
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   395
                msg = _(b'cannot continue inconsistent rebase')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   396
                hint = _(b'use "hg rebase --abort" to clear broken state')
29472
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
   397
                raise error.Abort(msg, hint=hint)
38816
2b728789edfd rebase: move "backup" flag to rebaseruntime
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38799
diff changeset
   398
29472
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
   399
        if isabort:
38816
2b728789edfd rebase: move "backup" flag to rebaseruntime
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38799
diff changeset
   400
            backup = backup and self.backupf
44923
1f114c797961 rebase: avoid clobbering wdir() with --dry-run or --confirm (issue6291)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44666
diff changeset
   401
            return self._abort(
1f114c797961 rebase: avoid clobbering wdir() with --dry-run or --confirm (issue6291)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44666
diff changeset
   402
                backup=backup,
1f114c797961 rebase: avoid clobbering wdir() with --dry-run or --confirm (issue6291)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44666
diff changeset
   403
                suppwarns=suppwarns,
1f114c797961 rebase: avoid clobbering wdir() with --dry-run or --confirm (issue6291)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44666
diff changeset
   404
                dryrun=dryrun,
1f114c797961 rebase: avoid clobbering wdir() with --dry-run or --confirm (issue6291)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44666
diff changeset
   405
                confirm=confirm,
1f114c797961 rebase: avoid clobbering wdir() with --dry-run or --confirm (issue6291)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44666
diff changeset
   406
            )
29472
f585ce6878e3 rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29404
diff changeset
   407
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   408
    def _preparenewrebase(self, destmap):
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   409
        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
   410
            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
   411
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
   412
        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
   413
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
   414
        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
   415
            # Empty state built, nothing to rebase
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   416
            self.ui.status(_(b'nothing to rebase\n'))
29473
e25da98052a4 rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29472
diff changeset
   417
            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
   418
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   419
        (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
   420
        if self.collapsef:
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   421
            dests = set(self.destmap.values())
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   422
            if len(dests) != 1:
46632
9989a276712f errors: use more specific errors in rebase extension
Martin von Zweigbergk <martinvonz@google.com>
parents: 46362
diff changeset
   423
                raise error.InputError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   424
                    _(b'--collapse does not work with multiple destinations')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   425
                )
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   426
            destrev = next(iter(dests))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   427
            destancestors = self.repo.changelog.ancestors(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   428
                [destrev], inclusive=True
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   429
            )
33847
ddf77c0cc169 rebase: remove self.destancestors
Jun Wu <quark@fb.com>
parents: 33846
diff changeset
   430
            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
   431
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   432
        for destrev in sorted(set(destmap.values())):
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   433
            dest = self.repo[destrev]
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
   434
            if dest.closesbranch() and not self.keepbranchesf:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   435
                self.ui.status(_(b'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
   436
46833
47c251a14525 rebase: clarify names of variables and function related to obsolete revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 46832
diff changeset
   437
        # Calculate self.obsolete_* sets
46832
d95edcbe5c99 rebase: calculate obsolescense-related info earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 46831
diff changeset
   438
        self._handleskippingobsolete()
d95edcbe5c99 rebase: calculate obsolescense-related info earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 46831
diff changeset
   439
46836
80cac9936324 reabase: call rewriteutil.precheck() a bit later
Martin von Zweigbergk <martinvonz@google.com>
parents: 46835
diff changeset
   440
        if not self.keepf:
46837
27ba8acd5684 rebase: don't call rewriteutil.precheck() with to-be-skipped commits
Martin von Zweigbergk <martinvonz@google.com>
parents: 46836
diff changeset
   441
            rebaseset = set(destmap.keys())
27ba8acd5684 rebase: don't call rewriteutil.precheck() with to-be-skipped commits
Martin von Zweigbergk <martinvonz@google.com>
parents: 46836
diff changeset
   442
            rebaseset -= set(self.obsolete_with_successor_in_destination)
27ba8acd5684 rebase: don't call rewriteutil.precheck() with to-be-skipped commits
Martin von Zweigbergk <martinvonz@google.com>
parents: 46836
diff changeset
   443
            rebaseset -= self.obsolete_with_successor_in_rebase_set
47020
ba6881c6a178 rewriteutil: check for divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 46863
diff changeset
   444
            # We have our own divergence-checking in the rebase extension
ba6881c6a178 rewriteutil: check for divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 46863
diff changeset
   445
            overrides = {}
ba6881c6a178 rewriteutil: check for divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 46863
diff changeset
   446
            if obsolete.isenabled(self.repo, obsolete.createmarkersopt):
ba6881c6a178 rewriteutil: check for divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 46863
diff changeset
   447
                overrides = {
ba6881c6a178 rewriteutil: check for divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 46863
diff changeset
   448
                    (b'experimental', b'evolution.allowdivergence'): b'true'
ba6881c6a178 rewriteutil: check for divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 46863
diff changeset
   449
                }
46836
80cac9936324 reabase: call rewriteutil.precheck() a bit later
Martin von Zweigbergk <martinvonz@google.com>
parents: 46835
diff changeset
   450
            try:
47020
ba6881c6a178 rewriteutil: check for divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 46863
diff changeset
   451
                with self.ui.configoverride(overrides):
ba6881c6a178 rewriteutil: check for divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 46863
diff changeset
   452
                    rewriteutil.precheck(self.repo, rebaseset, action=b'rebase')
46836
80cac9936324 reabase: call rewriteutil.precheck() a bit later
Martin von Zweigbergk <martinvonz@google.com>
parents: 46835
diff changeset
   453
            except error.Abort as e:
80cac9936324 reabase: call rewriteutil.precheck() a bit later
Martin von Zweigbergk <martinvonz@google.com>
parents: 46835
diff changeset
   454
                if e.hint is None:
80cac9936324 reabase: call rewriteutil.precheck() a bit later
Martin von Zweigbergk <martinvonz@google.com>
parents: 46835
diff changeset
   455
                    e.hint = _(b'use --keep to keep original changesets')
80cac9936324 reabase: call rewriteutil.precheck() a bit later
Martin von Zweigbergk <martinvonz@google.com>
parents: 46835
diff changeset
   456
                raise e
80cac9936324 reabase: call rewriteutil.precheck() a bit later
Martin von Zweigbergk <martinvonz@google.com>
parents: 46835
diff changeset
   457
46835
c2438f2f635c rebase: set `prepared = True` at very end of `_preparenewrebase()`
Martin von Zweigbergk <martinvonz@google.com>
parents: 46834
diff changeset
   458
        self.prepared = True
c2438f2f635c rebase: set `prepared = True` at very end of `_preparenewrebase()`
Martin von Zweigbergk <martinvonz@google.com>
parents: 46834
diff changeset
   459
35333
8dba17546016 rebase: extract _assignworkingcopy
Phil Cohen <phillco@fb.com>
parents: 35332
diff changeset
   460
    def _assignworkingcopy(self):
35290
482614b3802a rebase: add the --inmemory option flag; assign a wctx object for the rebase
Phil Cohen <phillco@fb.com>
parents: 35287
diff changeset
   461
        if self.inmemory:
482614b3802a rebase: add the --inmemory option flag; assign a wctx object for the rebase
Phil Cohen <phillco@fb.com>
parents: 35287
diff changeset
   462
            from mercurial.context import overlayworkingctx
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   463
35290
482614b3802a rebase: add the --inmemory option flag; assign a wctx object for the rebase
Phil Cohen <phillco@fb.com>
parents: 35287
diff changeset
   464
            self.wctx = overlayworkingctx(self.repo)
45510
1f5c548f15e5 rebase: fix an inconsistent hyphenation in a debug message
Martin von Zweigbergk <martinvonz@google.com>
parents: 45229
diff changeset
   465
            self.repo.ui.debug(b"rebasing in memory\n")
35290
482614b3802a rebase: add the --inmemory option flag; assign a wctx object for the rebase
Phil Cohen <phillco@fb.com>
parents: 35287
diff changeset
   466
        else:
482614b3802a rebase: add the --inmemory option flag; assign a wctx object for the rebase
Phil Cohen <phillco@fb.com>
parents: 35287
diff changeset
   467
            self.wctx = self.repo[None]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   468
            self.repo.ui.debug(b"rebasing on disk\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   469
        self.repo.ui.log(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   470
            b"rebase",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   471
            b"using in-memory rebase: %r\n",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   472
            self.inmemory,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   473
            rebase_imm_used=self.inmemory,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   474
        )
35333
8dba17546016 rebase: extract _assignworkingcopy
Phil Cohen <phillco@fb.com>
parents: 35332
diff changeset
   475
8dba17546016 rebase: extract _assignworkingcopy
Phil Cohen <phillco@fb.com>
parents: 35332
diff changeset
   476
    def _performrebase(self, tr):
8dba17546016 rebase: extract _assignworkingcopy
Phil Cohen <phillco@fb.com>
parents: 35332
diff changeset
   477
        self._assignworkingcopy()
8dba17546016 rebase: extract _assignworkingcopy
Phil Cohen <phillco@fb.com>
parents: 35332
diff changeset
   478
        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
   479
        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
   480
            # 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
   481
            # 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
   482
            # desired
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   483
            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
   484
            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
   485
                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
   486
                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
   487
                    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
   488
                    if len(branches) > 1:
46632
9989a276712f errors: use more specific errors in rebase extension
Martin von Zweigbergk <martinvonz@google.com>
parents: 46362
diff changeset
   489
                        raise error.InputError(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43105
diff changeset
   490
                            _(b'cannot collapse multiple named branches')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   491
                        )
29477
becc4c6eca42 rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29476
diff changeset
   492
33332
3b7cb3d17137 rebase: use scmutil.cleanupnodes (issue5606) (BC)
Jun Wu <quark@fb.com>
parents: 33157
diff changeset
   493
        # 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
   494
        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
   495
        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
   496
            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
   497
31225
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
   498
        # Store the state before we begin so users can run 'hg rebase --abort'
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
   499
        # if we fail before the transaction closes.
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
   500
        self.storestatus()
37031
74f91bec6991 rebase: register status file generator only once when using single transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 37028
diff changeset
   501
        if tr:
74f91bec6991 rebase: register status file generator only once when using single transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 37028
diff changeset
   502
            # 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: 37028
diff changeset
   503
            # commits.
74f91bec6991 rebase: register status file generator only once when using single transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 37028
diff changeset
   504
            self.storestatus(tr)
31225
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
   505
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   506
        cands = [k for k, v in self.state.items() if v == revtodo]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   507
        p = repo.ui.makeprogress(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   508
            _(b"rebasing"), unit=_(b'changesets'), total=len(cands)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   509
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   510
36933
61600b024a70 rebase: move constant expressions out of inner loop in _performrebase()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36932
diff changeset
   511
        def progress(ctx):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   512
            p.increment(item=(b"%d:%s" % (ctx.rev(), ctx)))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   513
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
   514
        for subset in sortsource(self.destmap):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   515
            sortedrevs = self.repo.revs(b'sort(%ld, -topo)', subset)
36932
437f80436186 rebase: inline _performrebasesubset()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36931
diff changeset
   516
            for rev in sortedrevs:
46834
535de0e34a79 rebase: filter out descendants of divergence-causing commits earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 46833
diff changeset
   517
                self._rebasenode(tr, rev, progress)
38377
a73eab7d6575 rebase: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38372
diff changeset
   518
        p.complete()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   519
        ui.note(_(b'rebase merging completed\n'))
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
   520
45511
e29cd888fd17 rebase: delete unused p1 argument to _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45510
diff changeset
   521
    def _concludenode(self, rev, editor, commitmsg=None):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45792
diff changeset
   522
        """Commit the wd changes with parents p1 and p2.
37033
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37032
diff changeset
   523
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37032
diff changeset
   524
        Reuse commit info from rev but also store useful information in extra.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45792
diff changeset
   525
        Return node of committed revision."""
37033
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37032
diff changeset
   526
        repo = self.repo
37034
fbc82a08bdcb rebase: pass in ctx, not rev, to conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37033
diff changeset
   527
        ctx = repo[rev]
37035
b7f5d03e1e54 rebase: look up commit message to reuse outside of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37034
diff changeset
   528
        if commitmsg is None:
b7f5d03e1e54 rebase: look up commit message to reuse outside of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37034
diff changeset
   529
            commitmsg = ctx.description()
45792
1703a7f9d5b8 rebase: update commit hash references in the new commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 45771
diff changeset
   530
1703a7f9d5b8 rebase: update commit hash references in the new commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 45771
diff changeset
   531
        # Skip replacement if collapsing, as that degenerates to p1 for all
1703a7f9d5b8 rebase: update commit hash references in the new commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 45771
diff changeset
   532
        # nodes.
1703a7f9d5b8 rebase: update commit hash references in the new commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 45771
diff changeset
   533
        if not self.collapsef:
1703a7f9d5b8 rebase: update commit hash references in the new commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 45771
diff changeset
   534
            cl = repo.changelog
1703a7f9d5b8 rebase: update commit hash references in the new commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 45771
diff changeset
   535
            commitmsg = rewriteutil.update_hash_refs(
1703a7f9d5b8 rebase: update commit hash references in the new commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 45771
diff changeset
   536
                repo,
1703a7f9d5b8 rebase: update commit hash references in the new commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 45771
diff changeset
   537
                commitmsg,
1703a7f9d5b8 rebase: update commit hash references in the new commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 45771
diff changeset
   538
                {
1703a7f9d5b8 rebase: update commit hash references in the new commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 45771
diff changeset
   539
                    cl.node(oldrev): [cl.node(newrev)]
1703a7f9d5b8 rebase: update commit hash references in the new commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 45771
diff changeset
   540
                    for oldrev, newrev in self.state.items()
1703a7f9d5b8 rebase: update commit hash references in the new commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 45771
diff changeset
   541
                    if newrev != revtodo
1703a7f9d5b8 rebase: update commit hash references in the new commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 45771
diff changeset
   542
                },
1703a7f9d5b8 rebase: update commit hash references in the new commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 45771
diff changeset
   543
            )
1703a7f9d5b8 rebase: update commit hash references in the new commits
Matt Harbison <matt_harbison@yahoo.com>
parents: 45771
diff changeset
   544
37041
0b1230a5a958 rebase: look up default date outside of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37040
diff changeset
   545
        date = self.date
0b1230a5a958 rebase: look up default date outside of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37040
diff changeset
   546
        if date is None:
0b1230a5a958 rebase: look up default date outside of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37040
diff changeset
   547
            date = ctx.date()
49449
cfff73cab721 rebase: add boolean config item rebase.store-source
C. Masloch <pushbx@ulukai.org>
parents: 49306
diff changeset
   548
        extra = {}
cfff73cab721 rebase: add boolean config item rebase.store-source
C. Masloch <pushbx@ulukai.org>
parents: 49306
diff changeset
   549
        if repo.ui.configbool(b'rebase', b'store-source'):
cfff73cab721 rebase: add boolean config item rebase.store-source
C. Masloch <pushbx@ulukai.org>
parents: 49306
diff changeset
   550
            extra = {b'rebase_source': ctx.hex()}
37037
bd0086bd3af4 rebase: inline _makextrafn() now that we have only one caller
Martin von Zweigbergk <martinvonz@google.com>
parents: 37036
diff changeset
   551
        for c in self.extrafns:
bd0086bd3af4 rebase: inline _makextrafn() now that we have only one caller
Martin von Zweigbergk <martinvonz@google.com>
parents: 37036
diff changeset
   552
            c(ctx, extra)
37039
7616073a4cf1 rebase: pass in entire "overrides" dict to conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37038
diff changeset
   553
        destphase = max(ctx.phase(), phases.draft)
45123
1efbfa9b36a7 rebase: consider rewrite.empty-successor configuration
Manuel Jacob <me@manueljacob.de>
parents: 45090
diff changeset
   554
        overrides = {
1efbfa9b36a7 rebase: consider rewrite.empty-successor configuration
Manuel Jacob <me@manueljacob.de>
parents: 45090
diff changeset
   555
            (b'phases', b'new-commit'): destphase,
1efbfa9b36a7 rebase: consider rewrite.empty-successor configuration
Manuel Jacob <me@manueljacob.de>
parents: 45090
diff changeset
   556
            (b'ui', b'allowemptycommit'): not self.skipemptysuccessorf,
1efbfa9b36a7 rebase: consider rewrite.empty-successor configuration
Manuel Jacob <me@manueljacob.de>
parents: 45090
diff changeset
   557
        }
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   558
        with repo.ui.configoverride(overrides, b'rebase'):
37040
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
   559
            if self.inmemory:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   560
                newnode = commitmemorynode(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   561
                    repo,
37040
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
   562
                    wctx=self.wctx,
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
   563
                    extra=extra,
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
   564
                    commitmsg=commitmsg,
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
   565
                    editor=editor,
37042
8ff5772711fa rebase: pass in "user" instead of "ctx" to conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37041
diff changeset
   566
                    user=ctx.user(),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   567
                    date=date,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   568
                )
37040
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
   569
            else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   570
                newnode = commitnode(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   571
                    repo,
37040
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
   572
                    extra=extra,
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
   573
                    commitmsg=commitmsg,
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
   574
                    editor=editor,
37042
8ff5772711fa rebase: pass in "user" instead of "ctx" to conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37041
diff changeset
   575
                    user=ctx.user(),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   576
                    date=date,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   577
                )
37033
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37032
diff changeset
   578
37040
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
   579
            return newnode
37033
5f99142f59cc rebase: extract common _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37032
diff changeset
   580
46834
535de0e34a79 rebase: filter out descendants of divergence-causing commits earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 46833
diff changeset
   581
    def _rebasenode(self, tr, rev, progressfn):
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
   582
        repo, ui, opts = self.repo, self.ui, self.opts
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
   583
        ctx = repo[rev]
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
   584
        desc = _ctxdesc(ctx)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
   585
        if self.state[rev] == rev:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   586
            ui.status(_(b'already rebased %s\n') % desc)
46834
535de0e34a79 rebase: filter out descendants of divergence-causing commits earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 46833
diff changeset
   587
        elif rev in self.obsolete_with_successor_in_rebase_set:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   588
            msg = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   589
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   590
                    b'note: not rebasing %s and its descendants as '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   591
                    b'this would cause divergence\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   592
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   593
                % desc
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   594
            )
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
   595
            repo.ui.status(msg)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
   596
            self.skipped.add(rev)
46833
47c251a14525 rebase: clarify names of variables and function related to obsolete revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 46832
diff changeset
   597
        elif rev in self.obsolete_with_successor_in_destination:
47c251a14525 rebase: clarify names of variables and function related to obsolete revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 46832
diff changeset
   598
            succ = self.obsolete_with_successor_in_destination[rev]
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
   599
            if succ is None:
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43105
diff changeset
   600
                msg = _(b'note: not rebasing %s, it has no successor\n') % desc
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
   601
            else:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
   602
                succdesc = _ctxdesc(repo[succ])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   603
                msg = _(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43105
diff changeset
   604
                    b'note: not rebasing %s, already in destination as %s\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   605
                ) % (desc, succdesc)
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
   606
            repo.ui.status(msg)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
   607
            # 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: 36930
diff changeset
   608
            self.skipped.add(rev)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
   609
            # 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: 36930
diff changeset
   610
            # This helps bookmark and working parent movement.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   611
            dest = max(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   612
                adjustdest(repo, rev, self.destmap, self.state, self.skipped)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   613
            )
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
   614
            self.state[rev] = dest
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
   615
        elif self.state[rev] == revtodo:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   616
            ui.status(_(b'rebasing %s\n') % desc)
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
   617
            progressfn(ctx)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   618
            p1, p2, base = defineparents(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   619
                repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   620
                rev,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   621
                self.destmap,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   622
                self.state,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   623
                self.skipped,
46833
47c251a14525 rebase: clarify names of variables and function related to obsolete revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 46832
diff changeset
   624
                self.obsolete_with_successor_in_destination,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   625
            )
44346
b42ce825308e rebase: stop relying on having two parents to resume rebase
Martin von Zweigbergk <martinvonz@google.com>
parents: 44341
diff changeset
   626
            if self.resume and self.wctx.p1().rev() == p1:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   627
                repo.ui.debug(b'resuming interrupted rebase\n')
44346
b42ce825308e rebase: stop relying on having two parents to resume rebase
Martin von Zweigbergk <martinvonz@google.com>
parents: 44341
diff changeset
   628
                self.resume = False
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
   629
            else:
47460
c9cedb546262 rebase: use str-keyed opts in remaining places
Martin von Zweigbergk <martinvonz@google.com>
parents: 47459
diff changeset
   630
                overrides = {(b'ui', b'forcemerge'): opts.get('tool', b'')}
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   631
                with ui.configoverride(overrides, b'rebase'):
45555
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   632
                    try:
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   633
                        rebasenode(
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   634
                            repo,
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   635
                            rev,
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   636
                            p1,
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   637
                            p2,
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   638
                            base,
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   639
                            self.collapsef,
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   640
                            wctx=self.wctx,
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   641
                        )
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   642
                    except error.InMemoryMergeConflictsError:
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   643
                        if self.dryrun:
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   644
                            raise error.ConflictResolutionRequired(b'rebase')
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   645
                        if self.collapsef:
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   646
                            # TODO: Make the overlayworkingctx reflected
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   647
                            # in the working copy here instead of re-raising
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   648
                            # so the entire rebase operation is retried.
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   649
                            raise
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   650
                        ui.status(
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   651
                            _(
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   652
                                b"hit merge conflicts; rebasing that "
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   653
                                b"commit again in the working copy\n"
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   654
                            )
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   655
                        )
46027
1d5189a57405 rebase: clear merge state when aborting in-memory merge on dirty working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 45577
diff changeset
   656
                        try:
1d5189a57405 rebase: clear merge state when aborting in-memory merge on dirty working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 45577
diff changeset
   657
                            cmdutil.bailifchanged(repo)
1d5189a57405 rebase: clear merge state when aborting in-memory merge on dirty working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 45577
diff changeset
   658
                        except error.Abort:
1d5189a57405 rebase: clear merge state when aborting in-memory merge on dirty working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 45577
diff changeset
   659
                            clearstatus(repo)
1d5189a57405 rebase: clear merge state when aborting in-memory merge on dirty working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 45577
diff changeset
   660
                            clearcollapsemsg(repo)
1d5189a57405 rebase: clear merge state when aborting in-memory merge on dirty working copy
Martin von Zweigbergk <martinvonz@google.com>
parents: 45577
diff changeset
   661
                            raise
45555
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   662
                        self.inmemory = False
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   663
                        self._assignworkingcopy()
45576
c1b603cdc95a merge: add a higher-level update() for the common `hg update` use case
Martin von Zweigbergk <martinvonz@google.com>
parents: 45557
diff changeset
   664
                        mergemod.update(repo[p1], wc=self.wctx)
45555
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   665
                        rebasenode(
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   666
                            repo,
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   667
                            rev,
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   668
                            p1,
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   669
                            p2,
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   670
                            base,
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   671
                            self.collapsef,
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   672
                            wctx=self.wctx,
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
   673
                        )
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
   674
            if not self.collapsef:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
   675
                merging = p2 != nullrev
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   676
                editform = cmdutil.mergeeditform(merging, b'rebase')
47460
c9cedb546262 rebase: use str-keyed opts in remaining places
Martin von Zweigbergk <martinvonz@google.com>
parents: 47459
diff changeset
   677
                editor = cmdutil.getcommiteditor(editform=editform, **opts)
44666
e7af56a0733e rebase: don't create merge when continuing rebase interrupted by old hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 44556
diff changeset
   678
                # We need to set parents again here just in case we're continuing
e7af56a0733e rebase: don't create merge when continuing rebase interrupted by old hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 44556
diff changeset
   679
                # a rebase started with an old hg version (before 9c9cfecd4600),
e7af56a0733e rebase: don't create merge when continuing rebase interrupted by old hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 44556
diff changeset
   680
                # because those old versions would have left us with two dirstate
e7af56a0733e rebase: don't create merge when continuing rebase interrupted by old hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 44556
diff changeset
   681
                # parents, and we don't want to create a merge commit here (unless
e7af56a0733e rebase: don't create merge when continuing rebase interrupted by old hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 44556
diff changeset
   682
                # we're rebasing a merge commit).
e7af56a0733e rebase: don't create merge when continuing rebase interrupted by old hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 44556
diff changeset
   683
                self.wctx.setparents(repo[p1].node(), repo[p2].node())
45511
e29cd888fd17 rebase: delete unused p1 argument to _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45510
diff changeset
   684
                newnode = self._concludenode(rev, editor)
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
   685
            else:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
   686
                # Skip commit if we are collapsing
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
   687
                newnode = None
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
   688
            # Update the state
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
   689
            if newnode is not None:
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
   690
                self.state[rev] = repo[newnode].rev()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   691
                ui.debug(b'rebased as %s\n' % short(newnode))
45123
1efbfa9b36a7 rebase: consider rewrite.empty-successor configuration
Manuel Jacob <me@manueljacob.de>
parents: 45090
diff changeset
   692
                if repo[newnode].isempty():
1efbfa9b36a7 rebase: consider rewrite.empty-successor configuration
Manuel Jacob <me@manueljacob.de>
parents: 45090
diff changeset
   693
                    ui.warn(
1efbfa9b36a7 rebase: consider rewrite.empty-successor configuration
Manuel Jacob <me@manueljacob.de>
parents: 45090
diff changeset
   694
                        _(
1efbfa9b36a7 rebase: consider rewrite.empty-successor configuration
Manuel Jacob <me@manueljacob.de>
parents: 45090
diff changeset
   695
                            b'note: created empty successor for %s, its '
1efbfa9b36a7 rebase: consider rewrite.empty-successor configuration
Manuel Jacob <me@manueljacob.de>
parents: 45090
diff changeset
   696
                            b'destination already has all its changes\n'
1efbfa9b36a7 rebase: consider rewrite.empty-successor configuration
Manuel Jacob <me@manueljacob.de>
parents: 45090
diff changeset
   697
                        )
1efbfa9b36a7 rebase: consider rewrite.empty-successor configuration
Manuel Jacob <me@manueljacob.de>
parents: 45090
diff changeset
   698
                        % desc
1efbfa9b36a7 rebase: consider rewrite.empty-successor configuration
Manuel Jacob <me@manueljacob.de>
parents: 45090
diff changeset
   699
                    )
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
   700
            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
   701
                if not self.collapsef:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   702
                    ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   703
                        _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   704
                            b'note: not rebasing %s, its destination already '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   705
                            b'has all its changes\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   706
                        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   707
                        % desc
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   708
                    )
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
   709
                    self.skipped.add(rev)
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
   710
                self.state[rev] = p1
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   711
                ui.debug(b'next revision set to %d\n' % p1)
36931
28f988093911 rebase: extract function for rebasing a single node
Martin von Zweigbergk <martinvonz@google.com>
parents: 36930
diff changeset
   712
        else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   713
            ui.status(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   714
                _(b'already rebased %s as %s\n') % (desc, repo[self.state[rev]])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   715
            )
37032
98663bed146e rebase: store rebase state after each commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 37031
diff changeset
   716
        if not tr:
98663bed146e rebase: store rebase state after each commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 37031
diff changeset
   717
            # When not using single transaction, store state after each
98663bed146e rebase: store rebase state after each commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 37031
diff changeset
   718
            # commit is completely done. On InterventionRequired, we thus
98663bed146e rebase: store rebase state after each commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 37031
diff changeset
   719
            # 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: 37031
diff changeset
   720
            # case and realize that the commit was in progress.
98663bed146e rebase: store rebase state after each commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 37031
diff changeset
   721
            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
   722
38816
2b728789edfd rebase: move "backup" flag to rebaseruntime
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38799
diff changeset
   723
    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
   724
        repo, ui, opts = self.repo, self.ui, self.opts
47460
c9cedb546262 rebase: use str-keyed opts in remaining places
Martin von Zweigbergk <martinvonz@google.com>
parents: 47459
diff changeset
   725
        fm = ui.formatter(b'rebase', pycompat.byteskwargs(opts))
34883
c858afe9c59b rebase: add support to output nodechanges
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34872
diff changeset
   726
        fm.startitem()
36771
f7e3fe95b663 rebase: delete obsolete internal "keepopen" option
Martin von Zweigbergk <martinvonz@google.com>
parents: 36478
diff changeset
   727
        if self.collapsef:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   728
            p1, p2, _base = defineparents(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   729
                repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   730
                min(self.state),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   731
                self.destmap,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   732
                self.state,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   733
                self.skipped,
46833
47c251a14525 rebase: clarify names of variables and function related to obsolete revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 46832
diff changeset
   734
                self.obsolete_with_successor_in_destination,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   735
            )
47460
c9cedb546262 rebase: use str-keyed opts in remaining places
Martin von Zweigbergk <martinvonz@google.com>
parents: 47459
diff changeset
   736
            editopt = opts.get('edit')
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   737
            editform = b'rebase.collapse'
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   738
            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
   739
                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
   740
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   741
                commitmsg = b'Collapsed revision'
33622
5a5f600b06ad rebase: sort collapsed revisions in commit message (issue5643)
Yuya Nishihara <yuya@tcha.org>
parents: 33590
diff changeset
   742
                for rebased in sorted(self.state):
33848
bc9e075133c9 rebase: remove "state >= revtodo" condition
Jun Wu <quark@fb.com>
parents: 33847
diff changeset
   743
                    if rebased not in self.skipped:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   744
                        commitmsg += b'\n* %s' % repo[rebased].description()
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   745
                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
   746
            editor = cmdutil.getcommiteditor(edit=editopt, editform=editform)
29552
db26925bdbb0 rebase: remove sortedstate-related confusion
Kostia Balytskyi <ikostia@fb.com>
parents: 29551
diff changeset
   747
            revtoreuse = max(self.state)
33619
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
   748
44348
8082a77cc3a2 rebase: remove some redundant setting of dirstate parents
Martin von Zweigbergk <martinvonz@google.com>
parents: 44347
diff changeset
   749
            self.wctx.setparents(repo[p1].node(), repo[self.external].node())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   750
            newnode = self._concludenode(
45511
e29cd888fd17 rebase: delete unused p1 argument to _concludenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45510
diff changeset
   751
                revtoreuse, editor, commitmsg=commitmsg
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   752
            )
36928
9457c395fcbb rebase: fix issue 5494 also with --collapse
Martin von Zweigbergk <martinvonz@google.com>
parents: 36927
diff changeset
   753
33864
70354bd4f19b rebase: only change self.state when collapsing in _finishrebase
Jun Wu <quark@fb.com>
parents: 33863
diff changeset
   754
            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
   755
                newrev = repo[newnode].rev()
36299
238646784294 py3: use default dict iterator instead of iterkeys
Augie Fackler <augie@google.com>
parents: 36271
diff changeset
   756
                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
   757
                    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
   758
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   759
        if b'qtip' in repo.tags():
47460
c9cedb546262 rebase: use str-keyed opts in remaining places
Martin von Zweigbergk <martinvonz@google.com>
parents: 47459
diff changeset
   760
            updatemq(repo, self.state, self.skipped, **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
   761
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   762
        # 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
   763
        # (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
   764
        newwd = self.state.get(self.originalwd, self.originalwd)
33843
d8d0ef5f5975 rebase: remove revprecursor and revpruned states (BC)
Jun Wu <quark@fb.com>
parents: 33842
diff changeset
   765
        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
   766
            # 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
   767
            newwd = self.originalwd
36975
795eb53f1d3e rebase: allow in-memory merge of the working copy parent
Martin von Zweigbergk <martinvonz@google.com>
parents: 36960
diff changeset
   768
        if newwd not in [c.rev() for c in repo[None].parents()]:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   769
            ui.note(_(b"update back to initial working directory parent\n"))
45577
5c8230ca37f2 merge: replace calls to hg.updaterepo() by merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45576
diff changeset
   770
            mergemod.update(repo[newwd])
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   771
34354
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
   772
        collapsedas = None
36774
a835bf3fe40a rebase: collapse two nested if-conditions
Martin von Zweigbergk <martinvonz@google.com>
parents: 36773
diff changeset
   773
        if self.collapsef and not self.keepf:
a835bf3fe40a rebase: collapse two nested if-conditions
Martin von Zweigbergk <martinvonz@google.com>
parents: 36773
diff changeset
   774
            collapsedas = newnode
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   775
        clearrebased(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   776
            ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   777
            repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   778
            self.destmap,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   779
            self.state,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   780
            self.skipped,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   781
            collapsedas,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   782
            self.keepf,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   783
            fm=fm,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   784
            backup=self.backupf,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   785
        )
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   786
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   787
        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
   788
        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
   789
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   790
        ui.note(_(b"rebase completed\n"))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   791
        util.unlinkpath(repo.sjoin(b'undo'), ignoremissing=True)
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   792
        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
   793
            skippedlen = len(self.skipped)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   794
            ui.note(_(b"%d revisions have been skipped\n") % skippedlen)
34883
c858afe9c59b rebase: add support to output nodechanges
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34872
diff changeset
   795
        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
   796
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   797
        if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   798
            self.activebookmark
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   799
            and self.activebookmark in repo._bookmarks
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   800
            and repo[b'.'].node() == repo._bookmarks[self.activebookmark]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   801
        ):
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   802
            bookmarks.activate(repo, self.activebookmark)
29478
007da66960a8 rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29477
diff changeset
   803
44923
1f114c797961 rebase: avoid clobbering wdir() with --dry-run or --confirm (issue6291)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44666
diff changeset
   804
    def _abort(self, backup=True, suppwarns=False, dryrun=False, confirm=False):
40857
2041991f1ce2 rebase: remove now-unnecessary arguments to _abort()
Martin von Zweigbergk <martinvonz@google.com>
parents: 40856
diff changeset
   805
        '''Restore the repository to its original state.'''
40856
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   806
40857
2041991f1ce2 rebase: remove now-unnecessary arguments to _abort()
Martin von Zweigbergk <martinvonz@google.com>
parents: 40856
diff changeset
   807
        repo = self.repo
40856
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   808
        try:
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   809
            # If the first commits in the rebased set get skipped during the
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   810
            # rebase, their values within the state mapping will be the dest
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   811
            # rev id. The rebased list must must not contain the dest rev
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   812
            # (issue4896)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   813
            rebased = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   814
                s
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   815
                for r, s in self.state.items()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   816
                if s >= 0 and s != r and s != self.destmap[r]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   817
            ]
40856
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   818
            immutable = [d for d in rebased if not repo[d].mutable()]
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   819
            cleanup = True
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   820
            if immutable:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   821
                repo.ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   822
                    _(b"warning: can't clean up public changesets %s\n")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   823
                    % b', '.join(bytes(repo[r]) for r in immutable),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   824
                    hint=_(b"see 'hg help phases' for details"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   825
                )
40856
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   826
                cleanup = False
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   827
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   828
            descendants = set()
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   829
            if rebased:
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   830
                descendants = set(repo.changelog.descendants(rebased))
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   831
            if descendants - set(rebased):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   832
                repo.ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   833
                    _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   834
                        b"warning: new changesets detected on "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   835
                        b"destination branch, can't strip\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   836
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   837
                )
40856
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   838
                cleanup = False
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   839
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   840
            if cleanup:
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   841
                if rebased:
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   842
                    strippoints = [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   843
                        c.node() for c in repo.set(b'roots(%ld)', rebased)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   844
                    ]
40856
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   845
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   846
                updateifonnodes = set(rebased)
40857
2041991f1ce2 rebase: remove now-unnecessary arguments to _abort()
Martin von Zweigbergk <martinvonz@google.com>
parents: 40856
diff changeset
   847
                updateifonnodes.update(self.destmap.values())
44923
1f114c797961 rebase: avoid clobbering wdir() with --dry-run or --confirm (issue6291)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44666
diff changeset
   848
1f114c797961 rebase: avoid clobbering wdir() with --dry-run or --confirm (issue6291)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44666
diff changeset
   849
                if not dryrun and not confirm:
1f114c797961 rebase: avoid clobbering wdir() with --dry-run or --confirm (issue6291)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44666
diff changeset
   850
                    updateifonnodes.add(self.originalwd)
1f114c797961 rebase: avoid clobbering wdir() with --dry-run or --confirm (issue6291)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44666
diff changeset
   851
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   852
                shouldupdate = repo[b'.'].rev() in updateifonnodes
40856
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   853
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   854
                # Update away from the rebase if necessary
44053
894c91c2e363 rebase: delete seemingly unnecessary needupdate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44051
diff changeset
   855
                if shouldupdate:
44270
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44239
diff changeset
   856
                    mergemod.clean_update(repo[self.originalwd])
40856
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   857
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   858
                # Strip from the first rebased revision
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   859
                if rebased:
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   860
                    repair.strip(repo.ui, repo, strippoints, backup=backup)
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   861
40857
2041991f1ce2 rebase: remove now-unnecessary arguments to _abort()
Martin von Zweigbergk <martinvonz@google.com>
parents: 40856
diff changeset
   862
            if self.activebookmark and self.activebookmark in repo._bookmarks:
2041991f1ce2 rebase: remove now-unnecessary arguments to _abort()
Martin von Zweigbergk <martinvonz@google.com>
parents: 40856
diff changeset
   863
                bookmarks.activate(repo, self.activebookmark)
40856
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   864
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   865
        finally:
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   866
            clearstatus(repo)
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   867
            clearcollapsemsg(repo)
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   868
            if not suppwarns:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   869
                repo.ui.warn(_(b'rebase aborted\n'))
40856
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   870
        return 0
c8eb8d1fc6cf rebase: move abort() onto rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 40819
diff changeset
   871
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   872
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   873
@command(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   874
    b'rebase',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   875
    [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   876
        (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   877
            b's',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   878
            b'source',
44555
05654ea5137c rebase: accept multiple --source arguments (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 44554
diff changeset
   879
            [],
05654ea5137c rebase: accept multiple --source arguments (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 44554
diff changeset
   880
            _(b'rebase the specified changesets and their descendants'),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   881
            _(b'REV'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   882
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   883
        (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   884
            b'b',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   885
            b'base',
44556
f63598aa1c4b rebase: accept multiple --base arguments (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 44555
diff changeset
   886
            [],
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   887
            _(b'rebase everything from branching point of specified changeset'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   888
            _(b'REV'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   889
        ),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   890
        (b'r', b'rev', [], _(b'rebase these revisions'), _(b'REV')),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   891
        (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   892
            b'd',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   893
            b'dest',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   894
            b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   895
            _(b'rebase onto the specified changeset'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   896
            _(b'REV'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   897
        ),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   898
        (b'', b'collapse', False, _(b'collapse the rebased changesets')),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   899
        (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   900
            b'm',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   901
            b'message',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   902
            b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   903
            _(b'use text as collapse commit message'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   904
            _(b'TEXT'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   905
        ),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   906
        (b'e', b'edit', False, _(b'invoke editor on commit messages')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   907
        (
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   908
            b'l',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   909
            b'logfile',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   910
            b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   911
            _(b'read collapse commit message from file'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   912
            _(b'FILE'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   913
        ),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   914
        (b'k', b'keep', False, _(b'keep original changesets')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   915
        (b'', b'keepbranches', False, _(b'keep original branch names')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   916
        (b'D', b'detach', False, _(b'(DEPRECATED)')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   917
        (b'i', b'interactive', False, _(b'(DEPRECATED)')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   918
        (b't', b'tool', b'', _(b'specify merge tool')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   919
        (b'', b'stop', False, _(b'stop interrupted rebase')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   920
        (b'c', b'continue', False, _(b'continue an interrupted rebase')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   921
        (b'a', b'abort', False, _(b'abort an interrupted rebase')),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   922
        (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   923
            b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   924
            b'auto-orphans',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   925
            b'',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   926
            _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   927
                b'automatically rebase orphan revisions '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   928
                b'in the specified revset (EXPERIMENTAL)'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   929
            ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   930
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   931
    ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   932
    + cmdutil.dryrunopts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   933
    + cmdutil.formatteropts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   934
    + cmdutil.confirmopts,
44556
f63598aa1c4b rebase: accept multiple --base arguments (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 44555
diff changeset
   935
    _(b'[[-s REV]... | [-b REV]... | [-r REV]...] [-d REV] [OPTION]...'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   936
    helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
   937
)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   938
def rebase(ui, repo, **opts):
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   939
    """move changeset (and descendants) to a different branch
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   940
7999
b25110140573 rebase: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7955
diff changeset
   941
    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
   942
    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
   943
    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
   944
    development tree.
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
   945
27454
3e3be524a712 rebase: simplify documentation about public commits
timeless <timeless@mozdev.org>
parents: 27344
diff changeset
   946
    Published commits cannot be rebased (see :hg:`help phases`).
3e3be524a712 rebase: simplify documentation about public commits
timeless <timeless@mozdev.org>
parents: 27344
diff changeset
   947
    To copy commits, see :hg:`help graft`.
18516
9fbeb61b8ad2 rebase: mention phases in the help
Kevin Bullock <kbullock@ringworld.org>
parents: 18514
diff changeset
   948
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
   949
    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
   950
    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
   951
    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
   952
    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
   953
    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
   954
    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
   955
    descendants.)
10646
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
   956
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
   957
    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
   958
a9a047878e14 rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents: 27454
diff changeset
   959
      1. Explicitly select them using ``--rev``.
10646
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
   960
27455
a9a047878e14 rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents: 27454
diff changeset
   961
      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
   962
         descendants.
27455
a9a047878e14 rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents: 27454
diff changeset
   963
a9a047878e14 rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents: 27454
diff changeset
   964
      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
   965
         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
   966
41796
25fc5b96d1c3 rebase: add missing dashes in help text
Manuel Jacob <me@manueljacob.de>
parents: 41206
diff changeset
   967
      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
   968
         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
   969
35287
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
   970
    If ``--source`` or ``--rev`` is used, special names ``SRC`` and ``ALLSRC``
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
   971
    can be used in ``--dest``. Destination would be calculated per source
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
   972
    revision with ``SRC`` substituted by that single source revision and
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
   973
    ``ALLSRC`` substituted by all source revisions.
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
   974
27456
2337958596e3 rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents: 27455
diff changeset
   975
    Rebase will destroy original changesets unless you use ``--keep``.
2337958596e3 rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents: 27455
diff changeset
   976
    It will also move your bookmarks (even if you do).
2337958596e3 rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents: 27455
diff changeset
   977
2337958596e3 rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents: 27455
diff changeset
   978
    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
   979
    (e.g. merges from the destination branch).
10646
86dc21148bdb rebase: improve help text
Greg Ward <greg-hg@gerg.ca>
parents: 10436
diff changeset
   980
27457
97cc045f1cfe rebase: simplify documentation about heads
timeless <timeless@mozdev.org>
parents: 27456
diff changeset
   981
    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
   982
    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
   983
    and/or destination.
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
   984
28001
ade12bf2bf0e rebase: mention help merge-tools in help
timeless <timeless@mozdev.org>
parents: 27977
diff changeset
   985
    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
   986
    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
   987
    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
   988
    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
   989
27458
d39e743e3578 rebase: mention conflict in documentation instead of merge
timeless <timeless@mozdev.org>
parents: 27457
diff changeset
   990
    If a rebase is interrupted to manually resolve a conflict, it can be
39095
571361e47137 rebase: include --stop option in documentation
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39094
diff changeset
   991
    continued with --continue/-c, aborted with --abort/-a, or stopped with
571361e47137 rebase: include --stop option in documentation
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39094
diff changeset
   992
    --stop.
11205
d26f662bfbf5 rebase: add error codes
Matt Mackall <mpm@selenic.com>
parents: 11204
diff changeset
   993
22790
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   994
    .. container:: verbose
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   995
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   996
      Examples:
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   997
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   998
      - move "local changes" (current commit back to branching point)
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
   999
        to the current branch tip after a pull::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
  1000
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
  1001
          hg rebase
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
  1002
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
  1003
      - move a single changeset to the stable branch::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
  1004
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
  1005
          hg rebase -r 5f493448 -d stable
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
  1006
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
  1007
      - 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
  1008
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
  1009
          hg rebase --source c0c3 --dest 4cf9
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
  1010
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
  1011
      - 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
  1012
        default branch::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
  1013
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
  1014
          hg rebase --base myfeature --dest default
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
  1015
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
  1016
      - collapse a sequence of changes into a single commit::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
  1017
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
  1018
          hg rebase --collapse -r 1520:1525 -d .
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
  1019
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
  1020
      - move a named branch while preserving its name::
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
  1021
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
  1022
          hg rebase -r "branch(featureX)" -d 1.3 --keepbranches
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
  1023
35287
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
  1024
      - stabilize orphaned changesets so history looks linear::
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
  1025
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
  1026
          hg rebase -r 'orphan()-obsolete()'\
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
  1027
 -d 'first(max((successors(max(roots(ALLSRC) & ::SRC)^)-obsolete())::) +\
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
  1028
 max(::((roots(ALLSRC) & ::SRC)^)-obsolete()))'
3398603c5621 rebase: enable multidest by default
Jun Wu <quark@fb.com>
parents: 35125
diff changeset
  1029
31558
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
  1030
    Configuration Options:
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
  1031
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
  1032
    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
  1033
    option::
31558
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
  1034
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
  1035
      [commands]
32083
1c911adebf48 rebase: fix incorrect configuration example
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31733
diff changeset
  1036
      rebase.requiredest = True
31558
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
  1037
33569
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
  1038
    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
  1039
    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
  1040
    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
  1041
    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
  1042
    unexpectedly::
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
  1043
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
  1044
      [rebase]
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
  1045
      singletransaction = True
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
  1046
35388
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
  1047
    By default, rebase writes to the working copy, but you can configure it to
42447
cda591d2bfe1 rebase: tweak description of inmemory working even w/ dirty working dir
Kyle Lippincott <spectral@google.com>
parents: 42299
diff changeset
  1048
    run in-memory for better performance. When the rebase is not moving the
cda591d2bfe1 rebase: tweak description of inmemory working even w/ dirty working dir
Kyle Lippincott <spectral@google.com>
parents: 42299
diff changeset
  1049
    parent(s) of the working copy (AKA the "currently checked out changesets"),
cda591d2bfe1 rebase: tweak description of inmemory working even w/ dirty working dir
Kyle Lippincott <spectral@google.com>
parents: 42299
diff changeset
  1050
    this may also allow it to run even if the working copy is dirty::
35388
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
  1051
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
  1052
      [rebase]
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
  1053
      experimental.inmemory = True
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
  1054
31558
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
  1055
    Return Values:
13dc00c233b7 rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents: 31514
diff changeset
  1056
19971
2a9bb64faa0b rebase: add description about exit code when there are unresolved conflicts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19969
diff changeset
  1057
    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
  1058
    unresolved conflicts.
22790
c64f9e0beead rebase: add help examples
Matt Mackall <mpm@selenic.com>
parents: 22789
diff changeset
  1059
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1060
    """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1061
    inmemory = ui.configbool(b'rebase', b'experimental.inmemory')
47459
de54d11040e7 rebase: keep str-keyed opts long enough to make `action` a str
Martin von Zweigbergk <martinvonz@google.com>
parents: 47020
diff changeset
  1062
    action = cmdutil.check_at_most_one_arg(opts, 'abort', 'stop', 'continue')
43927
905b21783968 rebase: use cmdutil.check_incompatible_arguments() for action+confirm/dryrun
Martin von Zweigbergk <martinvonz@google.com>
parents: 43926
diff changeset
  1063
    if action:
905b21783968 rebase: use cmdutil.check_incompatible_arguments() for action+confirm/dryrun
Martin von Zweigbergk <martinvonz@google.com>
parents: 43926
diff changeset
  1064
        cmdutil.check_incompatible_arguments(
47459
de54d11040e7 rebase: keep str-keyed opts long enough to make `action` a str
Martin von Zweigbergk <martinvonz@google.com>
parents: 47020
diff changeset
  1065
            opts, action, ['confirm', 'dry_run']
43927
905b21783968 rebase: use cmdutil.check_incompatible_arguments() for action+confirm/dryrun
Martin von Zweigbergk <martinvonz@google.com>
parents: 43926
diff changeset
  1066
        )
43931
8c87cc169946 rebase: use cmdutil.check_at_most_one_arg() for action+revision
Martin von Zweigbergk <martinvonz@google.com>
parents: 43930
diff changeset
  1067
        cmdutil.check_incompatible_arguments(
47459
de54d11040e7 rebase: keep str-keyed opts long enough to make `action` a str
Martin von Zweigbergk <martinvonz@google.com>
parents: 47020
diff changeset
  1068
            opts, action, ['rev', 'source', 'base', 'dest']
43931
8c87cc169946 rebase: use cmdutil.check_at_most_one_arg() for action+revision
Martin von Zweigbergk <martinvonz@google.com>
parents: 43930
diff changeset
  1069
        )
47459
de54d11040e7 rebase: keep str-keyed opts long enough to make `action` a str
Martin von Zweigbergk <martinvonz@google.com>
parents: 47020
diff changeset
  1070
    cmdutil.check_at_most_one_arg(opts, 'confirm', 'dry_run')
de54d11040e7 rebase: keep str-keyed opts long enough to make `action` a str
Martin von Zweigbergk <martinvonz@google.com>
parents: 47020
diff changeset
  1071
    cmdutil.check_at_most_one_arg(opts, 'rev', 'source', 'base')
38372
f4f1fb1cbfb4 rebase: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38239
diff changeset
  1072
39101
18cbe2d872d3 rebase: turn off inmemory flag on --stop
Yuya Nishihara <yuya@tcha.org>
parents: 39100
diff changeset
  1073
    if action or repo.currenttransaction() is not None:
35320
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  1074
        # 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: 35487
diff changeset
  1075
        # (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: 35487
diff changeset
  1076
        # fail the entire transaction.)
35388
dd11df900f7f rebase: replace --inmemory flag with rebase.experimental.inmemory config
Phil Cohen <phillco@fb.com>
parents: 35384
diff changeset
  1077
        inmemory = False
35320
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  1078
47459
de54d11040e7 rebase: keep str-keyed opts long enough to make `action` a str
Martin von Zweigbergk <martinvonz@google.com>
parents: 47020
diff changeset
  1079
    if opts.get('auto_orphans'):
de54d11040e7 rebase: keep str-keyed opts long enough to make `action` a str
Martin von Zweigbergk <martinvonz@google.com>
parents: 47020
diff changeset
  1080
        disallowed_opts = set(opts) - {'auto_orphans'}
43930
412f199b4092 rebase: use cmdutil.check_incompatible_arguments() for --auto-orphans
Martin von Zweigbergk <martinvonz@google.com>
parents: 43929
diff changeset
  1081
        cmdutil.check_incompatible_arguments(
47459
de54d11040e7 rebase: keep str-keyed opts long enough to make `action` a str
Martin von Zweigbergk <martinvonz@google.com>
parents: 47020
diff changeset
  1082
            opts, 'auto_orphans', disallowed_opts
43930
412f199b4092 rebase: use cmdutil.check_incompatible_arguments() for --auto-orphans
Martin von Zweigbergk <martinvonz@google.com>
parents: 43929
diff changeset
  1083
        )
412f199b4092 rebase: use cmdutil.check_incompatible_arguments() for --auto-orphans
Martin von Zweigbergk <martinvonz@google.com>
parents: 43929
diff changeset
  1084
47459
de54d11040e7 rebase: keep str-keyed opts long enough to make `action` a str
Martin von Zweigbergk <martinvonz@google.com>
parents: 47020
diff changeset
  1085
        userrevs = list(repo.revs(opts.get('auto_orphans')))
de54d11040e7 rebase: keep str-keyed opts long enough to make `action` a str
Martin von Zweigbergk <martinvonz@google.com>
parents: 47020
diff changeset
  1086
        opts['rev'] = [revsetlang.formatspec(b'%ld and orphan()', userrevs)]
de54d11040e7 rebase: keep str-keyed opts long enough to make `action` a str
Martin von Zweigbergk <martinvonz@google.com>
parents: 47020
diff changeset
  1087
        opts['dest'] = b'_destautoorphanrebase(SRC)'
37787
92213f6745ed rebase: introduce support for automatically rebasing orphan changes
Augie Fackler <augie@google.com>
parents: 37378
diff changeset
  1088
47460
c9cedb546262 rebase: use str-keyed opts in remaining places
Martin von Zweigbergk <martinvonz@google.com>
parents: 47459
diff changeset
  1089
    if opts.get('dry_run') or opts.get('confirm'):
39100
e9e742bd0501 rebase: use action variable to select things to do
Yuya Nishihara <yuya@tcha.org>
parents: 39099
diff changeset
  1090
        return _dryrunrebase(ui, repo, action, opts)
47459
de54d11040e7 rebase: keep str-keyed opts long enough to make `action` a str
Martin von Zweigbergk <martinvonz@google.com>
parents: 47020
diff changeset
  1091
    elif action == 'stop':
39093
cc37009e95ca rebase: add --stop option to stop rebase at any point (issue5206)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38816
diff changeset
  1092
        rbsrt = rebaseruntime(repo, ui)
cc37009e95ca rebase: add --stop option to stop rebase at any point (issue5206)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38816
diff changeset
  1093
        with repo.wlock(), repo.lock():
39116
ffb34ee6de9e rebase: cover restorestatus() by lock to prevent it from being updated
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39101
diff changeset
  1094
            rbsrt.restorestatus()
ffb34ee6de9e rebase: cover restorestatus() by lock to prevent it from being updated
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39101
diff changeset
  1095
            if rbsrt.collapsef:
46632
9989a276712f errors: use more specific errors in rebase extension
Martin von Zweigbergk <martinvonz@google.com>
parents: 46362
diff changeset
  1096
                raise error.StateError(_(b"cannot stop in --collapse session"))
39116
ffb34ee6de9e rebase: cover restorestatus() by lock to prevent it from being updated
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39101
diff changeset
  1097
            allowunstable = obsolete.isenabled(repo, obsolete.allowunstableopt)
ffb34ee6de9e rebase: cover restorestatus() by lock to prevent it from being updated
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 39101
diff changeset
  1098
            if not (rbsrt.keepf or allowunstable):
46632
9989a276712f errors: use more specific errors in rebase extension
Martin von Zweigbergk <martinvonz@google.com>
parents: 46362
diff changeset
  1099
                raise error.StateError(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1100
                    _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1101
                        b"cannot remove original changesets with"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1102
                        b" unrebased descendants"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1103
                    ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1104
                    hint=_(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1105
                        b'either enable obsmarkers to allow unstable '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1106
                        b'revisions or use --keep to keep original '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1107
                        b'changesets'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1108
                    ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1109
                )
44053
894c91c2e363 rebase: delete seemingly unnecessary needupdate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44051
diff changeset
  1110
            # update to the current working revision
894c91c2e363 rebase: delete seemingly unnecessary needupdate()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44051
diff changeset
  1111
            # to clear interrupted merge
45556
03726f5b6092 merge: use merge.clean_update() when applicable
Martin von Zweigbergk <martinvonz@google.com>
parents: 45555
diff changeset
  1112
            mergemod.clean_update(repo[rbsrt.originalwd])
39093
cc37009e95ca rebase: add --stop option to stop rebase at any point (issue5206)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38816
diff changeset
  1113
            rbsrt._finishrebase()
cc37009e95ca rebase: add --stop option to stop rebase at any point (issue5206)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38816
diff changeset
  1114
            return 0
38372
f4f1fb1cbfb4 rebase: add dry-run functionality
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38239
diff changeset
  1115
    elif inmemory:
35320
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  1116
        try:
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  1117
            # 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: 35319
diff changeset
  1118
            # and re-run as an on-disk merge.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1119
            overrides = {(b'rebase', b'singletransaction'): True}
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1120
            with ui.configoverride(overrides, b'rebase'):
39100
e9e742bd0501 rebase: use action variable to select things to do
Yuya Nishihara <yuya@tcha.org>
parents: 39099
diff changeset
  1121
                return _dorebase(ui, repo, action, opts, inmemory=inmemory)
35320
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  1122
        except error.InMemoryMergeConflictsError:
46362
24a32dea6955 rebase: add a config knob for forcing in-memory rebasing
Augie Fackler <augie@google.com>
parents: 46180
diff changeset
  1123
            if ui.configbool(b'devel', b'rebase.force-in-memory-merge'):
24a32dea6955 rebase: add a config knob for forcing in-memory rebasing
Augie Fackler <augie@google.com>
parents: 46180
diff changeset
  1124
                raise
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1125
            ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1126
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1127
                    b'hit merge conflicts; re-running rebase without in-memory'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1128
                    b' merge\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1129
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1130
            )
40790
f07d4f94f098 rebase: preserve working copy when redoing in-mem rebase on disk
Martin von Zweigbergk <martinvonz@google.com>
parents: 40366
diff changeset
  1131
            clearstatus(repo)
f07d4f94f098 rebase: preserve working copy when redoing in-mem rebase on disk
Martin von Zweigbergk <martinvonz@google.com>
parents: 40366
diff changeset
  1132
            clearcollapsemsg(repo)
39100
e9e742bd0501 rebase: use action variable to select things to do
Yuya Nishihara <yuya@tcha.org>
parents: 39099
diff changeset
  1133
            return _dorebase(ui, repo, action, opts, inmemory=False)
35320
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  1134
    else:
39100
e9e742bd0501 rebase: use action variable to select things to do
Yuya Nishihara <yuya@tcha.org>
parents: 39099
diff changeset
  1135
        return _dorebase(ui, repo, action, opts)
35320
d901a88891fe rebase: rerun a rebase on-disk if IMM merge conflicts arise
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  1136
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1137
39100
e9e742bd0501 rebase: use action variable to select things to do
Yuya Nishihara <yuya@tcha.org>
parents: 39099
diff changeset
  1138
def _dryrunrebase(ui, repo, action, opts):
45548
25e365d5aa8f rebase: add dryrun property to rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 45547
diff changeset
  1139
    rbsrt = rebaseruntime(repo, ui, inmemory=True, dryrun=True, opts=opts)
47460
c9cedb546262 rebase: use str-keyed opts in remaining places
Martin von Zweigbergk <martinvonz@google.com>
parents: 47459
diff changeset
  1140
    confirm = opts.get('confirm')
38667
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
  1141
    if confirm:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1142
        ui.status(_(b'starting in-memory rebase\n'))
38667
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
  1143
    else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1144
        ui.status(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43105
diff changeset
  1145
            _(b'starting dry-run rebase; repository will not be changed\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1146
        )
38496
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38495
diff changeset
  1147
    with repo.wlock(), repo.lock():
38667
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
  1148
        needsabort = True
38496
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38495
diff changeset
  1149
        try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1150
            overrides = {(b'rebase', b'singletransaction'): True}
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1151
            with ui.configoverride(overrides, b'rebase'):
46180
b7ccdb52e0f9 rebase: handle the case when nothing to rebase (dry-run)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 46113
diff changeset
  1152
                res = _origrebase(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45792
diff changeset
  1153
                    ui,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45792
diff changeset
  1154
                    repo,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45792
diff changeset
  1155
                    action,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45792
diff changeset
  1156
                    opts,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45792
diff changeset
  1157
                    rbsrt,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1158
                )
46180
b7ccdb52e0f9 rebase: handle the case when nothing to rebase (dry-run)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 46113
diff changeset
  1159
                if res == _nothingtorebase():
b7ccdb52e0f9 rebase: handle the case when nothing to rebase (dry-run)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 46113
diff changeset
  1160
                    needsabort = False
b7ccdb52e0f9 rebase: handle the case when nothing to rebase (dry-run)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 46113
diff changeset
  1161
                    return res
45555
feffeb18d412 rebase: teach in-memory rebase to not restart with on-disk rebase on conflict
Martin von Zweigbergk <martinvonz@google.com>
parents: 45549
diff changeset
  1162
        except error.ConflictResolutionRequired:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1163
            ui.status(_(b'hit a merge conflict\n'))
38496
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38495
diff changeset
  1164
            return 1
42108
1b5cec8b6a1e rebase: fix bug that prevented dry-run rebases from printing failures
Augie Fackler <augie@google.com>
parents: 42057
diff changeset
  1165
        except error.Abort:
1b5cec8b6a1e rebase: fix bug that prevented dry-run rebases from printing failures
Augie Fackler <augie@google.com>
parents: 42057
diff changeset
  1166
            needsabort = False
1b5cec8b6a1e rebase: fix bug that prevented dry-run rebases from printing failures
Augie Fackler <augie@google.com>
parents: 42057
diff changeset
  1167
            raise
38496
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38495
diff changeset
  1168
        else:
38667
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
  1169
            if confirm:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1170
                ui.status(_(b'rebase completed successfully\n'))
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43105
diff changeset
  1171
                if not ui.promptchoice(_(b'apply changes (yn)?$$ &Yes $$ &No')):
38667
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
  1172
                    # finish unfinished rebase
38816
2b728789edfd rebase: move "backup" flag to rebaseruntime
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38799
diff changeset
  1173
                    rbsrt._finishrebase()
38667
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
  1174
                else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1175
                    rbsrt._prepareabortorcontinue(
44923
1f114c797961 rebase: avoid clobbering wdir() with --dry-run or --confirm (issue6291)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44666
diff changeset
  1176
                        isabort=True,
1f114c797961 rebase: avoid clobbering wdir() with --dry-run or --confirm (issue6291)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44666
diff changeset
  1177
                        backup=False,
1f114c797961 rebase: avoid clobbering wdir() with --dry-run or --confirm (issue6291)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44666
diff changeset
  1178
                        suppwarns=True,
1f114c797961 rebase: avoid clobbering wdir() with --dry-run or --confirm (issue6291)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44666
diff changeset
  1179
                        confirm=confirm,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1180
                    )
38667
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
  1181
                needsabort = False
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
  1182
            else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1183
                ui.status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1184
                    _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1185
                        b'dry-run rebase completed successfully; run without'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1186
                        b' -n/--dry-run to perform this rebase\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1187
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1188
                )
38496
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38495
diff changeset
  1189
            return 0
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38495
diff changeset
  1190
        finally:
38667
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
  1191
            if needsabort:
572dff5c946e rebase: add --confirm option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38666
diff changeset
  1192
                # no need to store backup in case of dryrun
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1193
                rbsrt._prepareabortorcontinue(
44923
1f114c797961 rebase: avoid clobbering wdir() with --dry-run or --confirm (issue6291)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44666
diff changeset
  1194
                    isabort=True,
1f114c797961 rebase: avoid clobbering wdir() with --dry-run or --confirm (issue6291)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44666
diff changeset
  1195
                    backup=False,
1f114c797961 rebase: avoid clobbering wdir() with --dry-run or --confirm (issue6291)
Matt Harbison <matt_harbison@yahoo.com>
parents: 44666
diff changeset
  1196
                    suppwarns=True,
47460
c9cedb546262 rebase: use str-keyed opts in remaining places
Martin von Zweigbergk <martinvonz@google.com>
parents: 47459
diff changeset
  1197
                    dryrun=opts.get('dry_run'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1198
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1199
38496
c92fdc27cbdd rebase: extract dryrun as a function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38495
diff changeset
  1200
39100
e9e742bd0501 rebase: use action variable to select things to do
Yuya Nishihara <yuya@tcha.org>
parents: 39099
diff changeset
  1201
def _dorebase(ui, repo, action, opts, inmemory=False):
45548
25e365d5aa8f rebase: add dryrun property to rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 45547
diff changeset
  1202
    rbsrt = rebaseruntime(repo, ui, inmemory, opts=opts)
45546
3d47b5c7fe8d rebase: remove redundant isinmemory argument from _origrebase()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45512
diff changeset
  1203
    return _origrebase(ui, repo, action, opts, rbsrt)
38497
9c3b48fb7ac5 rebase: split _origrebase() for conveniece in dryrun
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38496
diff changeset
  1204
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1205
45548
25e365d5aa8f rebase: add dryrun property to rebaseruntime
Martin von Zweigbergk <martinvonz@google.com>
parents: 45547
diff changeset
  1206
def _origrebase(ui, repo, action, opts, rbsrt):
47459
de54d11040e7 rebase: keep str-keyed opts long enough to make `action` a str
Martin von Zweigbergk <martinvonz@google.com>
parents: 47020
diff changeset
  1207
    assert action != 'stop'
32917
070920db8b87 rebase: use context manager for locking in rebase()
Martin von Zweigbergk <martinvonz@google.com>
parents: 32900
diff changeset
  1208
    with repo.wlock(), repo.lock():
47460
c9cedb546262 rebase: use str-keyed opts in remaining places
Martin von Zweigbergk <martinvonz@google.com>
parents: 47459
diff changeset
  1209
        if opts.get('interactive'):
26496
b885ab9ca182 rebase: enable histedit for useful help with it
timeless@mozdev.org
parents: 26495
diff changeset
  1210
            try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1211
                if extensions.find(b'histedit'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1212
                    enablehistedit = b''
26496
b885ab9ca182 rebase: enable histedit for useful help with it
timeless@mozdev.org
parents: 26495
diff changeset
  1213
            except KeyError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1214
                enablehistedit = b" --config extensions.histedit="
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1215
            help = b"hg%s help -e histedit" % enablehistedit
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1216
            msg = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1217
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1218
                    b"interactive history editing is supported by the "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1219
                    b"'histedit' extension (see \"%s\")"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1220
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1221
                % help
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1222
            )
46632
9989a276712f errors: use more specific errors in rebase extension
Martin von Zweigbergk <martinvonz@google.com>
parents: 46362
diff changeset
  1223
            raise error.InputError(msg)
22382
d5b04ee8ecf7 rebase: add a deprecated -i/--interactive flag
David Soria Parra <davidsp@fb.com>
parents: 22251
diff changeset
  1224
29400
c79da70a4659 rebase: move collapse-related local variables to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29399
diff changeset
  1225
        if rbsrt.collapsemsg and not rbsrt.collapsef:
46632
9989a276712f errors: use more specific errors in rebase extension
Martin von Zweigbergk <martinvonz@google.com>
parents: 46362
diff changeset
  1226
            raise error.InputError(
9989a276712f errors: use more specific errors in rebase extension
Martin von Zweigbergk <martinvonz@google.com>
parents: 46362
diff changeset
  1227
                _(b'message can only be specified with collapse')
9989a276712f errors: use more specific errors in rebase extension
Martin von Zweigbergk <martinvonz@google.com>
parents: 46362
diff changeset
  1228
            )
13661
ee349e228835 rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents: 13609
diff changeset
  1229
39100
e9e742bd0501 rebase: use action variable to select things to do
Yuya Nishihara <yuya@tcha.org>
parents: 39099
diff changeset
  1230
        if action:
29400
c79da70a4659 rebase: move collapse-related local variables to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29399
diff changeset
  1231
            if rbsrt.collapsef:
46632
9989a276712f errors: use more specific errors in rebase extension
Martin von Zweigbergk <martinvonz@google.com>
parents: 46362
diff changeset
  1232
                raise error.InputError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1233
                    _(b'cannot use collapse with continue or abort')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1234
                )
47460
c9cedb546262 rebase: use str-keyed opts in remaining places
Martin von Zweigbergk <martinvonz@google.com>
parents: 47459
diff changeset
  1235
            if action == 'abort' and opts.get('tool', False):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1236
                ui.warn(_(b'tool option will be ignored\n'))
47459
de54d11040e7 rebase: keep str-keyed opts long enough to make `action` a str
Martin von Zweigbergk <martinvonz@google.com>
parents: 47020
diff changeset
  1237
            if action == 'continue':
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44666
diff changeset
  1238
                ms = mergestatemod.mergestate.read(repo)
30495
d528ddc11b33 rebase: refer to checkunresolved by its new name
Augie Fackler <augie@google.com>
parents: 30490
diff changeset
  1239
                mergeutil.checkunresolved(ms)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1240
47459
de54d11040e7 rebase: keep str-keyed opts long enough to make `action` a str
Martin von Zweigbergk <martinvonz@google.com>
parents: 47020
diff changeset
  1241
            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
  1242
            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
  1243
                return retcode
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1244
        else:
43932
9fb9f3a5cad7 rebase: inline single-use variables passed to _definedestmap()
Martin von Zweigbergk <martinvonz@google.com>
parents: 43931
diff changeset
  1245
            # search default destination in this space
9fb9f3a5cad7 rebase: inline single-use variables passed to _definedestmap()
Martin von Zweigbergk <martinvonz@google.com>
parents: 43931
diff changeset
  1246
            # used in the 'hg pull --rebase' case, see issue 5214.
47460
c9cedb546262 rebase: use str-keyed opts in remaining places
Martin von Zweigbergk <martinvonz@google.com>
parents: 47459
diff changeset
  1247
            destspace = opts.get('_destspace')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1248
            destmap = _definedestmap(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1249
                ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1250
                repo,
45546
3d47b5c7fe8d rebase: remove redundant isinmemory argument from _origrebase()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45512
diff changeset
  1251
                rbsrt.inmemory,
47460
c9cedb546262 rebase: use str-keyed opts in remaining places
Martin von Zweigbergk <martinvonz@google.com>
parents: 47459
diff changeset
  1252
                opts.get('dest', None),
c9cedb546262 rebase: use str-keyed opts in remaining places
Martin von Zweigbergk <martinvonz@google.com>
parents: 47459
diff changeset
  1253
                opts.get('source', []),
c9cedb546262 rebase: use str-keyed opts in remaining places
Martin von Zweigbergk <martinvonz@google.com>
parents: 47459
diff changeset
  1254
                opts.get('base', []),
c9cedb546262 rebase: use str-keyed opts in remaining places
Martin von Zweigbergk <martinvonz@google.com>
parents: 47459
diff changeset
  1255
                opts.get('rev', []),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1256
                destspace=destspace,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1257
            )
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
  1258
            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
  1259
            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
  1260
                return retcode
36775
6dab3bdb1f00 rebase: only store collapse message once
Martin von Zweigbergk <martinvonz@google.com>
parents: 36774
diff changeset
  1261
            storecollapsemsg(repo, rbsrt.collapsemsg)
21027
25ee5dbebc6b rebase: tell when reopening a closed branch head
Mads Kiilerich <madski@unity3d.com>
parents: 20790
diff changeset
  1262
33569
d341677d667d rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents: 33333
diff changeset
  1263
        tr = None
33619
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
  1264
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1265
        singletr = ui.configbool(b'rebase', b'singletransaction')
33619
609606d21765 rebase: use one dirstateguard for when using rebase.singletransaction
Durham Goode <durham@fb.com>
parents: 33590
diff changeset
  1266
        if singletr:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1267
            tr = repo.transaction(b'rebase')
35480
01b084914a60 rebase: don't take out a dirstate guard for in-memory rebase
Phil Cohen <phillco@fb.com>
parents: 35434
diff changeset
  1268
01b084914a60 rebase: don't take out a dirstate guard for in-memory rebase
Phil Cohen <phillco@fb.com>
parents: 35434
diff changeset
  1269
        # 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: 35434
diff changeset
  1270
        # 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: 35434
diff changeset
  1271
        # 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
  1272
        with util.acceptintervention(tr):
50062
6526c2fb777c dirstate-guard: remove usage in `rebase`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49449
diff changeset
  1273
            rbsrt._performrebase(tr)
6526c2fb777c dirstate-guard: remove usage in `rebase`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49449
diff changeset
  1274
            if not rbsrt.dryrun:
6526c2fb777c dirstate-guard: remove usage in `rebase`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49449
diff changeset
  1275
                rbsrt._finishrebase()
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1276
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1277
44553
dc25de8117e4 rebase: remove unused defaults argument values from _definedestmap()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44452
diff changeset
  1278
def _definedestmap(ui, repo, inmemory, destf, srcf, basef, revf, destspace):
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
  1279
    """use revisions argument to define destmap {srcrev: destrev}"""
31431
406705701c2d rebase: explicitly tests for None
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31395
diff changeset
  1280
    if revf is None:
406705701c2d rebase: explicitly tests for None
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31395
diff changeset
  1281
        revf = []
31395
361bccce566a rebase: don't use mutable default argument value
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31380
diff changeset
  1282
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
  1283
    # 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
  1284
    # 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
  1285
43591
b56c6647f65e rebase: check for unfinished ops even when inmemory (issue6214)
Kyle Lippincott <spectral@google.com>
parents: 43567
diff changeset
  1286
    cmdutil.checkunfinished(repo)
37025
0782ac132a41 rebase: pass "inmemory" directly to _definedestmap()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37021
diff changeset
  1287
    if not inmemory:
35291
aa660c1203a9 rebase: do not bail on uncomitted changes if rebasing in-memory
Phil Cohen <phillco@fb.com>
parents: 35290
diff changeset
  1288
        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
  1289
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1290
    if ui.configbool(b'commands', b'rebase.requiredest') and not destf:
46632
9989a276712f errors: use more specific errors in rebase extension
Martin von Zweigbergk <martinvonz@google.com>
parents: 46362
diff changeset
  1291
        raise error.InputError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1292
            _(b'you must specify a destination'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1293
            hint=_(b'use: hg rebase -d REV'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1294
        )
31731
b5afec71c1f9 rebase: allow destination-free continue and abort (issue5513)
Ryan McElroy <rmcelroy@fb.com>
parents: 31621
diff changeset
  1295
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1296
    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
  1297
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
  1298
    if revf:
48116
5ced12cfa41b errors: raise InputError on bad revset to revrange() iff provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 47793
diff changeset
  1299
        rebaseset = logcmdutil.revrange(repo, revf)
28136
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
  1300
        if not rebaseset:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1301
            ui.status(_(b'empty "rev" revision set - nothing to rebase\n'))
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
  1302
            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
  1303
    elif srcf:
48116
5ced12cfa41b errors: raise InputError on bad revset to revrange() iff provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 47793
diff changeset
  1304
        src = logcmdutil.revrange(repo, srcf)
28136
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
  1305
        if not src:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1306
            ui.status(_(b'empty "source" revision set - nothing to rebase\n'))
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
  1307
            return None
44555
05654ea5137c rebase: accept multiple --source arguments (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 44554
diff changeset
  1308
        # `+  (%ld)` to work around `wdir()::` being empty
05654ea5137c rebase: accept multiple --source arguments (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 44554
diff changeset
  1309
        rebaseset = repo.revs(b'(%ld):: + (%ld)', src, src)
28136
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
  1310
    else:
48116
5ced12cfa41b errors: raise InputError on bad revset to revrange() iff provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 47793
diff changeset
  1311
        base = logcmdutil.revrange(repo, basef or [b'.'])
28136
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
  1312
        if not base:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1313
            ui.status(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1314
                _(b'empty "base" revision set - ' b"can't compute rebase set\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1315
            )
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
  1316
            return None
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1317
        if destf:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1318
            # --base does not support multiple destinations
48118
5105a9975407 errors: raise InputError from revsingle() iff revset provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48116
diff changeset
  1319
            dest = logcmdutil.revsingle(repo, destf)
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1320
        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
  1321
            dest = repo[_destrebase(repo, base, destspace=destspace)]
36475
7b84b737352d py3: replace str() calls with their preferred bytes equivalent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36405
diff changeset
  1322
            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
  1323
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1324
        roots = []  # selected children of branching points
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1325
        bpbase = {}  # {branchingpoint: [origbase]}
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1326
        for b in base:  # group bases by branching points
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1327
            bp = repo.revs(b'ancestor(%d, %d)', b, dest.rev()).first()
30580
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
  1328
            bpbase[bp] = bpbase.get(bp, []) + [b]
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
  1329
        if None in bpbase:
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
  1330
            # emulate the old behavior, showing "nothing to rebase" (a better
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
  1331
            # behavior may be abort with "cannot find branching point" error)
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
  1332
            bpbase.clear()
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
  1333
        for bp, bs in bpbase.items():  # calculate roots
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1334
            roots += list(repo.revs(b'children(%d) & ancestors(%ld)', bp, bs))
30580
51e7c83e05ee rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents: 30495
diff changeset
  1335
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1336
        rebaseset = repo.revs(b'%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
  1337
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
  1338
        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
  1339
            # 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
  1340
            # 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
  1341
            # smartset.
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
  1342
            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
  1343
                if basef:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1344
                    ui.status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1345
                        _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1346
                            b'nothing to rebase - %s is both "base"'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1347
                            b' and destination\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1348
                        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1349
                        % dest
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1350
                    )
28136
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
  1351
                else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1352
                    ui.status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1353
                        _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1354
                            b'nothing to rebase - working directory '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1355
                            b'parent is also destination\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1356
                        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1357
                    )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1358
            elif not repo.revs(b'%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
  1359
                if basef:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1360
                    ui.status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1361
                        _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1362
                            b'nothing to rebase - "base" %s is '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1363
                            b'already an ancestor of destination '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1364
                            b'%s\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1365
                        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1366
                        % (b'+'.join(bytes(repo[r]) for r in base), dest)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1367
                    )
28136
5853878bbc2a rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28122
diff changeset
  1368
                else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1369
                    ui.status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1370
                        _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1371
                            b'nothing to rebase - working '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1372
                            b'directory parent is already an '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1373
                            b'ancestor of destination %s\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1374
                        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1375
                        % dest
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1376
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1377
            else:  # can it happen?
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1378
                ui.status(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1379
                    _(b'nothing to rebase from %s to %s\n')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1380
                    % (b'+'.join(bytes(repo[r]) for r in base), dest)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1381
                )
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
  1382
            return None
36975
795eb53f1d3e rebase: allow in-memory merge of the working copy parent
Martin von Zweigbergk <martinvonz@google.com>
parents: 36960
diff changeset
  1383
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 46030
diff changeset
  1384
    if wdirrev in rebaseset:
46632
9989a276712f errors: use more specific errors in rebase extension
Martin von Zweigbergk <martinvonz@google.com>
parents: 46362
diff changeset
  1385
        raise error.InputError(_(b'cannot rebase the working copy'))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1386
    rebasingwcp = repo[b'.'].rev() in rebaseset
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1387
    ui.log(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1388
        b"rebase",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1389
        b"rebasing working copy parent: %r\n",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1390
        rebasingwcp,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1391
        rebase_rebasing_wcp=rebasingwcp,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1392
    )
37025
0782ac132a41 rebase: pass "inmemory" directly to _definedestmap()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37021
diff changeset
  1393
    if inmemory and rebasingwcp:
35332
03bec089e105 rebase: disable `inmemory` if the rebaseset contains the working copy
Phil Cohen <phillco@fb.com>
parents: 35320
diff changeset
  1394
        # Check these since we did not before.
03bec089e105 rebase: disable `inmemory` if the rebaseset contains the working copy
Phil Cohen <phillco@fb.com>
parents: 35320
diff changeset
  1395
        cmdutil.checkunfinished(repo)
03bec089e105 rebase: disable `inmemory` if the rebaseset contains the working copy
Phil Cohen <phillco@fb.com>
parents: 35320
diff changeset
  1396
        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
  1397
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
  1398
    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
  1399
        dest = repo[_destrebase(repo, rebaseset, destspace=destspace)]
36475
7b84b737352d py3: replace str() calls with their preferred bytes equivalent
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36405
diff changeset
  1400
        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
  1401
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1402
    allsrc = revsetlang.formatspec(b'%ld', rebaseset)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1403
    alias = {b'ALLSRC': allsrc}
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1404
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1405
    if dest is None:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1406
        try:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1407
            # fast path: try to resolve dest without SRC alias
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1408
            dest = scmutil.revsingle(repo, destf, localalias=alias)
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1409
        except error.RepoLookupError:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1410
            # multi-dest path: resolve dest for each SRC separately
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1411
            destmap = {}
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1412
            for r in rebaseset:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1413
                alias[b'SRC'] = revsetlang.formatspec(b'%d', r)
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1414
                # use repo.anyrevs instead of scmutil.revsingle because we
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1415
                # don't want to abort if destset is empty.
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1416
                destset = repo.anyrevs([destf], user=True, localalias=alias)
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1417
                size = len(destset)
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1418
                if size == 1:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1419
                    destmap[r] = destset.first()
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1420
                elif size == 0:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1421
                    ui.note(_(b'skipping %s - empty destination\n') % repo[r])
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1422
                else:
46632
9989a276712f errors: use more specific errors in rebase extension
Martin von Zweigbergk <martinvonz@google.com>
parents: 46362
diff changeset
  1423
                    raise error.InputError(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43105
diff changeset
  1424
                        _(b'rebase destination for %s is not unique') % repo[r]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1425
                    )
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1426
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1427
    if dest is not None:
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1428
        # single-dest case: assign dest to each rev in rebaseset
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1429
        destrev = dest.rev()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1430
        destmap = {r: destrev for r in rebaseset}  # {srcrev: destrev}
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1431
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1432
    if not destmap:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1433
        ui.status(_(b'nothing to rebase - empty destination\n'))
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1434
        return None
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
  1435
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
  1436
    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
  1437
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1438
32248
b47e6b0ba6ca rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents: 32175
diff changeset
  1439
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
  1440
    """Return the revision that should be used as the second parent
32248
b47e6b0ba6ca rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents: 32175
diff changeset
  1441
    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
  1442
    Abort if there is more than one parent.
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
  1443
    """
19955
2160c2e0d7d1 rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents: 19951
diff changeset
  1444
    parents = set()
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
  1445
    source = min(state)
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
  1446
    for rev in state:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
  1447
        if rev == source:
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
  1448
            continue
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
  1449
        for p in repo[rev].parents():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1450
            if p.rev() not in state 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
  1451
                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
  1452
    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
  1453
        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
  1454
    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
  1455
        return parents.pop()
46632
9989a276712f errors: use more specific errors in rebase extension
Martin von Zweigbergk <martinvonz@google.com>
parents: 46362
diff changeset
  1456
    raise error.StateError(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1457
        _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1458
            b'unable to collapse on top of %d, there is more '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1459
            b'than one external parent: %s'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1460
        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1461
        % (max(destancestors), b', '.join(b"%d" % p for p in sorted(parents)))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1462
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1463
10351
38fe86fb16e3 rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 10263
diff changeset
  1464
44349
cd43cae79f25 rebase: remove some now-unused parent arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 44348
diff changeset
  1465
def commitmemorynode(repo, wctx, editor, extra, user, date, commitmsg):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45792
diff changeset
  1466
    """Commit the memory changes with parents p1 and p2.
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45792
diff changeset
  1467
    Return node of committed revision."""
37040
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
  1468
    # 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: 37039
diff changeset
  1469
    # ``branch`` (used when passing ``--keepbranches``).
44050
2ecbc4ec87d8 overlayworkingctx: default branch to base context's branch
Martin von Zweigbergk <martinvonz@google.com>
parents: 43978
diff changeset
  1470
    branch = None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1471
    if b'branch' in extra:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1472
        branch = extra[b'branch']
35319
228916ca12b5 rebase: add concludememorynode(), and call it when rebasing in-memory
Phil Cohen <phillco@fb.com>
parents: 35318
diff changeset
  1473
45229
0ea08126a2af rebase: fix regression in file change detection introduced by 0ecb3b11fcad
Manuel Jacob <me@manueljacob.de>
parents: 45151
diff changeset
  1474
    # FIXME: We call _compact() because it's required to correctly detect
0ea08126a2af rebase: fix regression in file change detection introduced by 0ecb3b11fcad
Manuel Jacob <me@manueljacob.de>
parents: 45151
diff changeset
  1475
    # changed files. This was added to fix a regression shortly before the 5.5
0ea08126a2af rebase: fix regression in file change detection introduced by 0ecb3b11fcad
Manuel Jacob <me@manueljacob.de>
parents: 45151
diff changeset
  1476
    # release. A proper fix will be done in the default branch.
0ea08126a2af rebase: fix regression in file change detection introduced by 0ecb3b11fcad
Manuel Jacob <me@manueljacob.de>
parents: 45151
diff changeset
  1477
    wctx._compact()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1478
    memctx = wctx.tomemctx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1479
        commitmsg,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1480
        date=date,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1481
        extra=extra,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1482
        user=user,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1483
        branch=branch,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1484
        editor=editor,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1485
    )
45090
0ecb3b11fcad rebase: correctly check for empty commit in in-memory mode
Manuel Jacob <me@manueljacob.de>
parents: 45087
diff changeset
  1486
    if memctx.isempty() and not repo.ui.configbool(b'ui', b'allowemptycommit'):
0ecb3b11fcad rebase: correctly check for empty commit in in-memory mode
Manuel Jacob <me@manueljacob.de>
parents: 45087
diff changeset
  1487
        return None
37040
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
  1488
    commitres = repo.commitctx(memctx)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1489
    wctx.clean()  # Might be reused
37040
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
  1490
    return commitres
35319
228916ca12b5 rebase: add concludememorynode(), and call it when rebasing in-memory
Phil Cohen <phillco@fb.com>
parents: 35318
diff changeset
  1491
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1492
44349
cd43cae79f25 rebase: remove some now-unused parent arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 44348
diff changeset
  1493
def commitnode(repo, editor, extra, user, date, commitmsg):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45792
diff changeset
  1494
    """Commit the wd changes with parents p1 and p2.
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45792
diff changeset
  1495
    Return node of committed revision."""
50063
a9562ea222be dirstate-guard: replace a usage in `rebase` with a transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50062
diff changeset
  1496
    tr = util.nullcontextmanager
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1497
    if not repo.ui.configbool(b'rebase', b'singletransaction'):
50063
a9562ea222be dirstate-guard: replace a usage in `rebase` with a transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50062
diff changeset
  1498
        tr = lambda: repo.transaction(b'rebase')
a9562ea222be dirstate-guard: replace a usage in `rebase` with a transaction
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50062
diff changeset
  1499
    with tr():
37040
b8d305bd12ca rebase: move config override out of conclude[memory]node()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37039
diff changeset
  1500
        # Commit might fail if unresolved files exist
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1501
        newnode = repo.commit(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1502
            text=commitmsg, user=user, date=date, extra=extra, editor=editor
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1503
        )
22038
021becbf024a rebase: do not retract phase boundary by hand
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22004
diff changeset
  1504
50259
a44e489940e0 branch: pass current transaction when writing branch in rebase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50107
diff changeset
  1505
        repo.dirstate.setbranch(
a44e489940e0 branch: pass current transaction when writing branch in rebase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50107
diff changeset
  1506
            repo[newnode].branch(), repo.currenttransaction()
a44e489940e0 branch: pass current transaction when writing branch in rebase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50107
diff changeset
  1507
        )
33120
b63351f6a246 rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32084
diff changeset
  1508
        return newnode
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1509
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1510
45547
2dcf595f6985 rebase: when collapsing, p1 == dest, so use the former only
Martin von Zweigbergk <martinvonz@google.com>
parents: 45546
diff changeset
  1511
def rebasenode(repo, rev, p1, p2, base, collapse, wctx):
43787
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43591
diff changeset
  1512
    """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
  1513
    # Merge phase
32248
b47e6b0ba6ca rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents: 32175
diff changeset
  1514
    # Update to destination and merge it with local
44094
521b4e3a42d7 rebase: extract a variable for a repeated `repo[p1]`
Martin von Zweigbergk <martinvonz@google.com>
parents: 44092
diff changeset
  1515
    p1ctx = repo[p1]
35317
5c25fe7fb1e6 rebase: do not update if IMM; instead, set the overlaywctx's parents
Phil Cohen <phillco@fb.com>
parents: 35316
diff changeset
  1516
    if wctx.isinmemory():
44094
521b4e3a42d7 rebase: extract a variable for a repeated `repo[p1]`
Martin von Zweigbergk <martinvonz@google.com>
parents: 44092
diff changeset
  1517
        wctx.setbase(p1ctx)
50107
cad3a68c0e0c rebase: scope parent change into a changing_parents context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50063
diff changeset
  1518
        scope = util.nullcontextmanager
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1519
    else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1520
        if repo[b'.'].rev() != p1:
44094
521b4e3a42d7 rebase: extract a variable for a repeated `repo[p1]`
Martin von Zweigbergk <martinvonz@google.com>
parents: 44092
diff changeset
  1521
            repo.ui.debug(b" update to %d:%s\n" % (p1, p1ctx))
44270
f546d2170b0f merge: introduce a clean_update() for that use-case
Martin von Zweigbergk <martinvonz@google.com>
parents: 44239
diff changeset
  1522
            mergemod.clean_update(p1ctx)
35317
5c25fe7fb1e6 rebase: do not update if IMM; instead, set the overlaywctx's parents
Phil Cohen <phillco@fb.com>
parents: 35316
diff changeset
  1523
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1524
            repo.ui.debug(b" already in destination\n")
50107
cad3a68c0e0c rebase: scope parent change into a changing_parents context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50063
diff changeset
  1525
        scope = lambda: repo.dirstate.changing_parents(repo)
35410
83014fa95435 rebase: fix for hgsubversion
Phil Cohen <phillco@fb.com>
parents: 35388
diff changeset
  1526
        # This is, alas, necessary to invalidate workingctx's manifest cache,
83014fa95435 rebase: fix for hgsubversion
Phil Cohen <phillco@fb.com>
parents: 35388
diff changeset
  1527
        # as well as other data we litter on it in other places.
83014fa95435 rebase: fix for hgsubversion
Phil Cohen <phillco@fb.com>
parents: 35388
diff changeset
  1528
        wctx = repo[None]
35317
5c25fe7fb1e6 rebase: do not update if IMM; instead, set the overlaywctx's parents
Phil Cohen <phillco@fb.com>
parents: 35316
diff changeset
  1529
        repo.dirstate.write(repo.currenttransaction())
44090
2f0a44c69e07 copies: replace duplicatecopies() by function that takes contexts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44053
diff changeset
  1530
    ctx = repo[rev]
2f0a44c69e07 copies: replace duplicatecopies() by function that takes contexts
Martin von Zweigbergk <martinvonz@google.com>
parents: 44053
diff changeset
  1531
    repo.ui.debug(b" merge against %d:%s\n" % (rev, ctx))
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
  1532
    if base is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1533
        repo.ui.debug(b"   detach base %d:%s\n" % (base, repo[base]))
44095
e733c59f3c09 rebase: fix bug where `--collapse` would apply diff on missing file
Martin von Zweigbergk <martinvonz@google.com>
parents: 44094
diff changeset
  1534
50107
cad3a68c0e0c rebase: scope parent change into a changing_parents context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50063
diff changeset
  1535
    with scope():
cad3a68c0e0c rebase: scope parent change into a changing_parents context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50063
diff changeset
  1536
        # See explanation in merge.graft()
cad3a68c0e0c rebase: scope parent change into a changing_parents context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50063
diff changeset
  1537
        mergeancestor = repo.changelog.isancestor(p1ctx.node(), ctx.node())
cad3a68c0e0c rebase: scope parent change into a changing_parents context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50063
diff changeset
  1538
        stats = mergemod._update(
cad3a68c0e0c rebase: scope parent change into a changing_parents context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50063
diff changeset
  1539
            repo,
cad3a68c0e0c rebase: scope parent change into a changing_parents context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50063
diff changeset
  1540
            rev,
cad3a68c0e0c rebase: scope parent change into a changing_parents context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50063
diff changeset
  1541
            branchmerge=True,
cad3a68c0e0c rebase: scope parent change into a changing_parents context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50063
diff changeset
  1542
            force=True,
cad3a68c0e0c rebase: scope parent change into a changing_parents context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50063
diff changeset
  1543
            ancestor=base,
cad3a68c0e0c rebase: scope parent change into a changing_parents context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50063
diff changeset
  1544
            mergeancestor=mergeancestor,
cad3a68c0e0c rebase: scope parent change into a changing_parents context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50063
diff changeset
  1545
            labels=[b'dest', b'source', b'parent of source'],
cad3a68c0e0c rebase: scope parent change into a changing_parents context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50063
diff changeset
  1546
            wc=wctx,
cad3a68c0e0c rebase: scope parent change into a changing_parents context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50063
diff changeset
  1547
        )
cad3a68c0e0c rebase: scope parent change into a changing_parents context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50063
diff changeset
  1548
        wctx.setparents(p1ctx.node(), repo[p2].node())
cad3a68c0e0c rebase: scope parent change into a changing_parents context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50063
diff changeset
  1549
        if collapse:
cad3a68c0e0c rebase: scope parent change into a changing_parents context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50063
diff changeset
  1550
            copies.graftcopies(wctx, ctx, p1ctx)
cad3a68c0e0c rebase: scope parent change into a changing_parents context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50063
diff changeset
  1551
        else:
cad3a68c0e0c rebase: scope parent change into a changing_parents context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50063
diff changeset
  1552
            # If we're not using --collapse, we need to
cad3a68c0e0c rebase: scope parent change into a changing_parents context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50063
diff changeset
  1553
            # duplicate copies between the revision we're
cad3a68c0e0c rebase: scope parent change into a changing_parents context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50063
diff changeset
  1554
            # rebasing and its first parent.
cad3a68c0e0c rebase: scope parent change into a changing_parents context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50063
diff changeset
  1555
            copies.graftcopies(wctx, ctx, ctx.p1())
45549
e9468f14379a rebase: move check for unresolved conflicts into lower-level rebasenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45548
diff changeset
  1556
e9468f14379a rebase: move check for unresolved conflicts into lower-level rebasenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45548
diff changeset
  1557
    if stats.unresolvedcount > 0:
e9468f14379a rebase: move check for unresolved conflicts into lower-level rebasenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45548
diff changeset
  1558
        if wctx.isinmemory():
e9468f14379a rebase: move check for unresolved conflicts into lower-level rebasenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45548
diff changeset
  1559
            raise error.InMemoryMergeConflictsError()
e9468f14379a rebase: move check for unresolved conflicts into lower-level rebasenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45548
diff changeset
  1560
        else:
e9468f14379a rebase: move check for unresolved conflicts into lower-level rebasenode()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45548
diff changeset
  1561
            raise error.ConflictResolutionRequired(b'rebase')
6923
ebf1462f2145 strip trailing whitespace, replace tabs by spaces
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6906
diff changeset
  1562
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1563
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
  1564
def adjustdest(repo, rev, destmap, state, skipped):
41533
0f64091cc851 global: make some docstrings raw strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41365
diff changeset
  1565
    r"""adjust rebase destination given the current rebase state
33590
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1566
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1567
    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
  1568
    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
  1569
    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
  1570
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1571
    For example, when doing rebasing B+E to F, C to G, rebase will first move B
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1572
    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
  1573
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1574
        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
  1575
        |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1576
        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
  1577
        |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1578
        | 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
  1579
        | |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1580
        | 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
  1581
        | |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1582
        | 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
  1583
        | |
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1584
        | 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
  1585
        | |
34005
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1586
        | B <- rebased as B1     C'
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1587
        |/                       |
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 34004
diff changeset
  1588
        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
  1589
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1590
    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
  1591
    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
  1592
    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
  1593
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1594
            H       C1 G1
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1595
           /|       | /
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1596
          F G       |/
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1597
        K | |  ->   K
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1598
        | C D       |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1599
        | |/        |
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1600
        | B         | ...
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1601
        |/          |/
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1602
        A           A
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1603
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1604
    Besides, adjust dest according to existing rebase information. For example,
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1605
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1606
      B C D    B needs to be rebased on top of C, C needs to be rebased on top
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1607
       \|/     of D. We will rebase C first.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1608
        A
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1609
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1610
          C'   After rebasing C, when considering B's destination, use C'
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1611
          |    instead of the original C.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1612
      B   D
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1613
       \ /
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1614
        A
33590
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1615
    """
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
  1616
    # pick already rebased revs with same dest from state as interesting source
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
  1617
    dest = destmap[rev]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1618
    source = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1619
        s
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1620
        for s, d in state.items()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1621
        if d > 0 and destmap[s] == dest and s not in skipped
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1622
    ]
33849
3ae2eaecb49e rebase: optimize "source" calculation in adjustdest
Jun Wu <quark@fb.com>
parents: 33848
diff changeset
  1623
33590
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1624
    result = []
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1625
    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
  1626
        adjusted = dest
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1627
        if prev != nullrev:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1628
            candidate = repo.revs(b'max(%ld and (::%d))', source, prev).first()
33590
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1629
            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
  1630
                adjusted = state[candidate]
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1631
        if adjusted == dest and dest in state:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1632
            adjusted = state[dest]
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1633
            if adjusted == revtodo:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1634
                # sortsource should produce an order that makes this impossible
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1635
                raise error.ProgrammingError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1636
                    b'rev %d should be rebased already at this time' % dest
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1637
                )
33590
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1638
        result.append(adjusted)
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1639
    return result
52f82e7d6a7e rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents: 33569
diff changeset
  1640
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1641
33846
3b04a6ff625c rebase: remove rebaseset from _checkobsrebase
Jun Wu <quark@fb.com>
parents: 33845
diff changeset
  1642
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
  1643
    """
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1644
    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
  1645
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1646
    `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
  1647
    `rebaseobsskipped`: set of revisions from source skipped because they have
35995
b7e2cf114e85 rebase: do not consider extincts for divergence detection (issue5782)
Denis Laxalde <denis@laxalde.org>
parents: 35994
diff changeset
  1648
    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
  1649
    """
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1650
    # Obsolete node with successors not in dest leads to divergence
47793
0044a7ad9f2f rebase: use obsolete.isenabled() to check for experimental.allowdivergence
Anton Shestakov <av6@dwimlabs.net>
parents: 47460
diff changeset
  1651
    divergenceok = obsolete.isenabled(repo, obsolete.allowdivergenceopt)
28685
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1652
    divergencebasecandidates = rebaseobsrevs - rebaseobsskipped
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1653
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1654
    if divergencebasecandidates and not divergenceok:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1655
        divhashes = (bytes(repo[r]) for r in divergencebasecandidates)
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43105
diff changeset
  1656
        msg = _(b"this rebase will cause divergences from: %s")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1657
        h = _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1658
            b"to force the rebase please set "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1659
            b"experimental.evolution.allowdivergence=True"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1660
        )
46632
9989a276712f errors: use more specific errors in rebase extension
Martin von Zweigbergk <martinvonz@google.com>
parents: 46362
diff changeset
  1661
        raise error.StateError(msg % (b",".join(divhashes),), hint=h)
28685
6c4d23fe611c rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents: 28429
diff changeset
  1662
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1663
34095
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34094
diff changeset
  1664
def successorrevs(unfi, rev):
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1665
    """yield revision numbers for successors of rev"""
34095
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34094
diff changeset
  1666
    assert unfi.filtername is None
43566
054846d213ba index: use `index.get_rev` in `rebase.successorrevs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43506
diff changeset
  1667
    get_rev = unfi.changelog.index.get_rev
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1668
    for s in obsutil.allsuccessors(unfi.obsstore, [unfi[rev].node()]):
43566
054846d213ba index: use `index.get_rev` in `rebase.successorrevs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43506
diff changeset
  1669
        r = get_rev(s)
054846d213ba index: use `index.get_rev` in `rebase.successorrevs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43506
diff changeset
  1670
        if r is not None:
054846d213ba index: use `index.get_rev` in `rebase.successorrevs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43506
diff changeset
  1671
            yield r
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1672
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1673
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
  1674
def defineparents(repo, rev, destmap, state, skipped, obsskipped):
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1675
    """Return new parents and optionally a merge base for rev being rebased
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1676
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1677
    The destination specified by "dest" cannot always be used directly because
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1678
    previously rebase result could affect destination. For example,
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1679
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1680
          D E    rebase -r C+D+E -d B
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1681
          |/     C will be rebased to C'
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1682
        B C      D's new destination will be C' instead of B
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1683
        |/       E's new destination will be C' instead of B
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1684
        A
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1685
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1686
    The new parents of a merge is slightly more complicated. See the comment
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1687
    block below.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1688
    """
34092
8a8e7a94ba07 rebase: do not crash rebasing merge with a parent having hidden successor
Jun Wu <quark@fb.com>
parents: 34009
diff changeset
  1689
    # use unfiltered changelog since successorrevs may return filtered nodes
34095
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34094
diff changeset
  1690
    assert repo.filtername is None
7471193be725 rebase: remove unnecessary '.unfiltered()' calls
Jun Wu <quark@fb.com>
parents: 34094
diff changeset
  1691
    cl = repo.changelog
38666
a06b2b032557 revlog: introduce a isancestorrev() and use it in rebase
Martin von Zweigbergk <martinvonz@google.com>
parents: 38546
diff changeset
  1692
    isancestor = cl.isancestorrev
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1693
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
  1694
    dest = destmap[rev]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1695
    oldps = repo.changelog.parentrevs(rev)  # old parents
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1696
    newps = [nullrev, nullrev]  # new parents
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
  1697
    dests = adjustdest(repo, rev, destmap, state, skipped)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1698
    bases = list(oldps)  # merge base candidates, initially just old parents
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1699
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1700
    if all(r == nullrev for r in oldps[1:]):
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1701
        # For non-merge changeset, just move p to adjusted dest as requested.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1702
        newps[0] = dests[0]
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1703
    else:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1704
        # For merge changeset, if we move p to dests[i] unconditionally, both
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1705
        # parents may change and the end result looks like "the merge loses a
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1706
        # parent", which is a surprise. This is a limit because "--dest" only
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1707
        # accepts one dest per src.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1708
        #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1709
        # Therefore, only move p with reasonable conditions (in this order):
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1710
        #   1. use dest, if dest is a descendent of (p or one of p's successors)
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1711
        #   2. use p's rebased result, if p is rebased (state[p] > 0)
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1712
        #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1713
        # Comparing with adjustdest, the logic here does some additional work:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1714
        #   1. decide which parents will not be moved towards dest
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1715
        #   2. if the above decision is "no", should a parent still be moved
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1716
        #      because it was rebased?
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1717
        #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1718
        # For example:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1719
        #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1720
        #     C    # "rebase -r C -d D" is an error since none of the parents
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1721
        #    /|    # can be moved. "rebase -r B+C -d D" will move C's parent
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1722
        #   A B D  # B (using rule "2."), since B will be rebased.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1723
        #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1724
        # The loop tries to be not rely on the fact that a Mercurial node has
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1725
        # at most 2 parents.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1726
        for i, p in enumerate(oldps):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1727
            np = p  # new parent
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1728
            if any(isancestor(x, dests[i]) for x in successorrevs(repo, p)):
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1729
                np = dests[i]
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1730
            elif p in state and state[p] > 0:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1731
                np = state[p]
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
  1732
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1733
            # If one parent becomes an ancestor of the other, drop the ancestor
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1734
            for j, x in enumerate(newps[:i]):
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1735
                if x == nullrev:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1736
                    continue
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1737
                if isancestor(np, x):  # CASE-1
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1738
                    np = nullrev
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1739
                elif isancestor(x, np):  # CASE-2
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1740
                    newps[j] = np
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1741
                    np = nullrev
33863
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1742
                    # New parents forming an ancestor relationship does not
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1743
                    # mean the old parents have a similar relationship. Do not
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1744
                    # set bases[x] to nullrev.
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1745
                    bases[j], bases[i] = bases[i], bases[j]
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1746
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1747
            newps[i] = np
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1748
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1749
        # "rebasenode" updates to new p1, and the old p1 will be used as merge
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1750
        # base. If only p2 changes, merging using unchanged p1 as merge base is
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1751
        # suboptimal. Therefore swap parents to make the merge sane.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1752
        if newps[1] != nullrev and oldps[0] == newps[0]:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1753
            assert len(newps) == 2 and len(oldps) == 2
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1754
            newps.reverse()
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1755
            bases.reverse()
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1756
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1757
        # No parent change might be an error because we fail to make rev a
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1758
        # descendent of requested dest. This can happen, for example:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1759
        #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1760
        #     C    # rebase -r C -d D
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1761
        #    /|    # None of A and B will be changed to D and rebase fails.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1762
        #   A B D
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1763
        if set(newps) == set(oldps) and dest not in newps:
46632
9989a276712f errors: use more specific errors in rebase extension
Martin von Zweigbergk <martinvonz@google.com>
parents: 46362
diff changeset
  1764
            raise error.InputError(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1765
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1766
                    b'cannot rebase %d:%s without '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1767
                    b'moving at least one of its parents'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1768
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1769
                % (rev, repo[rev])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1770
            )
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1771
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1772
    # Source should not be ancestor of dest. The check here guarantees it's
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1773
    # impossible. With multi-dest, the initial check does not cover complex
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1774
    # cases since we don't have abstractions to dry-run rebase cheaply.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1775
    if any(p != nullrev and isancestor(rev, p) for p in newps):
46632
9989a276712f errors: use more specific errors in rebase extension
Martin von Zweigbergk <martinvonz@google.com>
parents: 46362
diff changeset
  1776
        raise error.InputError(_(b'source is ancestor of destination'))
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1777
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1778
    # Check if the merge will contain unwanted changes. That may happen if
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1779
    # there are multiple special (non-changelog ancestor) merge bases, which
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1780
    # cannot be handled well by the 3-way merge algorithm. For example:
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1781
    #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1782
    #     F
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1783
    #    /|
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1784
    #   D E  # "rebase -r D+E+F -d Z", when rebasing F, if "D" was chosen
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1785
    #   | |  # as merge base, the difference between D and F will include
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1786
    #   B C  # C, so the rebased F will contain C surprisingly. If "E" was
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1787
    #   |/   #  chosen, the rebased F will contain B.
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1788
    #   A Z
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1789
    #
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1790
    # But our merge base candidates (D and E in above case) could still be
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1791
    # better than the default (ancestor(F, Z) == null). Therefore still
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1792
    # pick one (so choose p1 above).
44341
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  1793
    if sum(1 for b in set(bases) if b != nullrev and b not in newps) > 1:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1794
        unwanted = [None, None]  # unwanted[i]: unwanted revs if choose bases[i]
33863
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1795
        for i, base in enumerate(bases):
44341
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  1796
            if base == nullrev or base in newps:
33863
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1797
                continue
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1798
            # Revisions in the side (not chosen as merge base) branch that
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1799
            # might contain "surprising" contents
44167
4263aaab651d rebase: clarify a little by calculating a set in Python instead of in revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 44095
diff changeset
  1800
            other_bases = set(bases) - {base}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1801
            siderevs = list(
44167
4263aaab651d rebase: clarify a little by calculating a set in Python instead of in revset
Martin von Zweigbergk <martinvonz@google.com>
parents: 44095
diff changeset
  1802
                repo.revs(b'(%ld %% (%d+%d))', other_bases, base, dest)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1803
            )
23484
cf3495dfd7ed rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents: 23461
diff changeset
  1804
33863
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1805
            # If those revisions are covered by rebaseset, the result is good.
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1806
            # A merge in rebaseset would be considered to cover its ancestors.
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1807
            if siderevs:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1808
                rebaseset = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1809
                    r for r, d in state.items() if d > 0 and r not in obsskipped
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1810
                ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1811
                merges = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1812
                    r for r in rebaseset if cl.parentrevs(r)[1] != nullrev
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1813
                ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1814
                unwanted[i] = list(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1815
                    repo.revs(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1816
                        b'%ld - (::%ld) - %ld', siderevs, merges, rebaseset
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1817
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1818
                )
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1819
44341
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  1820
        if any(revs is not None for revs in unwanted):
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  1821
            # Choose a merge base that has a minimal number of unwanted revs.
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  1822
            l, i = min(
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  1823
                (len(revs), i)
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  1824
                for i, revs in enumerate(unwanted)
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  1825
                if revs is not None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1826
            )
33863
3160876c6e4e rebase: choose merge base without unwanted revisions
Jun Wu <quark@fb.com>
parents: 33849
diff changeset
  1827
44341
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  1828
            # The merge will include unwanted revisions. Abort now. Revisit this if
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  1829
            # we have a more advanced merge algorithm that handles multiple bases.
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  1830
            if l > 0:
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  1831
                unwanteddesc = _(b' or ').join(
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  1832
                    (
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  1833
                        b', '.join(b'%d:%s' % (r, repo[r]) for r in revs)
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  1834
                        for revs in unwanted
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  1835
                        if revs is not None
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  1836
                    )
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  1837
                )
46632
9989a276712f errors: use more specific errors in rebase extension
Martin von Zweigbergk <martinvonz@google.com>
parents: 46362
diff changeset
  1838
                raise error.InputError(
44341
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  1839
                    _(b'rebasing %d:%s will include unwanted changes from %s')
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  1840
                    % (rev, repo[rev], unwanteddesc)
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  1841
                )
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  1842
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  1843
            # newps[0] should match merge base if possible. Currently, if newps[i]
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  1844
            # is nullrev, the only case is newps[i] and newps[j] (j < i), one is
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  1845
            # the other's ancestor. In that case, it's fine to not swap newps here.
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  1846
            # (see CASE-1 and CASE-2 above)
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  1847
            if i != 0:
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  1848
                if newps[i] != nullrev:
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  1849
                    newps[0], newps[i] = newps[i], newps[0]
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  1850
                bases[0], bases[i] = bases[i], bases[0]
44214
3d2de64c49d2 rebase: define base in only place in defineparents()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44194
diff changeset
  1851
3d2de64c49d2 rebase: define base in only place in defineparents()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44194
diff changeset
  1852
    # "rebasenode" updates to new p1, use the corresponding merge base.
44341
77bb38be00ea rebase: always be graft-like, not merge-like, also for merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 44270
diff changeset
  1853
    base = bases[0]
44168
1cb7ae9b0071 rebase: move some variables after an error cases where they're not needed
Martin von Zweigbergk <martinvonz@google.com>
parents: 44167
diff changeset
  1854
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1855
    repo.ui.debug(b" future parents are %d and %d\n" % tuple(newps))
33786
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1856
0975506120fb rebase: rewrite core algorithm (issue5578) (issue5630)
Jun Wu <quark@fb.com>
parents: 33736
diff changeset
  1857
    return newps[0], newps[1], base
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1858
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1859
7955
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
  1860
def isagitpatch(repo, patchname):
43787
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43591
diff changeset
  1861
    """Return true if the given patch is in git format"""
7955
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
  1862
    mqpatch = os.path.join(repo.mq.path, patchname)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1863
    for line in patch.linereader(open(mqpatch, b'rb')):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1864
        if line.startswith(b'diff --git'):
7955
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
  1865
            return True
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
  1866
    return False
c3d4ff03ec72 rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 7954
diff changeset
  1867
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1868
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1869
def updatemq(repo, state, skipped, **opts):
43787
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43591
diff changeset
  1870
    """Update rebased mq patches - finalize and then import them"""
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1871
    mqrebase = {}
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
  1872
    mq = repo.mq
14572
8ff2957c1d82 mq: rename full_series to fullseries
Adrian Buehlmann <adrian@cadifra.com>
parents: 14509
diff changeset
  1873
    original_series = mq.fullseries[:]
16531
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
  1874
    skippedpatches = set()
14497
ea585f2b1adc rebase: restore mq guards after rebasing (issue2107)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 13894
diff changeset
  1875
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
  1876
    for p in mq.applied:
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
  1877
        rev = repo[p.node].rev()
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
  1878
        if rev in state:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1879
            repo.ui.debug(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1880
                b'revision %d is an mq patch (%s), finalize it.\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1881
                % (rev, p.name)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1882
            )
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
  1883
            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
  1884
        else:
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
  1885
            # 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
  1886
            skippedpatches.add(p.name)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1887
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1888
    if mqrebase:
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
  1889
        mq.finish(repo, mqrebase.keys())
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1890
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1891
        # 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
  1892
        for rev in sorted(mqrebase, reverse=True):
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1893
            if rev not in skipped:
11537
0a044e5ff489 rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11531
diff changeset
  1894
                name, isgit = mqrebase[rev]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1895
                repo.ui.note(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1896
                    _(b'updating mq patch %s to %d:%s\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1897
                    % (name, state[rev], repo[state[rev]])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1898
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1899
                mq.qimport(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1900
                    repo,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1901
                    (),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1902
                    patchname=name,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1903
                    git=isgit,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1904
                    rev=[b"%d" % state[rev]],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1905
                )
16531
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
  1906
            else:
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
  1907
                # Rebased and skipped
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
  1908
                skippedpatches.add(mqrebase[rev][0])
14497
ea585f2b1adc rebase: restore mq guards after rebasing (issue2107)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents: 13894
diff changeset
  1909
16531
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
  1910
        # 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
  1911
        # 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
  1912
        # ones while preserving the original series order and guards.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1913
        newseries = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1914
            s
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1915
            for s in original_series
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1916
            if mq.guard_re.split(s, 1)[0] not in skippedpatches
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1917
        ]
16531
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
  1918
        mq.fullseries[:] = newseries
b9f51f49bf2a rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents: 16280
diff changeset
  1919
        mq.seriesdirty = True
14580
92101ea35015 mq: rename save_dirty to savedirty
Adrian Buehlmann <adrian@cadifra.com>
parents: 14572
diff changeset
  1920
        mq.savedirty()
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1921
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1922
28185
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1923
def storecollapsemsg(repo, collapsemsg):
43787
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43591
diff changeset
  1924
    """Store the collapse message to allow recovery"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1925
    collapsemsg = collapsemsg or b''
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1926
    f = repo.vfs(b"last-message.txt", b"w")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1927
    f.write(b"%s\n" % collapsemsg)
28185
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1928
    f.close()
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1929
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1930
28185
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1931
def clearcollapsemsg(repo):
43787
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43591
diff changeset
  1932
    """Remove collapse message file"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1933
    repo.vfs.unlinkpath(b"last-message.txt", ignoremissing=True)
28185
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1934
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1935
31225
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
  1936
def restorecollapsemsg(repo, isabort):
43787
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43591
diff changeset
  1937
    """Restore previously stored collapse message"""
28185
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1938
    try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1939
        f = repo.vfs(b"last-message.txt")
28185
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1940
        collapsemsg = f.readline().strip()
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1941
        f.close()
49306
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 48946
diff changeset
  1942
    except FileNotFoundError:
31225
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
  1943
        if isabort:
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
  1944
            # Oh well, just abort like normal
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1945
            collapsemsg = b''
31225
749b057b01f3 rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents: 31224
diff changeset
  1946
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1947
            raise error.Abort(_(b'missing .hg/last-message.txt for rebase'))
28185
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1948
    return collapsemsg
c7e8948627f3 rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents: 28136
diff changeset
  1949
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1950
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1951
def clearstatus(repo):
43787
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43591
diff changeset
  1952
    """Remove the status files"""
33056
2312e70cf78b rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents: 32918
diff changeset
  1953
    # Make sure the active transaction won't write the state file
2312e70cf78b rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents: 32918
diff changeset
  1954
    tr = repo.currenttransaction()
2312e70cf78b rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents: 32918
diff changeset
  1955
    if tr:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1956
        tr.removefilegenerator(b'rebasestate')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1957
    repo.vfs.unlinkpath(b"rebasestate", ignoremissing=True)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1958
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1959
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1960
def sortsource(destmap):
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1961
    """yield source revisions in an order that we only rebase things once
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1962
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1963
    If source and destination overlaps, we should filter out revisions
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1964
    depending on other revisions which hasn't been rebased yet.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1965
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1966
    Yield a sorted list of revisions each time.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1967
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1968
    For example, when rebasing A to B, B to C. This function yields [B], then
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1969
    [A], indicating B needs to be rebased first.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1970
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1971
    Raise if there is a cycle so the rebase is impossible.
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1972
    """
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1973
    srcset = set(destmap)
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1974
    while srcset:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1975
        srclist = sorted(srcset)
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1976
        result = []
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1977
        for r in srclist:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1978
            if destmap[r] not in srcset:
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1979
                result.append(r)
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1980
        if not result:
46632
9989a276712f errors: use more specific errors in rebase extension
Martin von Zweigbergk <martinvonz@google.com>
parents: 46362
diff changeset
  1981
            raise error.InputError(_(b'source and destination form a cycle'))
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1982
        srcset -= set(result)
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1983
        yield result
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  1984
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  1985
34008
9422107a6b64 rebase: move working parent and bookmark for obsoleted revs (BC)
Jun Wu <quark@fb.com>
parents: 34007
diff changeset
  1986
def buildstate(repo, destmap, collapse):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45792
diff changeset
  1987
    """Define which revisions are going to be rebased and where
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1988
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
  1989
    repo: repo
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
  1990
    destmap: {srcrev: destrev}
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45792
diff changeset
  1991
    """
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
  1992
    rebaseset = destmap.keys()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1993
    originalwd = repo[b'.'].rev()
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  1994
10672
c2e1e637d4da rebase: always check if rebasing onto an applied mq patch.
Greg Ward <greg-hg@gerg.ca>
parents: 10659
diff changeset
  1995
    # 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
  1996
    # 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
  1997
    # a partially completed rebase is blocked by mq.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1998
    if b'qtip' in repo.tags():
44452
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44438
diff changeset
  1999
        mqapplied = {repo[s.node].rev() for s in repo.mq.applied}
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
  2000
        if set(destmap.values()) & mqapplied:
46632
9989a276712f errors: use more specific errors in rebase extension
Martin von Zweigbergk <martinvonz@google.com>
parents: 46362
diff changeset
  2001
            raise error.StateError(_(b'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
  2002
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  2003
    # Get "cycle" error early by exhausting the generator.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2004
    sortedsrc = list(sortsource(destmap))  # a list of sorted revs
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  2005
    if not sortedsrc:
46632
9989a276712f errors: use more specific errors in rebase extension
Martin von Zweigbergk <martinvonz@google.com>
parents: 46362
diff changeset
  2006
        raise error.InputError(_(b'no matching revisions'))
34006
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  2007
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  2008
    # Only check the first batch of revisions to rebase not depending on other
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  2009
    # rebaseset. This means "source is ancestor of destination" for the second
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  2010
    # (and following) batches of revisions are not checked here. We rely on
32528419db64 rebase: sort destmap topologically
Jun Wu <quark@fb.com>
parents: 34005
diff changeset
  2011
    # "defineparents" to do that check.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2012
    roots = list(repo.set(b'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
  2013
    if not roots:
46632
9989a276712f errors: use more specific errors in rebase extension
Martin von Zweigbergk <martinvonz@google.com>
parents: 46362
diff changeset
  2014
        raise error.InputError(_(b'no matching revisions'))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2015
36271
53be14874ee8 rebase: sort roots by revision
Augie Fackler <augie@google.com>
parents: 36185
diff changeset
  2016
    def revof(r):
53be14874ee8 rebase: sort roots by revision
Augie Fackler <augie@google.com>
parents: 36185
diff changeset
  2017
        return r.rev()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2018
36271
53be14874ee8 rebase: sort roots by revision
Augie Fackler <augie@google.com>
parents: 36185
diff changeset
  2019
    roots = sorted(roots, key=revof)
32175
456b4a32d75f rebase: don't update state dict same way for each root
Martin von Zweigbergk <martinvonz@google.com>
parents: 32084
diff changeset
  2020
    state = dict.fromkeys(rebaseset, revtodo)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2021
    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
  2022
    for root in roots:
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
  2023
        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
  2024
        commonbase = root.ancestor(dest)
100fdc84670f rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18386
diff changeset
  2025
        if commonbase == root:
46632
9989a276712f errors: use more specific errors in rebase extension
Martin von Zweigbergk <martinvonz@google.com>
parents: 46362
diff changeset
  2026
            raise error.InputError(_(b'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
  2027
        if commonbase == dest:
31380
65d93d712777 rebase: allow rebasing children of wd to wd if a new branch has been set (BC)
Mads Kiilerich <mads@kiilerich.com>
parents: 31311
diff changeset
  2028
            wctx = repo[None]
65d93d712777 rebase: allow rebasing children of wd to wd if a new branch has been set (BC)
Mads Kiilerich <mads@kiilerich.com>
parents: 31311
diff changeset
  2029
            if dest == wctx.p1():
65d93d712777 rebase: allow rebasing children of wd to wd if a new branch has been set (BC)
Mads Kiilerich <mads@kiilerich.com>
parents: 31311
diff changeset
  2030
                # when rebasing to '.', it will use the current wd branch name
65d93d712777 rebase: allow rebasing children of wd to wd if a new branch has been set (BC)
Mads Kiilerich <mads@kiilerich.com>
parents: 31311
diff changeset
  2031
                samebranch = root.branch() == wctx.branch()
65d93d712777 rebase: allow rebasing children of wd to wd if a new branch has been set (BC)
Mads Kiilerich <mads@kiilerich.com>
parents: 31311
diff changeset
  2032
            else:
65d93d712777 rebase: allow rebasing children of wd to wd if a new branch has been set (BC)
Mads Kiilerich <mads@kiilerich.com>
parents: 31311
diff changeset
  2033
                samebranch = root.branch() == dest.branch()
32900
07d5a503124c rebase: rewrite "x in y.children()" as "y in x.parents()"
Martin von Zweigbergk <martinvonz@google.com>
parents: 32594
diff changeset
  2034
            if not collapse and samebranch and dest in root.parents():
32272
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
  2035
                # mark the revision as done by setting its new revision
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
  2036
                # equal to its old (current) revisions
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
  2037
                state[root.rev()] = root.rev()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2038
                repo.ui.debug(b'source is a child of destination\n')
32272
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
  2039
                continue
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  2040
32272
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
  2041
        emptyrebase = False
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2042
        repo.ui.debug(b'rebase onto %s starting from %s\n' % (dest, root))
32272
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
  2043
    if emptyrebase:
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
  2044
        return None
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
  2045
    for rev in sorted(state):
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
  2046
        parents = [p for p in repo.changelog.parentrevs(rev) if p != nullrev]
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
  2047
        # if all parents of this revision are done, then so is this revision
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
  2048
        if parents and all((state.get(p) == p for p in parents)):
78496ac30025 rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32249
diff changeset
  2049
            state[rev] = rev
34004
af609bb3487f rebase: change internal format to support destination map
Jun Wu <quark@fb.com>
parents: 34003
diff changeset
  2050
    return originalwd, destmap, state
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  2051
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2052
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2053
def clearrebased(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2054
    ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2055
    repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2056
    destmap,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2057
    state,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2058
    skipped,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2059
    collapsedas=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2060
    keepf=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2061
    fm=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2062
    backup=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2063
):
17613
aafc521668d8 rebase: properly handle --collapse when creating obsolescence marker
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17612
diff changeset
  2064
    """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
  2065
aafc521668d8 rebase: properly handle --collapse when creating obsolescence marker
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17612
diff changeset
  2066
    If `collapsedas` is not None, the rebase was a collapse whose result if the
34354
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
  2067
    `collapsedas` node.
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
  2068
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
  2069
    If `keepf` is not True, the rebase has --keep set and no nodes should be
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
  2070
    removed (but bookmarks still need to be moved).
38799
2002c193f2bc rebase: support "history-editing-backup" config option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38681
diff changeset
  2071
2002c193f2bc rebase: support "history-editing-backup" config option
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 38681
diff changeset
  2072
    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
  2073
    revisions.
34354
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
  2074
    """
33332
3b7cb3d17137 rebase: use scmutil.cleanupnodes (issue5606) (BC)
Jun Wu <quark@fb.com>
parents: 33157
diff changeset
  2075
    tonode = repo.changelog.node
34354
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
  2076
    replacements = {}
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
  2077
    moves = {}
39915
7198cdbbbde1 rebase: don't try to prune obsolete changeset already in the destination
Boris Feld <boris.feld@octobus.net>
parents: 39328
diff changeset
  2078
    stripcleanup = not obsolete.isenabled(repo, obsolete.createmarkersopt)
39919
0428feb1f0d7 rebase: explicitly track collapses as fold
Boris Feld <boris.feld@octobus.net>
parents: 39918
diff changeset
  2079
0428feb1f0d7 rebase: explicitly track collapses as fold
Boris Feld <boris.feld@octobus.net>
parents: 39918
diff changeset
  2080
    collapsednodes = []
33333
8bfd10e4c55a rebase: remove "if True"
Jun Wu <quark@fb.com>
parents: 33332
diff changeset
  2081
    for rev, newrev in sorted(state.items()):
8bfd10e4c55a rebase: remove "if True"
Jun Wu <quark@fb.com>
parents: 33332
diff changeset
  2082
        if newrev >= 0 and newrev != rev:
34354
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
  2083
            oldnode = tonode(rev)
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
  2084
            newnode = collapsedas or tonode(newrev)
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33622
diff changeset
  2085
            moves[oldnode] = newnode
42975
43c84b816445 rebase: track new nodes when --keep is set
Paul Gossman <pgossman@janestreet.com>
parents: 42613
diff changeset
  2086
            succs = None
43c84b816445 rebase: track new nodes when --keep is set
Paul Gossman <pgossman@janestreet.com>
parents: 42613
diff changeset
  2087
            if rev in skipped:
43c84b816445 rebase: track new nodes when --keep is set
Paul Gossman <pgossman@janestreet.com>
parents: 42613
diff changeset
  2088
                if stripcleanup or not repo[rev].obsolete():
43c84b816445 rebase: track new nodes when --keep is set
Paul Gossman <pgossman@janestreet.com>
parents: 42613
diff changeset
  2089
                    succs = ()
43c84b816445 rebase: track new nodes when --keep is set
Paul Gossman <pgossman@janestreet.com>
parents: 42613
diff changeset
  2090
            elif collapsedas:
43c84b816445 rebase: track new nodes when --keep is set
Paul Gossman <pgossman@janestreet.com>
parents: 42613
diff changeset
  2091
                collapsednodes.append(oldnode)
43c84b816445 rebase: track new nodes when --keep is set
Paul Gossman <pgossman@janestreet.com>
parents: 42613
diff changeset
  2092
            else:
43c84b816445 rebase: track new nodes when --keep is set
Paul Gossman <pgossman@janestreet.com>
parents: 42613
diff changeset
  2093
                succs = (newnode,)
43c84b816445 rebase: track new nodes when --keep is set
Paul Gossman <pgossman@janestreet.com>
parents: 42613
diff changeset
  2094
            if succs is not None:
43c84b816445 rebase: track new nodes when --keep is set
Paul Gossman <pgossman@janestreet.com>
parents: 42613
diff changeset
  2095
                replacements[(oldnode,)] = succs
39919
0428feb1f0d7 rebase: explicitly track collapses as fold
Boris Feld <boris.feld@octobus.net>
parents: 39918
diff changeset
  2096
    if collapsednodes:
0428feb1f0d7 rebase: explicitly track collapses as fold
Boris Feld <boris.feld@octobus.net>
parents: 39918
diff changeset
  2097
        replacements[tuple(collapsednodes)] = (collapsedas,)
34883
c858afe9c59b rebase: add support to output nodechanges
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34872
diff changeset
  2098
    if fm:
35125
f56a30b844aa rebase: use fm.formatlist() and fm.formatdict() to support user template
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35058
diff changeset
  2099
        hf = fm.hexfunc
f56a30b844aa rebase: use fm.formatlist() and fm.formatdict() to support user template
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35058
diff changeset
  2100
        fl = fm.formatlist
f56a30b844aa rebase: use fm.formatlist() and fm.formatdict() to support user template
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35058
diff changeset
  2101
        fd = fm.formatdict
39917
a8ccd9523d40 rebase: expand a long "one-liner"
Boris Feld <boris.feld@octobus.net>
parents: 39915
diff changeset
  2102
        changes = {}
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
  2103
        for oldns, newn in replacements.items():
39918
a8318c9cb2ad rebase: use tuple as `replacement` keys
Boris Feld <boris.feld@octobus.net>
parents: 39917
diff changeset
  2104
            for oldn in oldns:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2105
                changes[hf(oldn)] = fl([hf(n) for n in newn], name=b'node')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2106
        nodechanges = fd(changes, key=b"oldnode", value=b"newnodes")
34883
c858afe9c59b rebase: add support to output nodechanges
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34872
diff changeset
  2107
        fm.data(nodechanges=nodechanges)
42975
43c84b816445 rebase: track new nodes when --keep is set
Paul Gossman <pgossman@janestreet.com>
parents: 42613
diff changeset
  2108
    if keepf:
43c84b816445 rebase: track new nodes when --keep is set
Paul Gossman <pgossman@janestreet.com>
parents: 42613
diff changeset
  2109
        replacements = {}
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2110
    scmutil.cleanupnodes(repo, replacements, b'rebase', moves, backup=backup)
17611
910123eac887 rebase: extract final changesets cleanup logic in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17325
diff changeset
  2111
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2112
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 7213
diff changeset
  2113
def pullrebase(orig, ui, repo, *args, **opts):
43787
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43591
diff changeset
  2114
    """Call rebase after pull if the latter has been invoked with --rebase"""
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
  2115
    if opts.get('rebase'):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2116
        if ui.configbool(b'commands', b'rebase.requiredest'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2117
            msg = _(b'rebase destination required by configuration')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2118
            hint = _(b'use hg pull followed by hg rebase -d DEST')
46632
9989a276712f errors: use more specific errors in rebase extension
Martin von Zweigbergk <martinvonz@google.com>
parents: 46362
diff changeset
  2119
            raise error.InputError(msg, hint=hint)
31733
ae6bab095c66 rebase: abort hg pull --rebase if rebase.requiredest is set (issue5514)
Ryan McElroy <rmcelroy@fb.com>
parents: 31731
diff changeset
  2120
32918
04c9dd951a41 rebase: use context manager for locking in pullrebase()
Martin von Zweigbergk <martinvonz@google.com>
parents: 32917
diff changeset
  2121
        with repo.wlock(), repo.lock():
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
  2122
            if opts.get('update'):
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
  2123
                del opts['update']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2124
                ui.debug(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2125
                    b'--update and --rebase are not compatible, ignoring '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2126
                    b'the update flag\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2127
                )
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  2128
42532
12243f15d53e statecheck: added support for STATES
Taapas Agrawal <taapas2897@gmail.com>
parents: 42530
diff changeset
  2129
            cmdutil.checkunfinished(repo, skipmerge=True)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2130
            cmdutil.bailifchanged(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2131
                repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2132
                hint=_(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2133
                    b'cannot pull with rebase: '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2134
                    b'please commit or shelve your changes first'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2135
                ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2136
            )
30725
c2bd2f77965b rebase: fail-fast the pull if working dir is not clean (BC)
Valters Vingolds <valters@vingolds.ch>
parents: 30709
diff changeset
  2137
26029
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  2138
            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
  2139
            origpostincoming = commands.postincoming
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2140
26029
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  2141
            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
  2142
                pass
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2143
26029
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  2144
            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
  2145
            try:
26960
6979fe2a6d75 rebase: add returning value from pullrebase function
liscju <piotr.listkiewicz@gmail.com>
parents: 26811
diff changeset
  2146
                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
  2147
            finally:
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  2148
                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
  2149
            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
  2150
            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
  2151
                # --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
  2152
                # dropping it
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
  2153
                if 'rev' in opts:
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
  2154
                    del opts['rev']
26029
563ea14c62d4 rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25660
diff changeset
  2155
                # 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
  2156
                # --source.
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
  2157
                if 'source' in opts:
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
  2158
                    del opts['source']
29044
261c25372959 rebase: restrict rebase destination to the pulled set (issue5214)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29043
diff changeset
  2159
                # 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
  2160
                destspace = list(repo.changelog.revs(start=revsprepull))
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
  2161
                opts['_destspace'] = destspace
28189
fac3a24be50e rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28188
diff changeset
  2162
                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
  2163
                    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
  2164
                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
  2165
                    # 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
  2166
                    rev, _a, _b = destutil.destupdate(repo)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2167
                    if rev == repo[b'.'].rev():
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2168
                        ui.status(_(b'nothing to rebase\n'))
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
  2169
                    else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2170
                        ui.status(_(b'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
  2171
                        # 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
  2172
                        # with warning and trumpets
0e3835c7e1cf rebase: perform update through the 'update' command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28117
diff changeset
  2173
                        commands.update(ui, repo)
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  2174
    else:
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
  2175
        if opts.get('tool'):
46632
9989a276712f errors: use more specific errors in rebase extension
Martin von Zweigbergk <martinvonz@google.com>
parents: 46362
diff changeset
  2176
            raise error.InputError(_(b'--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
  2177
        ret = orig(ui, repo, *args, **opts)
6979fe2a6d75 rebase: add returning value from pullrebase function
liscju <piotr.listkiewicz@gmail.com>
parents: 26811
diff changeset
  2178
6979fe2a6d75 rebase: add returning value from pullrebase function
liscju <piotr.listkiewicz@gmail.com>
parents: 26811
diff changeset
  2179
    return ret
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  2180
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2181
46833
47c251a14525 rebase: clarify names of variables and function related to obsolete revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 46832
diff changeset
  2182
def _compute_obsolete_sets(repo, rebaseobsrevs, destmap):
47c251a14525 rebase: clarify names of variables and function related to obsolete revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 46832
diff changeset
  2183
    """Figure out what to do about about obsolete revisions
35058
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35002
diff changeset
  2184
46833
47c251a14525 rebase: clarify names of variables and function related to obsolete revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 46832
diff changeset
  2185
    `obsolete_with_successor_in_destination` is a mapping mapping obsolete => successor for all
35058
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35002
diff changeset
  2186
    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
  2187
46833
47c251a14525 rebase: clarify names of variables and function related to obsolete revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 46832
diff changeset
  2188
    `obsolete_with_successor_in_rebase_set` is a set with obsolete revisions,
47c251a14525 rebase: clarify names of variables and function related to obsolete revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 46832
diff changeset
  2189
    without a successor in destination, that would cause divergence.
35058
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35002
diff changeset
  2190
    """
46833
47c251a14525 rebase: clarify names of variables and function related to obsolete revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 46832
diff changeset
  2191
    obsolete_with_successor_in_destination = {}
47c251a14525 rebase: clarify names of variables and function related to obsolete revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 46832
diff changeset
  2192
    obsolete_with_successor_in_rebase_set = set()
26349
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
  2193
26674
fd4a38bd7e49 rebase: use a direct reference to repo.changelog
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26671
diff changeset
  2194
    cl = repo.changelog
43567
0fea03924990 index: use `index.get_rev` in `rebase._computeobsoletenotrebased`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43566
diff changeset
  2195
    get_rev = cl.index.get_rev
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2196
    extinctrevs = set(repo.revs(b'extinct()'))
34003
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
  2197
    for srcrev in rebaseobsrevs:
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
  2198
        srcnode = cl.node(srcrev)
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
  2199
        # XXX: more advanced APIs are required to handle split correctly
35997
24f05489377b rebase: make "successors" a set in _computeobsoletenotrebased()
Denis Laxalde <denis@laxalde.org>
parents: 35995
diff changeset
  2200
        successors = set(obsutil.allsuccessors(repo.obsstore, [srcnode]))
35994
ae0d25071fca rebase: eliminate node from successors early in _computeobsoletenotrebased()
Denis Laxalde <denis@laxalde.org>
parents: 35917
diff changeset
  2201
        # obsutil.allsuccessors includes node itself
ae0d25071fca rebase: eliminate node from successors early in _computeobsoletenotrebased()
Denis Laxalde <denis@laxalde.org>
parents: 35917
diff changeset
  2202
        successors.remove(srcnode)
43567
0fea03924990 index: use `index.get_rev` in `rebase._computeobsoletenotrebased`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43566
diff changeset
  2203
        succrevs = {get_rev(s) for s in successors}
0fea03924990 index: use `index.get_rev` in `rebase._computeobsoletenotrebased`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43566
diff changeset
  2204
        succrevs.discard(None)
46801
32399d0813e0 rebase: skip obsolete commits even if they have pruned successors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46677
diff changeset
  2205
        if not successors or succrevs.issubset(extinctrevs):
32399d0813e0 rebase: skip obsolete commits even if they have pruned successors
Martin von Zweigbergk <martinvonz@google.com>
parents: 46677
diff changeset
  2206
            # no successor, or all successors are extinct
46833
47c251a14525 rebase: clarify names of variables and function related to obsolete revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 46832
diff changeset
  2207
            obsolete_with_successor_in_destination[srcrev] = None
34003
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
  2208
        else:
38672
0f8599afb92f rebase: avoid converting from nodes to revnums twice
Martin von Zweigbergk <martinvonz@google.com>
parents: 38671
diff changeset
  2209
            dstrev = destmap[srcrev]
0f8599afb92f rebase: avoid converting from nodes to revnums twice
Martin von Zweigbergk <martinvonz@google.com>
parents: 38671
diff changeset
  2210
            for succrev in succrevs:
0f8599afb92f rebase: avoid converting from nodes to revnums twice
Martin von Zweigbergk <martinvonz@google.com>
parents: 38671
diff changeset
  2211
                if cl.isancestorrev(succrev, dstrev):
46833
47c251a14525 rebase: clarify names of variables and function related to obsolete revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 46832
diff changeset
  2212
                    obsolete_with_successor_in_destination[srcrev] = succrev
34003
ba9d5d48bf95 rebase: rewrite _computeobsoletenotrebased
Jun Wu <quark@fb.com>
parents: 33864
diff changeset
  2213
                    break
35058
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35002
diff changeset
  2214
            else:
a68c3420be41 rebase: exclude descendants of obsoletes w/o a successor in dest (issue5300)
Denis Laxalde <denis@laxalde.org>
parents: 35002
diff changeset
  2215
                # 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: 35002
diff changeset
  2216
                # 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: 35002
diff changeset
  2217
                # and its descendants to avoid divergence.
39328
94a4980695f8 rebase: skip extinct revisions even if it has no successor in rebase set
Martin von Zweigbergk <martinvonz@google.com>
parents: 39135
diff changeset
  2218
                if srcrev in extinctrevs or any(s in destmap for s in succrevs):
46833
47c251a14525 rebase: clarify names of variables and function related to obsolete revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 46832
diff changeset
  2219
                    obsolete_with_successor_in_rebase_set.add(srcrev)
27012
5eac7ab59b95 rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents: 27010
diff changeset
  2220
46833
47c251a14525 rebase: clarify names of variables and function related to obsolete revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 46832
diff changeset
  2221
    return (
47c251a14525 rebase: clarify names of variables and function related to obsolete revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 46832
diff changeset
  2222
        obsolete_with_successor_in_destination,
47c251a14525 rebase: clarify names of variables and function related to obsolete revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 46832
diff changeset
  2223
        obsolete_with_successor_in_rebase_set,
47c251a14525 rebase: clarify names of variables and function related to obsolete revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 46832
diff changeset
  2224
    )
26349
92409f8dff5d rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents: 26301
diff changeset
  2225
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2226
42583
b9bc47211cf5 abort: added support for rebase
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
  2227
def abortrebase(ui, repo):
b9bc47211cf5 abort: added support for rebase
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
  2228
    with repo.wlock(), repo.lock():
b9bc47211cf5 abort: added support for rebase
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
  2229
        rbsrt = rebaseruntime(repo, ui)
b9bc47211cf5 abort: added support for rebase
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
  2230
        rbsrt._prepareabortorcontinue(isabort=True)
b9bc47211cf5 abort: added support for rebase
Taapas Agrawal <taapas2897@gmail.com>
parents: 42533
diff changeset
  2231
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2232
42613
35ebdbb38efb continue: added support for rebase
Taapas Agrawal <taapas2897@gmail.com>
parents: 42583
diff changeset
  2233
def continuerebase(ui, repo):
35ebdbb38efb continue: added support for rebase
Taapas Agrawal <taapas2897@gmail.com>
parents: 42583
diff changeset
  2234
    with repo.wlock(), repo.lock():
35ebdbb38efb continue: added support for rebase
Taapas Agrawal <taapas2897@gmail.com>
parents: 42583
diff changeset
  2235
        rbsrt = rebaseruntime(repo, ui)
44856
b7808443ed6a mergestate: split out merge state handling code from main merge module
Augie Fackler <augie@google.com>
parents: 44666
diff changeset
  2236
        ms = mergestatemod.mergestate.read(repo)
42613
35ebdbb38efb continue: added support for rebase
Taapas Agrawal <taapas2897@gmail.com>
parents: 42583
diff changeset
  2237
        mergeutil.checkunresolved(ms)
35ebdbb38efb continue: added support for rebase
Taapas Agrawal <taapas2897@gmail.com>
parents: 42583
diff changeset
  2238
        retcode = rbsrt._prepareabortorcontinue(isabort=False)
35ebdbb38efb continue: added support for rebase
Taapas Agrawal <taapas2897@gmail.com>
parents: 42583
diff changeset
  2239
        if retcode is not None:
35ebdbb38efb continue: added support for rebase
Taapas Agrawal <taapas2897@gmail.com>
parents: 42583
diff changeset
  2240
            return retcode
35ebdbb38efb continue: added support for rebase
Taapas Agrawal <taapas2897@gmail.com>
parents: 42583
diff changeset
  2241
        rbsrt._performrebase(None)
35ebdbb38efb continue: added support for rebase
Taapas Agrawal <taapas2897@gmail.com>
parents: 42583
diff changeset
  2242
        rbsrt._finishrebase()
35ebdbb38efb continue: added support for rebase
Taapas Agrawal <taapas2897@gmail.com>
parents: 42583
diff changeset
  2243
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2244
19214
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
  2245
def summaryhook(ui, repo):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2246
    if not repo.vfs.exists(b'rebasestate'):
19214
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
  2247
        return
19849
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
  2248
    try:
29403
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
  2249
        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
  2250
        rbsrt.restorestatus()
b95fd7c15b7c rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents: 29402
diff changeset
  2251
        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
  2252
    except error.RepoLookupError:
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
  2253
        # i18n: column positioning for "hg summary"
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2254
        msg = _(b'rebase: (use "hg rebase --abort" to clear broken state)\n')
19849
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
  2255
        ui.write(msg)
e7fa36d2ad3a rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19848
diff changeset
  2256
        return
48935
2cce2fa5bcf7 py3: replace pycompat.itervalues(x) with x.values()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48913
diff changeset
  2257
    numrebased = len([i for i in state.values() if i >= 0])
19214
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
  2258
    # i18n: column positioning for "hg summary"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2259
    ui.write(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2260
        _(b'rebase: %s, %s (rebase --continue)\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2261
        % (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2262
            ui.label(_(b'%d rebased'), b'rebase.rebased') % numrebased,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2263
            ui.label(_(b'%d remaining'), b'rebase.remaining')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2264
            % (len(state) - numrebased),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2265
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2266
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2267
19214
0250047a365e summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents: 19059
diff changeset
  2268
6906
808f03f61ebe Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff changeset
  2269
def uisetup(ui):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2270
    # Replace pull with a decorator to provide --rebase option
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2271
    entry = extensions.wrapcommand(commands.table, b'pull', pullrebase)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2272
    entry[1].append(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2273
        (b'', b'rebase', None, _(b"rebase working directory to branch head"))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2274
    )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2275
    entry[1].append((b't', b'tool', b'', _(b"specify merge tool for rebase")))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2276
    cmdutil.summaryhooks.add(b'rebase', summaryhook)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2277
    statemod.addunfinished(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2278
        b'rebase',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2279
        fname=b'rebasestate',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2280
        stopflag=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2281
        continueflag=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2282
        abortfunc=abortrebase,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2283
        continuefunc=continuerebase,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42975
diff changeset
  2284
    )