2012-02-16 2 views
2

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

У меня нет проблем писать сценарий проверки (например, скрипт оболочки, который запускает модульные тесты), но он должен работать на полной рабочей копии.

Моя проблема заключается в том, что если я просто поместил его в крюк pretxnchangegroup, он не будет работать с обновленными файлами. Если я попытаюсь обновить hg внутри крючка, это приведет к повреждению репозитория всякий раз, когда проверка завершается неудачей, и нажатие отменяется.

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

ответ

3

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

Вы можете избежать большинства этих недостатков с помощью двухуровневой настройки репозитория. Что-то вроде project-push, где люди могут нажимать без проверки валидации и project-pull, который имеет только изменения, которые прошли некоторую проверку. Затем у вас есть сценарий вне диапазона (cron или hook triggered), который перемещает изменения от project-push до project-pull только после подтверждения подтверждения. Поскольку этот тест выполняется вне диапазона, не блокируются, но недействительные изменения никогда не превращают его в project-pull. Вы можете отправить его по электронной почте автору, когда их толчок переместил project-pull в состояние, не подлежащее проверке. Пользователи с их .hg/hgrc сконфигурированные как это не было бы думать о том, что они были два хранилищами на всех:

[paths] 
default=http://host//path/to/project-pull 
default-push=http://host//path/to/project-push 

Они могли бы просто использовать hg push и hg pull и все будет «просто работать».

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

for thefile in $(hg manifest -r tip) ; do 
    if ! hg cat -r tip $thefile | ./validate_on_file.sh ; then 
    exit 
    fi 
done 

Если вам нужно работать со всеми файлами сразу (компиляция и т. д.), и вы не хотите создавать структуру с двумя репо, которая освобождает людей для быстрого нажатия, тогда вам нужно отдельное репо для тестирования, но вам не нужно клонировать/создавать его каждый раз. Нечто подобное в pretxnchangegroup крючка должно сделать:

hg push /scratch/long-lived-testrepo ## Warning: may not work, 
            ## if pretxnchangegroup locks the repo and 
            ## blocks this push to testrepo 
hg -R /scratch/long-lived-testrepo update 
cd /scratch/long-lived-testrepo 
./validation.sh 
+0

Спасибо за интересное вводное предупреждение. Однако в этом случае проект по-прежнему относительно невелик в плане людей и времени проверки, поэтому я хотел бы попробовать вашу последнюю идею (все файлы необходимы для проверки, для некоторого статического анализа кода). Один вопрос: в случае валидация не удалась, будет ли простой «hg rollback» (очистить репо)? Будет ли это просто отказаться от всей группы поэтапных наборов изменений? – Gnurfos

+0

Да, откат отменяет нажатие или вытягивание. убедитесь, что используете '-R', или вы будете откатывать возвращаемое репо, а не тестовое репо. –

+0

Спасибо, кажется, отлично работает. (но я просто подключился к репозиторию нуля вместо использования -R). – Gnurfos

Смежные вопросы