view hgext/hooklib/reject_merge_commits.py @ 51479:5bd31e68c7a3

stream-clone-test: add title to various test cases These case are fine as is, but as we are adding title to all the other as we simplify them, lets add title for all cases.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Fri, 08 Mar 2024 10:59:51 +0100
parents 6000f5b25c9b
children f4733654f144
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 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
            )