问题

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

  • 普通批处理文件(非常有限但对于非常简单的解决方案也许可以)
  • 专用编译的可执行应用程序(sledgehammer to fract a nutshell?)
  • 其他一些混合选择(如运行Powershell脚本的批处理文件)

  最佳答案

我刚刚花了几天时间拖延这个问题.有第三方产品可用,有很多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的钩子文件夹,其中包含以下行:

 [path]\PreCommit.exe %1 %2
 

您可能会考虑这种过度杀伤,但最终只有几分钟的编码.此外,您获得了IMHO比替代方案更可取的.NET语言套件的优势.我会大大扩展我的钩子并对它们编写适当的测试 – 使用DOS批处理文件执行此操作有点困难!

顺便说一句,代码是从这篇文章调整的。

  相同标签的其他问题

svnhooksvn-hooks