hgext3rd/evolve/cmdrewrite.py
author Martin von Zweigbergk <martinvonz@google.com>
Fri, 12 Jul 2019 10:26:41 -0700
changeset 4759 f30c1fab7155
parent 4758 f0ecf2137824
child 4774 12a88b988875
permissions -rw-r--r--
py3: convert exceptions to bytes using pycompat.bytestr()
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2772
394b836e475b commands: rewrite the 'evocommands' module to 'cmdrewrite'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2771
diff changeset
     1
# Module dedicated to host history rewriting commands
2724
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     2
#
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     3
# Copyright 2017 Octobus <contact@octobus.net>
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     4
#
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     5
# This software may be used and distributed according to the terms of the
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     6
# GNU General Public License version 2 or any later version.
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     7
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     8
# Status: Stabilization of the API in progress
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     9
#
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    10
#   The final set of command should go into core.
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    11
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    12
from __future__ import absolute_import
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    13
3670
1043e9c54355 compat: adapt `amend --patch` to the new `patch.extract` API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3661
diff changeset
    14
import contextlib
2763
4a5b0c373e65 commands: move the touch to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
    15
import random
4a5b0c373e65 commands: move the touch to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
    16
2724
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    17
from mercurial import (
2762
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
    18
    bookmarks as bookmarksmod,
2724
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    19
    cmdutil,
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    20
    commands,
2725
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
    21
    context,
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
    22
    copies,
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
    23
    error,
2760
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
    24
    hg,
2725
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
    25
    lock as lockmod,
3453
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
    26
    merge,
2725
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
    27
    node,
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
    28
    obsolete,
3697
6aff4bb3970d compat: drop compatibility layer for successorssets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3694
diff changeset
    29
    obsutil,
2941
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
    30
    patch,
2725
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
    31
    phases,
4752
8a73a8df63b6 py3: convert opts keys to bytes before passing to core APIs
Martin von Zweigbergk <martinvonz@google.com>
parents: 4747
diff changeset
    32
    pycompat,
2725
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
    33
    scmutil,
2724
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    34
    util,
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    35
)
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    36
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    37
from mercurial.i18n import _
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    38
3675
1dccccde82bb compat: access datestr in a way compatible with verison prior to 4.6
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3670
diff changeset
    39
try:
1dccccde82bb compat: access datestr in a way compatible with verison prior to 4.6
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3670
diff changeset
    40
    from mercurial.utils.dateutil import datestr
1dccccde82bb compat: access datestr in a way compatible with verison prior to 4.6
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3670
diff changeset
    41
except ImportError: # hg <= 4.5
1dccccde82bb compat: access datestr in a way compatible with verison prior to 4.6
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3670
diff changeset
    42
    from mercurial.util import datestr
3660
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
    43
2724
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    44
from . import (
2763
4a5b0c373e65 commands: move the touch to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
    45
    compat,
3457
82e9f9603b1b evolvestate: rename the file to state.py and class name to cmdstate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3456
diff changeset
    46
    state,
2724
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    47
    exthelper,
2756
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2752
diff changeset
    48
    rewriteutil,
2763
4a5b0c373e65 commands: move the touch to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
    49
    utility,
2724
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    50
)
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    51
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    52
eh = exthelper.exthelper()
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    53
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    54
walkopts = commands.walkopts
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    55
commitopts = commands.commitopts
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    56
commitopts2 = commands.commitopts2
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    57
mergetoolopts = commands.mergetoolopts
2941
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
    58
stringio = util.stringio
2724
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    59
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    60
# option added by evolve
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    61
3283
039c4b8dc3ed obsnote: warn if user try to store a note in obsmarker on an older hg
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3271
diff changeset
    62
def _checknotesize(ui, opts):
3213
7bc587557e4f cmdrewrite: add a utility function to make sure note is of valid format
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2949
diff changeset
    63
    """ make sure note is of valid format """
7bc587557e4f cmdrewrite: add a utility function to make sure note is of valid format
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2949
diff changeset
    64
7bc587557e4f cmdrewrite: add a utility function to make sure note is of valid format
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2949
diff changeset
    65
    note = opts.get('note')
7bc587557e4f cmdrewrite: add a utility function to make sure note is of valid format
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2949
diff changeset
    66
    if not note:
7bc587557e4f cmdrewrite: add a utility function to make sure note is of valid format
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2949
diff changeset
    67
        return
7bc587557e4f cmdrewrite: add a utility function to make sure note is of valid format
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2949
diff changeset
    68
3283
039c4b8dc3ed obsnote: warn if user try to store a note in obsmarker on an older hg
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3271
diff changeset
    69
    if not compat.isobsnotesupported():
039c4b8dc3ed obsnote: warn if user try to store a note in obsmarker on an older hg
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3271
diff changeset
    70
        ui.warn(_("current hg version does not support storing"
039c4b8dc3ed obsnote: warn if user try to store a note in obsmarker on an older hg
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3271
diff changeset
    71
                  " note in obsmarker\n"))
3213
7bc587557e4f cmdrewrite: add a utility function to make sure note is of valid format
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2949
diff changeset
    72
    if len(note) > 255:
7bc587557e4f cmdrewrite: add a utility function to make sure note is of valid format
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2949
diff changeset
    73
        raise error.Abort(_("cannot store a note of more than 255 bytes"))
7bc587557e4f cmdrewrite: add a utility function to make sure note is of valid format
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2949
diff changeset
    74
    if '\n' in note:
7bc587557e4f cmdrewrite: add a utility function to make sure note is of valid format
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2949
diff changeset
    75
        raise error.Abort(_("note cannot contain a newline"))
7bc587557e4f cmdrewrite: add a utility function to make sure note is of valid format
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2949
diff changeset
    76
2724
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    77
def _resolveoptions(ui, opts):
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    78
    """modify commit options dict to handle related options
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    79
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    80
    For now, all it does is figure out the commit date: respect -D unless
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    81
    -d was supplied.
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    82
    """
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    83
    # N.B. this is extremely similar to setupheaderopts() in mq.py
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    84
    if not opts.get('date') and opts.get('current_date'):
3514
498f782ccb4b compat: add compat layer for date related functions
Boris Feld <boris.feld@octobus.net>
parents: 3506
diff changeset
    85
        opts['date'] = '%d %d' % compat.makedate()
2724
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    86
    if not opts.get('user') and opts.get('current_user'):
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    87
        opts['user'] = ui.username()
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    88
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    89
commitopts3 = [
4715
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
    90
    (b'D', b'current-date', None,
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
    91
     _(b'record the current date as commit date')),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
    92
    (b'U', b'current-user', None,
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
    93
     _(b'record the current user as committer')),
2724
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    94
]
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    95
4715
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
    96
interactiveopt = [[b'i', b'interactive', None, _(b'use interactive mode')]]
2724
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    97
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    98
@eh.command(
4715
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
    99
    b'amend|refresh',
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   100
    [(b'A', b'addremove', None,
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   101
      _(b'mark new/missing files as added/removed before committing')),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   102
     (b'a', b'all', False, _(b"match all files")),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   103
     (b'e', b'edit', False, _(b'invoke editor on commit messages')),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   104
     (b'', b'extract', False, _(b'extract changes from the commit to the working copy')),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   105
     (b'', b'patch', False, _(b'make changes to wdir parent by editing patch')),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   106
     (b'', b'close-branch', None,
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   107
      _(b'mark a branch as closed, hiding it from the branch list')),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   108
     (b's', b'secret', None, _(b'use the secret phase for committing')),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   109
     (b'n', b'note', b'', _(b'store a note on amend'), _(b'TEXT')),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   110
     ] + walkopts + commitopts + commitopts2 + commitopts3 + interactiveopt,
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   111
    _(b'[OPTION]... [FILE]...'),
4191
5c734be63c3e evolve: adapt for changed @command decorator
Martin von Zweigbergk <martinvonz@google.com>
parents: 4126
diff changeset
   112
    helpbasic=True)
2724
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   113
def amend(ui, repo, *pats, **opts):
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   114
    """combine a changeset with updates and replace it with a new one
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   115
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   116
    Commits a new changeset incorporating both the changes to the given files
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   117
    and all the changes from the current parent changeset into the repository.
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   118
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   119
    See :hg:`commit` for details about committing changes.
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   120
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   121
    If you don't specify -m, the parent's message will be reused.
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   122
3296
b834cb64f779 amend: fix a typo in amend help text related to the extract option
Boris Feld <boris.feld@octobus.net>
parents: 3283
diff changeset
   123
    If --extract is specified, the behavior of `hg amend` is reversed: Changes
2730
7fbb7a5d359f uncommit: expose the feature with a '--extract' to amend
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2729
diff changeset
   124
    to selected files in the checked out revision appear again as uncommitted
7fbb7a5d359f uncommit: expose the feature with a '--extract' to amend
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2729
diff changeset
   125
    changed in the working directory.
7fbb7a5d359f uncommit: expose the feature with a '--extract' to amend
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2729
diff changeset
   126
2724
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   127
    Returns 0 on success, 1 if nothing changed.
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   128
    """
3283
039c4b8dc3ed obsnote: warn if user try to store a note in obsmarker on an older hg
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3271
diff changeset
   129
    _checknotesize(ui, opts)
2724
e6bc6eaa17c5 amend: extract into a 'evolve.evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   130
    opts = opts.copy()
3660
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   131
    if opts.get('patch'):
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   132
        return amendpatch(ui, repo, *pats, **opts)
2730
7fbb7a5d359f uncommit: expose the feature with a '--extract' to amend
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2729
diff changeset
   133
    if opts.get('extract'):
7fbb7a5d359f uncommit: expose the feature with a '--extract' to amend
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2729
diff changeset
   134
        return uncommit(ui, repo, *pats, **opts)
7fbb7a5d359f uncommit: expose the feature with a '--extract' to amend
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2729
diff changeset
   135
    else:
7fbb7a5d359f uncommit: expose the feature with a '--extract' to amend
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2729
diff changeset
   136
        if opts.pop('all', False):
7fbb7a5d359f uncommit: expose the feature with a '--extract' to amend
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2729
diff changeset
   137
            # add an include for all
7fbb7a5d359f uncommit: expose the feature with a '--extract' to amend
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2729
diff changeset
   138
            include = list(opts.get('include'))
7fbb7a5d359f uncommit: expose the feature with a '--extract' to amend
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2729
diff changeset
   139
            include.append('re:.*')
7fbb7a5d359f uncommit: expose the feature with a '--extract' to amend
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2729
diff changeset
   140
        edit = opts.pop('edit', False)
7fbb7a5d359f uncommit: expose the feature with a '--extract' to amend
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2729
diff changeset
   141
        log = opts.get('logfile')
7fbb7a5d359f uncommit: expose the feature with a '--extract' to amend
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2729
diff changeset
   142
        opts['amend'] = True
7fbb7a5d359f uncommit: expose the feature with a '--extract' to amend
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2729
diff changeset
   143
        _resolveoptions(ui, opts)
7fbb7a5d359f uncommit: expose the feature with a '--extract' to amend
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2729
diff changeset
   144
        _alias, commitcmd = cmdutil.findcmd('commit', commands.table)
3744
4a70392f1723 amend: use context manager for locks (issue5887)
Martin von Zweigbergk <martinvonz@google.com>
parents: 3709
diff changeset
   145
        with repo.wlock(), repo.lock():
3452
8275ef099135 amend: query the wdir parent after taking lock (issue5266)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3451
diff changeset
   146
            if not (edit or opts['message'] or log):
8275ef099135 amend: query the wdir parent after taking lock (issue5266)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3451
diff changeset
   147
                opts['message'] = repo['.'].description()
2787
ebca049e8ca9 amend: use precheck to validate revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2786
diff changeset
   148
            rewriteutil.precheck(repo, [repo['.'].rev()], action='amend')
ebca049e8ca9 amend: use precheck to validate revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2786
diff changeset
   149
            return commitcmd[0](ui, repo, *pats, **opts)
2725
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   150
3660
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   151
def amendpatch(ui, repo, *pats, **opts):
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   152
    """logic for --patch flag of `hg amend` command."""
4642
a7c4f163656b cmdrewrite: use context manager for some locks and transactions
Martin von Zweigbergk <martinvonz@google.com>
parents: 4640
diff changeset
   153
    with repo.wlock(), repo.lock(), repo.transaction('amend') as tr:
3660
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   154
        cmdutil.bailifchanged(repo)
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   155
        # first get the patch
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   156
        old = repo['.']
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   157
        p1 = old.p1()
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   158
        rewriteutil.precheck(repo, [old.rev()], 'amend')
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   159
        diffopts = patch.difffeatureopts(repo.ui, whitespace=True)
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   160
        diffopts.nodates = True
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   161
        diffopts.git = True
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   162
        fp = stringio()
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   163
        _writectxmetadata(repo, old, fp)
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   164
        matcher = scmutil.match(old, pats, opts)
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   165
        for chunk, label in patch.diffui(repo, p1.node(), old.node(),
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   166
                                         match=matcher,
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   167
                                         opts=diffopts):
4463
7d54a538dd1e evolve: unindent some lines caught by flake8
Anton Shestakov <av6@dwimlabs.net>
parents: 4446
diff changeset
   168
            fp.write(chunk)
3661
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   169
        newnode = _editandapply(ui, repo, pats, old, p1, fp, diffopts)
3660
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   170
        if newnode == old.node():
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   171
            raise error.Abort(_("nothing changed"))
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   172
        metadata = {}
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   173
        if opts.get('note'):
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   174
            metadata['note'] = opts['note']
4372
5345be014f2c amend: use scmutil.cleanupnodes() with --patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 4371
diff changeset
   175
        replacements = {old.node(): [newnode]}
5345be014f2c amend: use scmutil.cleanupnodes() with --patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 4371
diff changeset
   176
        scmutil.cleanupnodes(repo, replacements, operation='amend',
5345be014f2c amend: use scmutil.cleanupnodes() with --patch
Martin von Zweigbergk <martinvonz@google.com>
parents: 4371
diff changeset
   177
                             metadata=metadata)
3660
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   178
        phases.retractboundary(repo, tr, old.phase(), [newnode])
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   179
        hg.updaterepo(repo, newnode, True)
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   180
3661
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   181
def _editandapply(ui, repo, pats, old, p1, fp, diffopts):
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   182
    newnode = None
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   183
    while newnode is None:
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   184
        fp.seek(0)
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   185
        previous_patch = fp.getvalue()
4734
6b101bbd907a cleanup: remove check only needed for hg versions before 4.4
Martin von Zweigbergk <martinvonz@google.com>
parents: 4733
diff changeset
   186
        newpatch = ui.edit(fp.getvalue(), old.user(), action="diff")
3661
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   187
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   188
        afp = stringio()
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   189
        afp.write(newpatch)
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   190
        if pats:
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   191
            # write rest of the files in the patch
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   192
            restmatcher = scmutil.match(old, [], opts={'exclude': pats})
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   193
            for chunk, label in patch.diffui(repo, p1.node(), old.node(),
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   194
                                             match=restmatcher,
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   195
                                             opts=diffopts):
4463
7d54a538dd1e evolve: unindent some lines caught by flake8
Anton Shestakov <av6@dwimlabs.net>
parents: 4446
diff changeset
   196
                afp.write(chunk)
