Mercurial > hg
view hgext/hooklib/reject_merge_commits.py @ 46197:2607a9346398
branchmap: micro-optimize branchinfo
changelogrevision() is supposed to be used if not all data of
changelog.read is used. This is the case here as only the extra field is
used. This also improves extensibility as at least hgext.git doesn't
implement changelog.read.
Differential Revision: https://phab.mercurial-scm.org/D9626
author | Joerg Sonnenberger <joerg@bec.de> |
---|---|
date | Thu, 17 Dec 2020 13:29:50 +0100 |
parents | 4cabeea6d214 |
children | 6000f5b25c9b |
line wrap: on
line source
# Copyright 2020 Joerg Sonnenberger <joerg@bec.de> # # This software may be used and distributed according to the terms of the # GNU General Public License version 2 or any later version. """reject_merge_commits is a hook to check new changesets for merge commits. Merge commits are allowed only between different branches, i.e. merging a feature branch into the main development branch. This can be used to enforce policies for linear commit histories. Usage: [hooks] pretxnchangegroup.reject_merge_commits = \ python:hgext.hooklib.reject_merge_commits.hook """ from __future__ import absolute_import from mercurial.i18n import _ from mercurial import ( error, pycompat, ) def hook(ui, repo, hooktype, node=None, **kwargs): if hooktype != b"pretxnchangegroup": raise error.Abort( _(b'Unsupported hook type %r') % pycompat.bytestr(hooktype) ) ctx = repo.unfiltered()[node] for rev in repo.changelog.revs(start=ctx.rev()): rev = repo[rev] parents = rev.parents() if len(parents) < 2: continue if all(repo[p].branch() == rev.branch() for p in parents): raise error.Abort( _( b'%s rejected as merge on the same branch. ' b'Please consider rebase.' ) % rev )