mercurial/cmd_impls/graft.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Tue, 11 Mar 2025 02:29:42 +0100
branchstable
changeset 53042 cdd7bf612c7b
parent 52505 68dc6cecca32
permissions -rw-r--r--
bundle-spec: properly format boolean parameter (issue6960) This was breaking automatic clone bundle generation. This changeset fixes it and add a test to catch it in the future.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
52328
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     1
# graft.py - implementation of the graft command
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     2
52350
d4e30c15626d typing: add missing `from __future__ import annotations` to core modules
Matt Harbison <matt_harbison@yahoo.com>
parents: 52348
diff changeset
     3
from __future__ import annotations
d4e30c15626d typing: add missing `from __future__ import annotations` to core modules
Matt Harbison <matt_harbison@yahoo.com>
parents: 52348
diff changeset
     4
52351
9042ffea4edd typing: add minimal annotations to cmd_impls/graft.py to pytype with 3.10
Matt Harbison <matt_harbison@yahoo.com>
parents: 52350
diff changeset
     5
import typing
9042ffea4edd typing: add minimal annotations to cmd_impls/graft.py to pytype with 3.10
Matt Harbison <matt_harbison@yahoo.com>
parents: 52350
diff changeset
     6
9042ffea4edd typing: add minimal annotations to cmd_impls/graft.py to pytype with 3.10
Matt Harbison <matt_harbison@yahoo.com>
parents: 52350
diff changeset
     7
from typing import (
9042ffea4edd typing: add minimal annotations to cmd_impls/graft.py to pytype with 3.10
Matt Harbison <matt_harbison@yahoo.com>
parents: 52350
diff changeset
     8
    Any,
9042ffea4edd typing: add minimal annotations to cmd_impls/graft.py to pytype with 3.10
Matt Harbison <matt_harbison@yahoo.com>
parents: 52350
diff changeset
     9
    Tuple,
9042ffea4edd typing: add minimal annotations to cmd_impls/graft.py to pytype with 3.10
Matt Harbison <matt_harbison@yahoo.com>
parents: 52350
diff changeset
    10
)
9042ffea4edd typing: add minimal annotations to cmd_impls/graft.py to pytype with 3.10
Matt Harbison <matt_harbison@yahoo.com>
parents: 52350
diff changeset
    11
52328
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    12
from ..i18n import _
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    13
52505
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
    14
from .. import (
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
    15
    cmdutil,
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
    16
    context,
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
    17
    error,
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
    18
    logcmdutil,
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
    19
    merge as mergemod,
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
    20
    state as statemod,
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
    21
)
52328
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    22
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    23
52351
9042ffea4edd typing: add minimal annotations to cmd_impls/graft.py to pytype with 3.10
Matt Harbison <matt_harbison@yahoo.com>
parents: 52350
diff changeset
    24
if typing.TYPE_CHECKING:
9042ffea4edd typing: add minimal annotations to cmd_impls/graft.py to pytype with 3.10
Matt Harbison <matt_harbison@yahoo.com>
parents: 52350
diff changeset
    25
    _ActionT = str
9042ffea4edd typing: add minimal annotations to cmd_impls/graft.py to pytype with 3.10
Matt Harbison <matt_harbison@yahoo.com>
parents: 52350
diff changeset
    26
    _CmdArgsT = Any  # TODO: (statedata, revs, editor, cont, dry_run, tool)
9042ffea4edd typing: add minimal annotations to cmd_impls/graft.py to pytype with 3.10
Matt Harbison <matt_harbison@yahoo.com>
parents: 52350
diff changeset
    27
9042ffea4edd typing: add minimal annotations to cmd_impls/graft.py to pytype with 3.10
Matt Harbison <matt_harbison@yahoo.com>
parents: 52350
diff changeset
    28
9042ffea4edd typing: add minimal annotations to cmd_impls/graft.py to pytype with 3.10
Matt Harbison <matt_harbison@yahoo.com>
parents: 52350
diff changeset
    29
def cmd_graft(ui, repo, *revs, **opts) -> int:
52347
0facc743b92f graft: fix a few typos in doc comments
Matt Harbison <matt_harbison@yahoo.com>
parents: 52346
diff changeset
    30
    """implement the graft command as defined in mercurial/commands.py"""
52329
5ab77b93567c graft: split the argument processing from the grafting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52328
diff changeset
    31
    ret = _process_args(ui, repo, *revs, **opts)
