closehead.py
82 lines
| 2.6 KiB
| text/x-python
|
PythonLexer
/ hgext / closehead.py
Joerg Sonnenberger
|
r40029 | # closehead.py - Close arbitrary heads without checking them out first | ||
# | ||||
# This software may be used and distributed according to the terms of the | ||||
# GNU General Public License version 2 or any later version. | ||||
'''close arbitrary heads without checking them out first''' | ||||
from __future__ import absolute_import | ||||
from mercurial.i18n import _ | ||||
from mercurial import ( | ||||
bookmarks, | ||||
cmdutil, | ||||
context, | ||||
error, | ||||
pycompat, | ||||
registrar, | ||||
scmutil, | ||||
) | ||||
cmdtable = {} | ||||
command = registrar.command(cmdtable) | ||||
# Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for | ||||
# extensions which SHIP WITH MERCURIAL. Non-mainline extensions should | ||||
# be specifying the version(s) of Mercurial they are tested with, or | ||||
# leave the attribute unspecified. | ||||
testedwith = 'ships-with-hg-core' | ||||
commitopts = cmdutil.commitopts | ||||
commitopts2 = cmdutil.commitopts2 | ||||
Joerg Sonnenberger
|
r40132 | commitopts3 = [('r', 'rev', [], | ||
Joerg Sonnenberger
|
r40029 | _('revision to check'), _('REV'))] | ||
@command('close-head|close-heads', commitopts + commitopts2 + commitopts3, | ||||
_('[OPTION]... [REV]...'), inferrepo=True) | ||||
def close_branch(ui, repo, *revs, **opts): | ||||
"""close the given head revisions | ||||
This is equivalent to checking out each revision in a clean tree and running | ||||
``hg commit --close-branch``, except that it doesn't change the working | ||||
directory. | ||||
The commit message must be specified with -l or -m. | ||||
""" | ||||
def docommit(rev): | ||||
cctx = context.memctx(repo, parents=[rev, None], text=message, | ||||
files=[], filectxfn=None, user=opts.get('user'), | ||||
date=opts.get('date'), extra=extra) | ||||
tr = repo.transaction('commit') | ||||
ret = repo.commitctx(cctx, True) | ||||
bookmarks.update(repo, [rev, None], ret) | ||||
cctx.markcommitted(ret) | ||||
tr.close() | ||||
opts = pycompat.byteskwargs(opts) | ||||
revs += tuple(opts.get('rev', [])) | ||||
revs = scmutil.revrange(repo, revs) | ||||
if not revs: | ||||
raise error.Abort(_('no revisions specified')) | ||||
heads = [] | ||||
for branch in repo.branchmap(): | ||||
heads.extend(repo.branchheads(branch)) | ||||
heads = set(repo[h].rev() for h in heads) | ||||
for rev in revs: | ||||
if rev not in heads: | ||||
Pulkit Goyal
|
r40264 | raise error.Abort(_('revision is not an open head: %d') % rev) | ||
Joerg Sonnenberger
|
r40029 | |||
message = cmdutil.logmessage(ui, opts) | ||||
if not message: | ||||
raise error.Abort(_("no commit message specified with -l or -m")) | ||||
extra = { 'close': '1' } | ||||
with repo.wlock(), repo.lock(): | ||||
for rev in revs: | ||||
r = repo[rev] | ||||
branch = r.branch() | ||||
extra['branch'] = branch | ||||
docommit(r) | ||||
return 0 | ||||