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

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

===============>>#1 票数: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批处理文件很难做到这一点!

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

===============>>#2 票数: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应用程序。

===============>>#3 票数:2

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

===============>>#4 票数:1

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

===============>>#5 票数:1

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

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

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

===============>>#6 票数:1

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

  ask by Yann Trevin translate from so

未解决问题?本站智能推荐: