Mercurial > hg
view hgext/closehead.py @ 41720:6704696141b8
templates: adding a config() function for template customization
This allows templates to be written such that users can customize them easily,
or that they can be customized based on other configuration of the system. For
enterprise deployments, we often have complex template aliases, and right now
the only way individual users can customize those is by replacing the whole
template alias (which means they won't get company-wide updates to it anymore,
plus most users don't want to have to get a complex template right).
With this change, they can just set a config option which feeds into our
templates for common changes (e.g. whether to limit commit descriptions to the
width of their terminal or not).
To work around the issue of having to register the config options, I declared
a dedicated section [templateconfig] for these options to be dynamically
declared. They can still reference any other config option that's registered
elsewhere.
I only did string, bool and int at this time - list and date would add other
complications with parsing the default so I'll leave that as an exercise to
the reader :)
Differential Revision: https://phab.mercurial-scm.org/D5959
author | rdamazio@google.com |
---|---|
date | Wed, 13 Feb 2019 18:34:08 -0800 |
parents | c303d65d2e34 |
children | 2372284d9457 |
line wrap: on
line source
# 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 commitopts3 = [('r', 'rev', [], _('revision to check'), _('REV'))] @command('close-head|close-heads', commitopts + commitopts2 + commitopts3, _('[OPTION]... [REV]...'), helpcategory=command.CATEGORY_CHANGE_MANAGEMENT, 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: raise error.Abort(_('revision is not an open head: %d') % rev) 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