Mercurial hook для установки политики на имена тегов - PullRequest
2 голосов
/ 19 июля 2011

Я пишу (в процессе) ловушку, чтобы предотвратить локальное добавление имени тега BAD:

.hg / hgrc :

pretag.badtagname = python:.hg/hgcheck.py:localbadtag

.hg/hgcheck.py:

goodtag_re = r'(ver-\d+\.\d+\.\d+|tip)$'
def localbadtag(ui, repo, hooktype, node, **kwargs):
    assert(hooktype == 'pretag')
    re_ = re.compile(goodtag_re)
    if not re_.match(tag):
        ui.warn('Invalid tag name "%s".\n' % tag)
        ui.warn('Use one of tip, ver-xx.xx.xx\n')
        return True
    return False

Как сделать эту проверку для pretxnchangegroup hook?

Я пытаюсь написать этот код:

def pushbadtag(ui, repo, hooktype, node, **kwargs):
    assert(hooktype == 'pretxnchangegroup')
    re_ = re.compile(goodtag_re)
    for rev in xrange(repo[node].rev(), len(repo)):
        ui.warn('rev: %d\n' % rev)
        for tag in repo[rev].tags():
            ui.warn('tag: ' + tag + '\n')
            if not re_.match(tag):
                ui.warn('Invalid tag name "%s" for rev: "%s".\n' % (tag, rev))
                ui.warn('Use one of tip, ver-xx.xx.xx\n')
                return True
    return False

но когда я (нажимаю на репо с включенной верхней pretxnchangegroup hook:

  $ hg tag gg
  $ hg push -f
pushing to /cygdrive/d/home/tmp/hg/good
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files (+1 heads)
rev: 35
tag: tip

вы можете видеть, что rev.tags () не возвращает тег gg !

1 Ответ

3 голосов
/ 19 июля 2011

* Интерпретируемый вопрос: почему rev.tags() не возвращает тег gg?

rev.tags() не возвращает тег gg, потому что у введенной вами ревизии нет этого тега. По умолчанию hg tag помечает родителя рабочего каталога. Новая ревизия добавляет только файл .hgtags. Тег был добавлен в набор изменений, которые уже были у обоих репозиториев. Попробуйте внести некоторые изменения и зафиксировать, затем пометив это так, что вы нажимаете 2 набора изменений, и у одного будет неправильный тег.

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

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

...