Используйте сообщение фиксации в хуке предварительной фиксации CVS - PullRequest
5 голосов
/ 07 декабря 2009

Возможно ли использовать сообщение фиксации в хуке предварительной фиксации в CVS? Сервер CVS работает удаленно, и я обращаюсь к нему, используя pserver.

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

У меня нет выбора использовать другую систему управления версиями.

Ответы [ 4 ]

4 голосов
/ 16 января 2010

Вот несколько полезных руководств, чтобы узнать больше:

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 не является необходимым или обязательным, просто для меня просто написать (глупые) примеры в:

checkoutlist

# these files will be automatically checked out for you
acceptable

verifymsg

# 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, делая ответ немного проще.

3 голосов
/ 16 января 2010

Perl-модуль CVS :: Trigger , кажется, имеет экспериментальную функцию, которая позволяет кэшировать значения между вызовами различных триггеров. На странице явно упоминается передача имен файлов из commitinfo в verifymsg, поэтому, возможно, это поможет вам добиться того, чего вы хотите.

1 голос
/ 07 декабря 2009

Вы можете использовать файл verifymsg в каталоге CVSROOT. Вы можете настроить его так, чтобы он вызывал скрипт, который может проверять содержимое комментария о регистрации. Вы можете отклонить коммит, вернув ненулевое значение.

Стандартный файл verifymsg содержит больше деталей.

0 голосов
/ 22 февраля 2010

Я имел дело с той же проблемой. До сих пор моим лучшим решением было получить идентификатор родительского процесса (getppid ()) и использовать его во временном файле, в который я могу поместить список файлов из commitinfo. Этот родительский идентификатор кажется одинаковым для процесса verifymsg (по крайней мере, в AIX). Удачи.

...