52334
77cb5d8643b3 graft: clarify the args passing depending of variants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52333
diff changeset
    32
    action, graftstate, args = ret
77cb5d8643b3 graft: clarify the args passing depending of variants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52333
diff changeset
    33
    if action == "ERROR":
52329
5ab77b93567c graft: split the argument processing from the grafting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52328
diff changeset
    34
        return -1
52334
77cb5d8643b3 graft: clarify the args passing depending of variants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52333
diff changeset
    35
    elif action == "ABORT":
77cb5d8643b3 graft: clarify the args passing depending of variants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52333
diff changeset
    36
        assert args is None
77cb5d8643b3 graft: clarify the args passing depending of variants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52333
diff changeset
    37
        return cmdutil.abortgraft(ui, repo, graftstate)
52329
5ab77b93567c graft: split the argument processing from the grafting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52328
diff changeset
    38
    elif action == "STOP":
52334
77cb5d8643b3 graft: clarify the args passing depending of variants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52333
diff changeset
    39
        assert args is None
77cb5d8643b3 graft: clarify the args passing depending of variants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52333
diff changeset
    40
        return _stopgraft(ui, repo, graftstate)
52329
5ab77b93567c graft: split the argument processing from the grafting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52328
diff changeset
    41
    elif action == "GRAFT":
52334
77cb5d8643b3 graft: clarify the args passing depending of variants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52333
diff changeset
    42
        return _graft_revisions(ui, repo, graftstate, *args)
52505
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
    43
    elif action == "GRAFT-TO":
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
    44
        return _graft_revisions_in_memory(ui, repo, graftstate, *args)
52329
5ab77b93567c graft: split the argument processing from the grafting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52328
diff changeset
    45
    else:
52505
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
    46
        msg = b'unknown action: %s' % action.encode('ascii')
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
    47
        raise error.ProgrammingError(msg)
52329
5ab77b93567c graft: split the argument processing from the grafting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52328
diff changeset
    48
5ab77b93567c graft: split the argument processing from the grafting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52328
diff changeset
    49
52351
9042ffea4edd typing: add minimal annotations to cmd_impls/graft.py to pytype with 3.10
Matt Harbison <matt_harbison@yahoo.com>
parents: 52350
diff changeset
    50
def _process_args(
9042ffea4edd typing: add minimal annotations to cmd_impls/graft.py to pytype with 3.10
Matt Harbison <matt_harbison@yahoo.com>
parents: 52350
diff changeset
    51
    ui, repo, *revs, **opts
9042ffea4edd typing: add minimal annotations to cmd_impls/graft.py to pytype with 3.10
Matt Harbison <matt_harbison@yahoo.com>
parents: 52350
diff changeset
    52
) -> Tuple[_ActionT, statemod.cmdstate | None, _CmdArgsT | None]:
52329
5ab77b93567c graft: split the argument processing from the grafting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52328
diff changeset
    53
    """process the graft command argument to figure out what to do
5ab77b93567c graft: split the argument processing from the grafting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52328
diff changeset
    54
5ab77b93567c graft: split the argument processing from the grafting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52328
diff changeset
    55
    This also filter the selected revision to skip the one that cannot be graft
52347
0facc743b92f graft: fix a few typos in doc comments
Matt Harbison <matt_harbison@yahoo.com>
parents: 52346
diff changeset
    56
    or were already grafted.
52329
5ab77b93567c graft: split the argument processing from the grafting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52328
diff changeset
    57
    """
52328
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    58
    if revs and opts.get('rev'):
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    59
        ui.warn(
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    60
            _(
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    61
                b'warning: inconsistent use of --rev might give unexpected '
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    62
                b'revision ordering!\n'
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    63
            )
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    64
        )
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    65
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    66
    revs = list(revs)
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    67
    revs.extend(opts.get('rev'))
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    68
    # a dict of data to be stored in state file
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    69
    statedata = {}
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    70
    # list of new nodes created by ongoing graft
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    71
    statedata[b'newnodes'] = []
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    72
52336
8faabe8abf66 graft: gather arg compatibility code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52335
diff changeset
    73
    # argument incompatible with followup from an interrupted operation
52505
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
    74
    commit_args = [
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
    75
        'edit',
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
    76
        'log',
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
    77
        'user',
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
    78
        'date',
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
    79
        'currentdate',
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
    80
        'currentuser',
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
    81
        'to',
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
    82
    ]
