view hgext/hooklib/reject_merge_commits.py @ 51725:bbe59cc5d2e1

rust-changelog: accessing the index The `Index` object is currently the one providing all DAG related algorithms, starting with simple ancestors iteration up to more advanced ones (ranges, common ancestors…). From pure Rust code, there was no way to access the changelog index for a given `Repository`, probably because `rhg` does not use any such algorithm yet.
author Georges Racinet <georges.racinet@cloudcrane.io>
date Mon, 22 Jul 2024 18:20:29 +0200
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
            )