Полезные ловушки Mercurial

Какие полезные ловушки Mercurial вы встречали?

Несколько примеров хуков находятся в Mercurial book:

Я лично не считаю это очень полезным. Я хотел бы посмотреть:

  • Отклонить несколько голов
  • Reject Changegroups with merges (useful if you want users to always rebase)
    • Reject Changegroups with merges, unless commit message has special string
  • Автоматические ссылки на Fogbugz или TFS (аналогично хуку bugzilla)
  • Черный список будет отклонять push-уведомления с определенными идентификаторами набора изменений. (Полезно, если вы используете MQ для извлечения изменений из других клонов)

Пожалуйста, придерживайтесь хуков, у которых есть либо bat и bash, либо Python. Таким образом, они могут использоваться как пользователями * nix, так и пользователями Windows.


person Nathan Lee    schedule 10.11.2009    source источник
comment
Возможно, из этих вопросов о Subversion можно почерпнуть больше идей: stackoverflow. com / questions / 6155 / и stackoverflow.com/questions/884608/ ...   -  person Macke    schedule 29.12.2010


Ответы (4)


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

Вот несколько примеров: 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
person Ry4an Brase    schedule 10.11.2009
comment
hg.python.org/hooks/file/tips/checkheads.py - это больше хорошо, так как разрешить ветвление .... - person gavenkoa; 21.10.2011
comment
Действительно, есть несколько хороших вариантов, которые позволяют использовать только одну головку для каждой именованной ветки (анонимное ветвление тоже ветвится). - person Ry4an Brase; 22.10.2011
comment
@gavenkoa: ссылка должна быть hg.python.org/hooks/file/tip /checkheads.py (не / советы /) - person Macke; 23.10.2011
comment
@gavenkoa: Вы можете сделать это только через 5 или 15 минут после создания, чтобы избежать деструктивных изменений в обсуждениях. Возможно, вам стоит опубликовать свой комментарий в качестве ответа, так как он намного лучше принятого. - person Macke; 24.10.2011

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

См. Расширение CheckFiles.

person Macke    schedule 26.11.2010

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

Одна голова на ветку

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
person Nathan Lee    schedule 11.05.2011

Мне нравится упомянутый выше крючок Single Head Per Branch; однако branchtags() следует заменить на branchmap(), поскольку branchtags () больше не доступен. (Я не мог прокомментировать это, поэтому я вставил его здесь).

Мне также нравится крючок от https://bobhood.wordpress.com/2012/12/14/branch-freezing-with-mercurial/ для Frozen Branch. Вы добавляете раздел в свой 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), транзакция будет прервана.

person Mike The Dinosaur    schedule 03.12.2015