hgext/split.py
author Manuel Jacob <me@manueljacob.de>
Fri, 02 Feb 2024 04:46:54 +0100
changeset 51374 54a75576287a
parent 50884 b5066b2b40f2
child 51863 f4733654f144
permissions -rw-r--r--
hghave: add py312 and py313 While not required in the core test suite in the moment, these could be useful in the future or for extensions. For example, Python 3.12 removed distutils and it might make sense to differentiate based on that.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
     1
# split.py - split a changeset into smaller ones
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
     2
#
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
     3
# Copyright 2015 Laurent Charignon <lcharignon@fb.com>
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
     4
# Copyright 2017 Facebook, Inc.
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
     5
#
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
     6
# This software may be used and distributed according to the terms of the
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
     7
# GNU General Public License version 2 or any later version.
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
     8
"""command to split a changeset into smaller ones (EXPERIMENTAL)"""
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
     9
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    10
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    11
from mercurial.i18n import _
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    12
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    13
from mercurial.node import (
46843
728d89f6f9b1 refactor: prefer checks against nullrev over nullid
Joerg Sonnenberger <joerg@bec.de>
parents: 46758
diff changeset
    14
    nullrev,
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    15
    short,
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    16
)
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    17
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    18
from mercurial import (
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    19
    bookmarks,
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    20
    cmdutil,
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    21
    commands,
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    22
    error,
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    23
    hg,
48116
5ced12cfa41b errors: raise InputError on bad revset to revrange() iff provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 46924
diff changeset
    24
    logcmdutil,
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    25
    registrar,
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    26
    revsetlang,
43935
2349a60f33db split: use rewriteutil.precheck() instead of reimplementing it
Martin von Zweigbergk <martinvonz@google.com>
parents: 43641
diff changeset
    27
    rewriteutil,
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    28
    scmutil,
46758
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
    29
    util,
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    30
)
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    31
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    32
# allow people to use split without explicitly enabling rebase extension
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
    33
from . import rebase
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    34
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    35
cmdtable = {}
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    36
command = registrar.command(cmdtable)
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    37
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    38
# Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    39
# extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    40
# be specifying the version(s) of Mercurial they are tested with, or
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    41
# leave the attribute unspecified.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    42
testedwith = b'ships-with-hg-core'
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    43
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
    44
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
    45
