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

Version control 在CVS预提交挂钩中使用提交消息,version-control,cvs,commit,pre-commit-hook,Version Control,Cvs,Commit,Pre Commit Hook,是否可以在CVS中的预提交挂钩中使用提交消息?CVS服务器正在远程运行,我使用pserver访问它 理想情况下,如果文件通过过滤器或提交消息包含特定文本,我希望允许提交 我没有选择使用其他版本控制系统。您可以使用CVSROOT目录中的verifymsg文件。您可以将其配置为调用可以验证签入注释内容的脚本。您可以通过返回非零来拒绝提交 默认的verifymsg文件包含更多细节。Perl模块似乎有一个实验性的特性,允许在不同触发器的调用之间缓存值。该页面明确提到将文件名从commitinfo传递到v

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

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


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

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


默认的verifymsg文件包含更多细节。

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

以下是一些有用的教程,供您阅读:


你不能只使用一个钩子就做你想做的事情,但是你可以使用两个钩子,
commitinfo
将让你验证文件本身,而
verifymsg
将让你验证消息。两者都可用于取消提交(程序只需在状态为1时退出)。如果您不知道,
checkoutlist
commitinfo
和“verifymsg”都可以在存储库的CVSROOT目录中找到。我建议将您编写的任何脚本作为钩子也放在该目录中,但这并不重要,因为您需要指定完整路径。此外,perl不是必需的,也不是必需的,只是对我来说编写一些(愚蠢的)示例很简单:

检查表 验证消息 可接受的
#/usr/bin/perl-w
严格使用;
使用警告;
#如果cvs传递了合理的参数,这将更简单
我的($logfile,$dir,@files)=@ARGV;
my$grep=`grep-i'接受责任'$logfile`;
如果$grep,则退出0;
我的$found=0;
foreach my$文件(@files){
my$path=join'/',$dir,$file;
死“找不到文件$path”如果!-e$path;
my$grep=`grep-i'任何审议的证据'$path`;
$found++如果$grep;
}
如果发现$find<@文件,则死亡“您必须承担责任或出示慎重考虑的证据”;
买主警告:我在没有测试的情况下写下了大部分内容,所以我不能保证它能正常工作,但它至少能让你接近


再次编辑,我刚刚意识到我原来是错的,您可以将日志文件和提交的文件名传递给
verifymsg
,使答案变得更简单。

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

如果预提交挂钩失败,并且日志消息不包含“我接受责任”或其他内容,我想拒绝提交。pre-commit钩子确保文件是有效的,但是如果必须提交违反规则的文件,我希望确保日志中提到它。我希望能够在允许提交之前检查提交的消息和提交的文件。问题是,预提交挂钩似乎无法访问提交消息,以确保将失败的验证记录为故意的,而且verifymsg钩子无法访问更改的文件以验证更改是否符合规则。您是对的,verifymsg无法获取提交的文件。您必须单独实现它们。因此,如果一个失败,整个提交都将失败。这是你想要的吗?另外,为了澄清,据我回忆,您无法在预提交挂钩中获取实际文件,您只需被告知路径/名称即可。我可以在预提交挂钩中获取正在提交的实际文件(以及所做的更改)。我想我必须单独实现它们,但我只希望在文件验证失败并且没有证据表明有任何考虑的情况下失败。你用什么版本的CVS尝试过这个?在我的版本中,当我在
verifymsg
文件中指定%s时,我没有得到提交的文件,我仍然只得到日志文件。@dreamlax我从来没有像你那样需要使用
verifymsg
,我只使用了
loginfo
commitinfo
,但我想我在网上找到了一些示例,显示
verifymsg
同时接受日志文件和%s。如果这对您不起作用,您可能不得不求助于
commitinfo
脚本和
verifymsg
脚本之间的某种通信。@dreamlax另外,您是否可以同时满足这两个条件?然后,我的答案的早期版本(使用commitinfo和verifymsg)将适用于。我想这取决于你的意思是合乎逻辑的,还是更典型的英语或英语。我想我暂时得将就一下。我可以随时手动检查提交消息一段时间。也许我应该完全离开CVS,尽管到目前为止它一直非常适合我的需要。@dreamlax是的,提交钩子对于简单的事情非常有用,但是随着您的需求变得越来越复杂,它们的处理变得非常繁琐。谢谢。我会选择这个答案,除非你说它是实验性的,我需要一些更具体的东西。
# 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;