Глава 10. Обработка событий в репозитории с помощью ловушек

Содержание

10.1. Обзор ловушек Mercurial
10.2. Ловушки и безопасность
10.2.1. Ловушки выполняются с Вашими привелегиями
10.2.2. Ловушки не распространяются
10.2.3. Возможно переопределение ловушек
10.2.4. Обеспечение выполнения критических ловушек
10.3. Краткое руководство по использованию ловушек
10.3.1. Выполнение нескольких действий на событие
10.3.2. Управление возможностью выполнения действия
10.4. Написание собственных ловушек
10.4.1. Выбор того, как должна работать ваша ловушка
10.4.2. Параметры ловушек
10.4.3. Возвращаемое значение ловушки и контроль за действием
10.4.4. Написание внешних ловушек
10.4.5. Приказ Mercurial использовать внутренние ловушки
10.4.6. Написание внутрипроцессных ловушек
10.5. Несколько примеров ловушек
10.5.1. Проверка сообщений при фиксации
10.5.2. Проверка на конечные пробелы
10.6. Встроенные ловушки
10.6.1. acl — контроль доступа к частям репозитория
10.6.2. bugzilla — интеграция с Bugzilla
10.6.3. notify — отправка email оповещения
10.7. Информация для разработчиков ловушек
10.7.1. Выполнение внутрипроцессорых ловушек
10.7.2. Выполнение внешних ловушек
10.7.3. Как определить, откуда пришли изменения
10.8. Ловушки. Описание.
10.8.1. changegroup — после внесения внешних ревизий
10.8.2. commit—после создания новой ревизии
10.8.3. incoming — после добавления одной удаленной ревизии
10.8.4. outgoing — после распространения ревизии
10.8.5. prechangegroup — до начала добавления ревизий удалённого репозитория
10.8.6. precommit — перед фиксацией ревизии
10.8.7. preoutgoing — до начала передачи ревизий в другие репозитории
10.8.8. pretag — перед тегированием ревизии
10.8.9. pretxnchangegroup — перед завершением добавления ревизий удалённого репозитория
10.8.10. pretxncommit — перед завершением фиксации новой ревизии
10.8.11. preupdate — перед обновлением или слиянием рабочей директории.
10.8.12. tag — после создания метки ревизии
10.8.13. update — после обновления или слияния рабочей директории

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

Mercurial использует для этих действий название ловушка (hook). Ловушки в некоторых системах управления версиями называются «триггерами», но оба этих названия относятся к одной и той же идее.

10.1. Обзор ловушек Mercurial

Это краткий список ловушек, поддерживаемых Mercurial. Мы подробно опишем каждую из ловушек позднее, в разделе Раздел 10.7, «Информация для разработчиков ловушек».

Каждая из ловушек, описанная как «Контролирующая» имеет возможность определить, может ли быть продолжено действие. Если ловушка выполнилась успешно, то действие может продолжаться, если нет, действие либо не разрешается либо отменяется, в зависимости от ловушки.

  • changegroup: Выполняется после группы ревизий, внесённых в хранилище извне.

  • commit: Выполняется после создания новой ревизии в локальном хранилище.

  • incoming: Однократно выполняется для каждого нового набора ревизии, внесённой в репозиторий извне. Примечание: отличается от changegroup тем, что выполняется однократно перед внесением группы ревизий.

  • outgoing: Выполняется после передачи группы ревизий из этого репозитория.

  • prechangegroup: Выполняемся перед началом приёма группы ревизии в репозиторий.

  • precommit: Управляющая. Выполняется перед началом фиксации.

  • preoutgoing: Управляющая. Выполняется перед началом передачи группы ревизий из этого репозитория.

  • pretag: Управляющая. Выполняется перед созданием tag'а.

  • pretxnchangegroup: Управляющая. Выполняется после группы ревизий, принятых в локальный репозиторий из других, но до окончательной обработки транзакции в репозитории, которая сделает изменения постоянными.

  • pretxncommit: Управляющая. Выполняется после создания нового набора изменений в локальном хранилище, но перед их фиксацией.

  • preupdate: Управляющая. Выполняется перед началом обновления или слияния рабочей директории.

  • tag: Выполняется после создания tag'а.

  • update: Выполняется после завершения обновления или слияния рабочей директории.

10.2. Ловушки и безопасность

10.2.1. Ловушки выполняются с Вашими привелегиями

При запуске Вами команд Mercurial в хранилище и команд, вызывающих выполнение ловушек, эти ловушки выполняются на Вашей системе, в Вашем аккаунте и с Вашим уровнем доступа. Ловушки частично состоят из исполняемого кода, так что относитесь к ним с достаточным подозрением. Не устанавливайте ловушку, если не знаете Кто и Зачем её написал и Что она делает.

В некоторых случаях Вы можете столкнуться с ловушками, которые Вы не устанавливали себе. Если вы работаете на незнакомой системе, Mercurial может выполнять ловушки, определённые в системном глобальном ~/.hgrc файле.

Если вы работаете с репозиторием, принадлежащем другому пользователю, Mercurial может запускать ловушки, определённые в пользовательском репозитории, но он будет работать от «Вас». Например, если Вы выполняете hg pull из этого репозитория, а его .hg/hgrc определяет локальные outgoing ловушки, то ловушка будет работать под вашей учетной записью пользователя, даже если вы не владелец репозитория.

[Примечание] Примечание

Это применимо только если Вы забираете изменения из репозитория в локальной или сетевой файловой системе. Если Вы забираете изменения по http или ssh, то любая outgoing ловушка будет запущена под аккаунтом, из-под которого выполняется серверный процесс, на сервере.

Для просмотра ловушек, определённых в репозитории, используйте команду hg showconfig hooks. Если Вы работаете в одном репозитории, но общаетесь с другим, которыми не владеете (например, используете hg pull или hg incoming), запомните что это ловушки другого хранилища, не Ваши, и Вы должны их проверять.

10.2.2. Ловушки не распространяются

В Mercurial ловушки не попадают под контроль ревизий и не распространяются, когда Вы клонируете репозиторий, или забираете изменения из репозитория. Причина этого проста: ловушка это произвольный кусок исполняевого кода. Она работает от Вашей учётной записи, с Вашим уровнем привелегий, на Вашей машине.

В любой распределенной системе контроля версий было бы крайне безрассудно реализовывать версионноконтролируемые ловушки, так как это даёт легкий способ компроментации аккаунтов пользователей системы управления версиями.

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

