##// END OF EJS Templates
locking: take the `wlock` for the full `hg addremove` duration...
locking: take the `wlock` for the full `hg addremove` duration Otherwise, there is a race condition window between the time we resolve the file to addremove with the matcher and the time we lock the repo and modify the dirstate. For example, the working copy might have been updated away, or purged, and the matched files would no longer be correct.

File last commit:

r49730:6000f5b2 default
r50902:2aacd560 default
Show More
enforce_draft_commits.py
44 lines | 1.3 KiB | text/x-python | PythonLexer
/ hgext / hooklib / enforce_draft_commits.py
# 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.
"""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 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']))
)