##// END OF EJS Templates
py3: use stdlib's parseaddr() to get sender header in notify extension...
py3: use stdlib's parseaddr() to get sender header in notify extension In Python 3, email headers are unicode string so using stringutil.email() will not work as it compares with bytestring. So let's use email.utils.parseaddr() from the stdlib which has a consistent behavior across Python versions. The same is done in patchbomb extension already.

File last commit:

r43347:687b865b default
r43635:ac33550f stable
Show More
closehead.py
95 lines | 2.7 KiB | text/x-python | PythonLexer
Joerg Sonnenberger
extensions: new closehead module for closing arbitrary heads...
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.
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 testedwith = b'ships-with-hg-core'
Joerg Sonnenberger
extensions: new closehead module for closing arbitrary heads...
r40029
commitopts = cmdutil.commitopts
commitopts2 = cmdutil.commitopts2
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 commitopts3 = [(b'r', b'rev', [], _(b'revision to check'), _(b'REV'))]
Augie Fackler
formatting: blacken the codebase...
r43346
Joerg Sonnenberger
extensions: new closehead module for closing arbitrary heads...
r40029
Augie Fackler
formatting: blacken the codebase...
r43346 @command(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'close-head|close-heads',
Augie Fackler
formatting: blacken the codebase...
r43346 commitopts + commitopts2 + commitopts3,
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'[OPTION]... [REV]...'),
rdamazio@google.com
help: assigning categories to existing commands...
r40329 helpcategory=command.CATEGORY_CHANGE_MANAGEMENT,
Augie Fackler
formatting: blacken the codebase...
r43346 inferrepo=True,
)
Joerg Sonnenberger
extensions: new closehead module for closing arbitrary heads...
r40029 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.
"""
Augie Fackler
formatting: blacken the codebase...
r43346
Joerg Sonnenberger
extensions: new closehead module for closing arbitrary heads...
r40029 def docommit(rev):
Augie Fackler
formatting: blacken the codebase...
r43346 cctx = context.memctx(
repo,
parents=[rev, None],
text=message,
files=[],
filectxfn=None,
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 user=opts.get(b'user'),
date=opts.get(b'date'),
Augie Fackler
formatting: blacken the codebase...
r43346 extra=extra,
)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 tr = repo.transaction(b'commit')
Joerg Sonnenberger
extensions: new closehead module for closing arbitrary heads...
r40029 ret = repo.commitctx(cctx, True)
bookmarks.update(repo, [rev, None], ret)
cctx.markcommitted(ret)
tr.close()
opts = pycompat.byteskwargs(opts)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 revs += tuple(opts.get(b'rev', []))
Joerg Sonnenberger
extensions: new closehead module for closing arbitrary heads...
r40029 revs = scmutil.revrange(repo, revs)
if not revs:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.Abort(_(b'no revisions specified'))
Joerg Sonnenberger
extensions: new closehead module for closing arbitrary heads...
r40029
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:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.Abort(_(b'revision is not an open head: %d') % rev)
Joerg Sonnenberger
extensions: new closehead module for closing arbitrary heads...
r40029
message = cmdutil.logmessage(ui, opts)
if not message:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.Abort(_(b"no commit message specified with -l or -m"))
extra = {b'close': b'1'}
Joerg Sonnenberger
extensions: new closehead module for closing arbitrary heads...
r40029
with repo.wlock(), repo.lock():
for rev in revs:
r = repo[rev]
branch = r.branch()
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 extra[b'branch'] = branch
Joerg Sonnenberger
extensions: new closehead module for closing arbitrary heads...
r40029 docommit(r)
return 0