【问题标题】:SVN pre-commit script to check for mkdir用于检查 mkdir 的 SVN 预提交脚本
【发布时间】:2010-12-22 16:06:15
【问题描述】:

我为 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 正在做某种提交操作?

【问题讨论】:

  • 叫我疯了,但如果它是一个pre-commit 钩子,它不应该总是 是一个commit 操作...?
  • 这也是我的第一个想法......虽然,我也明白为什么它也会在 svn 副本上被调用。但是,我不在一个可以实际检查的位置。 :(。文档确实说它是 ONLY 在提交事务被评估为真正的修订之前调用的。
  • @silky & Dan - 这些是我在开发预提交脚本时的确切想法,但它实际上正在发生 :(
  • 嘿伙计们,为了澄清这是为什么 post-commit 触发“在 Subversion txn #committed 之前调用 pre-commit hook”的最接近的描述。由于 mkdir 命令与其他任何事务一样都是事务,因此它会触发预提交脚本。

标签: svn tortoisesvn pre-commit-hook


【解决方案1】:

我没有给你很好的答案,但是...

也许您可以使用svnlook changed --copy-info 提供帮助。使用它,您可以判断某个项目是否是从某个地方复制的。如果所有项目都被复制,那么从svn copy 指令中假设这一点可能是安全的。同样,如果您检查返回的项目,您应该能够确定它是否来自添加或删除目录(因为它只是添加或删除的单个目录项。)

希望对你有所帮助...

【讨论】:

  • 丹,谢谢你的建议。虽然不像我想要的那样直接的解决方案,但它工作得很好。我只需要检查“A”的更改信息,并查看添加以“/”结尾,这是唯一表明它是目录而不是文件的指示符。