52337
58827d815646 graft: also forbid "--base" with "--stop" and the like
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52336
diff changeset
    83
    nofollow_args = commit_args + ['base', 'rev']
52328
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    84
52336
8faabe8abf66 graft: gather arg compatibility code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52335
diff changeset
    85
    arg_compatibilities = [
8faabe8abf66 graft: gather arg compatibility code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52335
diff changeset
    86
        ('no_commit', commit_args),
52505
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
    87
        ('continue', ['to']),
52336
8faabe8abf66 graft: gather arg compatibility code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52335
diff changeset
    88
        ('stop', nofollow_args),
8faabe8abf66 graft: gather arg compatibility code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52335
diff changeset
    89
        ('abort', nofollow_args),
8faabe8abf66 graft: gather arg compatibility code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52335
diff changeset
    90
    ]
52328
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    91
    cmdutil.check_at_most_one_arg(opts, 'abort', 'stop', 'continue')
52336
8faabe8abf66 graft: gather arg compatibility code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52335
diff changeset
    92
    for arg, incompatible in arg_compatibilities:
8faabe8abf66 graft: gather arg compatibility code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52335
diff changeset
    93
        cmdutil.check_incompatible_arguments(opts, arg, incompatible)
8faabe8abf66 graft: gather arg compatibility code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52335
diff changeset
    94
8faabe8abf66 graft: gather arg compatibility code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52335
diff changeset
    95
    cmdutil.resolve_commit_options(ui, opts)
52328
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    96
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    97
    cont = False
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    98
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    99
    graftstate = statemod.cmdstate(repo, b'graftstate')
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   100
52505
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   101
    if opts.get('to'):
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   102
        toctx = logcmdutil.revsingle(repo, opts['to'], None)
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   103
        statedata[b'to'] = toctx.hex()
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   104
    else:
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   105
        toctx = repo[None].p1()
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   106
52328
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   107
    if opts.get('stop'):
52334
77cb5d8643b3 graft: clarify the args passing depending of variants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52333
diff changeset
   108
        return "STOP", graftstate, None
52328
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   109
    elif opts.get('abort'):
52334
77cb5d8643b3 graft: clarify the args passing depending of variants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52333
diff changeset
   110
        return "ABORT", graftstate, None
52328
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   111
    elif opts.get('continue'):
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   112
        cont = True
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   113
        if revs:
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   114
            raise error.InputError(_(b"can't specify --continue and revisions"))
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   115
        # read in unfinished revisions
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   116
        if graftstate.exists():
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   117
            statedata = cmdutil.readgraftstate(repo, graftstate)
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   118
            if statedata.get(b'no_commit'):
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   119
                opts['no_commit'] = statedata.get(b'no_commit')
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   120
            if statedata.get(b'base'):
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   121
                opts['base'] = statedata.get(b'base')
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   122
            nodes = statedata[b'nodes']
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   123
            revs = [repo[node].rev() for node in nodes]
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   124
        else:
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   125
            cmdutil.wrongtooltocontinue(repo, _(b'graft'))
52329
5ab77b93567c graft: split the argument processing from the grafting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52328
diff changeset
   126
    elif not revs:
5ab77b93567c graft: split the argument processing from the grafting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52328
diff changeset
   127
        raise error.InputError(_(b'no revisions specified'))
52328
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   128
    else:
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   129
        cmdutil.checkunfinished(repo)
52505
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   130
        if not opts.get('to'):
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   131
            cmdutil.bailifchanged(repo)
52328
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   132
        revs = logcmdutil.revrange(repo, revs)
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   133
52330
8572e80f978c graft: assign computed configuration value to statedata instead of opts
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52329
diff changeset
   134
    for o in (
8572e80f978c graft: assign computed configuration value to statedata instead of opts
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52329
diff changeset
   135
        b'date',
8572e80f978c graft: assign computed configuration value to statedata instead of opts
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52329
diff changeset
   136
        b'user',
8572e80f978c graft: assign computed configuration value to statedata instead of opts
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52329
diff changeset
   137
        b'log',
52331
11fb7f737456 graft: move no_commit into "statedata" too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52330
diff changeset
   138
        b'no_commit',
52332
8d7029218a61 graft: move "dry_run" and "base" in statedate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52331
diff changeset
   139
        b'dry_run',
52330
8572e80f978c graft: assign computed configuration value to statedata instead of opts
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52329
diff changeset
   140
    ):
