Это позволит использовать централизованные хуки для репо с одним шагом настройки для каждого пользователя. Однако это вызовет проблемы у пользователей, которые отключены от сети. В качестве альтернативы, если вы склонны отключать разработчиков (или тех, кто работает по каналам с высокой задержкой / низкой пропускной способностью), будет иметь репозиторий, содержащий хуки, и настройте глобальный hgrc каждого пользователя, чтобы он указывал на этот репозиторий (и требовали регулярного извлечения из центральный крюк репо).
Обратите внимание, что я воспринимаю идентификатор первого коммита как «идентификатор репо» - это предполагает, что первый коммит в каждом репозитории каким-то образом уникален - содержимое или сообщение о коммите. Если это не тот случай, вы можете сделать то же самое, но применить его к первым N коммитам - но вам придется учитывать репо, у которых меньше N коммитов - нельзя просто взять, например, repo[:5]
как новые коммиты затем изменил бы ID репо. Я лично предлагаю, чтобы первый коммит, вероятно, был стандартным .ignore
файлом с сообщением о коммите, уникальным для этого репо.
Иметь центральный файл shared_hgrc, доступный из общего сетевого ресурса (или из репозитория).
Глобальная hgrc каждого пользователя имеет:
%include /path/to/shared_hgrc
Создать общий репозиторий подключаемых модулей Python. Крючки должны быть написаны на python.
Создайте свои функции хуков. В каждой функции проверьте, какой хук репо был вызван, проверив идентификатор первого коммита:
# hooktest.py
import mercurial.util
FOOBAR_REPO = 'b88c69276866d73310be679b6a4b40d875e26d84'
ALLOW_PRECOMMIT_REPOS = set((
FOOBAR_REPO,
))
def precommit_deny_if_wrong_repo(ui, repo, **kwargs):
"""Aborts if the repo is not allowed to do this.
The repo ID is the ID of the first commit to the repo."""
repo_id = repo[0].hex().lower()
if repo_id not in ALLOW_PRECOMMIT_REPOS:
raise mercurial.util.Abort('Repository denied: %s' % (repo_id,))
ui.status('Repository allowed: %s\n' % (repo_id,))
def precommit_skip_if_wrong_repo(ui, repo, **kwargs):
"""Skips the hook if the repo is not allowed to do this.
The repo ID is the ID of the first commit to the repo."""
repo_id = repo[0].hex().lower()
if repo_id not in ALLOW_PRECOMMIT_REPOS:
ui.debug('Repository hook skipped: %s\n' % (repo_id,))
return
ui.status('Repository hook allowed: %s\n' % (repo_id,))
В файле shared_hgrc установите нужные вам хуки (убедитесь, что вы укажете имена хуков для предотвращения конфликтов):
[hooks]
pre-commit.00_skip = python:/path/to/hooktest.py:precommit_skip_if_wrong_repo
pre-commit.01_deny = python:/path/to/hooktest.py:precommit_deny_if_wrong_repo