В корпоративной интрасети это несколько легче контролировать, так как Вы можете, например, создать «стандартную» установку Mercurial на файловой системе NFS и использовать общесистемный ~/.hgrc файл для определения ловушек для всех пользователей. Тем не менее, здесь тоже есть ограничения; см. ниже.

10.2.3. Возможно переопределение ловушек

Mercurial позволяет изменить ловушку, переопределив её. Вы можете отключить ловушку, установив значение равным пустой строке, или по своему желанию изменить её поведение.

Вы должны понимать при распространении общесистемного или общесайтового ~/.hgrc файла, определяющего какие-либо ловушки, что пользователи могут отключать или переопределять эти ловушки.

10.2.4. Обеспечение выполнения критических ловушек

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

Вместо этого, Вы можете настроить политику использования Mercurial так, чтобы люди распространяли изменения через хорошо известный «канонический» сервер, который защищён и должным образом настроен.

Один из способов осуществления этого — сочетание социальной инженерии и технологии. Настройте ограниченный доступ к учетной записи: пользователи могут отправлять изменения по сети в репозиторий этой учетной записи, но не могут входить в аккаунт и запускать команды оболочки. В этом случае пользователи смогут отправлять изменения, содержащие любое любимое ими старьё.

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

10.3. Краткое руководство по использованию ловушек

Писать ловушки Mercurial легко. Давайте начнем с ловушки, которая запускается при окончании hg commit, и просто печатает хэш только что созданной ревизии. Ловушка вызывается commit (фиксацией).

Все ловушки работают по той же схеме, что и пример

$ hg init hook-test
$ cd hook-test
$ echo '[hooks]' >> .hg/hgrc
$ echo 'commit = echo committed $HG_NODE' >> .hg/hgrc
$ cat .hg/hgrc
[hooks]
commit = echo committed $HG_NODE
$ echo a > a
$ hg add a
$ hg commit -m 'testing commit hook'
committed df3f65052fb97482958fed9fde988a6550da98fc

Вы добавляете запись в разделе hooks вашего ~/.hgrc. Слева находится название действия на которое он сработает; справа действие которое следует предпринять. Как вы видите, вы можете запустить произвольные команды оболочки в ловушке. Mercurial передаёт дополнительную информацию ловушке через переменные окружения (ищите HG_NODE в примере).

10.3.1. Выполнение нескольких действий на событие

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

$ echo 'commit.when = echo -n "date of commit: "; date' >> .hg/hgrc
$ echo a >> a
$ hg commit -m 'i have two hooks'
committed 95279e34c052b63a7ffa8778ae428644dd2071a6
date of commit: Thu Feb  2 14:09:53 GMT 2012

Mercurial позволяет сделать это путем добавления расширения к концу имени ловушки. Вы расширяете имя ловушки, добавляя к названию ловушки (после «.») произвольный текст. Например, Mercurial будет работать как с commit.foo, так и с commit.bar при событии фиксации (commit).

Чтобы задать четкий порядок выполнения, когда есть несколько ловушек, определенных для события, Mercurial сортирует ловушки в по расширению, и выполняет команды ловушки в этом порядке сортировки. В приведенном выше примере, он будет выполнять в следующем порядке commit, commit.bar, commit.foo.

Это хорошая идея использовать несколько описательных расширений при определении новых ловушек. Это поможет вам вспомнить для чего эта ловушка. Если ловушка не выполнилась, вы получите сообщение об ошибке, которое содержит имя и расширение ловушки, поэтому использование описательных расширений могло бы сразу дать вам намек на то, почему не сработала ловушка (смотрите раздел Раздел 10.3.2, «Управление возможностью выполнения действия» для примера).

10.3.2. Управление возможностью выполнения действия

В наших предыдущих примерах мы использовали ловушку commit, которая запускается после завершения фиксации. Это одна из нескольких ловушек Mercurial, которые выполняются после того, как действие произошло. Такие ловушки не имеют возможности влиять на само действие.

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

Ловушка pretxncommit запускается когда фиксация почти полностью завершена. Другими словами, метаданные, представляющие набор изменений были записаны на диск, но транзакция до сих пор не завершена. Ловушка pretxncommit имеет возможность решить, будет ли транзакция завершена или должен произойти откат.

Если ловушка pretxncommit завершает свою работу с кодом возврата 0, транзакция завершается; фиксация заканчивается, и выполняется ловушка commit. Если ловушка pretxncommit выходит с ненулевым кодом возврата, транзакция откатывается; метаданные, представляющие изменения стираются, а ловушка commit не выполняется.

$ cat check_bug_id
#!/bin/sh
# check that a commit comment mentions a numeric bug id
hg log -r $1 --template {desc} | grep -q "\<bug *[0-9]"
$ echo 'pretxncommit.bug_id_required = ./check_bug_id $HG_NODE' >> .hg/hgrc
$ echo a >> a
$ hg commit -m 'i am not mentioning a bug id'
transaction abort!
rollback completed
abort: pretxncommit.bug_id_required hook exited with status 1
$ hg commit -m 'i refer you to bug 666'
committed 13b236affeff106b31ae144e61b115cc36f3a63e
date of commit: Thu Feb  2 14:09:54 GMT 2012

Ловушка в приведенном выше примере проверяет, что комментарий при фиксации содержит id бага. Если он есть, фиксация завершается. Если нет, то происходит откат.

10.4. Написание собственных ловушек

Когда вы пишете ловушку, то может оказаться полезным для запускать Mercurial или с опцией -v, или параметром конфигурации verbose со значением «true». Когда вы это делаете, Mercurial выведет сообщение перед вызовом каждой ловушки.

10.4.1. Выбор того, как должна работать ваша ловушка

Вы можете написать ловушку как обычную программу, обычно скрипт на языке shell, или, как функции Python, которая выполняется в рамках процесса Mercurial.

Написание ловушки, как внешней программы имеет то преимущество, что не требует знаний о внутреннем строении Mercurial. Вы можете вызвать нормальную команду Mercurial для получения любой дополнительной информации. Недостаток в том, что внешние ловушки медленнее, чем ловушки внутри процесса.

Ловушка в процессе выполнения Python имеет полный доступ к Mercurial API, и не «создаёт» другой процесс, так что по своей сути быстрее, чем внешняя ловушка. Кроме того, легче получить больше информации, которая требуется ловушке с помощью API, чем выполнив команды Mercurial.

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

10.4.2. Параметры ловушек

Mercurial вызывает каждую ловушку с набором четких параметров. В python, параметр передается в качестве аргументов функции ловушки. Для внешней программы, параметры передаются как переменные среды.

