我为SVN编写了以下预提交脚本,以验证用户是否已提交文件提交的最少信息量。但是,在尝试添加/删除目录时,现在它失败了。我知道为什么它显然失败了,我只是没有意识到每个动作都会调用预提交脚本。如何过滤正在执行的操作?我可以使用 svn log 执行此操作,还是需要使用其他内容?
<?php
define('SVNLOOK', "\"C:\Program Files\CollabNet\Subversion Server\svnlook.exe\"");
define('NOTEXT', 1000);
define('NOPATTERNMATCH', 1001);
define('ERRORPROCESSING', 9999);
$repo_path = $argv[1];
$transaction = $argv[2];
$tracking_regex_pattern = "/\b(?:bug|issue|ter)\s*[#]{0,1}(\d+)\b/i";
exec(SVNLOOK . " log $repo_path -t$transaction", $revisions);
//loop through transaction message line by line for validation
$validation_passed = (bool) false;
$has_text = (bool) false;
foreach($revisions as $change_line){
$change_line = trim($change_line);
if (!empty($change_line)){
$has_text = true;
if (preg_match($tracking_regex_pattern, $change_line)) {
$validation_passed = true;
}
}
}
if(!$validation_passed){
switch($has_text) {
case true:
throwError(NOPATTERNMATCH, $revisions);
break;
case false:
throwError(NOTEXT, $revisions);
break;
default:
throwError(ERRORPROCESSING, $revisions);
break;
}
}else{
exit(0);
}
function throwError($error_code, $revisions){
$fp = fopen('php://stderr', 'w');
fwrite($fp, "********** (Error Code: $error_code) **********\n");
foreach($revisions as $change_line) {
fwrite($fp, $change_line."\n");
}
fclose($fp);
exit($error_code);
}
?>
如何测试当前事务中正在执行的svn命令?基本上我只希望验证在 svn commit 上运行,而不是副本,mkdir等......
提前致谢!!!
编辑:我可能应该在原帖中澄清,我正在使用TortoiseSVN的创建文件夹...来做到这一点。也许TortoiseSVN正在进行某种提交操作?
答案 0 :(得分:2)
我没有一个很好的答案,但是......
也许您可以使用svnlook changed --copy-info
来帮助一下。使用它,您可以判断某个项目是否是从某个地方复制的。如果复制了所有项目,那么可以安全地从svn copy
指令中假设这一点。同样,如果您检查返回的项目,您应该能够确定它是否来自添加或删除目录(因为它只是添加或删除的单个目录项。)
希望它有所帮助...