hgext/commitextras.py
author Durham Goode <durham@fb.com>
Tue, 18 Jul 2017 07:47:28 -0700
changeset 33569 d341677d667d
parent 33562 3cfabb6cfd51
child 33602 27fbca750b4d
permissions -rw-r--r--
rebase: add config to move rebase into a single transaction This was previously landed as cf8ad0e6c0e4 but backed out in a5abaa81fa because it broke hook mid rebase and caused conflict resolution data loss in the event of unexpected exceptions. This new version adds the behavior back but behind a config flag, since the performance improvement is notable in large repositories. The next patch adds a test covering this config. The old commit message was: Previously, rebasing would open several transaction over the course of rebasing several commits. Opening a transaction can have notable overhead (like copying the dirstate) which can add up when rebasing many commits. This patch adds a single large transaction around the actual commit rebase operation, with a catch for intervention which serializes the current state if we need to drop back to the terminal for user intervention. Amazingly, almost all the tests seem to pass. On large repos with large working copies, this can speed up rebasing 7 commits by 25%. I'd expect the percentage to be a bit larger for rebasing even more commits. There are minor test changes because we're rolling back the entire transaction during unexpected exceptions instead of just stopping mid-rebase, so there's no more backup bundle. It also leave an unknown file in the working copy, since our clean up 'hg update' doesn't delete unknown files. (grafted from cca36c7f35261b0e31beb226bf361067ef0e06ab) (grafted from dc497d8705b71503e32e07bd33925c1e42cf9c9a) Differential Revision: https://phab.mercurial-scm.org/D134
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
33546
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
     1
# commitextras.py
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
     2
#
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
     3
# Copyright 2013 Facebook, Inc.
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
     4
#
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
     5
# This software may be used and distributed according to the terms of the
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
     6
# GNU General Public License version 2 or any later version.
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
     7
33562
3cfabb6cfd51 commitextras: mark the extension as ADVANCED
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33547
diff changeset
     8
'''adds a new flag extras to commit (ADVANCED)'''
33546
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
     9
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    10
from __future__ import absolute_import
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    11
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    12
from mercurial.i18n import _
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    13
from mercurial import (
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    14
    commands,
33547
a6af8560494e commitextras: check the format of the arguments and no internal key is used
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33546
diff changeset
    15
    error,
33546
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    16
    extensions,
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    17
    registrar,
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    18
)
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    19
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    20
cmdtable = {}
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    21
command = registrar.command(cmdtable)
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    22
testedwith = 'ships-with-hg-core'
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    23
33547
a6af8560494e commitextras: check the format of the arguments and no internal key is used
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33546
diff changeset
    24
usedinternally = {
a6af8560494e commitextras: check the format of the arguments and no internal key is used
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33546
diff changeset
    25
    'amend_source',
a6af8560494e commitextras: check the format of the arguments and no internal key is used
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33546
diff changeset
    26
    'branch',
a6af8560494e commitextras: check the format of the arguments and no internal key is used
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33546
diff changeset
    27
    'close',
a6af8560494e commitextras: check the format of the arguments and no internal key is used
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33546
diff changeset
    28
    'histedit_source',
a6af8560494e commitextras: check the format of the arguments and no internal key is used
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33546
diff changeset
    29
    'topic',
a6af8560494e commitextras: check the format of the arguments and no internal key is used
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33546
diff changeset
    30
    'rebase_source',
a6af8560494e commitextras: check the format of the arguments and no internal key is used
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33546
diff changeset
    31
    'intermediate-source',
a6af8560494e commitextras: check the format of the arguments and no internal key is used
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33546
diff changeset
    32
    '__touch-noise__',
a6af8560494e commitextras: check the format of the arguments and no internal key is used
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33546
diff changeset
    33
    'source',
a6af8560494e commitextras: check the format of the arguments and no internal key is used
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33546
diff changeset
    34
    'transplant_source',
a6af8560494e commitextras: check the format of the arguments and no internal key is used
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33546
diff changeset
    35
}
a6af8560494e commitextras: check the format of the arguments and no internal key is used
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33546
diff changeset
    36
33546
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    37
def extsetup(ui):
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    38
    entry = extensions.wrapcommand(commands.table, 'commit', _commit)
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    39
    options = entry[1]
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    40
    options.append(('', 'extra', [],
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    41
        _('set a changeset\'s extra values'), _("KEY=VALUE")))
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    42
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    43
def _commit(orig, ui, repo, *pats, **opts):
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    44
    origcommit = repo.commit
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    45
    try:
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    46
        def _wrappedcommit(*innerpats, **inneropts):
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    47
            extras = opts.get('extra')
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    48
            if extras:
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    49
                for raw in extras:
33547
a6af8560494e commitextras: check the format of the arguments and no internal key is used
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33546
diff changeset
    50
                    if '=' not in raw:
a6af8560494e commitextras: check the format of the arguments and no internal key is used
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33546
diff changeset
    51
                        msg = _("unable to parse '%s', should follow "
a6af8560494e commitextras: check the format of the arguments and no internal key is used
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33546
diff changeset
    52
                                "KEY=VALUE format")
a6af8560494e commitextras: check the format of the arguments and no internal key is used
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33546
diff changeset
    53
                        raise error.Abort(msg % raw)
33546
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    54
                    k, v = raw.split('=', 1)
33547
a6af8560494e commitextras: check the format of the arguments and no internal key is used
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33546
diff changeset
    55
                    if k in usedinternally:
a6af8560494e commitextras: check the format of the arguments and no internal key is used
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33546
diff changeset
    56
                        msg = _("key '%s' is used internally, can't be set "
a6af8560494e commitextras: check the format of the arguments and no internal key is used
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33546
diff changeset
    57
                                "manually")
a6af8560494e commitextras: check the format of the arguments and no internal key is used
Pulkit Goyal <7895pulkit@gmail.com>
parents: 33546
diff changeset
    58
                        raise error.Abort(msg % k)
33546
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    59
                    inneropts['extra'][k] = v
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    60
            return origcommit(*innerpats, **inneropts)
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    61
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    62
        # This __dict__ logic is needed because the normal
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    63
        # extension.wrapfunction doesn't seem to work.
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    64
        repo.__dict__['commit'] = _wrappedcommit
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    65
        return orig(ui, repo, *pats, **opts)
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    66
    finally:
77c0c36654c8 commitextras: move fb extension to core which add extras to a commit
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    67
        del repo.__dict__['commit']