Получить список наборов изменений в группе изменений (ловушка mercurial python)

Мне нужен ртутный хук, который будет запускать JSLint/PyChecker/etc для всех измененных файлов. Однако я не контролирую все клиенты hg и хочу, чтобы это выполнялось при отправке в главный репозиторий (который я контролирую), поэтому лучше всего использовать хук pretxnchangegroup на главном.

Как я могу получить список всех наборов изменений, которые находятся в группе изменений, которая будет зафиксирована?

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


person Knio    schedule 01.09.2010    source источник


Ответы (3)


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

Вместо этого либо просто проверьте все файлы во всех головках, либо используйте синтаксис hg status --rev x:y, чтобы получить список измененных файлов между уже имеющейся у вас ревизией и ревизией подсказки, которую вы получаете, и проверьте только те файлы, которые есть только в ревизии подсказки.

Если вам действительно нужен список всех ревизий, вы должны использовать набор ревизий ( hg help revsets ), новый в версии 1.6, но на самом деле вы хотите проверить только результаты, а не все ревизии, которые привели вас туда.

person Ry4an Brase    schedule 01.09.2010
comment
Правильно: я хочу проверить только заголовки, но я хочу проверить заголовок каждого файла, который был изменен в наборе изменений, потому что файл мог быть изменен, но не в заголовке. Как с помощью hg status --rev x:y найти x и y? крючок, кажется, только говорит мне y. Кроме того, это, кажется, выводит каждое изменение между этими датами? Сюда входят коммиты других людей, а не только коммиты в группе изменений. - person Knio; 01.09.2010
comment
X будет последним набором изменений, который у вас уже есть в этой ветке (будь то именованная ветка или анонимная ветка). Вы можете получить это из локального клона, созданного перед группой изменений, и оператора объединения в функции revsets. Честно говоря, вы должны делать то, что делают все, и просто проверять все файлы .py в каждом hg heads на changegreoup. Это не слишком неэффективно. Либо закодируйте код в заголовках, это хорошо или плохо, а код в промежуточных наборах изменений либо все еще присутствует в заголовке для проверки, либо был удален/исправлен и, таким образом, не вызывает беспокойства. - person Ry4an Brase; 02.09.2010
comment
У нас есть около 1000 файлов js/py, и запуск скрипта для каждого файла для каждой головы был бы слишком медленным. - person Knio; 02.09.2010

Я только что написал хук pretxnchangegroup, который делает именно это. Если вам нужны все файлы, которые были изменены в текущей группе изменений, вы можете получить объединение вывода этих двух команд:

hg status --rev $HG_NODE:

(обратите внимание на двоеточие в конце)

и

hg status --change $HG_NODE

При перемещении между двумя репозиториями на одном компьютере первой команды кажется достаточно, но при перемещении в удаленный репозиторий первая команда пропустит файлы, измененные в первом наборе изменений в группе изменений, где появляется вторая команда.

Согласно http://www.selenic.com/mercurial/hgrc.5.html, «ID первого нового набора изменений находится в $HG_NODE».

person Marc    schedule 08.02.2011
comment
Это еще не совсем законченное решение. --rev просто сравнивает $HG_NODE с HEAD (или рабочим каталогом) и перечисляет все файлы, которые были изменены, и не включает изменения в ревизиях, которые произошли между ними. Учтите следующее: * Пользователь делает фиксацию по умолчанию, что прерывает сборку. - person Knio; 16.03.2011
comment
Рассмотрим следующее: 1. Пользователь создает новую ветку bar по умолчанию (версия f00) 2. Пользователь снова извлекает default и делает фиксацию в default, которая ломает файл one.py (версия f01) 3. Пользователь снова извлекает bar и делает невинную фиксацию в файле two.py (версия f02) hg status --rev $HG_NODE && hg status --change $HG_NODE` теперь сообщает только об изменениях, сделанных в f00, и о разнице между f00 и f02. Поскольку one.py одинакова в обоих случаях, об этом не сообщается, а default не работает. - person Knio; 16.03.2011
comment
Также: эта система комментариев расстраивает - person Knio; 16.03.2011
comment
Я не уверен, что понимаю, что вы говорите - вы говорите, что передача изменений в панели на центральный сервер будет успешной, когда ошибки по умолчанию должны предотвратить это? Если так, то это так задумано - если я работаю в баре, почему случайные изменения в дефолте должны мешать моим пушам? Когда кто-то нажимает default, скрипт ловит эти ошибки. - person Marc; 24.03.2011
comment
Ничего себе - я понимаю, что вы имеете в виду о системе комментариев. Я не мог понять, как вставлять расширенные символы форматирования, такие как перевод строки... Но я прошу прощения, если неправильно понял вашу жалобу на эту систему. Что я пропустил? - person Marc; 24.03.2011
comment
Когда вы отправляете в центральный репозиторий, он отправляет все ваши коммиты, а не только те, что находятся в bar. Таким образом, вы можете сломать default в f01 и сдвинуть сломанную голову в default, не заметив этого скрипта. В идеале не должно быть возможности сломать какую-либо голову в центральном репозитории. - person Knio; 24.03.2011

Помогает ли мой ответ на этот вопрос вообще? https://stackoverflow.com/a/8615156/1025457

Это скелет хука pretxnchangegroup, который перебирает узлы в группе изменений.

person Truan    schedule 23.12.2011