3661
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   197
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   198
        user_patch = afp.getvalue()
3877
96bbea985b25 amend: allow aborting an `amend --patch` by saving an empty file (issue5925)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3751
diff changeset
   199
        if not user_patch:
96bbea985b25 amend: allow aborting an `amend --patch` by saving an empty file (issue5925)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3751
diff changeset
   200
            raise error.Abort(_("empty patch file, amend aborted"))
3661
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   201
        if user_patch == previous_patch:
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   202
            raise error.Abort(_("patch unchanged"))
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   203
        afp.seek(0)
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   204
        # write the patch to repo and get the newnode
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   205
        try:
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   206
            newnode = _writepatch(ui, repo, old, afp)
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   207
        except patch.PatchError as err:
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   208
            ui.write_err(_("failed to apply edited patch: %s\n") % err)
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   209
            defaultchoice = 0 # yes
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   210
            if not ui.interactive:
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   211
                defaultchoice = 1 # no
4108
ef3c9ecb8099 cmdrewrite: rename variable and move it closer to where it is used
Anton Shestakov <av6@dwimlabs.net>
parents: 4052
diff changeset
   212
            retrychoice = _('try to fix the patch (yn)?$$ &Yes $$ &No')
ef3c9ecb8099 cmdrewrite: rename variable and move it closer to where it is used
Anton Shestakov <av6@dwimlabs.net>
parents: 4052
diff changeset
   213
            if ui.promptchoice(retrychoice, default=defaultchoice):
3661
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   214
                raise error.Abort(_("Could not apply amended path"))
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   215
            else:
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   216
                # consider a third choice where we restore the original patch
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   217
                fp = stringio()
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   218
                fp.write(user_patch)
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   219
    return newnode
61fdd25542a6 patch: offer the user a chance to fix the patch if it fails to apply
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3660
diff changeset
   220
3660
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   221
def _writepatch(ui, repo, old, fp):
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   222
    """utility function to use filestore and patchrepo to apply a patch to the
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   223
    repository with metadata being extracted from the patch"""
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   224
    metadata = patch.extract(ui, fp)
3670
1043e9c54355 compat: adapt `amend --patch` to the new `patch.extract` API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3661
diff changeset
   225
    if util.safehasattr(metadata, 'get'): # < hg-4.6
1043e9c54355 compat: adapt `amend --patch` to the new `patch.extract` API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3661
diff changeset
   226
        @contextlib.contextmanager
1043e9c54355 compat: adapt `amend --patch` to the new `patch.extract` API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3661
diff changeset
   227
        def patchcontext():
1043e9c54355 compat: adapt `amend --patch` to the new `patch.extract` API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3661
diff changeset
   228
            yield metadata
1043e9c54355 compat: adapt `amend --patch` to the new `patch.extract` API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3661
diff changeset
   229
        patchcontext = patchcontext()
1043e9c54355 compat: adapt `amend --patch` to the new `patch.extract` API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3661
diff changeset
   230
    else:
1043e9c54355 compat: adapt `amend --patch` to the new `patch.extract` API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3661
diff changeset
   231
        patchcontext = metadata
3660
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   232
    pold = old.p1()
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   233
3670
1043e9c54355 compat: adapt `amend --patch` to the new `patch.extract` API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3661
diff changeset
   234
    with patchcontext as metadata:
1043e9c54355 compat: adapt `amend --patch` to the new `patch.extract` API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3661
diff changeset
   235
        # store the metadata from the patch to variables
1043e9c54355 compat: adapt `amend --patch` to the new `patch.extract` API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3661
diff changeset
   236
        parents = (metadata.get('p1'), metadata.get('p2'))
1043e9c54355 compat: adapt `amend --patch` to the new `patch.extract` API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3661
diff changeset
   237
        date = metadata.get('date') or old.date()
1043e9c54355 compat: adapt `amend --patch` to the new `patch.extract` API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3661
diff changeset
   238
        branch = metadata.get('branch') or old.branch()
1043e9c54355 compat: adapt `amend --patch` to the new `patch.extract` API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3661
diff changeset
   239
        user = metadata.get('user') or old.user()
1043e9c54355 compat: adapt `amend --patch` to the new `patch.extract` API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3661
diff changeset
   240
        # XXX: we must extract extras from the patchfile too
1043e9c54355 compat: adapt `amend --patch` to the new `patch.extract` API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3661
diff changeset
   241
        extra = old.extra()
1043e9c54355 compat: adapt `amend --patch` to the new `patch.extract` API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3661
diff changeset
   242
        message = metadata.get('message') or old.description()
1043e9c54355 compat: adapt `amend --patch` to the new `patch.extract` API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3661
diff changeset
   243
        store = patch.filestore()
1043e9c54355 compat: adapt `amend --patch` to the new `patch.extract` API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3661
diff changeset
   244
        fp.seek(0)
1043e9c54355 compat: adapt `amend --patch` to the new `patch.extract` API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3661
diff changeset
   245
        try:
1043e9c54355 compat: adapt `amend --patch` to the new `patch.extract` API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3661
diff changeset
   246
            files = set()
1043e9c54355 compat: adapt `amend --patch` to the new `patch.extract` API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3661
diff changeset
   247
            # beware: next line may raise a PatchError to be handled by the caller
1043e9c54355 compat: adapt `amend --patch` to the new `patch.extract` API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3661
diff changeset
   248
            # of this function
1043e9c54355 compat: adapt `amend --patch` to the new `patch.extract` API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3661
diff changeset
   249
            patch.patchrepo(ui, repo, pold, store, fp, 1, '',
1043e9c54355 compat: adapt `amend --patch` to the new `patch.extract` API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3661
diff changeset
   250
                            files=files, eolmode=None)
3660
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   251
3670
1043e9c54355 compat: adapt `amend --patch` to the new `patch.extract` API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3661
diff changeset
   252
            memctx = context.memctx(repo, parents, message, files=files,
1043e9c54355 compat: adapt `amend --patch` to the new `patch.extract` API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3661
diff changeset
   253
                                    filectxfn=store,
1043e9c54355 compat: adapt `amend --patch` to the new `patch.extract` API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3661
diff changeset
   254
                                    user=user,
1043e9c54355 compat: adapt `amend --patch` to the new `patch.extract` API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3661
diff changeset
   255
                                    date=date,
1043e9c54355 compat: adapt `amend --patch` to the new `patch.extract` API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3661
diff changeset
   256
                                    branch=branch,
1043e9c54355 compat: adapt `amend --patch` to the new `patch.extract` API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3661
diff changeset
   257
                                    extra=extra)
1043e9c54355 compat: adapt `amend --patch` to the new `patch.extract` API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3661
diff changeset
   258
            newcm = memctx.commit()
1043e9c54355 compat: adapt `amend --patch` to the new `patch.extract` API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3661
diff changeset
   259
        finally:
1043e9c54355 compat: adapt `amend --patch` to the new `patch.extract` API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3661
diff changeset
   260
            store.close()
3660
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   261
    return newcm
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   262
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   263
def _writectxmetadata(repo, ctx, fp):
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   264
    nodeval = scmutil.binnode(ctx)
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   265
    parents = [p.node() for p in ctx.parents() if p]
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   266
    branch = ctx.branch()
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   267
    if parents:
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   268
        prev = parents[0]
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   269
    else:
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   270
        prev = node.nullid
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   271
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   272
    fp.write("# HG changeset patch\n")
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   273
    fp.write("# User %s\n" % ctx.user())
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   274
    fp.write("# Date %d %d\n" % ctx.date())
3675
1dccccde82bb compat: access datestr in a way compatible with verison prior to 4.6
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3670
diff changeset
   275
    fp.write("#      %s\n" % datestr(ctx.date()))
3660
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   276
    if branch and branch != 'default':
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   277
        fp.write("# Branch %s\n" % branch)
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   278
    fp.write("# Node ID %s\n" % node.hex(nodeval))
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   279
    fp.write("# Parent  %s\n" % node.hex(prev))
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   280
    if len(parents) > 1:
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   281
        fp.write("# Parent  %s\n" % node.hex(parents[1]))
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   282
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   283
    for headerid in cmdutil.extraexport:
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   284
        header = cmdutil.extraexportmap[headerid](1, ctx)
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   285
        if header is not None:
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   286
            fp.write('# %s\n' % header)
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   287
    fp.write(ctx.description().rstrip())
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   288
    fp.write("\n\n")
f018656ca3bf amend: add a new flag `--patch` to `hg amend`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   289
2725
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   290
def _touchedbetween(repo, source, dest, match=None):
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   291
    touched = set()
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   292
    for files in repo.status(source, dest, match=match)[:3]:
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   293
        touched.update(files)
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   294
    return touched
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   295
2728
3c371aa16cb9 uncommit: add support for --user and --date
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2727
diff changeset
   296
def _commitfiltered(repo, ctx, match, target=None, message=None, user=None,
3c371aa16cb9 uncommit: add support for --user and --date
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2727
diff changeset
   297
                    date=None):
2725
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   298
    """Recommit ctx with changed files not in match. Return the new
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   299
    node identifier, or None if nothing changed.
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   300
    """
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   301
    base = ctx.p1()
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   302
    if target is None:
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   303
        target = base
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   304
    # ctx
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   305
    initialfiles = _touchedbetween(repo, base, ctx)
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   306
    if base == target:
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   307
        affected = set(f for f in initialfiles if match(f))
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   308
        newcontent = set()
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   309
    else:
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   310
        affected = _touchedbetween(repo, target, ctx, match=match)
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   311
        newcontent = _touchedbetween(repo, target, base, match=match)
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   312
    # The commit touchs all existing files
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   313
    # + all file that needs a new content
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   314
    # - the file affected bny uncommit with the same content than base.
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   315
    files = (initialfiles - affected) | newcontent
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   316
    if not newcontent and files == initialfiles:
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   317
        return None
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   318
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   319
    # Filter copies
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   320
    copied = copies.pathcopies(target, ctx)
4714
c51fc0ae7a7e py3: switch from iteritems() to items()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4707
diff changeset
   321
    copied = dict((dst, src) for dst, src in copied.items()
2725
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   322
                  if dst in files)
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   323
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   324
    def filectxfn(repo, memctx, path, contentctx=ctx, redirect=newcontent):
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   325
        if path in redirect:
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   326
            return filectxfn(repo, memctx, path, contentctx=target, redirect=())
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   327
        if path not in contentctx:
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   328
            return None
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   329
        fctx = contentctx[path]
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   330
        flags = fctx.flags()
3298
f4b06f44d274 memfilectx: changectx argument is not mandatory
Boris Feld <boris.feld@octobus.net>
parents: 3296
diff changeset
   331
        mctx = compat.memfilectx(repo, memctx, fctx, flags, copied, path)
2725
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   332
        return mctx
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   333
2727
f7d44441dfd3 uncommit: add support for --message and --logfile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2726
diff changeset
   334
    if message is None:
f7d44441dfd3 uncommit: add support for --message and --logfile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2726
diff changeset
   335
        message = ctx.description()
2728
3c371aa16cb9 uncommit: add support for --user and --date
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2727
diff changeset
   336
    if not user:
3c371aa16cb9 uncommit: add support for --user and --date
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2727
diff changeset
   337
        user = ctx.user()
3c371aa16cb9 uncommit: add support for --user and --date
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2727
diff changeset
   338
    if not date:
3c371aa16cb9 uncommit: add support for --user and --date
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2727
diff changeset
   339
        date = ctx.date()
2725
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   340
    new = context.memctx(repo,
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   341
                         parents=[base.node(), node.nullid],
2727
f7d44441dfd3 uncommit: add support for --message and --logfile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2726
diff changeset
   342
                         text=message,
2725
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   343
                         files=files,
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   344
                         filectxfn=filectxfn,
2728
3c371aa16cb9 uncommit: add support for --user and --date
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2727
diff changeset
   345
                         user=user,
3c371aa16cb9 uncommit: add support for --user and --date
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2727
diff changeset
   346
                         date=date,
2725
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   347
                         extra=ctx.extra())
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   348
    # commitctx always create a new revision, no need to check
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   349
    newid = repo.commitctx(new)
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   350
    return newid
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   351
2943
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   352
def _uncommitdirstate(repo, oldctx, match, interactive):
2725
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   353
    """Fix the dirstate after switching the working directory from
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   354
    oldctx to a copy of oldctx not containing changed files matched by
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   355
    match.
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   356
    """
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   357
    ctx = repo['.']
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   358
    ds = repo.dirstate
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   359
    copies = dict(ds.copies())
2943
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   360
    if interactive:
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   361
        # In interactive cases, we will find the status between oldctx and ctx
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   362
        # and considering only the files which are changed between oldctx and
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   363
        # ctx, and the status of what changed between oldctx and ctx will help
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   364
        # us in defining the exact behavior
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   365
        m, a, r = repo.status(oldctx, ctx, match=match)[:3]
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   366
        for f in m:
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   367
            # These are files which are modified between oldctx and ctx which
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   368
            # contains two cases: 1) Were modified in oldctx and some
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   369
            # modifications are uncommitted
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   370
            # 2) Were added in oldctx but some part is uncommitted (this cannot
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   371
            # contain the case when added files are uncommitted completely as
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   372
            # that will result in status as removed not modified.)
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   373
            # Also any modifications to a removed file will result the status as
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   374
            # added, so we have only two cases. So in either of the cases, the
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   375
            # resulting status can be modified or clean.
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   376
            if ds[f] == 'r':
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   377
                # But the file is removed in the working directory, leaving that
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   378
                # as removed
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   379
                continue
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   380
            ds.normallookup(f)
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   381
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   382
        for f in a:
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   383
            # These are the files which are added between oldctx and ctx(new
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   384
            # one), which means the files which were removed in oldctx
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   385
            # but uncommitted completely while making the ctx
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   386
            # This file should be marked as removed if the working directory
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   387
            # does not adds it back. If it's adds it back, we do a normallookup.
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   388
            # The file can't be removed in working directory, because it was
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   389
            # removed in oldctx
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   390
            if ds[f] == 'a':
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   391
                ds.normallookup(f)
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   392
                continue
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   393
            ds.remove(f)
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   394
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   395
        for f in r:
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   396
            # These are files which are removed between oldctx and ctx, which
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   397
            # means the files which were added in oldctx and were completely
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   398
            # uncommitted in ctx. If a added file is partially uncommitted, that
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   399
            # would have resulted in modified status, not removed.
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   400
            # So a file added in a commit, and uncommitting that addition must
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   401
            # result in file being stated as unknown.
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   402
            if ds[f] == 'r':
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   403
                # The working directory say it's removed, so lets make the file
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   404
                # unknown
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   405
                ds.drop(f)
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   406
                continue
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   407
            ds.add(f)
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   408
    else:
2942
10194206acc7 uncommit: pre-indent a block in if-True
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2941
diff changeset
   409
        m, a, r = repo.status(oldctx.p1(), oldctx, match=match)[:3]
10194206acc7 uncommit: pre-indent a block in if-True
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2941
diff changeset
   410
        for f in m:
10194206acc7 uncommit: pre-indent a block in if-True
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2941
diff changeset
   411
            if ds[f] == 'r':