Написана ли ваша ловушка в python или скриптом, конкретные имена и значения параметров будут одинаковы. Логический параметр будет представлен как логическое значение в python, и как число 1 (для «true») или 0 (для «false»), в случае переменных среды для внешних ловушек. Если параметр ловушки называется foo, имя аргумента ловушки в python будет также называться foo, в то время как переменная среды для внешних ловушек будет называться HG_FOO.

10.4.3. Возвращаемое значение ловушки и контроль за действием

Успешно выполнившаяся ловушка, должна выйти с кодом возврата 0, если она внешняя, или вернуть логическое «false», если внутрипроцессная. Отказ обозначается ненулевым кодом возврата из внешних ловушки, или внутри процесса ловушка возвращает логическое «true». Если в процессе выполнения ловушка генерирует исключение, ловушка считается выполнившейся неудачно.

Для контролирующей действие ловушки 0/false означает «разрешить», не-ноль/true/исключение означает «запретить».

10.4.4. Написание внешних ловушек

При определении внешней ловушки в вашем ~/.hgrc и ловушка запускаются, её переменные передаются вашей оболочке, которая интерпретирует её. Это означает, что вы можете использовать обычные конструкции shell в теле ловушки.

Исполняемая ловушка всегда выполняется с текущей директорией установленой в корневую директорию репозитория.

Каждый параметр ловушки передается в качестве переменной окружения, имя в верхнем регистре с префиксом «HG_».

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

10.4.5. Приказ Mercurial использовать внутренние ловушки

Cинтаксис ~/.hgrc для определения в внутренних ловушек несколько иной, чем для внешних ловушек. Значение ловушки должно начинаться с текста «python:», и продолжаться полностью определённым именем вызываемого объекта для использования в качестве значения ловушки.

Модуль, в котором находится ловушка автоматически импортируются при выполнении ловушки. До тех пор пока у вас есть имя модуля и правильный PYTHONPATH, это должно «просто работать».

Следующий ~/.hgrc фрагмент иллюстрирует синтаксис и смысл понятий, которые мы только что описали.

[hooks]
commit.example = python:mymodule.submodule.myhook

Когда Mercurial запускает ловушку commit.example, он импортирует mymodule.submodule, ищет объект с именем myhook, и вызывает его.

10.4.6. Написание внутрипроцессных ловушек

Простейших внутрипроцессный хук ничего не делает, но иллюстрирует основную формат api хуков:

def myhook(ui, repo, **kwargs):
    pass

Первый аргумент ловушки в python всегда ui объекта. Второй представляет собой репозиторий объектов, используемый в данный момент, это всегда localrepository. После этих двух аргументов идут другие аргументы. Какие аргументы будут переданы зависит от ловушки, но ловушка может игнорировать аргументы она не заботится о помещении их в аргументы словари такие как **kwargs выше.

10.5. Несколько примеров ловушек

10.5.1. Проверка сообщений при фиксации

Трудно представить себе полезное сообщение при фиксации слишком коротким. Простая ловушка pretxncommit в приведенном ниже примере поможет предотвратить фиксацию ревизии с сообщением, которое составляет менее 10 байт.

$ cat .hg/hgrc
[hooks]
pretxncommit.msglen = test `hg tip --template {desc} | wc -c` -ge 10
$ echo a > a
$ hg add a
$ hg commit -A -m 'too short'
transaction abort!
rollback completed
abort: pretxncommit.msglen hook exited with status 1
$ hg commit -A -m 'long enough'

10.5.2. Проверка на конечные пробелы

Интересным эффект при использовании связанных с commit ловушек, чтобы помочь вам писать чистый код. Простой пример «чистого кода» является утверждение о том, что изменения не должны добавлять новые строки текста, которые содержат «конечные пробелы». Конечные пробелы это ряд пробелов и табуляций в конце строки текста. В большинстве случаев, конечные пробелы не нужны, представляют невидимый шум, но это иногда это проблема, и люди часто предпочитают, избавляться от них.

Вы можете использовать precommit или pretxncommit ловушку для проверки конечных пробелов. Если вы используете ловушку precommit, ловушка не будет знать, какие файлы вы фиксируете, так что придется проверять каждый измененный файл в репозитории на завершающие пробелы. Если вы хотите зафиксировать изменения в файле foo, но файл bar содержит конечные пробелы, проверка в ловушке precommit может предотвратить фиксацию foo из-за проблемы с bar. Это кажется не правильным.

Если вы выберите ловушку pretxncommit, проверка выполнится незадолго до завершения транзакции. Это позволит вам проверить проблемы только в тех файлах, которые фиксируются. Однако, если вы ввели сообщение при фиксации в интерактивном режиме и ловушка не выполнилась, то транзакция будет отозвана, вы должны будете заново ввести сообщение после того как исправите конечные пробелы и запустить hg commit еще раз.

$ cat .hg/hgrc
[hooks]
pretxncommit.whitespace = hg export tip | (! egrep -q '^\+.*[ \t]$')
$ echo 'a ' > a
$ hg commit -A -m 'test with trailing whitespace'
adding a
transaction abort!
rollback completed
abort: pretxncommit.whitespace hook exited with status 1
$ echo 'a' > a
$ hg commit -A -m 'drop trailing whitespace and try again'

В вышеприведенном примере мы используем ловушку pretxncommit, которая проверяет текст на лишние пробелы в конце строк. Несмотря на простой и короткий код ловушка не очень полезная, так как всего лишь прерывает выполнение со статусом ошибки при попытке добавления строки из файла с лишними пробелами — но при этом не говорит ничего о том, где именно можно найти ошибку. У ловушки есть еще одна особенность — она проверяет на лишние пробелы только изменённые в файле строки, полностью игнорируя неизменённые.

#!/usr/bin/env python
#
# save as .hg/check_whitespace.py and make executable

import re

def trailing_whitespace(difflines):
    # 
    linenum, header = 0, False

    for line in difflines:
        if header:
            # remember the name of the file that this diff affects
            m = re.match(r'(?:---|\+\+\+) ([^\t]+)', line)
            if m and m.group(1) != '/dev/null':
                filename = m.group(1).split('/', 1)[-1]
            if line.startswith('+++ '):
                header = False
            continue
        if line.startswith('diff '):
            header = True
            continue
        # hunk header - save the line number
        m = re.match(r'@@ -\d+,\d+ \+(\d+),', line)
        if m:
            linenum = int(m.group(1))
            continue
        # hunk body - check for an added line with trailing whitespace
        m = re.match(r'\+.*\s$', line)
        if m:
            yield filename, linenum
        if line and line[0] in ' +':
            linenum += 1