8572e80f978c graft: assign computed configuration value to statedata instead of opts
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52329
diff changeset
   141
        v = opts.get(o.decode('ascii'))
8572e80f978c graft: assign computed configuration value to statedata instead of opts
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52329
diff changeset
   142
        # if statedata is already set, it comes from --continue and test says
8572e80f978c graft: assign computed configuration value to statedata instead of opts
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52329
diff changeset
   143
        # we should honor them above the options (which seems weird).
8572e80f978c graft: assign computed configuration value to statedata instead of opts
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52329
diff changeset
   144
        if v and o not in statedata:
8572e80f978c graft: assign computed configuration value to statedata instead of opts
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52329
diff changeset
   145
            statedata[o] = v
8572e80f978c graft: assign computed configuration value to statedata instead of opts
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52329
diff changeset
   146
52328
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   147
    skipped = set()
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   148
    basectx = None
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   149
    if opts.get('base'):
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   150
        basectx = logcmdutil.revsingle(repo, opts['base'], None)
52332
8d7029218a61 graft: move "dry_run" and "base" in statedate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52331
diff changeset
   151
        statedata[b'base'] = basectx.hex()
52328
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   152
    if basectx is None:
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   153
        # check for merges
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   154
        for rev in repo.revs(b'%ld and merge()', revs):
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   155
            ui.warn(_(b'skipping ungraftable merge revision %d\n') % rev)
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   156
            skipped.add(rev)
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   157
    revs = [r for r in revs if r not in skipped]
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   158
    if not revs:
52334
77cb5d8643b3 graft: clarify the args passing depending of variants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52333
diff changeset
   159
        return "ERROR", None, None
52328
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   160
    if basectx is not None and len(revs) != 1:
52348
99615755fb8e graft: trim an InputError message
Matt Harbison <matt_harbison@yahoo.com>
parents: 52347
diff changeset
   161
        raise error.InputError(_(b'only one revision allowed with --base'))
52328
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   162
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   163
    # Don't check in the --continue case, in effect retaining --force across
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   164
    # --continues. That's because without --force, any revisions we decided to
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   165
    # skip would have been filtered out here, so they wouldn't have made their
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   166
    # way to the graftstate. With --force, any revisions we would have otherwise
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   167
    # skipped would not have been filtered out, and if they hadn't been applied
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   168
    # already, they'd have been in the graftstate.
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   169
    if not (cont or opts.get('force')) and basectx is None:
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   170
        # check for ancestors of dest branch
52505
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   171
        ancestors = repo.revs(b'%ld & (::%d)', revs, toctx.rev())
52328
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   172
        for rev in ancestors:
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   173
            ui.warn(_(b'skipping ancestor revision %d:%s\n') % (rev, repo[rev]))
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   174
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   175
        revs = [r for r in revs if r not in ancestors]
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   176
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   177
        if not revs:
52334
77cb5d8643b3 graft: clarify the args passing depending of variants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52333
diff changeset
   178
            return "ERROR", None, None
52328
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   179
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   180
        # analyze revs for earlier grafts
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   181
        ids = {}
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   182
        for ctx in repo.set(b"%ld", revs):
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   183
            ids[ctx.hex()] = ctx.rev()
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   184
            n = ctx.extra().get(b'source')
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   185
            if n:
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   186
                ids[n] = ctx.rev()
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   187
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   188
        # check ancestors for earlier grafts
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   189
        ui.debug(b'scanning for duplicate grafts\n')
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   190
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   191
        # The only changesets we can be sure doesn't contain grafts of any
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   192
        # revs, are the ones that are common ancestors of *all* revs:
52505
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   193
        for rev in repo.revs(b'only(%d,ancestor(%ld))', toctx.rev(), revs):
