sapling/commitextras.py
Durham Goode e6b221f9d6 extras: add commitextras extension
Summary:
This adds an extension which will allow a user to specify commit 'extras' from
the command line. This will allow our repo sync script to include extra metadata
in the commits.

For instance, this is required in order to not lose git's committer info when
syncing into mercurial (which is required in order to make sure two commits with
the same content but different committers will produce a different hash in
Mercurial).

Test Plan: Added a simple test

Reviewers: pyd, lcharignon, mpm, sid0, rmcelroy

Reviewed By: rmcelroy

Differential Revision: https://phabricator.fb.com/D2027341

Signature: t1:2027341:1430255572:6866d0ba5564ca977c8fce41e55988883e15ce5b
2015-04-27 20:20:48 -07:00

41 lines
1.3 KiB
Python

# commitextras.py
#
# Copyright 2013 Facebook, Inc.
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
from mercurial import util, cmdutil, commands, hg, scmutil
from mercurial import bookmarks, extensions
from mercurial.i18n import _
from hgext import rebase
import errno, os, stat, subprocess
cmdtable = {}
command = cmdutil.command(cmdtable)
testedwith = 'internal'
def extsetup(ui):
entry = extensions.wrapcommand(commands.table, 'commit', _commit)
options = entry[1]
options.append(('', 'extra', [],
_('set a commit\'s extra values'), _("KEY=VALUE")))
def _commit(orig, ui, repo, *pats, **opts):
origcommit = repo.commit
try:
def _wrappedcommit(*innerpats, **inneropts):
extras = opts.get('extra')
if extras:
for raw in extras:
k, v = raw.split('=', 1)
inneropts['extra'][k] = v
return origcommit(*innerpats, **inneropts)
# This __dict__ logic is needed because the normal
# extension.wrapfunction doesn't seem to work.
repo.__dict__['commit'] = _wrappedcommit
return orig(ui, repo, *pats, **opts)
finally:
del repo.__dict__['commit']