Mercurial > hg
view hgext/hooklib/reject_merge_commits.py @ 48195:4d5a13253d34
dirstate-v2: Replace the 32-bit `mode` field with two bits
Previously we stored the entire value from `stat_result.st_mode`,
like dirstate-v1 does. However only the executable permission
and type of file (only symbolic links and normal files are supported)
are relevant to Mecurial.
So replace this field with two bits in the existing bitfield byte.
For now the unused space is left as padding, as it will be used
for something else soon.
Differential Revision: https://phab.mercurial-scm.org/D11635
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Tue, 12 Oct 2021 17:57:57 +0200 |
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 )