@command(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    46
    b'split',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
    47
    [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    48
        (b'r', b'rev', b'', _(b"revision to split"), _(b'REV')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    49
        (b'', b'rebase', True, _(b'rebase descendants after split')),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
    50
    ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
    51
    + cmdutil.commitopts2,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    52
    _(b'hg split [--no-rebase] [[-r] REV]'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
    53
    helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
    54
    helpbasic=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
    55
)
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    56
def split(ui, repo, *revs, **opts):
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    57
    """split a changeset into smaller ones
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    58
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    59
    Repeatedly prompt changes and commit message for new changesets until there
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    60
    is nothing left in the original changeset.
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    61
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    62
    If --rev was not given, split the working directory parent.
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    63
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    64
    By default, rebase connected non-obsoleted descendants onto the new
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    65
    changeset. Use --no-rebase to avoid the rebase.
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    66
    """
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    67
    revlist = []
50884
b5066b2b40f2 split: migrate `opts` to native kwargs
Matt Harbison <matt_harbison@yahoo.com>
parents: 49961
diff changeset
    68
    if opts.get('rev'):
b5066b2b40f2 split: migrate `opts` to native kwargs
Matt Harbison <matt_harbison@yahoo.com>
parents: 49961
diff changeset
    69
        revlist.append(opts.get('rev'))
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    70
    revlist.extend(revs)
46758
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
    71
    with repo.wlock(), repo.lock():
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
    72
        tr = repo.transaction(b'split')
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
    73
        # If the rebase somehow runs into conflicts, make sure
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
    74
        # we close the transaction so the user can continue it.
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
    75
        with util.acceptintervention(tr):
48116
5ced12cfa41b errors: raise InputError on bad revset to revrange() iff provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 46924
diff changeset
    76
            revs = logcmdutil.revrange(repo, revlist or [b'.'])
46758
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
    77
            if len(revs) > 1:
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
    78
                raise error.InputError(_(b'cannot split multiple revisions'))
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    79
46758
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
    80
            rev = revs.first()
46843
728d89f6f9b1 refactor: prefer checks against nullrev over nullid
Joerg Sonnenberger <joerg@bec.de>
parents: 46758
diff changeset
    81
            # Handle nullrev specially here (instead of leaving for precheck()
46758
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
    82
            # below) so we get a nicer message and error code.
46843
728d89f6f9b1 refactor: prefer checks against nullrev over nullid
Joerg Sonnenberger <joerg@bec.de>
parents: 46758
diff changeset
    83
            if rev is None or rev == nullrev:
46758
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
    84
                ui.status(_(b'nothing to split\n'))
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
    85
                return 1
46843
728d89f6f9b1 refactor: prefer checks against nullrev over nullid
Joerg Sonnenberger <joerg@bec.de>
parents: 46758
diff changeset
    86
            ctx = repo[rev]
46758
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
    87
            if ctx.node() is None:
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
    88
                raise error.InputError(_(b'cannot split working directory'))
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
    89
50884
b5066b2b40f2 split: migrate `opts` to native kwargs
Matt Harbison <matt_harbison@yahoo.com>
parents: 49961
diff changeset
    90
            if opts.get('rebase'):
46758
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
    91
                # Skip obsoleted descendants and their descendants so the rebase
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
    92
                # won't cause conflicts for sure.
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
    93
                descendants = list(repo.revs(b'(%d::) - (%d)', rev, rev))
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
    94
                torebase = list(
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
    95
                    repo.revs(
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
    96
                        b'%ld - (%ld & obsolete())::', descendants, descendants
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
    97
                    )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
    98
                )
46758
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
    99
            else:
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
   100
                torebase = []
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
   101
            rewriteutil.precheck(repo, [rev] + torebase, b'split')
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
   102
46758
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
   103
            if len(ctx.parents()) > 1:
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
   104
                raise error.InputError(_(b'cannot split a merge changeset'))
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
   105
46758
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
   106
            cmdutil.bailifchanged(repo)
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
   107
46758
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
   108
            # Deactivate bookmark temporarily so it won't get moved
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
   109
            # unintentionally
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
   110
            bname = repo._activebookmark
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
   111
            if bname and repo._bookmarks[bname] != ctx.node():
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
   112
                bookmarks.deactivate(repo)
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
   113
46758
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
   114
            wnode = repo[b'.'].node()
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
   115
            top = None
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
   116
            try:
50884
b5066b2b40f2 split: migrate `opts` to native kwargs
Matt Harbison <matt_harbison@yahoo.com>
parents: 49961
diff changeset
   117
                top = dosplit(ui, repo, tr, ctx, **opts)
46758
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
   118
            finally:
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
   119
                # top is None: split failed, need update --clean recovery.
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
   120
                # wnode == ctx.node(): wnode split, no need to update.
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
   121
                if top is None or wnode != ctx.node():
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
   122
                    hg.clean(repo, wnode, show_stats=False)
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
   123
                if bname:
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
   124
                    bookmarks.activate(repo, bname)
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
   125
            if torebase and top:
7f6c002d7c0a split: close transaction in the unlikely event of a conflict while rebasing
Martin von Zweigbergk <martinvonz@google.com>
parents: 45876
diff changeset
   126
                dorebase(ui, repo, torebase, top)
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
   127
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
   128
50884
b5066b2b40f2 split: migrate `opts` to native kwargs
Matt Harbison <matt_harbison@yahoo.com>
parents: 49961
diff changeset
   129
def dosplit(ui, repo, tr, ctx, **opts):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
   130
    committed = []  # [ctx]
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
   131
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
   132
    # Set working parent to ctx.p1(), and keep working copy as ctx's content
41966
42e2c7c52e1b split: use the new movedirstate() we now have in scmutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 40295
diff changeset
   133
    if ctx.node() != repo.dirstate.p1():
42e2c7c52e1b split: use the new movedirstate() we now have in scmutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 40295
diff changeset
   134
        hg.clean(repo, ctx.node(), show_stats=False)
49961
7a8bfc05b691 dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49960
diff changeset
   135
    with repo.dirstate.changing_parents(repo):
41966
42e2c7c52e1b split: use the new movedirstate() we now have in scmutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 40295
diff changeset
   136
        scmutil.movedirstate(repo, ctx.p1())
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
   137
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
   138
    # Any modified, added, removed, deleted result means split is incomplete
43641
705738def50c split: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
   139
    def incomplete(repo):
705738def50c split: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
   140
        st = repo.status()
705738def50c split: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
   141
        return any((st.modified, st.added, st.removed, st.deleted))
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
   142
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
   143
    # Main split loop
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
   144
    while incomplete(repo):
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
   145
        if committed:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
   146
            header = _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   147
                b'HG: Splitting %s. So far it has been split into:\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
   148
            ) % short(ctx.node())
45856
8357e0e81bb7 split: disable color while rendering template for use in commit message
Martin von Zweigbergk <martinvonz@google.com>
parents: 45773
diff changeset
   149
            # We don't want color codes in the commit message template, so
8357e0e81bb7 split: disable color while rendering template for use in commit message
Martin von Zweigbergk <martinvonz@google.com>
parents: 45773
diff changeset
   150
            # disable the label() template function while we render it.
8357e0e81bb7 split: disable color while rendering template for use in commit message
Martin von Zweigbergk <martinvonz@google.com>
parents: 45773
diff changeset
   151
            with ui.configoverride(
8357e0e81bb7 split: disable color while rendering template for use in commit message
Martin von Zweigbergk <martinvonz@google.com>
parents: 45773
diff changeset
   152
                {(b'templatealias', b'label(l,x)'): b"x"}, b'split'
8357e0e81bb7 split: disable color while rendering template for use in commit message
Martin von Zweigbergk <martinvonz@google.com>
parents: 45773
diff changeset
   153
            ):
8357e0e81bb7 split: disable color while rendering template for use in commit message
Martin von Zweigbergk <martinvonz@google.com>
parents: 45773
diff changeset
   154
                for c in committed:
8357e0e81bb7 split: disable color while rendering template for use in commit message
Martin von Zweigbergk <martinvonz@google.com>
parents: 45773
diff changeset
   155
                    summary = cmdutil.format_changeset_summary(ui, c, b'split')
8357e0e81bb7 split: disable color while rendering template for use in commit message
Martin von Zweigbergk <martinvonz@google.com>
parents: 45773
diff changeset
   156
                    header += _(b'HG: - %s\n') % summary
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
   157
            header += _(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43077
diff changeset
   158
                b'HG: Write commit message for the next split changeset.\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
   159
            )
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
   160
        else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
   161
            header = _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   162
                b'HG: Splitting %s. Write commit message for the '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   163
                b'first split changeset.\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
   164
            ) % short(ctx.node())
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
   165
        opts.update(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
   166
            {
50884
b5066b2b40f2 split: migrate `opts` to native kwargs
Matt Harbison <matt_harbison@yahoo.com>
parents: 49961
diff changeset
   167
                'edit': True,
b5066b2b40f2 split: migrate `opts` to native kwargs
Matt Harbison <matt_harbison@yahoo.com>
parents: 49961
diff changeset
   168
                'interactive': True,
b5066b2b40f2 split: migrate `opts` to native kwargs
Matt Harbison <matt_harbison@yahoo.com>
parents: 49961
diff changeset
   169
                'message': header + ctx.description(),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
   170
            }
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
   171
        )
46923
8ee1ac083ee7 split: fix issue with empty splits adjusting phases
Kyle Lippincott <spectral@google.com>
parents: 46843
diff changeset
   172
        origctx = repo[b'.']
50884
b5066b2b40f2 split: migrate `opts` to native kwargs
Matt Harbison <matt_harbison@yahoo.com>
parents: 49961
diff changeset
   173
        commands.commit(ui, repo, **opts)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   174
        newctx = repo[b'.']
46923
8ee1ac083ee7 split: fix issue with empty splits adjusting phases
Kyle Lippincott <spectral@google.com>
parents: 46843
diff changeset
   175
        # Ensure user didn't do a "no-op" split (such as deselecting
8ee1ac083ee7 split: fix issue with empty splits adjusting phases
Kyle Lippincott <spectral@google.com>
parents: 46843
diff changeset
   176
        # everything).
8ee1ac083ee7 split: fix issue with empty splits adjusting phases
Kyle Lippincott <spectral@google.com>
parents: 46843
diff changeset
   177
        if origctx.node() != newctx.node():
8ee1ac083ee7 split: fix issue with empty splits adjusting phases
Kyle Lippincott <spectral@google.com>
parents: 46843
diff changeset
   178
            committed.append(newctx)
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
   179
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
   180
    if not committed:
45876
568c05d8f3d2 errors: raise InputError in `hg split`
Martin von Zweigbergk <martinvonz@google.com>
parents: 45856
diff changeset
   181
        raise error.InputError(_(b'cannot split an empty revision'))
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
   182
46924
ca0049946e9a split: avoid strip if split is a no-op (identical to original)
Kyle Lippincott <spectral@google.com>
parents: 46923
diff changeset
   183
    if len(committed) != 1 or committed[0].node() != ctx.node():
ca0049946e9a split: avoid strip if split is a no-op (identical to original)
Kyle Lippincott <spectral@google.com>
parents: 46923
diff changeset
   184
        # Ensure we don't strip a node if we produce the same commit as already
ca0049946e9a split: avoid strip if split is a no-op (identical to original)
Kyle Lippincott <spectral@google.com>
parents: 46923
diff changeset
   185
        # exists
ca0049946e9a split: avoid strip if split is a no-op (identical to original)
Kyle Lippincott <spectral@google.com>
parents: 46923
diff changeset
   186
        scmutil.cleanupnodes(
ca0049946e9a split: avoid strip if split is a no-op (identical to original)
Kyle Lippincott <spectral@google.com>
parents: 46923
diff changeset
   187
            repo,
ca0049946e9a split: avoid strip if split is a no-op (identical to original)
Kyle Lippincott <spectral@google.com>
parents: 46923
diff changeset
   188
            {ctx.node(): [c.node() for c in committed]},
ca0049946e9a split: avoid strip if split is a no-op (identical to original)
Kyle Lippincott <spectral@google.com>
parents: 46923
diff changeset
   189
            operation=b'split',
ca0049946e9a split: avoid strip if split is a no-op (identical to original)
Kyle Lippincott <spectral@google.com>
parents: 46923
diff changeset
   190
            fixphase=True,
ca0049946e9a split: avoid strip if split is a no-op (identical to original)
Kyle Lippincott <spectral@google.com>
parents: 46923
diff changeset
   191
        )
35455
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
   192
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
   193
    return committed[-1]
02ea370c2baa split: new extension to split changesets
Jun Wu <quark@fb.com>
parents:
diff changeset
   194
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
   195
36408
83bade6206d4 split: use ctx.rev() instead of %d % ctx
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36400
diff changeset
   196
def dorebase(ui, repo, src, destctx):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
   197
    rebase.rebase(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
   198
        ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
   199
        repo,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   200
        rev=[revsetlang.formatspec(b'%ld', src)],
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   201
        dest=revsetlang.formatspec(b'%d', destctx.rev()),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41966
diff changeset
   202
    )