Содержание
changegroup
— после внесения внешних ревизийcommit
—после создания новой ревизииincoming
— после добавления одной удаленной ревизииoutgoing
— после распространения ревизииprechangegroup
— до начала добавления ревизий удалённого репозиторияprecommit
— перед фиксацией ревизииpreoutgoing
— до начала передачи ревизий в другие репозиторииpretag
— перед тегированием ревизииpretxnchangegroup
— перед завершением добавления ревизий удалённого репозиторияpretxncommit
— перед завершением фиксации новой ревизииpreupdate
— перед обновлением или слиянием рабочей директории.tag
— после создания метки ревизииupdate
— после обновления или слияния рабочей директорииMercurial предлагает мощный механизм, позволяющий автоматизировать действия при возникновении в репозитории каких-либо событий. В некоторых случаях Вы даже можете управлять реакцией Mercurial на эти события.
Mercurial использует для этих действий название ловушка (hook). Ловушки в некоторых системах управления версиями называются «триггерами», но оба этих названия относятся к одной и той же идее.
Это краткий список ловушек, поддерживаемых Mercurial. Мы подробно опишем каждую из ловушек позднее, в разделе Раздел 10.7, «Информация для разработчиков ловушек».
Каждая из ловушек, описанная как «Контролирующая» имеет возможность определить, может ли быть продолжено действие. Если ловушка выполнилась успешно, то действие может продолжаться, если нет, действие либо не разрешается либо отменяется, в зависимости от ловушки.
changegroup
: Выполняется после группы ревизий, внесённых в хранилище извне.
commit
: Выполняется после создания новой ревизии в локальном хранилище.
incoming
: Однократно выполняется для каждого нового набора ревизии, внесённой в репозиторий извне. Примечание: отличается от changegroup
тем, что выполняется однократно перед внесением группы ревизий.
outgoing
: Выполняется после передачи группы ревизий из этого репозитория.
prechangegroup
: Выполняемся перед началом приёма группы ревизии в репозиторий.
preoutgoing
: Управляющая. Выполняется перед началом передачи группы ревизий из этого репозитория.
pretxnchangegroup
: Управляющая. Выполняется после группы ревизий, принятых в локальный репозиторий из других, но до окончательной обработки транзакции в репозитории, которая сделает изменения постоянными.
pretxncommit
: Управляющая. Выполняется после создания нового набора изменений в локальном хранилище, но перед их фиксацией.
preupdate
: Управляющая. Выполняется перед началом обновления или слияния рабочей директории.
update
: Выполняется после завершения обновления или слияния рабочей директории.
При запуске Вами команд Mercurial в хранилище и команд, вызывающих выполнение ловушек, эти ловушки выполняются на Вашей системе, в Вашем аккаунте и с Вашим уровнем доступа. Ловушки частично состоят из исполняемого кода, так что относитесь к ним с достаточным подозрением. Не устанавливайте ловушку, если не знаете Кто и Зачем её написал и Что она делает.
В некоторых случаях Вы можете столкнуться с ловушками, которые Вы не устанавливали себе. Если вы работаете на незнакомой системе, Mercurial может выполнять ловушки, определённые в системном глобальном ~/.hgrc
файле.
Если вы работаете с репозиторием, принадлежащем другому пользователю, Mercurial может запускать ловушки, определённые в пользовательском репозитории, но он будет работать от «Вас». Например, если Вы выполняете hg pull из этого репозитория, а его .hg/hgrc
определяет локальные outgoing
ловушки, то ловушка будет работать под вашей учетной записью пользователя, даже если вы не владелец репозитория.
Для просмотра ловушек, определённых в репозитории, используйте команду hg showconfig hooks. Если Вы работаете в одном репозитории, но общаетесь с другим, которыми не владеете (например, используете hg pull или hg incoming), запомните что это ловушки другого хранилища, не Ваши, и Вы должны их проверять.
В Mercurial ловушки не попадают под контроль ревизий и не распространяются, когда Вы клонируете репозиторий, или забираете изменения из репозитория. Причина этого проста: ловушка это произвольный кусок исполняевого кода. Она работает от Вашей учётной записи, с Вашим уровнем привелегий, на Вашей машине.
В любой распределенной системе контроля версий было бы крайне безрассудно реализовывать версионноконтролируемые ловушки, так как это даёт легкий способ компроментации аккаунтов пользователей системы управления версиями.
Mercurial не распространяет ловушки, и, при работе с другими людьми над совместным проектом, Вы не должны полагать, что другие используют те же ловушки Mercurial, что и Вы, или что они их правильно настроили. Вы должны документировать ловушки, если ожидаете их использование другими.
В корпоративной интрасети это несколько легче контролировать, так как Вы можете, например, создать «стандартную» установку Mercurial на файловой системе NFS и использовать общесистемный ~/.hgrc
файл для определения ловушек для всех пользователей. Тем не менее, здесь тоже есть ограничения; см. ниже.
Mercurial позволяет изменить ловушку, переопределив её. Вы можете отключить ловушку, установив значение равным пустой строке, или по своему желанию изменить её поведение.
Вы должны понимать при распространении общесистемного или общесайтового ~/.hgrc
файла, определяющего какие-либо ловушки, что пользователи могут отключать или переопределять эти ловушки.
Иногда Вам может понадобится соблюдение политики, и Вы не хотите, чтобы другие могли её обойти. Например, требование, что каждое изменение должно проходить строгий набор тестов. Определение этого требования с помощью ловушки в общесайтовом ~/.hgrc
не будет работать для удаленных пользователей с ноутбуками, и, конечно, локальные пользователи также могут её обойти, переопределив ловушку.
Вместо этого, Вы можете настроить политику использования Mercurial так, чтобы люди распространяли изменения через хорошо известный «канонический» сервер, который защищён и должным образом настроен.
Один из способов осуществления этого — сочетание социальной инженерии и технологии. Настройте ограниченный доступ к учетной записи: пользователи могут отправлять изменения по сети в репозиторий этой учетной записи, но не могут входить в аккаунт и запускать команды оболочки. В этом случае пользователи смогут отправлять изменения, содержащие любое любимое ими старьё.
Когда кто-то отправляет изменения на сервер, с которого все их забирают, то сервер проверит ревизию, прежде чем она будет принята как постоянная, и отвергнет его, если ревизия не пройдёт испытаний. Если человек только забирает изменения с этого фильтрующего сервера, то у него будет уверенность, что все им забираемые изменения были автоматически проверены.
Писать ловушки 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
в примере).
Довольно часто вы хотелось бы задать более чем одну ловушку для определенного рода событий, как показано ниже.
$
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, «Управление возможностью выполнения действия» для примера).
В наших предыдущих примерах мы использовали ловушку 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 бага. Если он есть, фиксация завершается. Если нет, то происходит откат.
Когда вы пишете ловушку, то может оказаться полезным для запускать Mercurial или с опцией -v
, или параметром конфигурации verbose
со значением «true». Когда вы это делаете, Mercurial выведет сообщение перед вызовом каждой ловушки.
Вы можете написать ловушку как обычную программу, обычно скрипт на языке shell, или, как функции Python, которая выполняется в рамках процесса Mercurial.
Написание ловушки, как внешней программы имеет то преимущество, что не требует знаний о внутреннем строении Mercurial. Вы можете вызвать нормальную команду Mercurial для получения любой дополнительной информации. Недостаток в том, что внешние ловушки медленнее, чем ловушки внутри процесса.
Ловушка в процессе выполнения Python имеет полный доступ к Mercurial API, и не «создаёт» другой процесс, так что по своей сути быстрее, чем внешняя ловушка. Кроме того, легче получить больше информации, которая требуется ловушке с помощью API, чем выполнив команды Mercurial.
Если вы знакомы с Python, или требуются ловушки с высокой производительностью, использование ловушек в Python может быть хорошим выбором. Однако, если у вас есть простая ловушка и не нужно заботиться о производительности (вероятно, большинство ловушек), скрипт, это прекрасно.
Mercurial вызывает каждую ловушку с набором четких параметров. В python, параметр передается в качестве аргументов функции ловушки. Для внешней программы, параметры передаются как переменные среды.
Написана ли ваша ловушка в python или скриптом, конкретные имена и значения параметров будут одинаковы. Логический параметр будет представлен как логическое значение в python, и как число 1 (для «true») или 0 (для «false»), в случае переменных среды для внешних ловушек. Если параметр ловушки называется foo
, имя аргумента ловушки в python будет также называться foo
, в то время как переменная среды для внешних ловушек будет называться HG_FOO
.
Успешно выполнившаяся ловушка, должна выйти с кодом возврата 0, если она внешняя, или вернуть логическое «false», если внутрипроцессная. Отказ обозначается ненулевым кодом возврата из внешних ловушки, или внутри процесса ловушка возвращает логическое «true». Если в процессе выполнения ловушка генерирует исключение, ловушка считается выполнившейся неудачно.
Для контролирующей действие ловушки 0/false означает «разрешить», не-ноль/true/исключение означает «запретить».
При определении внешней ловушки в вашем ~/.hgrc
и ловушка запускаются, её переменные передаются вашей оболочке, которая интерпретирует её. Это означает, что вы можете использовать обычные конструкции shell в теле ловушки.
Исполняемая ловушка всегда выполняется с текущей директорией установленой в корневую директорию репозитория.
Каждый параметр ловушки передается в качестве переменной окружения, имя в верхнем регистре с префиксом «HG_
».
За исключением параметров ловушек, Mercurial не устанавливает и не изменяет переменные окружения при запуске ловушки. Это полезно помнить, если вы пишете ловушку на веб-сервере, который может быть запущен под целым рядом различных пользователей с различными наборами переменных окружения. В многопользовательской среде, вы не должны полагаться на переменные окружения, которые установлены в значения вашей среды, при тестировании ловушки.
Cинтаксис ~/.hgrc
для определения в внутренних ловушек несколько иной, чем для внешних ловушек. Значение ловушки должно начинаться с текста «python:
», и продолжаться полностью определённым именем вызываемого объекта для использования в качестве значения ловушки.
Модуль, в котором находится ловушка автоматически импортируются при выполнении ловушки. До тех пор пока у вас есть имя модуля и правильный PYTHONPATH
, это должно «просто работать».
Следующий ~/.hgrc
фрагмент иллюстрирует синтаксис и смысл понятий, которые мы только что описали.
[hooks] commit.example = python:mymodule.submodule.myhook
Когда Mercurial запускает ловушку commit.example
, он импортирует mymodule.submodule
, ищет объект с именем myhook
, и вызывает его.
Простейших внутрипроцессный хук ничего не делает, но иллюстрирует основную формат api хуков:
def myhook(ui, repo, **kwargs): pass
Первый аргумент ловушки в python всегда ui
объекта. Второй представляет собой репозиторий объектов, используемый в данный момент, это всегда localrepository
. После этих двух аргументов идут другие аргументы. Какие аргументы будут переданы зависит от ловушки, но ловушка может игнорировать аргументы она не заботится о помещении их в аргументы словари такие как **kwargs
выше.
Трудно представить себе полезное сообщение при фиксации слишком коротким. Простая ловушка 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'
Интересным эффект при использовании связанных с 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
Mercurial поставляется с несколькими встроенными ловушками. Вы можете найти их в каталоге hgext
дерева исходников Mercurial. Если вы используете бинарные пакеты Mercurial, ловушки будут находиться в подкаталоге hgext
, каталога куда был установлен Mercurial.
Расширение 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
Если вы хотите проверить ловушку acl
, запустите его с включонным режимом отладки Mercurial. Поскольку вы, вероятно, будете запускать его на сервере, где это не удобно (или возможно только иногда) передайте опцию --debug
, не забывайте, что вы можете разрешить отладку в файле ~/.hgrc
:
[ui] debug = true
С включенной отладкой ловушка acl
будет печатать достаточно информации, чтобы вы выяснили, почему разрешается или запрещается отправка от определенных пользователей.
Расширение 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 на «требует проверки».
Вы должны настроить эту ловушку в ~/.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.
По умолчанию, ловушка 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
Вы можете настроить текст, который добавляет эта ловушка в качестве комментария, вы укажите его в виде шаблона 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}
Наиболее распространенные проблемы с настройкой ловушки 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.
Хотя встроенный веб-сервер Mercurial предоставляет rss каналы изменений в каждом репозитории, многие люди предпочитают получать уведомления об изменениях по электронной почте. Ловушка notify
позволяет посылать уведомления множеству адресов электронной почты, когда поступают ревизии, в которых заинтересованы абоненты.
Как и в ловушке bugzilla
, ловушка notify
управляется с помощью шаблонов, поэтому вы можете настроить содержание уведомлений, которые она посылает.
По умолчанию, ловушка notify
включает в себя diff каждой ревизии, которые он посылает. Вы можете ограничить размер diff или отключить эту функцию полностью. Это полезно, позволяя абонентам просматривать изменения немедленно, а не нажатием ссылки в письме.
Вы можете настроить ловушку 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...]
Все внутрипроце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
.
Внешние ловушки передаются командной оболочке пользователя, запустившего Mercurial. Доступны фичи командной оболочки, как, например, подстановка переменных и команды перенаправления. Ловушка запускается в корневой директории хранилища (в отличие от in-process ловушек, которые работают в той же директории из которой был запущен Mercurial).
Параметры ловушке передаются как переменные среды. Каждое имя переменной преобразуется в верхний регистр с префиксом «HG_
». Например, если имя параметра «node
», имя переменной среды, представляющее параметр, будет «HG_NODE
».
Булевы параметры представляется в виде строки «1
» для «истинно», «0
» для «ложь». Если переменная окружения называется HG_NODE
, HG_PARENT1
или HG_PARENT2
, она содержит ID набора изменений в виде шестнадцатеричной строки. Для представления «null changeset ID» используется пустая строка вместо строки нулей. Если переменная окружения называется HG_URL
, она будет содержать адрес удалённого хранилища, если его можно определить.
Если ловушка завершается с кодом возврата, равным нулю, то это успешное завершениие. Если она завершилась с ненулевым статусом, то «всё» плохо.
Ловушку, которая срабатывает при перемещении набора изменений между локальным хранилищем и каким-либо другим можно настроить на нахождение информации «о той стороне». Mercurial знает как набор изменений передаётся, и , во многих случаях, куда и откуда они передаются.
Mercurial сообщает ловушкам что, или откуда, используется для передачи ревизий между репозиториями. Это информация обеспечивается Mercurial-ом в параметра python с именем source
, или переменную окружения с именем HG_SOURCE
.
Когда это возможно, Mercurial сообщает ловушкам положение «той стороны», при действиях, которые передают ревизии между репозиториями. Это обеспечивается Mercurial в параметре python с именем url
, или переменной окружения с именем HG_URL
.
Эта информация не всегда известна. Если ловушка вызывается в репозитории, работа с которым ведется по http или ssh, Mercurial не может сказать где расположен удаленный репозиторий, но может знать клиента, который подключен к нему. В этом случае URL будет представлен в одной из следующих форм:
Эта ловушка запускается после того как группа уже существующих ревизий добавляется в репозиторий, например, через hg pull или hg unbundle. Эта ловушка выполняется один раз за операцию, добавления одной или более ревизий. В отличие от ловушки incoming
, которая выполняется один раз на каждую ревизию, независимо от того, прибыли ли ревизии в группе.
Возможное применение для этой ловушки включать автоматические сборку или тесты для добавленных ревизий, обновление базы данных багов, или уведомлять подписчиков о том, что в репозиторий содержит новые изменения.
node
— ID ревизии. ID первой ревизии в добавляемой группе ревизий. Все ревизии между этой и tip
, включительно, добавляются отдельными командами hg pull, hg push или hg unbundle.
source
— Строка. Источник этих изменений. Смотрите раздел Раздел 10.7.3.1, «Источники изменений» для деталей.
url
— URL. Местанахождение удаленного репозитория, если оно известно. Смотрите раздел Раздел 10.7.3.2, «Откуда пришли ревизии — URL удалённого репозитория» для деталей.
Смотрите также: incoming
(раздел Раздел 10.8.3, «incoming
— после добавления одной удаленной ревизии»), prechangegroup
(раздел Раздел 10.8.5, «prechangegroup
— до начала добавления ревизий удалённого репозитория»), pretxnchangegroup
(раздел Раздел 10.8.9, «pretxnchangegroup
— перед завершением добавления ревизий удалённого репозитория»)
Эта ловушка запускается после того, как создан новая ревизия
Смотрите также: precommit
(раздел Раздел 10.8.6, «precommit
— перед фиксацией ревизии»), pretxncommit
(раздел Раздел 10.8.10, «pretxncommit
— перед завершением фиксации новой ревизии»)
Эта ловушка запускается после добавления в репозиторий ранее существующей ревизии, например, с помощью hg push. Если группа ревизий добавляется одной операцией, то эта ловушка вызывается для каждой добавленной ревизии.
Вы можете использовать эту ловушку для тех же целей что и ловушку changegroup
(см. раздел Раздел 10.8.1, «changegroup
— после внесения внешних ревизий»); просто иногда более удобно выполнить один раз ловушку для группы ревизий, в то время как в другом случае удобнее выполнять ловушку один раз для ревизии.
source
: строка. Источник ревизий. Смотрите раздел Раздел 10.7.3.1, «Источники изменений» для деталей.
url
: URL. Местанахождение удаленного репозитория, если оно известно. Смотрите раздел Раздел 10.7.3.2, «Откуда пришли ревизии — URL удалённого репозитория» для деталей.
Смотрите также: changegroup
(раздел Раздел 10.8.1, «changegroup
— после внесения внешних ревизий») prechangegroup
(раздел Раздел 10.8.5, «prechangegroup
— до начала добавления ревизий удалённого репозитория»), pretxnchangegroup
(раздел Раздел 10.8.9, «pretxnchangegroup
— перед завершением добавления ревизий удалённого репозитория»)
Эта ловушка запускается после того как группа ревизий будет распространена за пределы этого репозитория, например при использовании команд 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
— до начала передачи ревизий в другие репозитории»)
Эта контролирующая ловушка запускается до того как Mercurial начнет добавлять группы ревизий из другого репозитория.
Эта ловушка не содержит информации о добавляемой ревизии, потому что она запускается до разрешения передачи этой ревизии. Если эта ловушка возвращает ошибку, ревизия не передаётся.
Эту ловушку можно использовать для запрета внешним пользователям вносить изменения в репозиторий. Например так можно «заморозить» ветку на сервере, на время или постоянно, от пользователей в то время как администратор будет модифицировать репозиторий.
source
: строка. Источник ревизий. Смотрите раздел Раздел 10.7.3.1, «Источники изменений» для подробностей.
url
: URL. Местанахождение удаленного репозитория, если оно известно. Смотрите раздел Раздел 10.7.3.2, «Откуда пришли ревизии — URL удалённого репозитория» для деталей.
Смотрите также: changegroup
(раздел Раздел 10.8.1, «changegroup
— после внесения внешних ревизий»), incoming
(раздел Раздел 10.8.3, «incoming
— после добавления одной удаленной ревизии»), pretxnchangegroup
(раздел Раздел 10.8.9, «pretxnchangegroup
— перед завершением добавления ревизий удалённого репозитория»)
Эта ловушка запускается до начала фиксации Mercurial'ом новой ревизии. Выполняется до того, как Mercurial сформирует какие-либо метаданные для передачи, такие как файлы, сообщения, или даты.
Одно из использований этой ловушки — запрет возможности фиксировать новые ревизии, позволяя в то же время входящие ревизии. Другой вариант использования состоит в том, чтобы запустить сборку или тест, и разрешить фиксацию ревизии только в том случае, если сборка или тесты прошли успешно.
Если фиксация завершится, то родители рабочей директории станут родителями новой ревизии.
Смотрите также: commit
(раздел Раздел 10.8.2, «commit
—после создания новой ревизии»), pretxncommit
(раздел Раздел 10.8.10, «pretxncommit
— перед завершением фиксации новой ревизии»)
Этот ловушка вызывается до того как Mercurial узнает идентификатор ревизии, который будет передаваться.
Один из вариантов использования для этой ловушки — предотвращение передачи изменений в другой репозиторий.
source
: Строка. Источник операции с помощью которой пытаются получить данные из этого хранилища (см. раздел Раздел 10.7.3.1, «Источники изменений»). Смотрите документацию на параметр source
ловушки outgoing
, в разделе Раздел 10.8.4, «outgoing
— после распространения ревизии», для информации о возможных значений этого параметра.
url
: URL. Местонахождение удаленного хранилища, если оно известно. См. раздел Раздел 10.7.3.2, «Откуда пришли ревизии — URL удалённого репозитория» для получения дополнительной информации.
Смотрите также: outgoing
(раздел Раздел 10.8.4, «outgoing
— после распространения ревизии»)
Этот контролирующая ловушка запускается до создания тега. Если ловушка выполняется успешно, создание тега продолжается. Если ловушка не выполняется удачно, тег не создается.
Если тег должен быть создан под управлением ревизиями, ловушки precommit
и pretxncommit
(в разделе Раздел 10.8.2, «commit
—после создания новой ревизии» и в разделе Раздел 10.8.10, «pretxncommit
— перед завершением фиксации новой ревизии»), также будут запущены.
Смотрите также: tag
(раздел Раздел 10.8.12, «tag
— после создания метки ревизии»)
Этот контрольная ловушка запускается перед завершением транзакции, которая управляет добавлением группы новых ревизий из другого репозитория. Если ловушка выполняется успешно, транзакция завершается, и все ревизии становятся постоянными в этом репозитории. Если ловушка срывается, транзакция откатывается, а данные ревизий стираются.
Эта ловушка можете получить доступ к метаданным, связанными с почти добавленными ревизиями, но она не должна ничего делать с этими данными. Она также не должна изменять рабочий каталог.
Когда запускается эта ловушка другие процессы Mercurial, имеющие доступ к этому репозиторию, они будут иметь возможность увидеть почти добавленные ревизии, как будто они постоянные. Это может привести к гонкам, если не принять меры,чтобы их избежать.
Эту ловушку можно использовать для автоматической проверки ревизий. Если ловушка не удалось, все ревизии будут «отклонены» и транзакция будет отклонена.
node
: ID ревизии. ID первой ревизии в добавляемой группе ревизий. Все ревизии между этой и tip
, включительно, добавляются отдельными командами hg pull, hg push или hg unbundle.
source
: Строка. Источник этих изменений. Смотрите раздел Раздел 10.7.3.1, «Источники изменений» для деталей.
url
: URL. Местанахождение удаленного репозитория, если оно известно. Смотрите раздел Раздел 10.7.3.2, «Откуда пришли ревизии — URL удалённого репозитория» для деталей.
Смотрите также: changegroup
(раздел Раздел 10.8.1, «changegroup
— после внесения внешних ревизий»), incoming
(раздел Раздел 10.8.3, «incoming
— после добавления одной удаленной ревизии»), prechangegroup
(раздел Раздел 10.8.5, «prechangegroup
— до начала добавления ревизий удалённого репозитория»)
Это управляющий хук запускается перед транзакцией, которая сделает новую фиксацию завершённой. Если хук отработал успешно, транзакция завершается и ревизия принимается в репозиторий. Если хук вернул ошибку — транзакция откатывается и принятые данные удаляются.
Этот хук может получить доступ к метаданным, связанным с почти новой ревизией, но он не должен ничего делать с этими постоянными данными. Он также не должн изменять рабочую директорию.
Пока выполняется этот хук, другие процессы Mercurial, обращающиеся к этому хранилищу, видят временное состояние хранилища как постоянное. Это может привести к ошибкам, если вы не предусмотрели мер предотвращения этого.
Смотрите также: precommit
(раздел Раздел 10.8.6, «precommit
— перед фиксацией ревизии»)
Эта управляющая ловушка, запускается перед началом обновления/слияния рабочей директории. Запускается только если внутренняя pre-update проверка Mercurial'а определила, что обновление/слияние возможны. Если ловушка возвращает успешный код возврата, обновление/слияние продолжается; иначе даже не начинается.
parent1
: ID ревизии. ID ревизии родителя, которой обновляется рабочая директория. Если производится слияние рабочей директории это действие не меняет этого родителя.
parent2
: ID ревизии. Устанавливается только когда производится слияние рабочей директории. ID ревизии, с которой производится слияние рабочей копии.
Смотрите также: update
(раздел Раздел 10.8.13, «update
— после обновления или слияния рабочей директории»)
Ловушка выполняется после создания метки ревизии.
Если созданная метка попадает под контроль версий, то перед этим вызывается ловушка commit
(раздел Раздел 10.8.2, «commit
—после создания новой ревизии»)
Смотрите также: pretag
(раздел Раздел 10.8.8, «pretag
— перед тегированием ревизии»)
Ловушка запускается после завершения обновления или объединения изменений. Поскольку слияние может не сработать (если внешняя команда hgmerge не выполнилась на конфликтных файлах), то эта ловушка сообщит — успешно ли обновление/слияние.
error
: Логическая. Показывает, успешно ли прошло обновление или слияние.
parent1
: ID ревизии. ID ревизии родителя который обновляется этой рабочей копией. Если производится слияние рабочей директории это действие не меняет этого родителя.
parent2
: ID ревизии. Устанавливается только когда производится слияние рабочей директории. ID ревизии, с которой производится слияние рабочей копии.
Смотрите также: preupdate
(раздел Раздел 10.8.11, «preupdate
— перед обновлением или слиянием рабочей директории.»).