10194206acc7 uncommit: pre-indent a block in if-True
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2941
diff changeset
   412
                # modified + removed -> removed
10194206acc7 uncommit: pre-indent a block in if-True
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2941
diff changeset
   413
                continue
10194206acc7 uncommit: pre-indent a block in if-True
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2941
diff changeset
   414
            ds.normallookup(f)
2725
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   415
2942
10194206acc7 uncommit: pre-indent a block in if-True
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2941
diff changeset
   416
        for f in a:
10194206acc7 uncommit: pre-indent a block in if-True
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2941
diff changeset
   417
            if ds[f] == 'r':
10194206acc7 uncommit: pre-indent a block in if-True
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2941
diff changeset
   418
                # added + removed -> unknown
10194206acc7 uncommit: pre-indent a block in if-True
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2941
diff changeset
   419
                ds.drop(f)
10194206acc7 uncommit: pre-indent a block in if-True
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2941
diff changeset
   420
            elif ds[f] != 'a':
10194206acc7 uncommit: pre-indent a block in if-True
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2941
diff changeset
   421
                ds.add(f)
2725
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   422
2942
10194206acc7 uncommit: pre-indent a block in if-True
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2941
diff changeset
   423
        for f in r:
10194206acc7 uncommit: pre-indent a block in if-True
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2941
diff changeset
   424
            if ds[f] == 'a':
10194206acc7 uncommit: pre-indent a block in if-True
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2941
diff changeset
   425
                # removed + added -> normal
10194206acc7 uncommit: pre-indent a block in if-True
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2941
diff changeset
   426
                ds.normallookup(f)
10194206acc7 uncommit: pre-indent a block in if-True
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2941
diff changeset
   427
            elif ds[f] != 'r':
10194206acc7 uncommit: pre-indent a block in if-True
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2941
diff changeset
   428
                ds.remove(f)
2725
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   429
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   430
    # Merge old parent and old working dir copies
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   431
    oldcopies = {}
2943
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   432
    if interactive:
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   433
        # Interactive had different meaning of the variables so restoring the
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   434
        # original meaning to use them
25576132cb30 uncommit: fix the dirstate handling in `uncommit -i`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2942
diff changeset
   435
        m, a, r = repo.status(oldctx.p1(), oldctx, match=match)[:3]
2725
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   436
    for f in (m + a):
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   437
        src = oldctx[f].renamed()
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   438
        if src:
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   439
            oldcopies[f] = src[0]
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   440
    oldcopies.update(copies)
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   441
    copies = dict((dst, oldcopies.get(src, src))
4714
c51fc0ae7a7e py3: switch from iteritems() to items()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4707
diff changeset
   442
                  for dst, src in oldcopies.items())
2725
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   443
    # Adjust the dirstate copies
4714
c51fc0ae7a7e py3: switch from iteritems() to items()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4707
diff changeset
   444
    for dst, src in copies.items():
2725
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   445
        if (src not in ctx or dst in ctx or ds[dst] != 'a'):
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   446
            src = None
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   447
        ds.copy(src, dst)
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   448
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   449
@eh.command(
4715
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   450
    b'uncommit',
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   451
    [(b'a', b'all', None, _(b'uncommit all changes when no arguments given')),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   452
     (b'i', b'interactive', False, _(b'interactive mode to uncommit (EXPERIMENTAL)')),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   453
     (b'r', b'rev', b'', _(b'revert commit content to REV instead'), _(b'REV')),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   454
     (b'', b'revert', False, _(b'discard working directory changes after uncommit')),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   455
     (b'n', b'note', b'', _(b'store a note on uncommit'), _(b'TEXT')),
2729
69fe16428b0f uncommit: add support for -U and -D
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2728
diff changeset
   456
     ] + commands.walkopts + commitopts + commitopts2 + commitopts3,
4715
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   457
    _(b'[OPTION]... [NAME]'))
2725
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   458
def uncommit(ui, repo, *pats, **opts):
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   459
    """move changes from parent revision to working directory
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   460
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   461
    Changes to selected files in the checked out revision appear again as
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   462
    uncommitted changed in the working directory. A new revision
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   463
    without the selected changes is created, becomes the checked out
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   464
    revision, and obsoletes the previous one.
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   465
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   466
    The --include option specifies patterns to uncommit.
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   467
    The --exclude option specifies patterns to keep in the commit.
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   468
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   469
    The --rev argument let you change the commit file to a content of another
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   470
    revision. It still does not change the content of your file in the working
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   471
    directory.
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   472
2941
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   473
    .. container:: verbose
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   474
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   475
       The --interactive option lets you select hunks interactively to uncommit.
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   476
       You can uncommit parts of file using this option.
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   477
2725
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   478
    Return 0 if changed files are uncommitted.
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   479
    """
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   480
3283
039c4b8dc3ed obsnote: warn if user try to store a note in obsmarker on an older hg
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3271
diff changeset
   481
    _checknotesize(ui, opts)
2729
69fe16428b0f uncommit: add support for -U and -D
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2728
diff changeset
   482
    _resolveoptions(ui, opts) # process commitopts3
2941
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   483
    interactive = opts.get('interactive')
2725
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   484
    wlock = lock = tr = None
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   485
    try:
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   486
        wlock = repo.wlock()
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   487
        lock = repo.lock()
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   488
        wctx = repo[None]
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   489
        if len(wctx.parents()) <= 0:
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   490
            raise error.Abort(_("cannot uncommit null changeset"))
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   491
        if len(wctx.parents()) > 1:
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   492
            raise error.Abort(_("cannot uncommit while merging"))
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   493
        old = repo['.']
2788
554c069cdc85 uncommit: use precheck to validate revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2787
diff changeset
   494
        rewriteutil.precheck(repo, [repo['.'].rev()], action='uncommit')
2725
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   495
        if len(old.parents()) > 1:
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   496
            raise error.Abort(_("cannot uncommit merge changeset"))
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   497
        oldphase = old.phase()
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   498
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   499
        rev = None
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   500
        if opts.get('rev'):
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   501
            rev = scmutil.revsingle(repo, opts.get('rev'))
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   502
            ctx = repo[None]
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   503
            if ctx.p1() == rev or ctx.p2() == rev:
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   504
                raise error.Abort(_("cannot uncommit to parent changeset"))
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   505
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   506
        onahead = old.rev() in repo.changelog.headrevs()
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   507
        disallowunstable = not obsolete.isenabled(repo,
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   508
                                                  obsolete.allowunstableopt)
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   509
        if disallowunstable and not onahead:
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   510
            raise error.Abort(_("cannot uncommit in the middle of a stack"))
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   511
4752
8a73a8df63b6 py3: convert opts keys to bytes before passing to core APIs
Martin von Zweigbergk <martinvonz@google.com>
parents: 4747
diff changeset
   512
        match = scmutil.match(old, pats, pycompat.byteskwargs(opts))