52328
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   194
            ctx = repo[rev]
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   195
            n = ctx.extra().get(b'source')
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   196
            if n in ids:
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   197
                try:
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   198
                    r = repo[n].rev()
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   199
                except error.RepoLookupError:
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   200
                    r = None
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   201
                if r in revs:
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   202
                    ui.warn(
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   203
                        _(
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   204
                            b'skipping revision %d:%s '
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   205
                            b'(already grafted to %d:%s)\n'
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   206
                        )
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   207
                        % (r, repo[r], rev, ctx)
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   208
                    )
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   209
                    revs.remove(r)
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   210
                elif ids[n] in revs:
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   211
                    if r is None:
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   212
                        ui.warn(
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   213
                            _(
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   214
                                b'skipping already grafted revision %d:%s '
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   215
                                b'(%d:%s also has unknown origin %s)\n'
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   216
                            )
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   217
                            % (ids[n], repo[ids[n]], rev, ctx, n[:12])
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   218
                        )
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   219
                    else:
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   220
                        ui.warn(
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   221
                            _(
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   222
                                b'skipping already grafted revision %d:%s '
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   223
                                b'(%d:%s also has origin %d:%s)\n'
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   224
                            )
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   225
                            % (ids[n], repo[ids[n]], rev, ctx, r, n[:12])
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   226
                        )
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   227
                    revs.remove(ids[n])
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   228
            elif ctx.hex() in ids:
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   229
                r = ids[ctx.hex()]
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   230
                if r in revs:
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   231
                    ui.warn(
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   232
                        _(
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   233
                            b'skipping already grafted revision %d:%s '
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   234
                            b'(was grafted from %d:%s)\n'
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   235
                        )
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   236
                        % (r, repo[r], rev, ctx)
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   237
                    )
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   238
                    revs.remove(r)
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   239
        if not revs:
52334
77cb5d8643b3 graft: clarify the args passing depending of variants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52333
diff changeset
   240
            return "ERROR", None, None
52328
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   241
52335
0b52283d50bb graft: get the editor later
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52334
diff changeset
   242
    editor = cmdutil.getcommiteditor(editform=b'graft', **opts)
52332
8d7029218a61 graft: move "dry_run" and "base" in statedate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52331
diff changeset
   243
    dry_run = bool(opts.get("dry_run"))
52333
da216ed31c3d graft: explicitly pass the "tool" argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52332
diff changeset
   244
    tool = opts.get('tool', b'')
52505
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   245
    if opts.get("to"):
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   246
        return "GRAFT-TO", graftstate, (statedata, revs, editor, dry_run, tool)
52334
77cb5d8643b3 graft: clarify the args passing depending of variants
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52333
diff changeset
   247
    return "GRAFT", graftstate, (statedata, revs, editor, cont, dry_run, tool)
52329
5ab77b93567c graft: split the argument processing from the grafting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52328
diff changeset
   248
5ab77b93567c graft: split the argument processing from the grafting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52328
diff changeset
   249
52503
cef86c1d5dfd graft: extract creation of progress report line in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52351
diff changeset
   250
def _build_progress(ui, repo, ctx):
cef86c1d5dfd graft: extract creation of progress report line in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52351
diff changeset
   251
    rev_sum = b'%d:%s "%s"' % (
cef86c1d5dfd graft: extract creation of progress report line in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52351
diff changeset
   252
        ctx.rev(),
cef86c1d5dfd graft: extract creation of progress report line in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52351
diff changeset
   253
        ctx,
cef86c1d5dfd graft: extract creation of progress report line in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52351
diff changeset
   254
        ctx.description().split(b'\n', 1)[0],
cef86c1d5dfd graft: extract creation of progress report line in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52351
diff changeset
   255
    )
cef86c1d5dfd graft: extract creation of progress report line in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52351
diff changeset
   256
    names = repo.nodetags(ctx.node()) + repo.nodebookmarks(ctx.node())
cef86c1d5dfd graft: extract creation of progress report line in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52351
diff changeset
   257
    if names:
cef86c1d5dfd graft: extract creation of progress report line in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52351
diff changeset
   258
        rev_sum += b' (%s)' % b' '.join(names)
cef86c1d5dfd graft: extract creation of progress report line in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52351
diff changeset
   259
    return _(b'grafting %s\n') % rev_sum
cef86c1d5dfd graft: extract creation of progress report line in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52351
diff changeset
   260
cef86c1d5dfd graft: extract creation of progress report line in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52351
diff changeset
   261
52504
de16800904f9 graft: extract meta information computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52503
diff changeset
   262
def _build_meta(ui, repo, ctx, statedata):
de16800904f9 graft: extract meta information computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52503
diff changeset
   263
    source = ctx.extra().get(b'source')
de16800904f9 graft: extract meta information computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52503
diff changeset
   264
    extra = {}
de16800904f9 graft: extract meta information computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52503
diff changeset
   265
    if source:
