是否可以在 CVS 的预提交挂钩中使用提交消息?CVS 服务器正在远程运行,我使用pserver
.
理想情况下,如果文件通过过滤器或提交消息包含某些文本,我希望允许提交。
我没有选择使用另一个版本控制系统。
是否可以在 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
使答案更简单一些。
CVS::Trigger Perl 模块似乎有一个实验特性,允许在不同触发器的调用之间缓存值。该页面明确提到将文件名从 commitinfo 传递到 verifymsg,因此它可能会帮助您实现您想要的。
您可以使用目录verifymsg
中的CVSROOT
文件。您可以将其配置为调用可以验证签入注释内容的脚本。您可以通过返回非零来拒绝提交。
默认的 verifymsg 文件包含更多详细信息。
我一直在处理同样的问题。到目前为止,我最好的解决方案是获取父进程 ID (getppid()) 并在临时文件中使用它,我可以将文件列表从 commitinfo 中放入。此父 ID 似乎与 verifymsg 进程相同(至少在 AIX 上)。祝你好运。