if __name__ == '__main__':
    import os, sys
    
    added = 0
    for filename, linenum in trailing_whitespace(os.popen('hg export tip')):
        print >> sys.stderr, ('%s, line %d: trailing whitespace added' %
                              (filename, linenum))
        added += 1
    if added:
        # save the commit message so we don't need to retype it
        os.system('hg tip --template "{desc}" > .hg/commit.save')
        print >> sys.stderr, 'commit message saved to .hg/commit.save'
        sys.exit(1)

Выше версия гораздо более сложная, но и более полезная. Она анализирует унифицированный формат, чтобы увидеть, если добавились строки с конечными пробелами она печатает имя файла и номер строки, для каждого такого происшествия. Еще лучше, если изменение добавляет конечные пробелы, это ловушка сохраняет комментарии и печатает имя сохраненного файла перед выходом и говорит mercurial, откатить транзакцию, так что вы можете использовать опцию -l filename команды hg commit для повторного использования сохраненного сообщения фиксации, как только вы исправите проблемы.

$ cat .hg/hgrc
[hooks]
pretxncommit.whitespace = .hg/check_whitespace.py
$ echo 'a ' >> a
$ hg commit -A -m 'add new line with trailing whitespace'
a, line 2: trailing whitespace added
commit message saved to .hg/commit.save
transaction abort!
rollback completed
abort: pretxncommit.whitespace hook exited with status 1
$ sed -i 's, *$,,' a
$ hg commit -A -m 'trimmed trailing whitespace'
a, line 2: trailing whitespace added
commit message saved to .hg/commit.save
transaction abort!
rollback completed
abort: pretxncommit.whitespace hook exited with status 1

В качестве последнего отступления, к сведению в приведенном выше примере используется особенность редактора sed — редактирование на месте, чтобы избавиться от конечных пробелов в файле. Это краткое и достаточно полезное действие, и я буду ещё повторять его здесь (Использование perl тоже неплохая мера).

perl -pi -e 's,\s+$,,' filename

10.6. Встроенные ловушки

Mercurial поставляется с несколькими встроенными ловушками. Вы можете найти их в каталоге hgext дерева исходников Mercurial. Если вы используете бинарные пакеты Mercurial, ловушки будут находиться в подкаталоге hgext, каталога куда был установлен Mercurial.

10.6.1. acl — контроль доступа к частям репозитория

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

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

10.6.1.1. Конфигурация ловушки acl

Для того чтобы управлять входящими ревизиями, ловушка acl должна использоваться в качестве ловушки pretxnchangegroup. Это позволяет ей видеть, какие файлы были изменены в каждом входящей ревизии и отклонять группы ревизий, если они пытаются изменять «запрещенные» файлы. Пример:

[hooks]
pretxnchangegroup.acl = python:hgext.acl.hook

Расширение acl конфигурируется с помощью трех разделов.

Раздел acl имеет только одно поле, sources, в котором перечислены источники входящих ревизий, на которые ловушка обращает внимание. Вам обычно не нужно настраивать этот раздел.

  • serve: контролирует входящие ревизии, которые поступают из удаленного репозитория по протоколу http либо ssh. Это значение по умолчанию для sources, и, как правило только это значение вам и нужно для этого элемента конфигурации.

  • pull: контроль входящих ревизий, которые прибывают через вытягивание из локального репозитория.

  • push: контроль входящих ревизий, которые прибывают через отправку из локального репозитория.

  • bundle: Контроль входящих ревизий, которые прибывают из другого хранилища с помощью bundle-ов.

Раздел acl.allow контролирует пользователей, которым разрешено добавлять ревизии в репозиторий. Если этот раздел отсутствует, все пользователи, которые явно не запрещены будут разрешены. Если этот раздел присутствует, все пользователи, которые явно не разрешены будут запрещены (пустой раздел означает, что все пользователи не имеют доступа).

Раздел acl.deny определяет, какие пользователи не могут добавлять ревизии в репозиторий. Если этот раздел отсутствует или пуст, ни для одного нет запретов.

Синтаксис для разделов acl.allow и acl.deny одинаковы. Слева каждая записи glob-шаблон, который соответствует файлам или каталогам, по отношению к корню репозитория, справа, имя пользователя.

В следующем примере, пользователь docwriter может только добавить ревизии в подкаталоги каталога docs репозитория, а intern может вставлять изменения в любой файл или каталог, кроме source/sensitive.

