Можно ли найти самое последнее время PUSH для ртутного репозитория из хука перед фиксацией?

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

Итак, я настроил свой файл hgrc на стороне сервера следующим образом:

[hooks]
prechangegroup.throttlehook = python:path/to/throttlescript.py:hook

Я использую хук prechangegroup, потому что это дает мне доступ к репозиторию в том виде, в каком он существует, без коммитов входящих push-уведомлений.

Хук работает, поскольку код скрипта запускается и может отклонить входящий push, если я верну ненулевой код возврата.

Там, где я сталкиваюсь с трудностями, я получаю отметку времени самого последнего нажатия. В дросселе script.py у меня есть следующее:

import time
def hook(ui, repo, **kwargs):
    difference = time.time() - repo['tip'].date()[0] # this should be the difference between the current time and the most recent push
    if difference < 900:
        print "You are pushing too soon after the most recent push. Please try again later."
        return 1
    return 0

Но repo['tip'].date()[0], похоже, является отметкой времени самой последней фиксации, которая могла произойти задолго до того, как она была отправлена ​​в мой канонический репозиторий, поэтому, вероятно, ей нельзя доверять как отметке времени самой последней отправки.

Есть ли другое место, где я могу найти временную метку push, а не commit? Могу ли я использовать время последнего изменения какого-либо файла в папке .hg репозитория?


person KWierso    schedule 16.12.2013    source источник


Ответы (1)


Mercurial не отслеживает push-уведомления, а только наборы изменений, которые они приносят. Существует расширение под названием «pushlog», написанное ребятами из Mozilla, которое записывает все нажатия и извлечения в журнал, но я не думаю, что оно широко используется.

Если вы хотите немного пошалить, вы можете просто проверить время последнего изменения в файле .hg/store/00changelog.i, который записывается при каждом успешном нажатии.

В bash вы можете сделать это довольно легко, используя find:

#!/bin/bash
if test -z $(find .hg/store/00changelog.i -newerct '15 minutes ago') ; then
    exit 0
fi
echo "You are pushing too soon after the most recent push. Please try again later."
exit 1

Я предсказываю, хотя вы просто разозлите своих коллег. :)

person Ry4an Brase    schedule 17.12.2013
comment
Что ж, к счастью, я пишу это для инфраструктуры Mozilla! ;) - person KWierso; 17.12.2013
comment
Прохладный. Если они все еще используют его, pushlog был текстовым файлом. Вероятно, проще всего просто проверить время последнего изменения, что делает приведенное выше решение самым простым. - person Ry4an Brase; 17.12.2013