在CVS预提交挂钩中使用提交消息

时间:2009-12-07 00:07:59

标签: version-control cvs commit pre-commit-hook

是否可以在CVS的预提交挂钩中使用提交消息? CVS服务器正在远程运行,我使用pserver访问它。

理想情况下,如果文件通过过滤器提交消息包含某些文本,我想允许提交。

我没有选择使用其他版本控制系统。

4 个答案:

答案 0 :(得分:4)

以下是一些有用的教程,可以阅读更多内容:

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退出)。如果您不知道,checkoutlistcommitinfo和'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,使得答案更加简单。

答案 1 :(得分:3)

CVS::Trigger Perl模块似乎具有实验性功能,允许在不同触发器的调用之间缓存值。页面明确提到将文件名从commitinfo传递给verifymsg,所以它可能会帮助你实现你想要的。

答案 2 :(得分:1)

您可以使用verifymsg目录中的CVSROOT文件。您可以将其配置为调用脚本,该脚本可以验证签入注释的内容。您可以通过返回非零来拒绝提交。

默认的verifymsg文件包含更多详细信息。

答案 3 :(得分:0)

我一直在处理同样的问题。到目前为止,我最好的解决方案是获取父进程Id(getppid())并在临时文件中使用它,我可以将文件列表放入commitinfo。这个父ID似乎与verifymsg进程相同(至少在AIX上)。 祝你好运。