de16800904f9 graft: extract meta information computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52503
diff changeset
   266
        extra[b'source'] = source
de16800904f9 graft: extract meta information computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52503
diff changeset
   267
        extra[b'intermediate-source'] = ctx.hex()
de16800904f9 graft: extract meta information computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52503
diff changeset
   268
    else:
de16800904f9 graft: extract meta information computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52503
diff changeset
   269
        extra[b'source'] = ctx.hex()
de16800904f9 graft: extract meta information computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52503
diff changeset
   270
    user = statedata.get(b'user', ctx.user())
de16800904f9 graft: extract meta information computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52503
diff changeset
   271
    date = statedata.get(b'date', ctx.date())
de16800904f9 graft: extract meta information computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52503
diff changeset
   272
    message = ctx.description()
de16800904f9 graft: extract meta information computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52503
diff changeset
   273
    if statedata.get(b'log'):
de16800904f9 graft: extract meta information computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52503
diff changeset
   274
        message += b'\n(grafted from %s)' % ctx.hex()
de16800904f9 graft: extract meta information computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52503
diff changeset
   275
    return (user, date, message, extra)
de16800904f9 graft: extract meta information computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52503
diff changeset
   276
de16800904f9 graft: extract meta information computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52503
diff changeset
   277
52505
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   278
def _graft_revisions_in_memory(
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   279
    ui,
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   280
    repo,
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   281
    graftstate,
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   282
    statedata,
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   283
    revs,
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   284
    editor,
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   285
    dry_run,
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   286
    tool=b'',
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   287
):
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   288
    """graft revisions in memory
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   289
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   290
    Abort on unresolved conflicts.
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   291
    """
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   292
    with repo.lock(), repo.transaction(b"graft"):
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   293
        target = repo[statedata[b"to"]]
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   294
        for r in revs:
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   295
            ctx = repo[r]
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   296
            ui.status(_build_progress(ui, repo, ctx))
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   297
            if dry_run:
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   298
                # we might want to actually perform the grafting to detect
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   299
                # potential conflict in the dry run.
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   300
                continue
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   301
            wctx = context.overlayworkingctx(repo)
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   302
            wctx.setbase(target)
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   303
            if b'base' in statedata:
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   304
                base = repo[statedata[b'base']]
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   305
            else:
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   306
                base = ctx.p1()
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   307
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   308
            (user, date, message, extra) = _build_meta(ui, repo, ctx, statedata)
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   309
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   310
            # perform the graft merge with p1(rev) as 'ancestor'
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   311
            try:
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   312
                overrides = {(b'ui', b'forcemerge'): tool}
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   313
                with ui.configoverride(overrides, b'graft'):
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   314
                    mergemod.graft(
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   315
                        repo,
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   316
                        ctx,
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   317
                        base,
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   318
                        wctx=wctx,
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   319
                    )
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   320
            except error.InMemoryMergeConflictsError as e:
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   321
                raise error.Abort(
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   322
                    b'cannot graft in memory: merge conflicts',
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   323
                    hint=_(bytes(e)),
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   324
                )
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   325
            mctx = wctx.tomemctx(
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   326
                message,
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   327
                user=user,
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   328
                date=date,
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   329
                extra=extra,
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   330
                editor=editor,
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   331
            )
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   332
            node = repo.commitctx(mctx)
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   333
            target = repo[node]
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   334
        return 0
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   335
68dc6cecca32 graft: add a `--to` flag grafting in memory
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52504
diff changeset
   336
52329
5ab77b93567c graft: split the argument processing from the grafting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52328
diff changeset
   337
def _graft_revisions(
5ab77b93567c graft: split the argument processing from the grafting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52328
diff changeset
   338
    ui,
5ab77b93567c graft: split the argument processing from the grafting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52328
diff changeset
   339
    repo,
5ab77b93567c graft: split the argument processing from the grafting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52328
diff changeset
   340
    graftstate,
5ab77b93567c graft: split the argument processing from the grafting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52328
diff changeset
   341
    statedata,
5ab77b93567c graft: split the argument processing from the grafting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52328
diff changeset
   342
    revs,
5ab77b93567c graft: split the argument processing from the grafting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52328
diff changeset
   343
    editor,
5ab77b93567c graft: split the argument processing from the grafting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52328
diff changeset
   344
    cont=False,
52332
8d7029218a61 graft: move "dry_run" and "base" in statedate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52331
diff changeset
   345
    dry_run=False,
52333
da216ed31c3d graft: explicitly pass the "tool" argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52332
diff changeset
   346
    tool=b'',
52329
5ab77b93567c graft: split the argument processing from the grafting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52328
diff changeset
   347
):
5ab77b93567c graft: split the argument processing from the grafting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52328
diff changeset
   348
    """actually graft some revisions"""
