在Windows中为subversion编写钩子的最佳策略

时间:2008-08-07 18:47:51

标签: svn hook svn-hooks

Windows 中为 Subversion 编写 hooks 的最佳方法是什么?据我所知,只能使用可执行文件。那么最佳选择是什么?

  • 普通批处理文件(非常有限,但对于非常简单的解决方案可能没问题)
  • 专门编译的可执行应用程序(大锤要简单说一下?)
  • 其他一些混合选择(如运行Powershell脚本的批处理文件)

6 个答案:

答案 0 :(得分:7)

我刚刚花了好几天拖延这个问题。有第三方产品和大量的PERL和Python脚本,但我想要一些简单的东西和我熟悉的语言,所以最终只是在C#控制台应用程序中编写钩子。这很直接:

public void Main(string[] args)
{
  string repositories = args[0];
  string transaction = args[1];

  var processStartInfo = new ProcessStartInfo
                           {
                             FileName = "svnlook.exe",
                             UseShellExecute = false,
                             CreateNoWindow = true,
                             RedirectStandardOutput = true,
                             RedirectStandardError = true,
                             Arguments = String.Format("log -t \"{0}\" \"{1}\"", transaction, repositories)
                           };

  var p = Process.Start(processStartInfo);
  var s = p.StandardOutput.ReadToEnd();
  p.WaitForExit();

  if (s == string.Empty)
  {
    Console.Error.WriteLine("Message must be provided");
    Environment.Exit(1);
  }

  Environment.Exit(0);
}

然后,您可以通过将pre-commit.cmd文件添加到repo的hooks文件夹中,在提交前调用此方法,并使用以下行:

[path]\PreCommit.exe %1 %2

你可能会认为这有点过分,但最终只需要几分钟的编码。更重要的是,你获得了.NET语言套件的优势,恕我直言的选择远远优于其他选择。我将大大扩展我的钩子,并针对它们编写适当的测试 - 用DOS批处理文件很难做到这一点!

顺便说一句,代码已经改编自this post

答案 1 :(得分:5)

我们有如下复杂的要求:

  1. 只有某些用户可以在SVN树的某些部分创建文件夹,但每个人都可以编辑那里的文件
  2. 某些文件扩展名不能包含文件中的某些文字
  3. 某些文件扩展名只能存储在目录的子集中
  4. 除了几个更简单的,必须有提交评论
  5. 通过对所有以前的SVN提交运行新挂钩来测试回归
  6. 对于我们来说,#5对我们来说是巨大的,没有比这更好的方法来了解你不会破坏前进的提交而不是能够通过你的新钩子推送所有先前的提交。让钩子理解1234是一个修订版本,1234-1是一个事务,并且在调用svnlook等时进行适当的参数更改是我们在此过程中做出的最佳决策。

    对于我们来说,坚果足够大,以至于完全可单元测试,可回归测试,C#console exe最有意义。我们有配置文件来提供目录限制,解析现有的httpd_authz文件以获得“特权”用户等。如果我们没有在带有.NET开发工作的Windows上运行,我可能会用Python编写它,但是因为其他人可能需要在将来支持它。我在.NET上完成了.BAT,.VBS,Powershell愚蠢。

    就我个人而言,我认为Powershell与.NET的不同之处在于它作为一种“脚本”语言几乎毫无用处。如果产品的唯一cmd行支持来自PS(Exchange,Windows 2k8)等,这是很好的,但如果您只想解析一些文本或访问常规.NET对象PS只会添加一个疯狂的语法和愚蠢的安全Iron看看什么是一个快速简单的小.NET应用程序。

答案 2 :(得分:2)

检查CaptainHook,“使用.NET编写Subversion挂钩的简单插件框架”。

答案 3 :(得分:1)

根据复杂程度,每种情况都不同,如果我只是简单地移动文件,我会写一个快速的批处理文件。如果我想做更复杂的事情我通常只是跳过脚本部分并编写一个可以处理它的快速c#程序。

那么问题是你把那个c#程序放在svn中并让它版本化了吗:)。

编辑:专用c#应用程序的好处是我可以在以后重用代码片段来创建新的钩子,包括我为处理钩子日志记录而创建的简单日志输出。

答案 4 :(得分:1)

如果你有一个简单的PHP类的PHP可执行文件,你可以在PHP中编写钩子脚本,就像它在这里显示http://www.devhands.com/2010/01/subversion-hook-php-framework-in/

答案 5 :(得分:1)

我在Windows上的Python中编写了钩子,因为网上有很多例子(通常用于Linux,但差异很小)。我们还使用与SVN集成的Trac,并且可以通过Python访问Trac API,这样我们就可以从SVN钩子脚本自动创建/修改Trac票据。