4506
79de4e86d9a4 uncommit: abort if an explicitly given file cannot be uncommitted (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents: 4499
diff changeset
   513
79de4e86d9a4 uncommit: abort if an explicitly given file cannot be uncommitted (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents: 4499
diff changeset
   514
        # Check all explicitly given files; abort if there's a problem.
79de4e86d9a4 uncommit: abort if an explicitly given file cannot be uncommitted (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents: 4499
diff changeset
   515
        if match.files():
79de4e86d9a4 uncommit: abort if an explicitly given file cannot be uncommitted (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents: 4499
diff changeset
   516
            s = old.status(old.p1(), match, listclean=True)
79de4e86d9a4 uncommit: abort if an explicitly given file cannot be uncommitted (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents: 4499
diff changeset
   517
            eligible = set(s.added) | set(s.modified) | set(s.removed)
79de4e86d9a4 uncommit: abort if an explicitly given file cannot be uncommitted (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents: 4499
diff changeset
   518
79de4e86d9a4 uncommit: abort if an explicitly given file cannot be uncommitted (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents: 4499
diff changeset
   519
            badfiles = set(match.files()) - eligible
79de4e86d9a4 uncommit: abort if an explicitly given file cannot be uncommitted (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents: 4499
diff changeset
   520
79de4e86d9a4 uncommit: abort if an explicitly given file cannot be uncommitted (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents: 4499
diff changeset
   521
            # Naming a parent directory of an eligible file is OK, even
79de4e86d9a4 uncommit: abort if an explicitly given file cannot be uncommitted (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents: 4499
diff changeset
   522
            # if not everything tracked in that directory can be
79de4e86d9a4 uncommit: abort if an explicitly given file cannot be uncommitted (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents: 4499
diff changeset
   523
            # uncommitted.
79de4e86d9a4 uncommit: abort if an explicitly given file cannot be uncommitted (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents: 4499
diff changeset
   524
            if badfiles:
79de4e86d9a4 uncommit: abort if an explicitly given file cannot be uncommitted (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents: 4499
diff changeset
   525
                badfiles -= set([f for f in util.dirs(eligible)])
79de4e86d9a4 uncommit: abort if an explicitly given file cannot be uncommitted (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents: 4499
diff changeset
   526
79de4e86d9a4 uncommit: abort if an explicitly given file cannot be uncommitted (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents: 4499
diff changeset
   527
            try:
79de4e86d9a4 uncommit: abort if an explicitly given file cannot be uncommitted (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents: 4499
diff changeset
   528
                uipathfn = scmutil.getuipathfn(repo)
79de4e86d9a4 uncommit: abort if an explicitly given file cannot be uncommitted (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents: 4499
diff changeset
   529
            except AttributeError:
79de4e86d9a4 uncommit: abort if an explicitly given file cannot be uncommitted (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents: 4499
diff changeset
   530
                uipathfn = match.rel   # <= 4.9
79de4e86d9a4 uncommit: abort if an explicitly given file cannot be uncommitted (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents: 4499
diff changeset
   531
79de4e86d9a4 uncommit: abort if an explicitly given file cannot be uncommitted (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents: 4499
diff changeset
   532
            for f in sorted(badfiles):
79de4e86d9a4 uncommit: abort if an explicitly given file cannot be uncommitted (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents: 4499
diff changeset
   533
                if f in s.clean:
79de4e86d9a4 uncommit: abort if an explicitly given file cannot be uncommitted (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents: 4499
diff changeset
   534
                    hint = _(b"file was not changed in working directory "
79de4e86d9a4 uncommit: abort if an explicitly given file cannot be uncommitted (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents: 4499
diff changeset
   535
                             b"parent")
79de4e86d9a4 uncommit: abort if an explicitly given file cannot be uncommitted (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents: 4499
diff changeset
   536
                elif repo.wvfs.exists(f):
79de4e86d9a4 uncommit: abort if an explicitly given file cannot be uncommitted (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents: 4499
diff changeset
   537
                    hint = _(b"file was untracked in working directory parent")
79de4e86d9a4 uncommit: abort if an explicitly given file cannot be uncommitted (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents: 4499
diff changeset
   538
                else:
79de4e86d9a4 uncommit: abort if an explicitly given file cannot be uncommitted (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents: 4499
diff changeset
   539
                    hint = _(b"file does not exist")
79de4e86d9a4 uncommit: abort if an explicitly given file cannot be uncommitted (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents: 4499
diff changeset
   540
79de4e86d9a4 uncommit: abort if an explicitly given file cannot be uncommitted (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents: 4499
diff changeset
   541
                raise error.Abort(_(b'cannot uncommit "%s"')
79de4e86d9a4 uncommit: abort if an explicitly given file cannot be uncommitted (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents: 4499
diff changeset
   542
                                  % uipathfn(f), hint=hint)
79de4e86d9a4 uncommit: abort if an explicitly given file cannot be uncommitted (BC)
Matt Harbison <matt_harbison@yahoo.com>
parents: 4499
diff changeset
   543
2725
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   544
        # Recommit the filtered changeset
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   545
        tr = repo.transaction('uncommit')
2941
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   546
        if interactive:
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   547
            opts['all'] = True
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   548
            newid = _interactiveuncommit(ui, repo, old, match)
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   549
        else:
2940
89b205e5271e uncommit: pre-indent a block in if-True for the next patch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2923
diff changeset
   550
            newid = None
89b205e5271e uncommit: pre-indent a block in if-True for the next patch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2923
diff changeset
   551
            includeorexclude = opts.get('include') or opts.get('exclude')
89b205e5271e uncommit: pre-indent a block in if-True for the next patch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2923
diff changeset
   552
            if (pats or includeorexclude or opts.get('all')):
89b205e5271e uncommit: pre-indent a block in if-True for the next patch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2923
diff changeset
   553
                if not (opts['message'] or opts['logfile']):
89b205e5271e uncommit: pre-indent a block in if-True for the next patch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2923
diff changeset
   554
                    opts['message'] = old.description()
4752
8a73a8df63b6 py3: convert opts keys to bytes before passing to core APIs
Martin von Zweigbergk <martinvonz@google.com>
parents: 4747
diff changeset
   555
                message = cmdutil.logmessage(ui, pycompat.byteskwargs(opts))
2940
89b205e5271e uncommit: pre-indent a block in if-True for the next patch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2923
diff changeset
   556
                newid = _commitfiltered(repo, old, match, target=rev,
89b205e5271e uncommit: pre-indent a block in if-True for the next patch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2923
diff changeset
   557
                                        message=message, user=opts.get('user'),
89b205e5271e uncommit: pre-indent a block in if-True for the next patch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2923
diff changeset
   558
                                        date=opts.get('date'))
89b205e5271e uncommit: pre-indent a block in if-True for the next patch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2923
diff changeset
   559
            if newid is None:
89b205e5271e uncommit: pre-indent a block in if-True for the next patch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2923
diff changeset
   560
                raise error.Abort(_('nothing to uncommit'),
89b205e5271e uncommit: pre-indent a block in if-True for the next patch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2923
diff changeset
   561
                                  hint=_("use --all to uncommit all files"))
2941
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   562
3220
f0f4cc2febac uncommit: add support for storing a note in obsmarker
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3219
diff changeset
   563
        # metadata to be stored in obsmarker
f0f4cc2febac uncommit: add support for storing a note in obsmarker
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3219
diff changeset
   564
        metadata = {}
f0f4cc2febac uncommit: add support for storing a note in obsmarker
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3219
diff changeset
   565
        if opts.get('note'):
f0f4cc2febac uncommit: add support for storing a note in obsmarker
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3219
diff changeset
   566
            metadata['note'] = opts['note']
f0f4cc2febac uncommit: add support for storing a note in obsmarker
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3219
diff changeset
   567
4373
11bbf4dc694f uncommit: use scmtutil.cleanupnodes()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4372
diff changeset
   568
        replacements = {old.node(): [newid]}
11bbf4dc694f uncommit: use scmtutil.cleanupnodes()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4372
diff changeset
   569
        scmutil.cleanupnodes(repo, replacements, operation="uncommit",
11bbf4dc694f uncommit: use scmtutil.cleanupnodes()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4372
diff changeset
   570
                             metadata=metadata)
2725
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   571
        phases.retractboundary(repo, tr, oldphase, [newid])
3389
eacf6149b678 uncommit: add a new flag `--revert` to discard wdir changes after uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3298
diff changeset
   572
        if opts.get('revert'):
eacf6149b678 uncommit: add a new flag `--revert` to discard wdir changes after uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3298
diff changeset
   573
            hg.updaterepo(repo, newid, True)
eacf6149b678 uncommit: add a new flag `--revert` to discard wdir changes after uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3298
diff changeset
   574
        else:
eacf6149b678 uncommit: add a new flag `--revert` to discard wdir changes after uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3298
diff changeset
   575
            with repo.dirstate.parentchange():
eacf6149b678 uncommit: add a new flag `--revert` to discard wdir changes after uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3298
diff changeset
   576
                repo.dirstate.setparents(newid, node.nullid)
eacf6149b678 uncommit: add a new flag `--revert` to discard wdir changes after uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3298
diff changeset
   577
                _uncommitdirstate(repo, old, match, interactive)
2725
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   578
        if not repo[newid].files():
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   579
            ui.warn(_("new changeset is empty\n"))
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   580
            ui.status(_("(use 'hg prune .' to remove it)\n"))
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   581
        tr.close()
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   582
    finally:
4eb90eace7f9 uncommit: move to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2724
diff changeset
   583
        lockmod.release(tr, lock, wlock)
2760
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   584
2941
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   585
def _interactiveuncommit(ui, repo, old, match):
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   586
    """ The function which contains all the logic for interactively uncommiting
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   587
    a commit. This function makes a temporary commit with the chunks which user
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   588
    selected to uncommit. After that the diff of the parent and that commit is
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   589
    applied to the working directory and committed again which results in the
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   590
    new commit which should be one after uncommitted.
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   591
    """
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   592
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   593
    # create a temporary commit with hunks user selected
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   594
    tempnode = _createtempcommit(ui, repo, old, match)
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   595
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   596
    diffopts = patch.difffeatureopts(repo.ui, whitespace=True)
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   597
    diffopts.nodates = True
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   598
    diffopts.git = True
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   599
    fp = stringio()
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   600
    for chunk, label in patch.diffui(repo, tempnode, old.node(), None,
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   601
                                     opts=diffopts):
4463
7d54a538dd1e evolve: unindent some lines caught by flake8
Anton Shestakov <av6@dwimlabs.net>
parents: 4446
diff changeset
   602
        fp.write(chunk)
2941
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   603
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   604
    fp.seek(0)
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   605
    newnode = _patchtocommit(ui, repo, old, fp)
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   606
    # creating obs marker temp -> ()
3694
c0d5e0929f8b compat: from compatibility layer for createmarkers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3675
diff changeset
   607
    obsolete.createmarkers(repo, [(repo[tempnode], ())], operation="uncommit")
2941
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   608
    return newnode
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   609
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   610
def _createtempcommit(ui, repo, old, match):
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   611
    """ Creates a temporary commit for `uncommit --interative` which contains
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   612
    the hunks which were selected by the user to uncommit.
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   613
    """
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   614
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   615
    pold = old.p1()
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   616
    # The logic to interactively selecting something copied from
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   617
    # cmdutil.revert()
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   618
    diffopts = patch.difffeatureopts(repo.ui, whitespace=True)
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   619
    diffopts.nodates = True
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   620
    diffopts.git = True
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   621
    diff = patch.diff(repo, pold.node(), old.node(), match, opts=diffopts)
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   622
    originalchunks = patch.parsepatch(diff)
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   623
    # XXX: The interactive selection is buggy and does not let you
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   624
    # uncommit a removed file partially.
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   625
    # TODO: wrap the operations in mercurial/patch.py and mercurial/crecord.py
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   626
    # to add uncommit as an operation taking care of BC.
4499
90f94231db5d evolve: compat patch for recordfilter change in mercurial
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4491
diff changeset
   627
    try:
90f94231db5d evolve: compat patch for recordfilter change in mercurial
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4491
diff changeset
   628
        chunks, opts = cmdutil.recordfilter(repo.ui, originalchunks, match,
90f94231db5d evolve: compat patch for recordfilter change in mercurial
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4491
diff changeset
   629
                                            operation='discard')
90f94231db5d evolve: compat patch for recordfilter change in mercurial
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4491
diff changeset
   630
    except TypeError:
90f94231db5d evolve: compat patch for recordfilter change in mercurial
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4491
diff changeset
   631
        # hg <= 4.9 (db72f9f6580e)
90f94231db5d evolve: compat patch for recordfilter change in mercurial
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4491
diff changeset
   632
        chunks, opts = cmdutil.recordfilter(repo.ui, originalchunks,
90f94231db5d evolve: compat patch for recordfilter change in mercurial
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4491
diff changeset
   633
                                            operation='discard')
2941
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   634
    if not chunks:
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   635
        raise error.Abort(_("nothing selected to uncommit"))
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   636
    fp = stringio()
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   637
    for c in chunks:
4463
7d54a538dd1e evolve: unindent some lines caught by flake8
Anton Shestakov <av6@dwimlabs.net>
parents: 4446
diff changeset
   638
        c.write(fp)
2941
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   639
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   640
    fp.seek(0)
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   641
    oldnode = node.hex(old.node())[:12]
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   642
    message = 'temporary commit for uncommiting %s' % oldnode
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   643
    tempnode = _patchtocommit(ui, repo, old, fp, message, oldnode)
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   644
    return tempnode
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   645
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   646
def _patchtocommit(ui, repo, old, fp, message=None, extras=None):
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   647
    """ A function which will apply the patch to the working directory and
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   648
    make a commit whose parents are same as that of old argument. The message
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   649
    argument tells us whether to use the message of the old commit or a
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   650
    different message which is passed. Returns the node of new commit made.
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   651
    """
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   652
    pold = old.p1()
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   653
    parents = (old.p1().node(), old.p2().node())
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   654
    date = old.date()
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   655
    branch = old.branch()
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   656
    user = old.user()
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   657
    extra = old.extra()
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   658
    if extras:
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   659
        extra['uncommit_source'] = extras
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   660
    if not message:
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   661
        message = old.description()
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   662
    store = patch.filestore()
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   663
    try:
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   664
        files = set()
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   665
        try:
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   666
            patch.patchrepo(ui, repo, pold, store, fp, 1, '',
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   667
                            files=files, eolmode=None)
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   668
        except patch.PatchError as err:
4759
f30c1fab7155 py3: convert exceptions to bytes using pycompat.bytestr()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4758
diff changeset
   669
            raise error.Abort(pycompat.bytestr(err))
2941
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   670
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   671
        finally:
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   672
            del fp
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   673
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   674
        memctx = context.memctx(repo, parents, message, files=files,
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   675
                                filectxfn=store,
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   676
                                user=user,
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   677
                                date=date,
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   678
                                branch=branch,
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   679
                                extra=extra)
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   680
        newcm = memctx.commit()
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   681
    finally:
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   682
        store.close()
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   683
    return newcm
b0458b9e1b47 uncommit: add an interactive option to uncommit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2940
diff changeset
   684
2760
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   685
@eh.command(
4715
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   686
    b'fold|squash',
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   687
    [(b'r', b'rev', [], _(b"revision to fold"), _(b'REV')),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   688
     (b'', b'exact', None, _(b"only fold specified revisions")),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   689
     (b'', b'from', None, _(b"fold revisions linearly to working copy parent")),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   690
     (b'n', b'note', b'', _(b'store a note on fold'), _(b'TEXT')),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   691
     ] + commitopts + commitopts2 + commitopts3,
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   692
    _(b'hg fold [OPTION]... [-r] REV'),
4191
5c734be63c3e evolve: adapt for changed @command decorator
Martin von Zweigbergk <martinvonz@google.com>
parents: 4126
diff changeset
   693
    helpbasic=True)
2761
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   694
def fold(ui, repo, *revs, **opts):
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   695
    """fold multiple revisions into a single one
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   696
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   697
    With --from, folds all the revisions linearly between the given revisions
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   698
    and the parent of the working directory.
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   699
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   700
    With --exact, folds only the specified revisions while ignoring the
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   701
    parent of the working directory. In this case, the given revisions must
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   702
    form a linear unbroken chain.
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   703
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   704
    .. container:: verbose
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   705
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   706
     Some examples:
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   707
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   708
     - Fold the current revision with its parent::
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   709
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   710
         hg fold --from .^
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   711
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   712
     - Fold all draft revisions with working directory parent::
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   713
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   714
         hg fold --from 'draft()'
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   715
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   716
       See :hg:`help phases` for more about draft revisions and
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   717
       :hg:`help revsets` for more about the `draft()` keyword
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   718
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   719
     - Fold revisions between 3 and 6 with the working directory parent::
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   720
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   721
         hg fold --from 3::6
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   722
2923
8c2d3c474fc6 doc: make paragraphs before example code end with "::" for reST syntax
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2790
diff changeset
   723
     - Fold revisions 3 and 4::
2761
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   724
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   725
        hg fold "3 + 4" --exact
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   726
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   727
     - Only fold revisions linearly between foo and @::
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   728
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   729
         hg fold foo::@ --exact
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   730
    """
3283
039c4b8dc3ed obsnote: warn if user try to store a note in obsmarker on an older hg
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3271
diff changeset
   731
    _checknotesize(ui, opts)
2768
85e5a56db776 fold: add support for the -D and -U options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2766
diff changeset
   732
    _resolveoptions(ui, opts)
2761
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   733
    revs = list(revs)
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   734
    revs.extend(opts['rev'])
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   735
    if not revs:
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   736
        raise error.Abort(_('no revisions specified'))
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   737
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   738
    revs = scmutil.revrange(repo, revs)
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   739
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   740
    if opts['from'] and opts['exact']:
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   741
        raise error.Abort(_('cannot use both --from and --exact'))
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   742
    elif opts['from']:
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   743
        # Try to extend given revision starting from the working directory
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   744
        extrevs = repo.revs('(%ld::.) or (.::%ld)', revs, revs)
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   745
        discardedrevs = [r for r in revs if r not in extrevs]
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   746
        if discardedrevs:
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   747
            msg = _("cannot fold non-linear revisions")
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   748
            hint = _("given revisions are unrelated to parent of working"
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   749
                     " directory")
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   750
            raise error.Abort(msg, hint=hint)
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   751
        revs = extrevs
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   752
    elif opts['exact']:
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   753
        # Nothing to do; "revs" is already set correctly
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   754
        pass
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   755
    else:
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   756
        raise error.Abort(_('must specify either --from or --exact'))
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   757
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   758
    if not revs:
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   759
        raise error.Abort(_('specified revisions evaluate to an empty set'),
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   760
                          hint=_('use different revision arguments'))
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   761
    elif len(revs) == 1:
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   762
        ui.write_err(_('single revision specified, nothing to fold\n'))
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   763
        return 1
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   764
4340
5300be965515 fold: sort concatenated commit messages in topological order
Martin von Zweigbergk <martinvonz@google.com>
parents: 4300
diff changeset
   765
    # Sort so combined commit message of `hg fold --exact -r . -r .^` is
5300be965515 fold: sort concatenated commit messages in topological order
Martin von Zweigbergk <martinvonz@google.com>
parents: 4300
diff changeset
   766
    # in topological order.
5300be965515 fold: sort concatenated commit messages in topological order
Martin von Zweigbergk <martinvonz@google.com>
parents: 4300
diff changeset
   767
    revs.sort()
5300be965515 fold: sort concatenated commit messages in topological order
Martin von Zweigbergk <martinvonz@google.com>
parents: 4300
diff changeset
   768
2761
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   769
    wlock = lock = None
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   770
    try:
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   771
        wlock = repo.wlock()
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   772
        lock = repo.lock()
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   773
4723
41885988921e fold: allow operations on merge commits with some conditions
Anton Shestakov <av6@dwimlabs.net>
parents: 4721
diff changeset
   774
        root, head, p2 = rewriteutil.foldcheck(repo, revs)
2761
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   775
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   776
        tr = repo.transaction('fold')
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   777
        try:
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   778
            commitopts = opts.copy()
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   779
            allctx = [repo[r] for r in revs]
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   780
            targetphase = max(c.phase() for c in allctx)
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   781
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   782
            if commitopts.get('message') or commitopts.get('logfile'):
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   783
                commitopts['edit'] = False
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   784
            else:
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   785
                msgs = ["HG: This is a fold of %d changesets." % len(allctx)]
4758
f0ecf2137824 py3: use "%d" for formatting integers
Martin von Zweigbergk <martinvonz@google.com>
parents: 4753
diff changeset
   786
                msgs += ["HG: Commit message of changeset %d.\n\n%s\n" %
2761
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   787
                         (c.rev(), c.description()) for c in allctx]
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   788
                commitopts['message'] = "\n".join(msgs)
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   789
                commitopts['edit'] = True
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   790
3219
b73bd280b21c fold: add support for storing a note in obsmarker
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3218
diff changeset
   791
            metadata = {}
b73bd280b21c fold: add support for storing a note in obsmarker
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3218
diff changeset
   792
            if opts.get('note'):
b73bd280b21c fold: add support for storing a note in obsmarker
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3218
diff changeset
   793
                metadata['note'] = opts['note']
b73bd280b21c fold: add support for storing a note in obsmarker
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3218
diff changeset
   794
4723
41885988921e fold: allow operations on merge commits with some conditions
Anton Shestakov <av6@dwimlabs.net>
parents: 4721
diff changeset
   795
            updates = allctx[:]
41885988921e fold: allow operations on merge commits with some conditions
Anton Shestakov <av6@dwimlabs.net>
parents: 4721
diff changeset
   796
            if p2 is not None and root.p2() != p2:
41885988921e fold: allow operations on merge commits with some conditions
Anton Shestakov <av6@dwimlabs.net>
parents: 4721
diff changeset
   797
                updates.append(p2)
4752
8a73a8df63b6 py3: convert opts keys to bytes before passing to core APIs
Martin von Zweigbergk <martinvonz@google.com>
parents: 4747
diff changeset
   798
            commitopts = pycompat.byteskwargs(commitopts)
4723
41885988921e fold: allow operations on merge commits with some conditions
Anton Shestakov <av6@dwimlabs.net>
parents: 4721
diff changeset
   799
            newid, unusedvariable = rewriteutil.rewrite(repo, root, updates,
2761
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   800
                                                        head,
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   801
                                                        [root.p1().node(),
4723
41885988921e fold: allow operations on merge commits with some conditions
Anton Shestakov <av6@dwimlabs.net>
parents: 4721
diff changeset
   802
                                                         p2.node()],
2761
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   803
                                                        commitopts=commitopts)
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   804
            phases.retractboundary(repo, tr, targetphase, [newid])
4370
45c0415e45b9 fold: use scmutil.cleanupnodes()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4340
diff changeset
   805
            replacements = {ctx.node(): [newid] for ctx in allctx}
45c0415e45b9 fold: use scmutil.cleanupnodes()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4340
diff changeset
   806
            scmutil.cleanupnodes(repo, replacements, operation="fold",
45c0415e45b9 fold: use scmutil.cleanupnodes()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4340
diff changeset
   807
                                 metadata=metadata)
2761
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   808
            tr.close()
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   809
        finally:
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   810
            tr.release()
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   811
        ui.status('%i changesets folded\n' % len(revs))
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   812
        if repo['.'].rev() in revs:
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   813
            hg.update(repo, newid)
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   814
    finally:
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   815
        lockmod.release(lock, wlock)
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   816
7450e360c88c commands: move fold to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2760
diff changeset
   817
@eh.command(
4715
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   818
    b'metaedit',
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   819
    [(b'r', b'rev', [], _(b"revision to edit"), _(b'REV')),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   820
     (b'', b'fold', None, _(b"also fold specified revisions into one")),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   821
     (b'n', b'note', b'', _(b'store a note on metaedit'), _(b'TEXT')),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   822
     ] + commitopts + commitopts2 + commitopts3,
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   823
    _(b'hg metaedit [OPTION]... [-r] [REV]'))
2760
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   824
def metaedit(ui, repo, *revs, **opts):
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   825
    """edit commit information
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   826
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   827
    Edits the commit information for the specified revisions. By default, edits
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   828
    commit information for the working directory parent.
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   829
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   830
    With --fold, also folds multiple revisions into one if necessary. In this
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   831
    case, the given revisions must form a linear unbroken chain.
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   832
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   833
    .. container:: verbose
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   834
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   835
     Some examples:
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   836
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   837
     - Edit the commit message for the working directory parent::
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   838
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   839
         hg metaedit
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   840
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   841
     - Change the username for the working directory parent::
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   842
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   843
         hg metaedit --user 'New User <new-email@example.com>'
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   844
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   845
     - Combine all draft revisions that are ancestors of foo but not of @ into
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   846
       one::
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   847
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   848
         hg metaedit --fold 'draft() and only(foo,@)'
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   849
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   850
       See :hg:`help phases` for more about draft revisions, and
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   851
       :hg:`help revsets` for more about the `draft()` and `only()` keywords.
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   852
    """
3283
039c4b8dc3ed obsnote: warn if user try to store a note in obsmarker on an older hg
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3271
diff changeset
   853
    _checknotesize(ui, opts)
2769
b96349ae3e2a metaedit: add support for the -D and -U options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2768
diff changeset
   854
    _resolveoptions(ui, opts)
2760
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   855
    revs = list(revs)
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   856
    revs.extend(opts['rev'])
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   857
    if not revs:
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   858
        if opts['fold']:
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   859
            raise error.Abort(_('revisions must be specified with --fold'))
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   860
        revs = ['.']
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   861
4642
a7c4f163656b cmdrewrite: use context manager for some locks and transactions
Martin von Zweigbergk <martinvonz@google.com>
parents: 4640
diff changeset
   862
    with repo.wlock(), repo.lock():
2760
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   863
        revs = scmutil.revrange(repo, revs)
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   864
        if not opts['fold'] and len(revs) > 1:
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   865
            # TODO: handle multiple revisions. This is somewhat tricky because
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   866
            # if we want to edit a series of commits:
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   867
            #
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   868
            #   a ---- b ---- c
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   869
            #
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   870
            # we need to rewrite a first, then directly rewrite b on top of the
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   871
            # new a, then rewrite c on top of the new b. So we need to handle
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   872
            # revisions in topological order.
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   873
            raise error.Abort(_('editing multiple revisions without --fold is '
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   874
                                'not currently supported'))
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   875
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   876
        if opts['fold']:
4723
41885988921e fold: allow operations on merge commits with some conditions
Anton Shestakov <av6@dwimlabs.net>
parents: 4721
diff changeset
   877
            root, head, p2 = rewriteutil.foldcheck(repo, revs)
2760
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   878
        else:
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   879
            if repo.revs("%ld and public()", revs):
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   880
                raise error.Abort(_('cannot edit commit information for public '
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   881
                                    'revisions'))
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   882
            newunstable = rewriteutil.disallowednewunstable(repo, revs)
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   883
            if newunstable:
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   884
                msg = _('cannot edit commit information in the middle'
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   885
                        ' of a stack')
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   886
                hint = _('%s will become unstable and new unstable changes'
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   887
                         ' are not allowed')
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   888
                hint %= repo[newunstable.first()]
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   889
                raise error.Abort(msg, hint=hint)
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   890
            root = head = repo[revs.first()]
4724
77bf84025dd5 metaedit: allow operations on merge commits with some conditions
Anton Shestakov <av6@dwimlabs.net>
parents: 4723
diff changeset
   891
            p2 = root.p2()
2760
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   892
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   893
        wctx = repo[None]
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   894
        p1 = wctx.p1()
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   895
        tr = repo.transaction('metaedit')
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   896
        newp1 = None
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   897
        try:
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   898
            commitopts = opts.copy()
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   899
            allctx = [repo[r] for r in revs]
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   900
            targetphase = max(c.phase() for c in allctx)
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   901
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   902
            if commitopts.get('message') or commitopts.get('logfile'):
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   903
                commitopts['edit'] = False
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   904
            else:
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   905
                if opts['fold']:
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   906
                    msgs = ["HG: This is a fold of %d changesets." % len(allctx)]
4758
f0ecf2137824 py3: use "%d" for formatting integers
Martin von Zweigbergk <martinvonz@google.com>
parents: 4753
diff changeset
   907
                    msgs += ["HG: Commit message of changeset %d.\n\n%s\n" %
2760
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   908
                             (c.rev(), c.description()) for c in allctx]
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   909
                else:
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   910
                    msgs = [head.description()]
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   911
                commitopts['message'] = "\n".join(msgs)
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   912
                commitopts['edit'] = True
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   913
4724
77bf84025dd5 metaedit: allow operations on merge commits with some conditions
Anton Shestakov <av6@dwimlabs.net>
parents: 4723
diff changeset
   914
            updates = allctx[:]
77bf84025dd5 metaedit: allow operations on merge commits with some conditions
Anton Shestakov <av6@dwimlabs.net>
parents: 4723
diff changeset
   915
            if p2 is not None and (root.p2() != p2 or not opts['fold']):
77bf84025dd5 metaedit: allow operations on merge commits with some conditions
Anton Shestakov <av6@dwimlabs.net>
parents: 4723
diff changeset
   916
                updates.append(p2)
2760
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   917
            # TODO: if the author and message are the same, don't create a new
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   918
            # hash. Right now we create a new hash because the date can be
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   919
            # different.
4752
8a73a8df63b6 py3: convert opts keys to bytes before passing to core APIs
Martin von Zweigbergk <martinvonz@google.com>
parents: 4747
diff changeset
   920
            commitopts = pycompat.byteskwargs(commitopts)
4724
77bf84025dd5 metaedit: allow operations on merge commits with some conditions
Anton Shestakov <av6@dwimlabs.net>
parents: 4723
diff changeset
   921
            newid, created = rewriteutil.rewrite(repo, root, updates, head,
2760
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   922
                                                 [root.p1().node(),
4724
77bf84025dd5 metaedit: allow operations on merge commits with some conditions
Anton Shestakov <av6@dwimlabs.net>
parents: 4723
diff changeset
   923
                                                  p2.node()],
2760
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   924
                                                 commitopts=commitopts)
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   925
            if created:
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   926
                if p1.rev() in revs:
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   927
                    newp1 = newid
3218
772cc931f085 metaedit: add support for storing a note in obsmarker
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3217
diff changeset
   928
                # metadata to be stored on obsmarker
772cc931f085 metaedit: add support for storing a note in obsmarker
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3217
diff changeset
   929
                metadata = {}
772cc931f085 metaedit: add support for storing a note in obsmarker
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3217
diff changeset
   930
                if opts.get('note'):
772cc931f085 metaedit: add support for storing a note in obsmarker
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3217
diff changeset
   931
                    metadata['note'] = opts['note']
772cc931f085 metaedit: add support for storing a note in obsmarker
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3217
diff changeset
   932
2760
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   933
                phases.retractboundary(repo, tr, targetphase, [newid])
3694
c0d5e0929f8b compat: from compatibility layer for createmarkers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3675
diff changeset
   934
                obsolete.createmarkers(repo, [(ctx, (repo[newid],))
c0d5e0929f8b compat: from compatibility layer for createmarkers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3675
diff changeset
   935
                                              for ctx in allctx],
c0d5e0929f8b compat: from compatibility layer for createmarkers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3675
diff changeset
   936
                                       metadata=metadata, operation="metaedit")
2760
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   937
            else:
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   938
                ui.status(_("nothing changed\n"))
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   939
            tr.close()
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   940
        finally:
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   941
            tr.release()
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   942
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   943
        if opts['fold']:
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   944
            ui.status('%i changesets folded\n' % len(revs))
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   945
        if newp1 is not None:
ddff53ecc00b commands: move metaedit to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   946
            hg.update(repo, newp1)
2762
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
   947
2766
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
   948
metadataopts = [
4715
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   949
    (b'd', b'date', b'',
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   950
     _(b'record the specified date in metadata'), _(b'DATE')),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   951
    (b'u', b'user', b'',
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   952
     _(b'record the specified user in metadata'), _(b'USER')),
2766
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
   953
]
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
   954
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
   955
def _getmetadata(**opts):
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
   956
    metadata = {}
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
   957
    date = opts.get('date')
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
   958
    user = opts.get('user')
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
   959
    if date:
3514
498f782ccb4b compat: add compat layer for date related functions
Boris Feld <boris.feld@octobus.net>
parents: 3506
diff changeset
   960
        metadata['date'] = '%i %i' % compat.parsedate(date)
2766
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
   961
    if user:
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
   962
        metadata['user'] = user
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
   963
    return metadata
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
   964
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
   965
@eh.command(
4715
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   966
    b'prune|obsolete',
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   967
    [(b'n', b'new', [], _(b"successor changeset (DEPRECATED)")),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   968
     (b's', b'succ', [], _(b"successor changeset"), _(b'REV')),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   969
     (b'r', b'rev', [], _(b"revisions to prune"), _(b'REV')),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   970
     (b'k', b'keep', None, _(b"does not modify working copy during prune")),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   971
     (b'n', b'note', b'', _(b'store a note on prune'), _(b'TEXT')),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   972
     (b'', b'pair', False, _(b"record a pairing, such as a rebase or divergence resolution "
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   973
                             b"(pairing multiple precursors to multiple successors)")),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   974
     (b'', b'biject', False, _(b"alias to --pair (DEPRECATED)")),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   975
     (b'', b'fold', False,
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   976
      _(b"record a fold (multiple precursors, one successors)")),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   977
     (b'', b'split', False,
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   978
      _(b"record a split (on precursor, multiple successors)")),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   979
     (b'B', b'bookmark', [], _(b"remove revs only reachable from given"
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   980
                               b" bookmark"), _(b'BOOKMARK'))] + metadataopts,
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
   981
    _(b'[OPTION] [-r] REV...'),
4191
5c734be63c3e evolve: adapt for changed @command decorator
Martin von Zweigbergk <martinvonz@google.com>
parents: 4126
diff changeset
   982
    helpbasic=True)
2766
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
   983
# XXX -U  --noupdate option to prevent wc update and or bookmarks update ?
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
   984
def cmdprune(ui, repo, *revs, **opts):
3989
b60113460856 prune: improve help first line
Dan Villiom Podlaski Christiansen <dan@magenta.dk>
parents: 3988
diff changeset
   985
    """mark changesets as obsolete or succeeded by another changeset
2766
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
   986
3990
566fe891f1ec prune: more human-friendly documentation
Dan Villiom Podlaski Christiansen <dan@magenta.dk>
parents: 3989
diff changeset
   987
    Pruning changesets marks them obsolete, hiding them from the
566fe891f1ec prune: more human-friendly documentation
Dan Villiom Podlaski Christiansen <dan@magenta.dk>
parents: 3989
diff changeset
   988
    history log, provided they have no descendants. Otherwise, all
566fe891f1ec prune: more human-friendly documentation
Dan Villiom Podlaski Christiansen <dan@magenta.dk>
parents: 3989
diff changeset
   989
    such descendants that aren't themselves obsolete become
566fe891f1ec prune: more human-friendly documentation
Dan Villiom Podlaski Christiansen <dan@magenta.dk>
parents: 3989
diff changeset
   990
    "unstable". Use :hg:`evolve` to handle this situation.
2766
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
   991
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
   992
    When you prune the parent of your working copy, Mercurial updates the working
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
   993
    copy to a non-obsolete parent.
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
   994
3984
33f795a17622 prune: use ``-s/--succ`` in documentation
Dan Villiom Podlaski Christiansen <dan@magenta.dk>
parents: 3877
diff changeset
   995
    You can use ``-s/--succ`` to tell Mercurial that a newer version (successor) of the
2766
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
   996
    pruned changeset exists. Mercurial records successor revisions in obsolescence
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
   997
    markers.
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
   998
3988
3e4fbda6bdce prune: try to clarify the "multi" revisions case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3987
diff changeset
   999
    If you prune a single revision and specify multiple revisions in
3e4fbda6bdce prune: try to clarify the "multi" revisions case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3987
diff changeset
  1000
    ``-s/--succ``, you are recording a "split" and must acknowledge it by
3e4fbda6bdce prune: try to clarify the "multi" revisions case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3987
diff changeset
  1001
    passing ``--split``. Similarly, when you prune multiple changesets with a
3e4fbda6bdce prune: try to clarify the "multi" revisions case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3987
diff changeset
  1002
    single successor, you must pass the ``--fold`` option.
3987
b802003ffb50 prune: move help about biject after the one about split and fold
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3986
diff changeset
  1003
3988
3e4fbda6bdce prune: try to clarify the "multi" revisions case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3987
diff changeset
  1004
    If you want to supersede multiple revisions at the same time, use
4045
821e4be40c6c prune: replace --biject with --pair
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3990
diff changeset
  1005
    ``--pair`` option to pair the pruned precursor and successor changesets.
3988
3e4fbda6bdce prune: try to clarify the "multi" revisions case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3987
diff changeset
  1006
    This is commonly useful for resolving history divergence, or when someone
3e4fbda6bdce prune: try to clarify the "multi" revisions case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3987
diff changeset
  1007
    else does edits history without obsolescence enabled.
2766
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1008
    """
3283
039c4b8dc3ed obsnote: warn if user try to store a note in obsmarker on an older hg
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3271
diff changeset
  1009
    _checknotesize(ui, opts)
2766
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1010
    revs = scmutil.revrange(repo, list(revs) + opts.get('rev'))
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1011
    succs = opts['new'] + opts['succ']
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1012
    bookmarks = set(opts.get('bookmark'))
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1013
    metadata = _getmetadata(**opts)
4045
821e4be40c6c prune: replace --biject with --pair
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3990
diff changeset
  1014
    biject = opts.get('pair') or opts.get('biject')
2766
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1015
    fold = opts.get('fold')
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1016
    split = opts.get('split')
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1017
4045
821e4be40c6c prune: replace --biject with --pair
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3990
diff changeset
  1018
    options = [o for o in ('pair', 'fold', 'split') if opts.get(o)]
2766
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1019
    if 1 < len(options):
4753
87d3955467b4 py3: convert str to bytes before passing to core exception
Martin von Zweigbergk <martinvonz@google.com>
parents: 4752
diff changeset
  1020
        _opts = pycompat.sysbytes(', '.join(options))
87d3955467b4 py3: convert str to bytes before passing to core exception
Martin von Zweigbergk <martinvonz@google.com>
parents: 4752
diff changeset
  1021
        raise error.Abort(_("can only specify one of %s") % _opts)
2766
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1022
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1023
    if bookmarks:
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1024
        reachablefrombookmark = rewriteutil.reachablefrombookmark
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1025
        repomarks, revs = reachablefrombookmark(repo, revs, bookmarks)
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1026
        if not revs:
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1027
            # no revisions to prune - delete bookmark immediately
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1028
            rewriteutil.deletebookmark(repo, repomarks, bookmarks)
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1029
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1030
    if not revs:
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1031
        raise error.Abort(_('nothing to prune'))
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1032
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1033
    wlock = lock = tr = None
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1034
    try:
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1035
        wlock = repo.wlock()
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1036
        lock = repo.lock()
4445
0f2305921e4d prune: use action "prune", not "touch", in precheck
Martin von Zweigbergk <martinvonz@google.com>
parents: 4423
diff changeset
  1037
        rewriteutil.precheck(repo, revs, 'prune')
2766
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1038
        tr = repo.transaction('prune')
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1039
        # defines pruned changesets
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1040
        precs = []
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1041
        revs.sort()
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1042
        for p in revs:
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1043
            cp = repo[p]
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1044
            precs.append(cp)
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1045
        if not precs:
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1046
            raise error.Abort('nothing to prune')
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1047
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1048
        # defines successors changesets
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1049
        sucs = scmutil.revrange(repo, succs)
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1050
        sucs.sort()
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1051
        sucs = tuple(repo[n] for n in sucs)
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1052
        if not biject and len(sucs) > 1 and len(precs) > 1:
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1053
            msg = "Can't use multiple successors for multiple precursors"
4045
821e4be40c6c prune: replace --biject with --pair
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3990
diff changeset
  1054
            hint = _("use --pair to mark a series as a replacement"
2766
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1055
                     " for another")
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1056
            raise error.Abort(msg, hint=hint)
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1057
        elif biject and len(sucs) != len(precs):
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1058
            msg = "Can't use %d successors for %d precursors" \
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1059
                % (len(sucs), len(precs))
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1060
            raise error.Abort(msg)
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1061
        elif (len(precs) == 1 and len(sucs) > 1) and not split:
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1062
            msg = "please add --split if you want to do a split"
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1063
            raise error.Abort(msg)
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1064
        elif len(sucs) == 1 and len(precs) > 1 and not fold:
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1065
            msg = "please add --fold if you want to do a fold"
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1066
            raise error.Abort(msg)
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1067
        elif biject:
4374
86bf0b106949 prune: use scmutil.cleanupnodes()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4373
diff changeset
  1068
            replacements = {p.node(): [s.node()] for p, s in zip(precs, sucs)}
2766
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1069
        else:
4374
86bf0b106949 prune: use scmutil.cleanupnodes()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4373
diff changeset
  1070
            replacements = {p.node(): [s.node() for s in sucs] for p in precs}
2766
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1071
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1072
        wdp = repo['.']
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1073
4702
fcecbb1261f2 evolve: fix the inconsistent behaviour of prune (issue6137)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4699
diff changeset
  1074
        if wdp in precs:
fcecbb1261f2 evolve: fix the inconsistent behaviour of prune (issue6137)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4699
diff changeset
  1075
            if len(sucs) == 1 and len(precs) == 1:
fcecbb1261f2 evolve: fix the inconsistent behaviour of prune (issue6137)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4699
diff changeset
  1076
                # '.' killed, so update to the successor
fcecbb1261f2 evolve: fix the inconsistent behaviour of prune (issue6137)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4699
diff changeset
  1077
                newnode = sucs[0]
fcecbb1261f2 evolve: fix the inconsistent behaviour of prune (issue6137)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4699
diff changeset
  1078
            elif biject:
fcecbb1261f2 evolve: fix the inconsistent behaviour of prune (issue6137)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4699
diff changeset
  1079
                # find the exact successor of '.'
fcecbb1261f2 evolve: fix the inconsistent behaviour of prune (issue6137)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4699
diff changeset
  1080
                newnode = sucs[precs.index(wdp)]
fcecbb1261f2 evolve: fix the inconsistent behaviour of prune (issue6137)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4699
diff changeset
  1081
            else:
fcecbb1261f2 evolve: fix the inconsistent behaviour of prune (issue6137)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4699
diff changeset
  1082
                # update to an unkilled parent
fcecbb1261f2 evolve: fix the inconsistent behaviour of prune (issue6137)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4699
diff changeset
  1083
                newnode = wdp
fcecbb1261f2 evolve: fix the inconsistent behaviour of prune (issue6137)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4699
diff changeset
  1084
fcecbb1261f2 evolve: fix the inconsistent behaviour of prune (issue6137)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4699
diff changeset
  1085
                while newnode in precs or newnode.obsolete():
fcecbb1261f2 evolve: fix the inconsistent behaviour of prune (issue6137)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4699
diff changeset
  1086
                    newnode = newnode.parents()[0]
2766
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1087
        else:
4702
fcecbb1261f2 evolve: fix the inconsistent behaviour of prune (issue6137)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4699
diff changeset
  1088
            # no need to update anywhere as wdp is not related to revs
fcecbb1261f2 evolve: fix the inconsistent behaviour of prune (issue6137)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4699
diff changeset
  1089
            # being pruned
2766
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1090
            newnode = wdp
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1091
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1092
        if newnode.node() != wdp.node():
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1093
            if opts.get('keep', False):
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1094
                # This is largely the same as the implementation in
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1095
                # strip.stripcmd(). We might want to refactor this somewhere
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1096
                # common at some point.
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1097
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1098
                # only reset the dirstate for files that would actually change
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1099
                # between the working context and uctx
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1100
                descendantrevs = repo.revs("%d::." % newnode.rev())
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1101
                changedfiles = []
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1102
                for rev in descendantrevs:
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1103
                    # blindly reset the files, regardless of what actually
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1104
                    # changed
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1105
                    changedfiles.extend(repo[rev].files())
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1106
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1107
                # reset files that only changed in the dirstate too
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1108
                dirstate = repo.dirstate
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1109
                dirchanges = [f for f in dirstate if dirstate[f] != 'n']
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1110
                changedfiles.extend(dirchanges)
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1111
                repo.dirstate.rebuild(newnode.node(), newnode.manifest(),
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1112
                                      changedfiles)
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1113
                dirstate.write(tr)
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1114
            else:
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1115
                bookactive = repo._activebookmark
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1116
                # Active bookmark that we don't want to delete (with -B option)
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1117
                # we deactivate and move it before the update and reactivate it
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1118
                # after
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1119
                movebookmark = bookactive and not bookmarks
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1120
                if movebookmark:
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1121
                    bookmarksmod.deactivate(repo)
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1122
                    bmchanges = [(bookactive, newnode.node())]
3699
67d6cc7e0979 compat: drop compatibility layer for bookmark.applychanges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3697
diff changeset
  1123
                    repo._bookmarks.applychanges(repo, tr, bmchanges)
3751
a1a0cfbffd30 evolve: pass revisions as strings to commands.*()
Martin von Zweigbergk <martinvonz@google.com>
parents: 3744
diff changeset
  1124
                commands.update(ui, repo, newnode.hex())
4613
30a544904238 messages: standardize on "working copy is now at" including "is"
Martin von Zweigbergk <martinvonz@google.com>
parents: 4506
diff changeset
  1125
                ui.status(_('working directory is now at %s\n')
4747
fa6aafa2857d py3: replace str(ctx) by bytes(ctx)
Martin von Zweigbergk <martinvonz@google.com>
parents: 4734
diff changeset
  1126
                          % ui.label(bytes(newnode), 'evolve.node'))
2766
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1127
                if movebookmark:
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1128
                    bookmarksmod.activate(repo, bookactive)
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1129
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1130
        # update bookmarks
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1131
        if bookmarks:
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1132
            rewriteutil.deletebookmark(repo, repomarks, bookmarks)
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1133
3217
b6ba296532cb prune: add support for storing a note in obsmarker
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3216
diff changeset
  1134
        # store note in metadata
b6ba296532cb prune: add support for storing a note in obsmarker
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3216
diff changeset
  1135
        if opts.get('note'):
b6ba296532cb prune: add support for storing a note in obsmarker
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3216
diff changeset
  1136
            metadata['note'] = opts['note']
b6ba296532cb prune: add support for storing a note in obsmarker
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3216
diff changeset
  1137
3506
6b4272bbb65d evolve: update code for not implicitly converting ctx to revision
Boris Feld <boris.feld@octobus.net>
parents: 3484
diff changeset
  1138
        precrevs = (precursor.rev() for precursor in precs)
4374
86bf0b106949 prune: use scmutil.cleanupnodes()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4373
diff changeset
  1139
        moves = {}
3506
6b4272bbb65d evolve: update code for not implicitly converting ctx to revision
Boris Feld <boris.feld@octobus.net>
parents: 3484
diff changeset
  1140
        for ctx in repo.unfiltered().set('bookmark() and %ld', precrevs):
2766
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1141
            # used to be:
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1142
            #
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1143
            #   ldest = list(repo.set('max((::%d) - obsolete())', ctx))
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1144
            #   if ldest:
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1145
            #      c = ldest[0]
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1146
            #
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1147
            # but then revset took a lazy arrow in the knee and became much
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1148
            # slower. The new forms makes as much sense and a much faster.
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1149
            for dest in ctx.ancestors():
4374
86bf0b106949 prune: use scmutil.cleanupnodes()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4373
diff changeset
  1150
                if not dest.obsolete() and dest.node() not in replacements:
86bf0b106949 prune: use scmutil.cleanupnodes()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4373
diff changeset
  1151
                    moves[ctx.node()] = dest.node()
2766
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1152
                    break
4374
86bf0b106949 prune: use scmutil.cleanupnodes()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4373
diff changeset
  1153
        scmutil.cleanupnodes(repo, replacements, operation="prune", moves=moves,
86bf0b106949 prune: use scmutil.cleanupnodes()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4373
diff changeset
  1154
                             metadata=metadata)
86bf0b106949 prune: use scmutil.cleanupnodes()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4373
diff changeset
  1155
86bf0b106949 prune: use scmutil.cleanupnodes()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4373
diff changeset
  1156
        # informs that changeset have been pruned
86bf0b106949 prune: use scmutil.cleanupnodes()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4373
diff changeset
  1157
        ui.status(_('%i changesets pruned\n') % len(precs))
2766
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1158
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1159
        tr.close()
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1160
    finally:
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1161
        lockmod.release(tr, lock, wlock)
83ad13719e26 commands: move 'prune' to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2763
diff changeset
  1162
2762
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1163
@eh.command(
4715
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
  1164
    b'split',
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
  1165
    [(b'i', b'interactive', True, _(b'use interactive mode')),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
  1166
     (b'r', b'rev', [], _(b"revision to split"), _(b'REV')),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
  1167
     (b'n', b'note', b'', _(b"store a note on split"), _(b'TEXT')),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
  1168
     ] + commitopts + commitopts2 + commitopts3,
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
  1169
    _(b'hg split [OPTION] [-r REV] [FILES]'),
4191
5c734be63c3e evolve: adapt for changed @command decorator
Martin von Zweigbergk <martinvonz@google.com>
parents: 4126
diff changeset
  1170
    helpbasic=True)
4299
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1171
def cmdsplit(ui, repo, *pats, **opts):
2762
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1172
    """split a changeset into smaller changesets
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1173
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1174
    By default, split the current revision by prompting for all its hunks to be
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1175
    redistributed into new changesets.
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1176
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1177
    Use --rev to split a given changeset instead.
4299
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1178
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1179
    If file patterns are specified only files matching these patterns will be
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1180
    considered to be split in earlier changesets. The files that doesn't match
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1181
    will be gathered in the last changeset.
2762
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1182
    """
3283
039c4b8dc3ed obsnote: warn if user try to store a note in obsmarker on an older hg
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3271
diff changeset
  1183
    _checknotesize(ui, opts)
2771
6044bd16bfb7 split: add support for the -D and -U option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2770
diff changeset
  1184
    _resolveoptions(ui, opts)
2762
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1185
    tr = wlock = lock = None
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1186
    newcommits = []
4300
702f7e1d0b01 split: add a --interactive flag
Boris Feld <boris.feld@octobus.net>
parents: 4299
diff changeset
  1187
    iselect = opts.pop('interactive')
2762
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1188
4733
85ae5dc0507d split: remove an unnecessary (and confusingly typed) fallback revision
Martin von Zweigbergk <martinvonz@google.com>
parents: 4729
diff changeset
  1189
    revs = opts.get('rev')
4298
a98fa6c0d4f3 split: only accept explicit revision through the `-r` option
Boris Feld <boris.feld@octobus.net>
parents: 4294
diff changeset
  1190
    if not revs:
a98fa6c0d4f3 split: only accept explicit revision through the `-r` option
Boris Feld <boris.feld@octobus.net>
parents: 4294
diff changeset
  1191
        revarg = '.'
a98fa6c0d4f3 split: only accept explicit revision through the `-r` option
Boris Feld <boris.feld@octobus.net>
parents: 4294
diff changeset
  1192
    elif len(revs) == 1:
a98fa6c0d4f3 split: only accept explicit revision through the `-r` option
Boris Feld <boris.feld@octobus.net>
parents: 4294
diff changeset
  1193
        revarg = revs[0]
a98fa6c0d4f3 split: only accept explicit revision through the `-r` option
Boris Feld <boris.feld@octobus.net>
parents: 4294
diff changeset
  1194
    else:
a98fa6c0d4f3 split: only accept explicit revision through the `-r` option
Boris Feld <boris.feld@octobus.net>
parents: 4294
diff changeset
  1195
        # XXX --rev often accept multiple value, it seems safer to explicitly
a98fa6c0d4f3 split: only accept explicit revision through the `-r` option
Boris Feld <boris.feld@octobus.net>
parents: 4294
diff changeset
  1196
        # complains here instead of just taking the last value.
a98fa6c0d4f3 split: only accept explicit revision through the `-r` option
Boris Feld <boris.feld@octobus.net>
parents: 4294
diff changeset
  1197
        raise error.Abort(_('more than one revset is given'))
2762
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1198
3270
e6150b9b88d9 split: force the branch to fix the split bug
Boris Feld <boris.feld@octobus.net>
parents: 3233
diff changeset
  1199
    # Save the current branch to restore it in the end
e6150b9b88d9 split: force the branch to fix the split bug
Boris Feld <boris.feld@octobus.net>
parents: 3233
diff changeset
  1200
    savedbranch = repo.dirstate.branch()
e6150b9b88d9 split: force the branch to fix the split bug
Boris Feld <boris.feld@octobus.net>
parents: 3233
diff changeset
  1201
2762
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1202
    try:
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1203
        wlock = repo.wlock()
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1204
        lock = repo.lock()
4298
a98fa6c0d4f3 split: only accept explicit revision through the `-r` option
Boris Feld <boris.feld@octobus.net>
parents: 4294
diff changeset
  1205
        ctx = scmutil.revsingle(repo, revarg)
3506
6b4272bbb65d evolve: update code for not implicitly converting ctx to revision
Boris Feld <boris.feld@octobus.net>
parents: 3484
diff changeset
  1206
        rev = ctx.rev()
2762
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1207
        cmdutil.bailifchanged(repo)
2786
ae690d39fc92 split: use precheck to validate revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2774
diff changeset
  1208
        rewriteutil.precheck(repo, [rev], action='split')
2762
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1209
        tr = repo.transaction('split')
4423
144cd06029de split: use ui.configoverride to preserve phase while commiting
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4410
diff changeset
  1210
        # make sure we respect the phase while splitting
144cd06029de split: use ui.configoverride to preserve phase while commiting
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4410
diff changeset
  1211
        overrides = {('phases', 'new-commit'): ctx.phase()}
2762
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1212
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1213
        if len(ctx.parents()) > 1:
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1214
            raise error.Abort(_("cannot split merge commits"))
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1215
        prev = ctx.p1()
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1216
        bmupdate = rewriteutil.bookmarksupdater(repo, ctx.node(), tr)
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1217
        bookactive = repo._activebookmark
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1218
        if bookactive is not None:
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1219
            repo.ui.status(_("(leaving bookmark %s)\n") % repo._activebookmark)
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1220
        bookmarksmod.deactivate(repo)
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1221
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1222
        # Prepare the working directory
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1223
        rewriteutil.presplitupdate(repo, ui, prev, ctx)
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1224
4299
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1225
        def haschanges(matcher=None):
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1226
            modified, added, removed, deleted = repo.status(match=matcher)[:4]
2762
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1227
            return modified or added or removed or deleted
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1228
        msg = ("HG: This is the original pre-split commit message. "
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1229
               "Edit it as appropriate.\n\n")
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1230
        msg += ctx.description()
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1231
        opts['message'] = msg
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1232
        opts['edit'] = True
2770
a9ea16a1f4dc split: fix the --user option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2769
diff changeset
  1233
        if not opts['user']:
a9ea16a1f4dc split: fix the --user option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2769
diff changeset
  1234
            opts['user'] = ctx.user()
3270
e6150b9b88d9 split: force the branch to fix the split bug
Boris Feld <boris.feld@octobus.net>
parents: 3233
diff changeset
  1235
e6150b9b88d9 split: force the branch to fix the split bug
Boris Feld <boris.feld@octobus.net>
parents: 3233
diff changeset
  1236
        # Set the right branch
e6150b9b88d9 split: force the branch to fix the split bug
Boris Feld <boris.feld@octobus.net>
parents: 3233
diff changeset
  1237
        # XXX-TODO: Find a way to set the branch without altering the dirstate
e6150b9b88d9 split: force the branch to fix the split bug
Boris Feld <boris.feld@octobus.net>
parents: 3233
diff changeset
  1238
        repo.dirstate.setbranch(ctx.branch())
e6150b9b88d9 split: force the branch to fix the split bug
Boris Feld <boris.feld@octobus.net>
parents: 3233
diff changeset
  1239
4299
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1240
        if pats:
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1241
            # refresh the wctx used for the matcher
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1242
            matcher = scmutil.match(repo[None], pats)
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1243
        else:
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1244
            matcher = scmutil.matchall(repo)
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1245
2762
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1246
        while haschanges():
4299
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1247
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1248
            if haschanges(matcher):
4300
702f7e1d0b01 split: add a --interactive flag
Boris Feld <boris.feld@octobus.net>
parents: 4299
diff changeset
  1249
                if iselect:
4423
144cd06029de split: use ui.configoverride to preserve phase while commiting
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4410
diff changeset
  1250
                    with repo.ui.configoverride(overrides, 'split'):
144cd06029de split: use ui.configoverride to preserve phase while commiting
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4410
diff changeset
  1251
                        cmdutil.dorecord(ui, repo, commands.commit, 'commit',
144cd06029de split: use ui.configoverride to preserve phase while commiting
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4410
diff changeset
  1252
                                         False, cmdutil.recordfilter, *pats,
144cd06029de split: use ui.configoverride to preserve phase while commiting
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4410
diff changeset
  1253
                                         **opts)
4300
702f7e1d0b01 split: add a --interactive flag
Boris Feld <boris.feld@octobus.net>
parents: 4299
diff changeset
  1254
                    # TODO: Does no seem like the best way to do this
702f7e1d0b01 split: add a --interactive flag
Boris Feld <boris.feld@octobus.net>
parents: 4299
diff changeset
  1255
                    # We should make dorecord return the newly created commit
702f7e1d0b01 split: add a --interactive flag
Boris Feld <boris.feld@octobus.net>
parents: 4299
diff changeset
  1256
                    newcommits.append(repo['.'])
702f7e1d0b01 split: add a --interactive flag
Boris Feld <boris.feld@octobus.net>
parents: 4299
diff changeset
  1257
                elif not pats:
702f7e1d0b01 split: add a --interactive flag
Boris Feld <boris.feld@octobus.net>
parents: 4299
diff changeset
  1258
                    msg = _("no files of directories specified")
702f7e1d0b01 split: add a --interactive flag
Boris Feld <boris.feld@octobus.net>
parents: 4299
diff changeset
  1259
                    hint = _("do you want --interactive")
702f7e1d0b01 split: add a --interactive flag
Boris Feld <boris.feld@octobus.net>
parents: 4299
diff changeset
  1260
                    raise error.Abort(msg, hint=hint)
702f7e1d0b01 split: add a --interactive flag
Boris Feld <boris.feld@octobus.net>
parents: 4299
diff changeset
  1261
                else:
4423
144cd06029de split: use ui.configoverride to preserve phase while commiting
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4410
diff changeset
  1262
                    with repo.ui.configoverride(overrides, 'split'):
144cd06029de split: use ui.configoverride to preserve phase while commiting
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4410
diff changeset
  1263
                        commands.commit(ui, repo, *pats, **opts)
4300
702f7e1d0b01 split: add a --interactive flag
Boris Feld <boris.feld@octobus.net>
parents: 4299
diff changeset
  1264
                    newcommits.append(repo['.'])
4299
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1265
            if pats:
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1266
                # refresh the wctx used for the matcher
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1267
                matcher = scmutil.match(repo[None], pats)
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1268
            else:
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1269
                matcher = scmutil.matchall(repo)
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1270
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1271
            if haschanges(matcher):
4291
8f54ab5dd4e2 split: add a help entry to the final prompt
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4236
diff changeset
  1272
                nextaction = None
8f54ab5dd4e2 split: add a help entry to the final prompt
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4236
diff changeset
  1273
                while nextaction is None:
4294
8974a05a49fa split: rework the prompt to be more standard
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4293
diff changeset
  1274
                    nextaction = ui.prompt('continue splitting? [Ycdq?]', default='y')
8974a05a49fa split: rework the prompt to be more standard
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4293
diff changeset
  1275
                    if nextaction == 'c':
4423
144cd06029de split: use ui.configoverride to preserve phase while commiting
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4410
diff changeset
  1276
                        with repo.ui.configoverride(overrides, 'split'):
144cd06029de split: use ui.configoverride to preserve phase while commiting
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4410
diff changeset
  1277
                            commands.commit(ui, repo, **opts)
4291
8f54ab5dd4e2 split: add a help entry to the final prompt
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4236
diff changeset
  1278
                        newcommits.append(repo['.'])
8f54ab5dd4e2 split: add a help entry to the final prompt
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4236
diff changeset
  1279
                        break
4292
caaa89adf3eb split: add a way to abort a split from the prompt
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4291
diff changeset
  1280
                    elif nextaction == 'q':
caaa89adf3eb split: add a way to abort a split from the prompt
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4291
diff changeset
  1281
                        raise error.Abort(_('user quit'))
4293
d4902d48d095 split: add a option to discard remaining change during split
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4292
diff changeset
  1282
                    elif nextaction == 'd':
d4902d48d095 split: add a option to discard remaining change during split
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4292
diff changeset
  1283
                        # TODO: We should offer a way for the user to confirm
d4902d48d095 split: add a option to discard remaining change during split
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4292
diff changeset
  1284
                        # what is the remaining changes, either via a separate
d4902d48d095 split: add a option to discard remaining change during split
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4292
diff changeset
  1285
                        # diff action or by showing the remaining and
d4902d48d095 split: add a option to discard remaining change during split
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4292
diff changeset
  1286
                        # prompting for confirmation
d4902d48d095 split: add a option to discard remaining change during split
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4292
diff changeset
  1287
                        ui.status(_('discarding remaining changes\n'))
d4902d48d095 split: add a option to discard remaining change during split
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4292
diff changeset
  1288
                        target = newcommits[0]
4299
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1289
                        if pats:
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1290
                            status = repo.status(match=matcher)[:4]
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1291
                            dirty = set()
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1292
                            for i in status:
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1293
                                dirty.update(i)
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1294
                            dirty = sorted(dirty)
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1295
                            cmdutil.revert(ui, repo, repo[target],
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1296
                                           (target, node.nullid), *dirty)
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1297
                        else:
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1298
                            cmdutil.revert(ui, repo, repo[target],
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1299
                                           (target, node.nullid), all=True)
4291
8f54ab5dd4e2 split: add a help entry to the final prompt
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4236
diff changeset
  1300
                    elif nextaction == '?':
8f54ab5dd4e2 split: add a help entry to the final prompt
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4236
diff changeset
  1301
                        nextaction = None
4294
8974a05a49fa split: rework the prompt to be more standard
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4293
diff changeset
  1302
                        ui.write(_("y - yes, continue selection\n"))
8974a05a49fa split: rework the prompt to be more standard
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4293
diff changeset
  1303
                        ui.write(_("c - commit, select all remaining changes\n"))
4293
d4902d48d095 split: add a option to discard remaining change during split
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4292
diff changeset
  1304
                        ui.write(_("d - discard, discard remaining changes\n"))
4292
caaa89adf3eb split: add a way to abort a split from the prompt
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4291
diff changeset
  1305
                        ui.write(_("q - quit, abort the split\n"))
4291
8f54ab5dd4e2 split: add a help entry to the final prompt
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4236
diff changeset
  1306
                        ui.write(_("? - ?, display help\n"))
8f54ab5dd4e2 split: add a help entry to the final prompt
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4236
diff changeset
  1307
                else:
8f54ab5dd4e2 split: add a help entry to the final prompt
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4236
diff changeset
  1308
                    continue
8f54ab5dd4e2 split: add a help entry to the final prompt
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4236
diff changeset
  1309
                break # propagate the previous break
2762
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1310
            else:
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1311
                ui.status(_("no more change to split\n"))
4299
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1312
                if haschanges():
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1313
                    # XXX: Should we show a message for informing the user
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1314
                    # that we create another commit with remaining changes?
4423
144cd06029de split: use ui.configoverride to preserve phase while commiting
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4410
diff changeset
  1315
                    with repo.ui.configoverride(overrides, 'split'):
144cd06029de split: use ui.configoverride to preserve phase while commiting
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4410
diff changeset
  1316
                        commands.commit(ui, repo, **opts)
4299
4af0235e7b0b split: take file patterns to limit selection on matching file patterns
Boris Feld <boris.feld@octobus.net>
parents: 4298
diff changeset
  1317
                    newcommits.append(repo['.'])
2762
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1318
        if newcommits:
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1319
            tip = repo[newcommits[-1]]
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1320
            bmupdate(tip.node())
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1321
            if bookactive is not None:
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1322
                bookmarksmod.activate(repo, bookactive)
3216
13cb0810ce22 split: add support for storing a note in obsmarker
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3215
diff changeset
  1323
            metadata = {}
13cb0810ce22 split: add support for storing a note in obsmarker
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3215
diff changeset
  1324
            if opts.get('note'):
13cb0810ce22 split: add support for storing a note in obsmarker
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3215
diff changeset
  1325
                metadata['note'] = opts['note']
3694
c0d5e0929f8b compat: from compatibility layer for createmarkers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3675
diff changeset
  1326
            obsolete.createmarkers(repo, [(repo[rev], newcommits)],
c0d5e0929f8b compat: from compatibility layer for createmarkers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3675
diff changeset
  1327
                                   metadata=metadata, operation="split")
2762
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1328
        tr.close()
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1329
    finally:
3270
e6150b9b88d9 split: force the branch to fix the split bug
Boris Feld <boris.feld@octobus.net>
parents: 3233
diff changeset
  1330
        # Restore the old branch
e6150b9b88d9 split: force the branch to fix the split bug
Boris Feld <boris.feld@octobus.net>
parents: 3233
diff changeset
  1331
        repo.dirstate.setbranch(savedbranch)
e6150b9b88d9 split: force the branch to fix the split bug
Boris Feld <boris.feld@octobus.net>
parents: 3233
diff changeset
  1332
2762
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2761
diff changeset
  1333
        lockmod.release(tr, lock, wlock)
2763
4a5b0c373e65 commands: move the touch to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
  1334
4a5b0c373e65 commands: move the touch to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
  1335
@eh.command(
4715
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
  1336
    b'touch',
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
  1337
    [(b'r', b'rev', [], _(b'revision to update'), _(b'REV')),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
  1338
     (b'n', b'note', b'', _(b'store a note on touch'), _(b'TEXT')),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
  1339
     (b'D', b'duplicate', False,
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
  1340
      b'do not mark the new revision as successor of the old one'),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
  1341
     (b'A', b'allowdivergence', False,
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
  1342
      b'mark the new revision as successor of the old one potentially creating '
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
  1343
      b'divergence')],
2763
4a5b0c373e65 commands: move the touch to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
  1344
    # allow to choose the seed ?
4a5b0c373e65 commands: move the touch to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
  1345
    _('[-r] revs'))
4a5b0c373e65 commands: move the touch to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
  1346
def touch(ui, repo, *revs, **opts):
3233
bd01eb0108f4 touch: shorten touch's docstring to make it fit into a one line
Denis Laxalde <denis@laxalde.org>
parents: 3231
diff changeset
  1347
    """create successors identical to their predecessors but the changeset ID
2763
4a5b0c373e65 commands: move the touch to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
  1348
4a5b0c373e65 commands: move the touch to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
  1349
    This is used to "resurrect" changesets
4a5b0c373e65 commands: move the touch to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
  1350
    """
3283
039c4b8dc3ed obsnote: warn if user try to store a note in obsmarker on an older hg
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3271
diff changeset
  1351
    _checknotesize(ui, opts)
2763
4a5b0c373e65 commands: move the touch to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
  1352
    revs = list(revs)
4a5b0c373e65 commands: move the touch to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
  1353
    revs.extend(opts['rev'])
4a5b0c373e65 commands: move the touch to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
  1354
    if not revs:
4a5b0c373e65 commands: move the touch to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
  1355
        revs = ['.']
4a5b0c373e65 commands: move the touch to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
  1356
    revs = scmutil.revrange(repo, revs)
4a5b0c373e65 commands: move the touch to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
  1357
    if not revs:
4a5b0c373e65 commands: move the touch to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
  1358
        ui.write_err('no revision to touch\n')
4a5b0c373e65 commands: move the touch to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
  1359
        return 1
4638
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1360
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1361
    duplicate = opts['duplicate']
2790
1b7b9acda2a9 touch: use precheck to validate revision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2789
diff changeset
  1362
    if not duplicate:
4446
8232bddf543a touch: use action "touch", not "<function touch at ...>", in precheck
Martin von Zweigbergk <martinvonz@google.com>
parents: 4445
diff changeset
  1363
        rewriteutil.precheck(repo, revs, 'touch')
2763
4a5b0c373e65 commands: move the touch to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
  1364
    tmpl = utility.shorttemplate
3483
f03845bfd015 compat: add wrapper for logcmdutil functions
Yuya Nishihara <yuya@tcha.org>
parents: 3452
diff changeset
  1365
    displayer = compat.changesetdisplayer(ui, repo, {'template': tmpl})
4707
ea84a151fa62 touch: let's not use util.acceptintervention() as it's not required
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4706
diff changeset
  1366
    with repo.wlock(), repo.lock(), repo.transaction('touch'):
ea84a151fa62 touch: let's not use util.acceptintervention() as it's not required
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4706
diff changeset
  1367
        touchnodes(ui, repo, revs, displayer, **opts)
3453
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1368
4638
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1369
def touchnodes(ui, repo, revs, displayer, **opts):
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1370
    duplicate = opts['duplicate']
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1371
    allowdivergence = opts['allowdivergence']
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1372
    revs.sort() # ensure parent are run first
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1373
    newmapping = {}
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1374
    for r in revs:
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1375
        ctx = repo[r]
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1376
        extra = ctx.extra().copy()
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1377
        extra['__touch-noise__'] = random.randint(0, 0xffffffff)
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1378
        # search for touched parent
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1379
        p1 = ctx.p1().node()
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1380
        p2 = ctx.p2().node()
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1381
        p1 = newmapping.get(p1, p1)
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1382
        p2 = newmapping.get(p2, p2)
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1383
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1384
        if not (duplicate or allowdivergence):
4726
24e83f51ffc2 touch: clarify some inline documentation
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4702
diff changeset
  1385
            # If reviving this cset creates divergence, let's ask user
24e83f51ffc2 touch: clarify some inline documentation
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4702
diff changeset
  1386
            # what to do: create divergence or duplicate
4728
ef8907df73fc touch: fix the inconsistent behavior of divergence catching logic (issue6107)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4726
diff changeset
  1387
ef8907df73fc touch: fix the inconsistent behavior of divergence catching logic (issue6107)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4726
diff changeset
  1388
            # We need to check two cases that can cause divergence:
ef8907df73fc touch: fix the inconsistent behavior of divergence catching logic (issue6107)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4726
diff changeset
  1389
            # case 1: the rev being revived has a non-obsolete successor (easily
ef8907df73fc touch: fix the inconsistent behavior of divergence catching logic (issue6107)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4726
diff changeset
  1390
            #     detected by successorssets)
4638
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1391
            sset = obsutil.successorssets(repo, ctx.node())
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1392
            nodivergencerisk = (len(sset) == 0
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1393
                                or (len(sset) == 1
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1394
                                    and len(sset[0]) == 1
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1395
                                    and repo[sset[0][0]].rev() == ctx.rev()
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1396
                                ))
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1397
            if nodivergencerisk:
4728
ef8907df73fc touch: fix the inconsistent behavior of divergence catching logic (issue6107)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4726
diff changeset
  1398
                # case 2: one of the precursors of the rev being revived has a
ef8907df73fc touch: fix the inconsistent behavior of divergence catching logic (issue6107)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4726
diff changeset
  1399
                #     non-obsolete successor (we need divergentsets for this)
ef8907df73fc touch: fix the inconsistent behavior of divergence catching logic (issue6107)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4726
diff changeset
  1400
                from . import evolvecmd
ef8907df73fc touch: fix the inconsistent behavior of divergence catching logic (issue6107)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4726
diff changeset
  1401
                if evolvecmd.divergentsets(repo, ctx):
ef8907df73fc touch: fix the inconsistent behavior of divergence catching logic (issue6107)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4726
diff changeset
  1402
                    nodivergencerisk = False
ef8907df73fc touch: fix the inconsistent behavior of divergence catching logic (issue6107)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4726
diff changeset
  1403
            if nodivergencerisk:
4638
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1404
                duplicate = False
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1405
            else:
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1406
                displayer.show(ctx)
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1407
                index = ui.promptchoice(
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1408
                    _("reviving this changeset will create divergence"
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1409
                      " unless you make a duplicate.\n(a)llow divergence or"
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1410
                      " (d)uplicate the changeset? $$ &Allowdivergence $$ "
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1411
                      "&Duplicate"), 0)
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1412
                choice = ['allowdivergence', 'duplicate'][index]
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1413
                if choice == 'allowdivergence':
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1414
                    duplicate = False
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1415
                else:
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1416
                    duplicate = True
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1417
4721
b69497b23d31 touch: make sure merge commits include files from p1 and p2
Anton Shestakov <av6@dwimlabs.net>
parents: 4715
diff changeset
  1418
        updates = []
b69497b23d31 touch: make sure merge commits include files from p1 and p2
Anton Shestakov <av6@dwimlabs.net>
parents: 4715
diff changeset
  1419
        if len(ctx.parents()) > 1:
b69497b23d31 touch: make sure merge commits include files from p1 and p2
Anton Shestakov <av6@dwimlabs.net>
parents: 4715
diff changeset
  1420
            updates = ctx.parents()
4638
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1421
        extradict = {'extra': extra}
4721
b69497b23d31 touch: make sure merge commits include files from p1 and p2
Anton Shestakov <av6@dwimlabs.net>
parents: 4715
diff changeset
  1422
        new, unusedvariable = rewriteutil.rewrite(repo, ctx, updates, ctx,
4638
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1423
                                                  [p1, p2],
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1424
                                                  commitopts=extradict)
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1425
        # store touched version to help potential children
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1426
        newmapping[ctx.node()] = new
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1427
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1428
        if not duplicate:
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1429
            metadata = {}
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1430
            if opts.get('note'):
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1431
                metadata['note'] = opts['note']
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1432
            obsolete.createmarkers(repo, [(ctx, (repo[new],))],
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1433
                                   metadata=metadata, operation="touch")
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1434
        tr = repo.currenttransaction()
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1435
        phases.retractboundary(repo, tr, ctx.phase(), [new])
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1436
        if ctx in repo[None].parents():
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1437
            with repo.dirstate.parentchange():
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1438
                repo.dirstate.setparents(new, node.nullid)
7978db1dda3e touch: extract the logic of touching rev's to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4613
diff changeset
  1439
3453
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1440
@eh.command(
4715
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
  1441
    b'pick|grab',
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
  1442
    [(b'r', b'rev', b'', _(b'revision to pick'), _(b'REV')),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
  1443
     (b'c', b'continue', False, b'continue interrupted pick'),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
  1444
     (b'a', b'abort', False, b'abort interrupted pick'),
4391
054ff759f2fd pick: add --tool for hg pick to specify mergetool
Sangeet Kumar Mishra <mail2sangeetmishra@gmail.com>
parents: 4374
diff changeset
  1445
    ] + mergetoolopts,
4715
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4714
diff changeset
  1446
    _(b'[-r] rev'))
4048
d7034826c0a2 pick: rename the grab command to pick
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4047
diff changeset
  1447
def cmdpick(ui, repo, *revs, **opts):
4229
a8ed26f01c8d pick: `hg help` was not showing the full cmd desc of `pick`
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4191
diff changeset
  1448
    """move a commit on the top of working directory parent and updates to it."""
3453
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1449
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1450
    cont = opts.get('continue')
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1451
    abort = opts.get('abort')
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1452
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1453
    if cont and abort:
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1454
        raise error.Abort(_("cannot specify both --continue and --abort"))
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1455
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1456
    revs = list(revs)
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1457
    if opts.get('rev'):
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1458
        revs.append(opts['rev'])
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1459
4706
de194ed973ba branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4679 4702
diff changeset
  1460
    with repo.wlock(), repo.lock():
4052
73e73471d6c6 pick: replace "grabstate" with "pickstate"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4051
diff changeset
  1461
        pickstate = state.cmdstate(repo, path='pickstate')
3526
df20ddc79064 grab: move the initialization of pctx variable outside of if-else
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3522
diff changeset
  1462
        pctx = repo['.']
3453
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1463
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1464
        if not cont and not abort:
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1465
            cmdutil.bailifchanged(repo)
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1466
            revs = scmutil.revrange(repo, revs)
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1467
            if len(revs) > 1:
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1468
                raise error.Abort(_("specify just one revision"))
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1469
            elif not revs:
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1470
                raise error.Abort(_("empty revision set"))
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1471
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1472
            origctx = repo[revs.first()]
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1473
3527
7b4d1bfb6b7d grab: gracefully handle the case when we try to grab parent of wdir
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3526
diff changeset
  1474
            if origctx in pctx.ancestors() or origctx.node() == pctx.node():
4049
25981fae92f9 pick: update command output to mention pick instead of grab
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4048
diff changeset
  1475
                raise error.Abort(_("cannot pick an ancestor revision"))
3453
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1476
4049
25981fae92f9 pick: update command output to mention pick instead of grab
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4048
diff changeset
  1477
            rewriteutil.precheck(repo, [origctx.rev()], 'pick')
3453
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1478
4049
25981fae92f9 pick: update command output to mention pick instead of grab
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4048
diff changeset
  1479
            ui.status(_('picking %d:%s "%s"\n') %
3453
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1480
                      (origctx.rev(), origctx,
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1481
                       origctx.description().split("\n", 1)[0]))
4679
d9016946ec69 pick: reduce configoverride() scope
Anton Shestakov <av6@dwimlabs.net>
parents: 4642
diff changeset
  1482
            overrides = {('ui', 'forcemerge'): opts.get('tool', '')}
d9016946ec69 pick: reduce configoverride() scope
Anton Shestakov <av6@dwimlabs.net>
parents: 4642
diff changeset
  1483
            with ui.configoverride(overrides, 'pick'):
d9016946ec69 pick: reduce configoverride() scope
Anton Shestakov <av6@dwimlabs.net>
parents: 4642
diff changeset
  1484
                stats = merge.graft(repo, origctx, origctx.p1(),
d9016946ec69 pick: reduce configoverride() scope
Anton Shestakov <av6@dwimlabs.net>
parents: 4642
diff changeset
  1485
                                    ['local', 'destination'])
3616
f6d629514607 compat: use updateresult API if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3569
diff changeset
  1486
            if compat.hasconflict(stats):
4052
73e73471d6c6 pick: replace "grabstate" with "pickstate"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4051
diff changeset
  1487
                pickstate.addopts({'orignode': origctx.node(),
3457
82e9f9603b1b evolvestate: rename the file to state.py and class name to cmdstate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3456
diff changeset
  1488
                                   'oldpctx': pctx.node()})
4052
73e73471d6c6 pick: replace "grabstate" with "pickstate"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4051
diff changeset
  1489
                pickstate.save()
3453
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1490
                raise error.InterventionRequired(_("unresolved merge conflicts"
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1491
                                                   " (see hg help resolve)"))
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1492
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1493
        elif abort:
4052
73e73471d6c6 pick: replace "grabstate" with "pickstate"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4051
diff changeset
  1494
            if not pickstate:
4049
25981fae92f9 pick: update command output to mention pick instead of grab
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4048
diff changeset
  1495
                raise error.Abort(_("no interrupted pick state exists"))
4052
73e73471d6c6 pick: replace "grabstate" with "pickstate"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4051
diff changeset
  1496
            pickstate.load()
73e73471d6c6 pick: replace "grabstate" with "pickstate"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4051
diff changeset
  1497
            pctxnode = pickstate['oldpctx']
4049
25981fae92f9 pick: update command output to mention pick instead of grab
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4048
diff changeset
  1498
            ui.status(_("aborting pick, updating to %s\n") %
3453
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1499
                      node.hex(pctxnode)[:12])
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1500
            hg.updaterepo(repo, pctxnode, True)
4690
98f345bb9235 pick: actually delete pickstate if --abort is given
Anton Shestakov <av6@dwimlabs.net>
parents: 4687
diff changeset
  1501
            pickstate.delete()
3453
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1502
            return 0
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1503
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1504
        else:
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1505
            if revs:
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1506
                raise error.Abort(_("cannot specify both --continue and "
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1507
                                    "revision"))
4052
73e73471d6c6 pick: replace "grabstate" with "pickstate"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4051
diff changeset
  1508
            if not pickstate:
4049
25981fae92f9 pick: update command output to mention pick instead of grab
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4048
diff changeset
  1509
                raise error.Abort(_("no interrupted pick state exists"))
3453
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1510
4052
73e73471d6c6 pick: replace "grabstate" with "pickstate"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4051
diff changeset
  1511
            pickstate.load()
73e73471d6c6 pick: replace "grabstate" with "pickstate"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4051
diff changeset
  1512
            orignode = pickstate['orignode']
3453
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1513
            origctx = repo[orignode]
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1514
3475
a03bb02dfaba grab: preserve phase of the grabbed changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3457
diff changeset
  1515
        overrides = {('phases', 'new-commit'): origctx.phase()}
4050
3dddb03f3559 pick: use "pick" instead of "grab" for various internal API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4049
diff changeset
  1516
        with repo.ui.configoverride(overrides, 'pick'):
3475
a03bb02dfaba grab: preserve phase of the grabbed changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3457
diff changeset
  1517
            newnode = repo.commit(text=origctx.description(),
a03bb02dfaba grab: preserve phase of the grabbed changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3457
diff changeset
  1518
                                  user=origctx.user(),
a03bb02dfaba grab: preserve phase of the grabbed changeset
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3457
diff changeset
  1519
                                  date=origctx.date(), extra=origctx.extra())
4485
e3785a8d0712 pick: update working dir branch (issue6089)
Manuel Jacob <me@manueljacob.de>
parents: 4463
diff changeset
  1520
        repo.dirstate.setbranch(origctx.branch())
3453
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1521
4052
73e73471d6c6 pick: replace "grabstate" with "pickstate"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4051
diff changeset
  1522
        if pickstate:
73e73471d6c6 pick: replace "grabstate" with "pickstate"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4051
diff changeset
  1523
            pickstate.delete()
3569
236d36b17aa4 grab: include "operation" metadata in obsmarkers
Martin von Zweigbergk <martinvonz@google.com>
parents: 3568
diff changeset
  1524
        newctx = repo[newnode] if newnode else pctx
4371
9a218768bac5 pick: use scmutil.cleanupnodes()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4370
diff changeset
  1525
        replacements = {origctx.node(): [newctx.node()]}
9a218768bac5 pick: use scmutil.cleanupnodes()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4370
diff changeset
  1526
        scmutil.cleanupnodes(repo, replacements, operation="pick")
3453
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1527
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1528
        if newnode is None:
4049
25981fae92f9 pick: update command output to mention pick instead of grab
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4048
diff changeset
  1529
            ui.warn(_("note: picking %d:%s created no changes to commit\n") %
3453
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1530
                    (origctx.rev(), origctx))
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1531
            return 0
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1532
32ed5b6fadd3 grab: add a command to grab a commit and update to it
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3389
diff changeset
  1533
        return 0