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

Yan*_*vin 20 svn hook svn-hooks

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

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

Tro*_*unt 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);
}
Run Code Online (Sandbox Code Playgroud)

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

[path]\PreCommit.exe %1 %2
Run Code Online (Sandbox Code Playgroud)

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

顺便说一句,代码已经从这篇文章改编而来.


Mat*_*att 5

我们有复杂的要求,如:

  1. 只有某些用户可以在SVN树的某些部分创建文件夹,但每个人都可以在那里编辑文件
  2. 某些文件扩展名不能包含文件中的某些文本
  3. 某些文件扩展名只能存储在目录的子集中
  4. 除了几个更简单的,必须有一个提交评论
  5. 通过对所有先前的SVN提交运行新钩子来测试回归

#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应用程序.