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

问题描述:

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

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

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

下面是一些有用的教程阅读更多:

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; 

注意力不足:我写了大部分内容,没有测试,所以我不能保证它能正常工作它应该让你至少关闭。

再次编辑,我才意识到,我本来是错了,你可以同时通过日志文件和承诺的文件名verifymsg使答案相当简单一点。

+0

您尝试过使用什么版本的CVS?用我的版本,当我在'verifymsg'文件中指定%s时,我没有收到提交的文件,我仍然只获取日志文件。 – dreamlax 2010-01-18 01:12:17

+0

@dreamlax我从来没有像需要使用'verifymsg',我只使用'loginfo'和'commitinfo',但我想我在网上发现了一些例子,显示'verifymsg'接受日志文件和%s。如果这对你不起作用,你可能必须退回到'commitinfo'脚本和'verifymsg'脚本之间的某种通信。 – 2010-01-18 19:52:05

+0

@dreamlax另外,你是否可以同时要求这两个标准?然后,我使用commitinfo和verifymsg的答案的早期版本可以使用。我想这取决于你是否意味着逻辑**或**或更典型的英语**或**。 – 2010-01-18 19:56:44

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

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

+0

我想拒绝提交如果预提交失败*和*日志消息不*包含“我接受责任”或任何其他。预提交钩子确保文件是有效的,但如果提交违反规则的文件是必要的,我想确保日志提及它。我希望能够在允许提交之前检查提交的消息*和*提交的文件。 – dreamlax 2009-12-07 03:27:06

+0

问题是,预提交钩子似乎无法访问提交消息,以确保将故障验证记录为故意,并且verifymsg挂钩无法访问已更改的文件以验证更改是否符合与规则。 – dreamlax 2009-12-07 03:29:15

+0

你说得对,verifymsg无法获取正在提交的文件。你必须分开实施它们。所以如果一个失败,整个提交将失败。这是否做你想要的? 此外,为了阐明,据我所知,你不能在预先提交钩子的实际文件,你只是告诉路径/名称。 – 2009-12-07 03:53:32

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

+0

谢谢你。我会去回答这个问题,除非你说的是实验性的,我需要一些更具体的东西。 – dreamlax 2010-01-18 20:09:54

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