Используйте сообщение о фиксации в перехватчике предварительной фиксации CVS
-
13-09-2019 - |
Вопрос
Можно ли использовать сообщение о фиксации в перехватчике предварительной фиксации в CVS?Сервер CVS работает удаленно, и я получаю к нему доступ с помощью pserver
.
В идеале, я хочу разрешить фиксацию, если файлы проходят фильтр или сообщение о фиксации содержит определенный текст.
У меня нет выбора использовать другую систему управления версиями.
Решение
Вот несколько полезных руководств, чтобы узнать больше:
http://durak.org/sean/pubs/software/cvsbook/The-commitinfo-And-loginfo-And-rcsinfo-Files.html
http://durak.org/sean/pubs/software/cvsbook/The-verifymsg-And-rcsinfo-Files.html#The-verifymsg-And-rcsinfo-Files
Вы не можете делать то, что хотите, с помощью всего лишь одного крючка, но вы можете использовать два крючка. commitinfo
позволит вам проверить сами файлы и verifymsg
позволит вам проверить сообщение.Оба могут быть использованы для отмены фиксации (программам просто нужно выйти со статусом 1).Если вы не знали, checkoutlist
, commitinfo
и «verifymsg» можно найти в каталоге CVSROOT вашего репозитория.Я бы порекомендовал помещать любые сценарии, которые вы пишете, в качестве перехватчиков в этот каталог, но это не имеет особого значения, поскольку вы можете указать полный путь.Кроме того, Perl не является обязательным, мне просто нужно написать несколько (глупых) примеров:
контрольный список
# these files will be automatically checked out for you
acceptable
проверить сообщение
# specifies which file to run as hook, %l is filename of log message
# bar$ /path/to/repo/CVSROOT/verify_ends_in_bar %l
DEFAULT /path/to/repo/CVSROOT/acceptable %l %s
приемлемый
#/usr/bin/perl -w
use strict;
use warnings;
# this would be simpler if cvs passed sane arguments
my ($logfile, $dir, @files) = @ARGV;
my $grep = `grep -i 'accept liability' $logfile`;
exit 0 if $grep;
my $found = 0;
foreach my $file (@files) {
my $path = join '/', $dir, $file;
die "Can't find file $path" if ! -e $path;
my $grep = `grep -i 'evidence of any deliberation' $path`;
$found++ if $grep;
}
die "You must accept liability or show evidence of deliberation" if $found < @files;
Пусть покупатель будет бдителен:Я написал большую часть этого на ум, без каких-либо тестов, поэтому не могу гарантировать, что это работает, но это должно вас хотя бы приблизить.
Изменить еще раз, я только что понял, что изначально был неправ, и вы можете передать как файл журнала, так и имена зафиксированных файлов в verifymsg
делая ответ немного проще.
Другие советы
Тот Самый Резюме::Триггер Модуль Perl, похоже, имеет экспериментальный функция, позволяющая кэшировать значения между вызовами различных триггеров.На странице явно упоминается передача имен файлов из commitinfo в verifymsg, так что, возможно, это поможет вам достичь того, чего вы хотите.
Вы можете использовать verifymsg
файл в CVSROOT
каталог.Вы можете настроить его на вызов сценария, который может проверять содержимое комментария к проверке.Вы можете отклонить фиксацию, вернув ненулевое значение.
Файлverifymsg по умолчанию содержит более подробную информацию.
Я занимался той же проблемой.До сих пор моим лучшим решением было получить идентификатор родительского процесса (getppid()) и использовать его во временном файле, в который я могу поместить список файлов из commitinfo.Этот родительский идентификатор, по-видимому, один и тот же для процессаverifymsg (по крайней мере, в AIX).Удачи.