2009-12-07 5 views
5

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

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

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

ответ

3

Вот некоторые полезные учебники, чтобы узнать больше:

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; 

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

Edit снова, я просто понял, что я изначально неправильно, и вы можете передать как логи и совершенные имена файлов в verifymsg делает ответ совсем немного проще.

+0

Какую версию CVS вы пробовали? С моей версией, когда я укажу% s в файле 'verifymsg', я не получаю зафиксированные файлы, я все равно получаю только файл журнала. – dreamlax

+0

@dreamlax Мне никогда не приходилось использовать 'verifymsg', как у вас, я использовал только' loginfo' и 'commitinfo', но я думал, что нашел несколько примеров в Интернете, которые показали' verifymsg', принимающий оба журнала файла и% s. Если это не сработает для вас, возможно, вам придется вернуться к какой-то связи между скриптом 'commitinfo' и скриптом' verifymsg'. –

+0

@dreamlax Кроме того, вы могли бы обойтись с требованиями обоих критериев? Тогда будет работать более ранняя версия моего ответа, в которой использовались commitinfo и verifymsg. Я думаю, это зависит от того, имеете ли вы логическое ** или ** или более типично английское ** или **. –

1

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

Файл verifymsg по умолчанию содержит более подробную информацию.

+0

Я хочу отклонить фиксацию, если ошибка, связанная с предварительным фиксацией, не удалась * и * сообщение журнала не содержит * не содержит «я принимаю ответственность» или что-то еще. Крючок предварительной фиксации гарантирует, что файлы действительны, но в случае, если необходимо скопировать файлы, нарушающие правила, я хочу убедиться, что в журнале упоминается об этом. Я хочу иметь возможность проверить как зафиксированное сообщение *, так и * зафиксированные файлы, прежде чем разрешить коммит. – dreamlax

+0

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

+0

Вы правы, verifymsg не может попасть в файлы, которые совершаются. Вам придется реализовать их отдельно. Поэтому, если кто-то провалится, вся команда будет терпеть неудачу. Это делает то, что вы хотите? Кроме того, чтобы уточнить, насколько я помню, вы не можете получить фактические файлы в крюке предварительной фиксации, вам просто сказали пути/имена. –

3

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

+0

Спасибо за это. Я бы пошел на этот ответ, за исключением того, что, как вы сказали, это экспериментальный, и мне нужно что-то более конкретное. – dreamlax

0

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

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

  • Нет связанных вопросов^_^