[acl.allow]
docs/** = docwriter
[acl.deny]
source/sensitive/** = intern

10.6.1.2. Тестирование и поиск ошибок

Если вы хотите проверить ловушку acl, запустите его с включонным режимом отладки Mercurial. Поскольку вы, вероятно, будете запускать его на сервере, где это не удобно (или возможно только иногда) передайте опцию --debug, не забывайте, что вы можете разрешить отладку в файле ~/.hgrc:

[ui]
debug = true

С включенной отладкой ловушка acl будет печатать достаточно информации, чтобы вы выяснили, почему разрешается или запрещается отправка от определенных пользователей.

10.6.2. bugzilla — интеграция с Bugzilla

Расширение bugzilla добавляет комментарии к ошибке Bugzilla, когда находит ссылку на id бага в комментарии фиксации. Вы можете установить эту ловушку на общем сервере, так что каждый раз, удаленный пользователь передавая изменения на этот сервер, будет запускать ловушку.

Расширение добавляет комментарий к ошибке, которая выглядит следующим образом (вы можете настроить содержание комментария — смотрите ниже):

Changeset aad8b264143a, made by Joe User
	<joe.user@domain.com> in the frobnitz repository, refers
	to this bug. For complete details, see
	http://hg.domain.com/frobnitz?cmd=changeset;node=aad8b264143a
	Changeset description: Fix bug 10483 by guarding against some
	NULL pointers

Значение этой ловушки в том, что она автоматизирует процесс обновления ошибка в любое время когда создаётся ревизия относящаяся к нему. Если вы настроите ловушку должным образом, людям будет легко просмотреть ревизию, которая ссылается на данный баг, прямо из комментариев bugzilla.

Вы можете использовать код в этой книге в качестве отправной точки для некоторых более экзотических рецептов интеграции с Bugzilla. Вот несколько возможностей:

  • Требование, чтобы каждая ревизия помещаемая на сервер имела правильный id ошибки в комментарии фиксации. В этом случае, нужно настроить ловушку pretxncommit. Это позволило бы ловушке отклонять изменения, которые не содержат id ошибки.

  • Разрешить входящие наборы изменений и автоматически изменять состояние ошибки, также как и добавлять комментарии. Например, ловушка может распознавать строку «исправлена ошибка 31337», как индикатор того, что следует обновлять состояние ошибки 31337 на «требует проверки».

10.6.2.1. Конфигурация ловушки bugzilla

Вы должны настроить эту ловушку в ~/.hgrc сервера как ловушку incoming, например, следующим образом:

[hooks]
incoming.bugzilla = python:hgext.bugzilla.hook

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

Прежде чем начать, вы должны установить поддержку mysql для python на компьютеры, где вы будете устанавливаете ловушку. Если это не доступно в бинарном пакете для вашей системы, вы можете скачать его с [web:mysql-python].

Информация о конфигурации этой ловушке находится в разделе bugzilla вашего ~/.hgrc.

  • version: версия bugzilla, установленной на сервере. Схемы базы данных, которые использует bugzilla изменяются время от времени, так что ловушка должна знать, какие именно схемы использовать.

  • host: имя хоста MySQL-сервера, который хранит ваши данные Bugzilla. База данных должна быть настроена так, чтобы принимать соединения от серверов на которых настроена ловушка bugzilla.

  • user: имя пользователя, с которым нужно подключаться к серверу MySQL. База данных должна быть настроена так, чтобы этот пользователь имел возможность подключится с того компьютера, на котором настроена ловушка bugzilla. Этот пользователь должен иметь возможность читать и изменять таблицы Bugzilla. Значением по умолчанию для этого пункта является bugs — стандартное имя пользователя Bugzilla в базе данных MySQL.

  • password: пароль пользователя MySQL, настроенного выше. Он сохраняется в виде обычного текста, так что вы должны убедиться, что неавторизованные пользователи не могут читать ~/.hgrc файл, который хранит эту информацию.

  • db: имя базы данных bugzilla на сервере MySQL. Значение по умолчанию этого пункта — bugs, стандартное имя базу данных Bugzilla для MySQL.

  • notify: если вы хотите чтоб Bugzilla отправляла уведомление по электронной почте подписчикам после того, как ловушка добавила комментарий к ошибке, вам нужно чтобы ловушка выполнила команду, когда она обновит базу данных. Команда для запуска зависит от того, где вы установили bugzilla, но это, как правило, выглядит примерно так, если у вас есть bugzilla установлен в /var/www/html/bugzilla:

    cd /var/www/html/bugzilla &&
    	      ./processmail %s nobody@nowhere.com
  • Программа processmail Bugzilla получает ID ошибки (ловушка заменяет «%s» на ID ошибки) и адрес электронной почты. Также ожидается, чтоб иметь возможность писать в некоторые файлы в каталоге, в котором запускается. Если Bugzilla и эта ловушка установлены не на одном компьютере, вам нужно найти способ запустить processmail на сервере, где установлен Bugzilla.

10.6.2.2. Связывание имён тех кто фиксирует, с именами пользователей Bugzilla

По умолчанию, ловушка bugzilla пытается использовать адрес электронной почты коммиттера ревизии, как имя пользователя bugzilla, с которым обновляется ошибка. Если это не подходит к вашим потребностям, вы можете преобразовать mail-адрес коммиттера в имя пользователя Bugzilla используя раздел usermap.

Каждый элемент в разделе usermap содержит адрес электронной почты слева, и имя пользователя bugzilla справа.

[usermap]
jane.user@example.com = jane

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

# regular hgrc file refers to external usermap file
[bugzilla]
usermap = /home/hg/repos/userdata/bugzilla-usermap.conf

Тогда файл usermap, на который он ссылается может выглядеть следующим образом:

# bugzilla-usermap.conf - inside a hg repository
[usermap] stephanie@example.com = steph

10.6.2.3. Настройка текста, который будет добавлен в комментарий к ошибке

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

  • strip: число ведущих элементов пути к элементу от корня пути репозитория нужно убрать для построения url. Например, если репозитории на сервере, находится в /home/hg/repos, и у вас есть хранилище, которое находится в /home/hg/repos/app/tests, то установка strip в 4 даст путь app/tests. Ловушка делать этот путь, доступным при развёртывании шаблона, как webroot.

  • template: текст шаблона для использования. В дополнение к обычными связанными с ревизией переменными, в этом шаблоне можно использовать hgweb (значение поля конфигурации hgweb выше) и webroot (путь построенный с как описано выше).

Кроме того, вы можете добавить элемент baseurl в секцию web вашего ~/.hgrc. Ловушка bugzilla сделает его доступным при развёртывании имеющихся шаблонов в качестве основы строки для использования при построении url, который позволит пользователям просматривать из комментариев Bugzilla для просмотра ревизии. Например:

[web]
baseurl = http://hg.domain.com/

Вот примерный набор конфигурационной информации для ловушки bugzilla.

[bugzilla]
host = bugzilla.example.com
password = mypassword version = 2.16
# server-side repos live in /home/hg/repos, so strip 4 leading
# separators
strip = 4
hgweb = http://hg.example.com/
usermap = /home/hg/repos/notify/bugzilla.conf
template = Changeset {node|short}, made by {author} in the {webroot}
  repo, refers to this bug.\n
  For complete details, see
  {hgweb}{webroot}?cmd=changeset;node={node|short}\n
  Changeset description:\n
  \t{desc|tabindent}

10.6.2.4. Тестирование и поиск ошибок

Наиболее распространенные проблемы с настройкой ловушки bugzilla относятся к работе processmail сценария Bugzilla и преобразовании имен коммиттеров в имена пользователей.

Напомним, что в разделе Раздел 10.6.2.1, «Конфигурация ловушки bugzilla» выше, что пользователь, который работает с Mercurial на сервере тотже от кого будет выполнять сценарий processmail. Сценарий processmail иногда вызывает Bugzilla для записи файлов в каталоге конфигурации и файлов конфигурации Bugzilla, как правило, принадлежащих пользователю, от имени которого работает веб-сервер.

Вы можете заставить processmail запускаться от имени подходящего пользователя с помощью команды sudo. Вот пример записи в файле sudoers.

hg_user = (httpd_user)
NOPASSWD: /var/www/html/bugzilla/processmail-wrapper %s

Это позволяет пользователю hg_user запускать программe processmail-wrapper под пользователем httpd_user.

Косвенный вызов через сценарий обёртку необходим, потому что processmail ожидает, что будет запущен с текущим каталогом установленным туда куда вы установили Bugzilla; вы не можете определить, такого рода ограничение в файле sudoers. Содержание сценария обертки простое:

#!/bin/sh
cd `dirname $0` && ./processmail "$1" nobody@example.com

Не кажется важным, адрес электронной почты, который вы передаете processmail.

Если usermap не настроен правильно, пользователи увидят сообщение об ошибке от ловушки bugzilla, когда они передают изменения на сервер. Сообщение об ошибке будет выглядеть следующим образом:

cannot find bugzilla user id for john.q.public@example.com

Это означает, что адрес в коммиттера, john.q.public@example.com, не является правильным именем пользователя Bugzilla, и у него нет записи в usermap, который преобразует его в имя пользователя Bugzilla.

10.6.3. notify — отправка email оповещения

Хотя встроенный веб-сервер Mercurial предоставляет rss каналы изменений в каждом репозитории, многие люди предпочитают получать уведомления об изменениях по электронной почте. Ловушка notify позволяет посылать уведомления множеству адресов электронной почты, когда поступают ревизии, в которых заинтересованы абоненты.

Как и в ловушке bugzilla, ловушка notify управляется с помощью шаблонов, поэтому вы можете настроить содержание уведомлений, которые она посылает.

По умолчанию, ловушка notify включает в себя diff каждой ревизии, которые он посылает. Вы можете ограничить размер diff или отключить эту функцию полностью. Это полезно, позволяя абонентам просматривать изменения немедленно, а не нажатием ссылки в письме.

10.6.3.1. Настройка ловушки notify

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

[hooks]
# send one email per group of changes
changegroup.notify = python:hgext.notify.hook
# send one email per change
incoming.notify = python:hgext.notify.hook

Сведения о конфигурации этой ловушки находятся в секции notify файла ~/.hgrc.

  • test: По умолчанию эта ловушка не посылает электронную почту всем, вместо этого он выдает сообщение, которое было бы отправлено. Установить этот пункт в false, чтобы выключить отправку электронной почты. Причина того, что отправка электронной почты по умолчанию отключена, в том что нужно несколько попыток, чтобы настроить это расширение именно так, как вы хотите, и было бы дурным тоном спамить абонентов целым набором «неправильных» уведомлений при отладке конфигурации.

  • config: путь к конфигурационному файлу, который содержит информацию о подписке. Он храниться отдельно от основного ~/.hgrc так что вы можете сохранить его в собственном репозитории. Люди могут затем клонировать репозиторий, и обновлять подписки и отправлять изменения обратно на сервер.

  • strip: число ведущих символов разделителей пути в строке пути репозитория, которые обрезаются для определения пути к репозиторию абонента. Например, если репозитории на сервере, находятся в /home/hg/repos, а предупреждаем мы о репозитории с именем /home/hg/repos/shared/test, установка strip в 4 заставит notify обрезать путь до shared/test, и это значение будет сравниваться с подпиской абонентов.

  • template: текст шаблона который используется при отправке сообщений. Он определяет и содержимое заголовка сообщения и его тело.

  • maxdiff: Максимальное количество строк diff, которые добавляются к концу сообщения. Если размер diff больше, чем это значение, они будут обрезаны. По умолчанию, 300. Установите в 0, чтобы отправлять полный diff в сообщениях с уведомлением.

  • sources: список источников ревизий за которыми ведётся наблюдение. Это позволяет ограничить отправку уведомлений, например только на те ревизии, которые удаленные пользователи вставили в этот репозиторий через сервер. Смотрите раздел Раздел 10.7.3.1, «Источники изменений» для того чтоб узнать какие источники вы можете здесь указать.

Если вы установите пункт baseurl в секции web, вы сможете использовать его в шаблоне, он будет доступен как webroot.

Это пример конфигурации ловушки notify.

[notify]
# really send email
test = false
# subscriber data lives in the notify repo
config = /home/hg/repos/notify/notify.conf
# repos live in /home/hg/repos on server, so strip 4 "/" chars
strip = 4
template = X-Hg-Repo: {webroot}\n
  Subject: {webroot}: {desc|firstline|strip}\n
  From: {author}
  \n\n
  changeset {node|short} in {root}
  \n\ndetails:
  {baseurl}{webroot}?cmd=changeset;node={node|short}
  description: {desc|tabindent|strip}

[web]
baseurl =
http://hg.example.com/

Он выдаст сообщение, выглядящее следующим образом:

X-Hg-Repo: tests/slave
Subject: tests/slave: Handle error case when slave has no buffers
Date: Wed,  2 Aug 2006 15:25:46 -0700 (PDT)

changeset 3cba9bfe74b5 in /home/hg/repos/tests/slave

details:
http://hg.example.com/tests/slave?cmd=changeset;node=3cba9bfe74b5 

description: Handle error case when slave has no buffers

diffs (54 lines):
diff -r 9d95df7cf2ad -r 3cba9bfe74b5 include/tests.h
--- a/include/tests.h      Wed Aug 02 15:19:52 2006 -0700
+++ b/include/tests.h      Wed Aug 02 15:25:26 2006 -0700
@@ -212,6 +212,15 @@ static __inline__
void test_headers(void *h)
[...snip...]

10.6.3.2. Тестирование и поиск ошибок

Вы не должны забывать, что по умолчанию расширение notify не будут посылать никакие e-mail, до тех пор вы явно не сконфигурируете такое поведение, установив test в false. До тех пор пока вы это не сделаете, отсылаемое сообщение будет просто выводиться.

10.7. Информация для разработчиков ловушек

10.7.1. Выполнение внутрипроцессорых ловушек

Все внутрипроцеcсные ловушки вызываются с аргументами в следующей форме:

def myhook(ui, repo, **kwargs): pass

Здесь параметр ui это объект ui, параметр repo — объект localrepository. Имена и значения параметров **kwargs зависят от вызываемой ловушки и обладают общими чертами:

  • Если параметр называется node или parentN, он будет содержать шестнадцатеричный ID набора изменений. Пустая строка используется для указания «null» (исходного) набора изменений, вместо строки нулей.

  • Если параметр называется url, он содержит URL удаленного репозитория, если он может быть определен.

  • Содержащие булевые значения параметры представлены в виде обектов bool Python-а.

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

Если ловушка возвращает булевое значение «false», считается что вызов прошел успешно. Если возвращается «true» или генерируется исключение, считается что вызов завершился неудачей. Полезно думать о вызовах ловушек как «скажи мне, если ты потерпел неудачу».

Помните, что ID набора изменений передается в Python как шестнадцатеричная строка, а не как бинарный хеш, который использует API Mercurial. Для конвертации ее в бинарный вид используйте функцию bin.

10.7.2. Выполнение внешних ловушек

Внешние ловушки передаются командной оболочке пользователя, запустившего Mercurial. Доступны фичи командной оболочки, как, например, подстановка переменных и команды перенаправления. Ловушка запускается в корневой директории хранилища (в отличие от in-process ловушек, которые работают в той же директории из которой был запущен Mercurial).

Параметры ловушке передаются как переменные среды. Каждое имя переменной преобразуется в верхний регистр с префиксом «HG_». Например, если имя параметра «node», имя переменной среды, представляющее параметр, будет «HG_NODE».

Булевы параметры представляется в виде строки «1» для «истинно», «0» для «ложь». Если переменная окружения называется HG_NODE, HG_PARENT1 или HG_PARENT2, она содержит ID набора изменений в виде шестнадцатеричной строки. Для представления «null changeset ID» используется пустая строка вместо строки нулей. Если переменная окружения называется HG_URL, она будет содержать адрес удалённого хранилища, если его можно определить.

Если ловушка завершается с кодом возврата, равным нулю, то это успешное завершениие. Если она завершилась с ненулевым статусом, то «всё» плохо.

10.7.3. Как определить, откуда пришли изменения

Ловушку, которая срабатывает при перемещении набора изменений между локальным хранилищем и каким-либо другим можно настроить на нахождение информации «о той стороне». Mercurial знает как набор изменений передаётся, и , во многих случаях, куда и откуда они передаются.

10.7.3.1. Источники изменений

Mercurial сообщает ловушкам что, или откуда, используется для передачи ревизий между репозиториями. Это информация обеспечивается Mercurial-ом в параметра python с именем source, или переменную окружения с именем HG_SOURCE.

  • serve: ревизии передаются в или из удаленного репозитория по протоколу http или ssh.

  • pull: ревизии передаются через pull из этого репозитория в другой.

  • push: ревизии передаются через push из этого репозитория в другой.

  • bundle: ревизии передаются в или из комплекта.

10.7.3.2. Откуда пришли ревизии — URL удалённого репозитория

Когда это возможно, Mercurial сообщает ловушкам положение «той стороны», при действиях, которые передают ревизии между репозиториями. Это обеспечивается Mercurial в параметре python с именем url, или переменной окружения с именем HG_URL.

Эта информация не всегда известна. Если ловушка вызывается в репозитории, работа с которым ведется по http или ssh, Mercurial не может сказать где расположен удаленный репозиторий, но может знать клиента, который подключен к нему. В этом случае URL будет представлен в одной из следующих форм:

  • remote:ssh:ip-address — удаленный ssh клиент по указанному адресу.

  • remote:http:ip-address — удаленный http клиент по указанному адресу. Если клиент использует SSL, то адрес будет в виде: https:ip-address.

  • Пустой адрес — информация о удаленном клиенте недоступна.

10.8. Ловушки. Описание.

10.8.1. changegroup — после внесения внешних ревизий

Эта ловушка запускается после того как группа уже существующих ревизий добавляется в репозиторий, например, через hg pull или hg unbundle. Эта ловушка выполняется один раз за операцию, добавления одной или более ревизий. В отличие от ловушки incoming, которая выполняется один раз на каждую ревизию, независимо от того, прибыли ли ревизии в группе.

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

Параметры ловушки:

Смотрите также: incoming (раздел Раздел 10.8.3, «incoming — после добавления одной удаленной ревизии»), prechangegroup (раздел Раздел 10.8.5, «prechangegroup — до начала добавления ревизий удалённого репозитория»), pretxnchangegroup (раздел Раздел 10.8.9, «pretxnchangegroup — перед завершением добавления ревизий удалённого репозитория»)

10.8.2. commit—после создания новой ревизии

Эта ловушка запускается после того, как создан новая ревизия

Параметры ловушки:

  • node — ID ревизии. ID добавляемой ревизии.

  • parent1: ID ревизии. ID ревизии первого родителя добавляемой ревизии.

  • parent2: ID ревизии. ID ревизии второго родителя добавляемой ревизии.

Смотрите также: precommit (раздел Раздел 10.8.6, «precommit — перед фиксацией ревизии»), pretxncommit (раздел Раздел 10.8.10, «pretxncommit — перед завершением фиксации новой ревизии»)

10.8.3. incoming — после добавления одной удаленной ревизии

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

Вы можете использовать эту ловушку для тех же целей что и ловушку changegroup (см. раздел Раздел 10.8.1, «changegroup — после внесения внешних ревизий»); просто иногда более удобно выполнить один раз ловушку для группы ревизий, в то время как в другом случае удобнее выполнять ловушку один раз для ревизии.

Параметры этого хука:

Смотрите также: changegroup (раздел Раздел 10.8.1, «changegroup — после внесения внешних ревизий») prechangegroup (раздел Раздел 10.8.5, «prechangegroup — до начала добавления ревизий удалённого репозитория»), pretxnchangegroup (раздел Раздел 10.8.9, «pretxnchangegroup — перед завершением добавления ревизий удалённого репозитория»)

10.8.4. outgoing — после распространения ревизии

Эта ловушка запускается после того как группа ревизий будет распространена за пределы этого репозитория, например при использовании команд hg push или hg bundle.

Одно из применений данного хука — это уведомление администраторов что изменения были вытянуты.

Параметры этого хука:

  • node: ID ревизии. ID первой посланной ревизии в группе ревизий.

  • source: строка. Источник операции (см. раздел Раздел 10.7.3.1, «Источники изменений»). Если удаленный клиент забирает изменения из этого репозитория, source будет равен serve. Если клиент, который забирает изменения из этого репозитория локальный, source будет равен bundle, pull, или push, в зависимости от операции выполняемой клиентом.

  • url: URL. Местанахождение удаленного репозитория, если оно известно. Смотрите раздел Раздел 10.7.3.2, «Откуда пришли ревизии — URL удалённого репозитория» для деталей.

Смотрите также: preoutgoing (раздел Раздел 10.8.7, «preoutgoing — до начала передачи ревизий в другие репозитории»)

10.8.5. prechangegroup — до начала добавления ревизий удалённого репозитория

Эта контролирующая ловушка запускается до того как Mercurial начнет добавлять группы ревизий из другого репозитория.

Эта ловушка не содержит информации о добавляемой ревизии, потому что она запускается до разрешения передачи этой ревизии. Если эта ловушка возвращает ошибку, ревизия не передаётся.

Эту ловушку можно использовать для запрета внешним пользователям вносить изменения в репозиторий. Например так можно «заморозить» ветку на сервере, на время или постоянно, от пользователей в то время как администратор будет модифицировать репозиторий.

Параметры этого хука:

Смотрите также: changegroup (раздел Раздел 10.8.1, «changegroup — после внесения внешних ревизий»), incoming (раздел Раздел 10.8.3, «incoming — после добавления одной удаленной ревизии»), pretxnchangegroup (раздел Раздел 10.8.9, «pretxnchangegroup — перед завершением добавления ревизий удалённого репозитория»)

10.8.6. precommit — перед фиксацией ревизии

Эта ловушка запускается до начала фиксации Mercurial'ом новой ревизии. Выполняется до того, как Mercurial сформирует какие-либо метаданные для передачи, такие как файлы, сообщения, или даты.

Одно из использований этой ловушки — запрет возможности фиксировать новые ревизии, позволяя в то же время входящие ревизии. Другой вариант использования состоит в том, чтобы запустить сборку или тест, и разрешить фиксацию ревизии только в том случае, если сборка или тесты прошли успешно.

Параметры этого хука:

  • parent1: ID ревизии. ID ревизии первого родителя рабочей директории.

  • parent2: ID ревизии. ID ревизии второго родителя рабочей директории.

Если фиксация завершится, то родители рабочей директории станут родителями новой ревизии.

Смотрите также: commit (раздел Раздел 10.8.2, «commit—после создания новой ревизии»), pretxncommit (раздел Раздел 10.8.10, «pretxncommit — перед завершением фиксации новой ревизии»)

10.8.7. preoutgoing — до начала передачи ревизий в другие репозитории

Этот ловушка вызывается до того как Mercurial узнает идентификатор ревизии, который будет передаваться.

Один из вариантов использования для этой ловушки — предотвращение передачи изменений в другой репозиторий.

Параметры ловушки:

Смотрите также: outgoing (раздел Раздел 10.8.4, «outgoing — после распространения ревизии»)

10.8.8. pretag — перед тегированием ревизии

Этот контролирующая ловушка запускается до создания тега. Если ловушка выполняется успешно, создание тега продолжается. Если ловушка не выполняется удачно, тег не создается.

Параметры ловушки:

  • local: Логическая. Определяет является ли новый тег локальным для экземпляра репозитория (т.е. сохранен в .hg/localtags) или управляется Mercurial (сохранен в .hgtags)

  • node: ID ревизии. ID ревизии, которая была тегирована.

  • tag: Строка. Имя тега, который был создан.

Если тег должен быть создан под управлением ревизиями, ловушки precommit и pretxncommit (в разделе Раздел 10.8.2, «commit—после создания новой ревизии» и в разделе Раздел 10.8.10, «pretxncommit — перед завершением фиксации новой ревизии»), также будут запущены.

Смотрите также: tag (раздел Раздел 10.8.12, «tag — после создания метки ревизии»)

10.8.9. pretxnchangegroup — перед завершением добавления ревизий удалённого репозитория

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

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

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

Эту ловушку можно использовать для автоматической проверки ревизий. Если ловушка не удалось, все ревизии будут «отклонены» и транзакция будет отклонена.

Параметры ловушки:

Смотрите также: changegroup (раздел Раздел 10.8.1, «changegroup — после внесения внешних ревизий»), incoming (раздел Раздел 10.8.3, «incoming — после добавления одной удаленной ревизии»), prechangegroup (раздел Раздел 10.8.5, «prechangegroup — до начала добавления ревизий удалённого репозитория»)

10.8.10. pretxncommit — перед завершением фиксации новой ревизии

Это управляющий хук запускается перед транзакцией, которая сделает новую фиксацию завершённой. Если хук отработал успешно, транзакция завершается и ревизия принимается в репозиторий. Если хук вернул ошибку — транзакция откатывается и принятые данные удаляются.

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

Пока выполняется этот хук, другие процессы Mercurial, обращающиеся к этому хранилищу, видят временное состояние хранилища как постоянное. Это может привести к ошибкам, если вы не предусмотрели мер предотвращения этого.

Параметры ловушки:

  • node: ID ревизии. ID новой фиксируемой ревизии.

  • parent1: ID ревизии. ID ревизии первого родителя добавляемой ревизии.

  • parent2: ID ревизии. ID ревизии второго родителя добавляемой ревизии.

Смотрите также: precommit (раздел Раздел 10.8.6, «precommit — перед фиксацией ревизии»)

10.8.11. preupdate — перед обновлением или слиянием рабочей директории.

Эта управляющая ловушка, запускается перед началом обновления/слияния рабочей директории. Запускается только если внутренняя pre-update проверка Mercurial'а определила, что обновление/слияние возможны. Если ловушка возвращает успешный код возврата, обновление/слияние продолжается; иначе даже не начинается.

Параметры ловушки:

  • parent1: ID ревизии. ID ревизии родителя, которой обновляется рабочая директория. Если производится слияние рабочей директории это действие не меняет этого родителя.

  • parent2: ID ревизии. Устанавливается только когда производится слияние рабочей директории. ID ревизии, с которой производится слияние рабочей копии.

Смотрите также: update (раздел Раздел 10.8.13, «update — после обновления или слияния рабочей директории»)

10.8.12. tag — после создания метки ревизии

Ловушка выполняется после создания метки ревизии.

Параметры ловушки:

  • local: Логическая. Определяет является ли новый тег локальным для экземпляра репозитория (т.е. сохранен в .hg/localtags) или управляется Mercurial (сохранен в .hgtags)

  • node: ID ревизии. ID ревизии, которая была тегирована.

  • tag: Строка. Имя тега, который был создан.

Если созданная метка попадает под контроль версий, то перед этим вызывается ловушка commit (раздел Раздел 10.8.2, «commit—после создания новой ревизии»)

Смотрите также: pretag (раздел Раздел 10.8.8, «pretag — перед тегированием ревизии»)

10.8.13. update — после обновления или слияния рабочей директории

Ловушка запускается после завершения обновления или объединения изменений. Поскольку слияние может не сработать (если внешняя команда hgmerge не выполнилась на конфликтных файлах), то эта ловушка сообщит — успешно ли обновление/слияние.

  • error: Логическая. Показывает, успешно ли прошло обновление или слияние.

  • parent1: ID ревизии. ID ревизии родителя который обновляется этой рабочей копией. Если производится слияние рабочей директории это действие не меняет этого родителя.

  • parent2: ID ревизии. Устанавливается только когда производится слияние рабочей директории. ID ревизии, с которой производится слияние рабочей копии.

Смотрите также: preupdate (раздел Раздел 10.8.11, «preupdate — перед обновлением или слиянием рабочей директории.»).