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

20
什么是在Windows中为Subversion编写hooks的最佳方法?据我所知,只能使用可执行文件。那么什么是最佳选择?
  • 普通批处理文件(非常有限,但可能对于非常简单的解决方案可以接受)
  • 专用编译可执行应用程序(杀鸡焉用牛刀?)
  • 其他混合选择(例如运行PowerShell脚本的批处理文件)
6个回答

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 文件并包含以下行来在 pre commit 上调用它:

[path]\PreCommit.exe %1 %2

你可能认为这有些过度,但最终只需要几分钟的编码时间。此外,你还可以获得.NET语言套件的优势,我认为它比其他选择要好得多。我会大幅扩展我的钩子,并编写适当的测试来验证它们 - 使用DOS批处理文件很难做到这一点!顺便说一下,这段代码是从这篇文章中改编而来的。

5
我们有一些复杂的需求,例如:
  1. 只有某些用户可以在SVN树的部分区域创建文件夹,但所有人都可以在那里编辑文件
  2. 某些文件扩展名中不能包含某些文本
  3. 某些文件扩展名只能存储在子目录的子集中
  4. 还有一些更简单的要求,比如必须包含提交注释
  5. 通过对所有先前的SVN提交运行新的挂钩来进行回归测试
#5对我们非常重要,没有比通过将所有先前的提交传递给您的新挂钩来确保您不会打破提交更好的方法了。在调用svnlook时,使挂钩理解1234是一个修订版,1234-1是一个事务,并进行适当的参数更改,这是我们在整个过程中做出的最佳决策。
对我们而言,这个问题足够大,以至于最明智的选择是完全可单元测试、回归测试的C#控制台exe。我们有配置文件提供目录限制,解析现有的httpd_authz文件以获取“特权”用户等。如果我们不是在Windows平台上运行,拥有.NET开发工作人员,我可能会把它全部写成Python,但由于其他人可能需要支持它,所以我选择了.NET而不是.BAT、.VBS、Powershell等。
个人认为,PowerShell与.NET有足够的不同,几乎无法作为“脚本”语言使用。如果一个产品的唯一命令行支持来自PS(Exchange、Windows 2k8等),那么它就很好用。但如果你只想解析一些文本或访问常规的.NET对象,PS只会增加一个疯狂的语法和愚蠢的安全铁幕,这可能会成为一个快速简单的.NET应用程序。

2

请查看CaptainHook,它是一个使用.NET编写Subversion钩子的简单插件框架。


确保也获取补丁文件。它修复了两个漏洞。 - Greg Woods

1

那在Windows上不起作用,你需要有一个批处理或exe文件来启动php脚本。 - Joeri Sebrechts

1

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

问题是你是否将该c#程序放入svn并进行版本控制 :)

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


1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接