Полезные Mercurial Kooks
Какие полезные крючки Mercurial вы столкнулись?
Несколько примеров крючков находятся в Mercurial book:
Я лично не считаю их очень полезными. Я хотел бы видеть:
- Отклонить несколько глав
- Отклонить группы изменений слияниями (полезно, если вы хотите, чтобы пользователи всегда переустанавливали)
- Отклонить группы изменений слияниями, если сообщение commit имеет специальную строку
- Автоматические ссылки на Fogbugz или TFS (похожие на крючок bugzilla)
- Черный список, будет отрицать толки, имеющие определенные изменения. (Полезно, если вы используете MQ для внесения изменений в другие клоны)
Пожалуйста, придерживайтесь крючков, у которых есть либо bat, либо bash, либо Python. Таким образом, они могут использоваться как пользователями * nix, так и Windows.
Ответы
Ответ 1
Мой любимый крюк для формальных репозиториев - это тот, который отказывается от нескольких головок. Это здорово, когда у вас есть система непрерывной интеграции, для которой автоматически создается подсказка после слияния.
Несколько примеров приведены здесь: MercurialWiki: TipsAndTricks - предотвратите нажатие, которое создало бы несколько глав
Я использую эту версию из netbeans:
# This software may be used and distributed according to the terms
# of the GNU General Public License, incorporated herein by reference.
#
# To forbid pushes which creates two or more headss
#
# [hooks]
# pretxnchangegroup.forbid_2heads = python:forbid2_head.forbid_2heads
from mercurial import ui
from mercurial.i18n import gettext as _
def forbid_2heads(ui, repo, hooktype, node, **kwargs):
if len(repo.heads()) > 1:
ui.warn(_('Trying to push more than one head, try run "hg merge" before it.\n'))
return True
Ответ 2
Я только что создал небольшой крюк pretxncommit, который проверяет наличие вкладок и завершающих пробелов и сообщает об этом пользователю довольно приятно. Он также предоставляет команду для очистки этих файлов (или всех файлов).
См. расширение CheckFiles.
Ответ 3
Другим хорошим крюком является этот. Он допускает несколько головок, но только если они находятся в разных ветвях.
Одиночная головка на ветку
def hook(ui, repo, **kwargs):
for b in repo.branchtags():
if len(repo.branchheads(b)) > 1:
print "Two heads detected on branch '%s'" % b
print "Only one head per branch is allowed!"
return 1
return 0
Ответ 4
Мне нравится упоминавшийся выше крючок Single Head Per Branch; однако branchtags()
следует заменить на branchmap()
, так как branchtags() больше недоступен. (Я не мог прокомментировать этот, поэтому я его тут же засунул).
Мне также нравится крючок из https://bobhood.wordpress.com/2012/12/14/branch-freezing-with-mercurial/ для Frozen Branches. Вы добавляете раздел в свой hgrc следующим образом:
[frozen_branches]
freeze_list = BranchFoo, BranchBar
и добавьте крючок:
def frozenbranches(ui, repo, **kwargs):
hooktype = kwargs['hooktype']
if hooktype != 'pretxnchangegroup':
ui.warn('frozenbranches: Only "pretxnchangegroup" hooks are supported by this hook\n')
return True
frozen_list = ui.configlist('frozen_branches', 'freeze_list')
if frozen_list is None:
# no frozen branches listed; allow all changes
return False
try:
ctx = repo[kwargs['node']]
start = ctx.rev()
end = len(repo)
for rev in xrange(start, end):
node = repo[rev]
branch = node.branch()
if branch in frozen_list:
ui.warn("abort: %d:%s includes modifications to frozen branch: '%s'!\n" % (rev, node.hex()[:12], branch))
# reject the entire changegroup
return True
except:
e = sys.exc_info()[0]
ui.warn("\nERROR !!!\n%s" % e)
return True
# allow the changegroup
return False
Если кто-либо попытается обновить замороженные ветки (например, BranchFoo, BranchBar), транзакция будет прервана.