5

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

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

我没有选择使用另一个版本控制系统。

4

4 回答 4

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 不是必需的或必需的,我只是简单地在以下位置编写一些(愚蠢的)示例:

结账清单

# 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使答案更简单一些。

于 2010-01-16T06:07:15.017 回答
3

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

于 2010-01-15T21:51:30.580 回答
1

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

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

于 2009-12-07T02:48:59.783 回答
0

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

于 2010-02-22T19:09:13.533 回答