diff -r edc8504bc26b -r 4cabeea6d214 hgext/hooklib/enforce_draft_commits.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgext/hooklib/enforce_draft_commits.py Sat Sep 07 14:50:39 2019 +0200 @@ -0,0 +1,45 @@ +# Copyright 2020 Joerg Sonnenberger +# +# This software may be used and distributed according to the terms of the +# GNU General Public License version 2 or any later version. + +"""enforce_draft_commits us a hook to ensure that all new changesets are +in the draft phase. This allows enforcing policies for work-in-progress +changes in overlay repositories, i.e. a shared hidden repositories with +different views for work-in-progress code and public history. + +Usage: + [hooks] + pretxnclose-phase.enforce_draft_commits = \ + python:hgext.hooklib.enforce_draft_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"pretxnclose-phase": + raise error.Abort( + _(b'Unsupported hook type %r') % pycompat.bytestr(hooktype) + ) + ctx = repo.unfiltered()[node] + if kwargs['oldphase']: + raise error.Abort( + _(b'Phase change from %r to %r for %s rejected') + % ( + pycompat.bytestr(kwargs['oldphase']), + pycompat.bytestr(kwargs['phase']), + ctx, + ) + ) + elif kwargs['phase'] != b'draft': + raise error.Abort( + _(b'New changeset %s in phase %r rejected') + % (ctx, pycompat.bytestr(kwargs['phase'])) + )