Как мне установить хук в HG / Mercurial, который диктуется хранилищем? - PullRequest
4 голосов
/ 18 сентября 2011

Мне нужно запустить ловушку после обновления (это создаст решение, которое они обновили), и я не хочу добавлять этот ловушку вручную для каждого человека, который клонирует мой центральный репозиторий.

Когда кто-то впервые клонирует мой центральный репозиторий, возможно ли включить крючки в этот клон? Кажется, что файл .hgrc не клонируется автоматически.

Я читал о хуках для всего сайта, но, насколько я понимаю, они работают с каждым созданным репозиторием, где я хочу иметь только хуки для некоторых репозиториев.

Ответы [ 4 ]

10 голосов
/ 18 сентября 2011

Как уже сказал Руди , это (к счастью) невозможно по соображениям безопасности.

Однако вы можете уменьшить нагрузку на клон для настройки хуков вручную: поставляйте скрипты хуков как часть вашего репозитория, например, в каталоге .hghooks, и дополнительно включите в репозиторий сценарий, который устанавливает эти хуки в клоне hgrc. Теперь каждому сотруднику нужно вызывать скрипт установки только один раз для каждого клона.

4 голосов
/ 18 сентября 2011

Это невозможно, так как эти хуки не распространяются на клонов - это мера безопасности. Если бы это было возможно, можно было бы создать хранилище ружей, которое запускает произвольные команды на любой машине, где клонировано хранилище.

Подробнее см. http://hgbook.red -bean.com / read / processing-repository-events-with-hooks.html # id402330 .

3 голосов
/ 19 сентября 2011

Это позволит использовать централизованные хуки для репо с одним шагом настройки для каждого пользователя. Однако это вызовет проблемы у пользователей, которые отключены от сети. В качестве альтернативы, если вы склонны отключать разработчиков (или тех, кто работает по каналам с высокой задержкой / низкой пропускной способностью), будет иметь репозиторий, содержащий хуки, и настройте глобальный hgrc каждого пользователя, чтобы он указывал на этот репозиторий (и требовали регулярного извлечения из центральный крюк репо).

Обратите внимание, что я воспринимаю идентификатор первого коммита как «идентификатор репо» - это предполагает, что первый коммит в каждом репозитории каким-то образом уникален - содержимое или сообщение о коммите. Если это не тот случай, вы можете сделать то же самое, но применить его к первым N коммитам - но вам придется учитывать репо, у которых меньше N коммитов - нельзя просто взять, например, repo[:5] как новые коммиты затем изменил бы ID репо. Я лично предлагаю, чтобы первый коммит, вероятно, был стандартным .ignore файлом с сообщением о коммите, уникальным для этого репо.

  1. Иметь центральный файл shared_hgrc, доступный из общего сетевого ресурса (или из репозитория).

  2. Глобальная hgrc каждого пользователя имеет:

    %include /path/to/shared_hgrc
    
  3. Создать общий репозиторий подключаемых модулей Python. Крючки должны быть написаны на python.

  4. Создайте свои функции хуков. В каждой функции проверьте, какой хук репо был вызван, проверив идентификатор первого коммита:

    # 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,))
    
  5. В файле 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
    
1 голос
/ 18 сентября 2011

Как сначала сказал @Rudi, этого нельзя сделать из соображений безопасности.

С некоторой предварительной настройкой вы можете сделать так, чтобы хуки запускались на клоне, но помещая хук с относительным путем репо в /etc/mercurial или в ~/.hgrc каждого пользователя, что в корпоративной настройке можно сделать через инструменты управления вашей системой или создание собственного установщика Mercurial. В не корпоративных условиях следуйте советам @ Oben и предоставьте сценарии и файл readme.

...