52328
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   349
    for pos, ctx in enumerate(repo.set(b"%ld", revs)):
52503
cef86c1d5dfd graft: extract creation of progress report line in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52351
diff changeset
   350
        ui.status(_build_progress(ui, repo, ctx))
52332
8d7029218a61 graft: move "dry_run" and "base" in statedate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52331
diff changeset
   351
        if dry_run:
52328
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   352
            continue
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   353
52504
de16800904f9 graft: extract meta information computation in a function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52503
diff changeset
   354
        (user, date, message, extra) = _build_meta(ui, repo, ctx, statedata)
52328
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   355
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   356
        # we don't merge the first commit when continuing
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   357
        if not cont:
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   358
            # perform the graft merge with p1(rev) as 'ancestor'
52333
da216ed31c3d graft: explicitly pass the "tool" argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52332
diff changeset
   359
            overrides = {(b'ui', b'forcemerge'): tool}
52332
8d7029218a61 graft: move "dry_run" and "base" in statedate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52331
diff changeset
   360
            if b'base' in statedata:
8d7029218a61 graft: move "dry_run" and "base" in statedate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52331
diff changeset
   361
                base = repo[statedata[b'base']]
8d7029218a61 graft: move "dry_run" and "base" in statedate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52331
diff changeset
   362
            else:
8d7029218a61 graft: move "dry_run" and "base" in statedate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52331
diff changeset
   363
                base = ctx.p1()
52328
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   364
            with ui.configoverride(overrides, b'graft'):
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   365
                stats = mergemod.graft(
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   366
                    repo, ctx, base, [b'local', b'graft', b'parent of graft']
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   367
                )
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   368
            # report any conflicts
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   369
            if stats.unresolvedcount > 0:
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   370
                # write out state for --continue
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   371
                nodes = [repo[rev].hex() for rev in revs[pos:]]
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   372
                statedata[b'nodes'] = nodes
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   373
                stateversion = 1
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   374
                graftstate.save(stateversion, statedata)
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   375
                ui.error(_(b"abort: unresolved conflicts, can't continue\n"))
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   376
                ui.error(_(b"(use 'hg resolve' and 'hg graft --continue')\n"))
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   377
                return 1
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   378
        else:
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   379
            cont = False
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   380
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   381
        # commit if --no-commit is false
52331
11fb7f737456 graft: move no_commit into "statedata" too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52330
diff changeset
   382
        if not statedata.get(b'no_commit'):
52328
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   383
            node = repo.commit(
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   384
                text=message, user=user, date=date, extra=extra, editor=editor
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   385
            )
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   386
            if node is None:
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   387
                ui.warn(
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   388
                    _(b'note: graft of %d:%s created no changes to commit\n')
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   389
                    % (ctx.rev(), ctx)
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   390
                )
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   391
            # checking that newnodes exist because old state files won't have it
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   392
            elif statedata.get(b'newnodes') is not None:
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   393
                nn = statedata[b'newnodes']
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   394
                assert isinstance(nn, list)  # list of bytes
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   395
                nn.append(node)
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   396
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   397
    # remove state when we complete successfully
52332
8d7029218a61 graft: move "dry_run" and "base" in statedate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 52331
diff changeset
   398
    if not dry_run:
52328
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   399
        graftstate.delete()
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   400
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   401
    return 0
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   402
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   403
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   404
def _stopgraft(ui, repo, graftstate):
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   405
    """stop the interrupted graft"""
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   406
    if not graftstate.exists():
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   407
        raise error.StateError(_(b"no interrupted graft found"))
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   408
    pctx = repo[b'.']
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   409
    mergemod.clean_update(pctx)
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   410
    graftstate.delete()
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   411
    ui.status(_(b"stopped the interrupted graft\n"))
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   412
    ui.status(_(b"working directory is now at %s\n") % pctx.hex()[:12])
f2fc0a91faca commands: create a "mercurial.cmd_impls" module to host graft
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   413
    return 0