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

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

  • 纯粹的批处理文件(非常有限,但对于非常简单的解决方案也许可以)
  • 专门编译的可执行应用程序(大锤可以简单地说明一下吗?)
  • 其他一些混合选项(如运行Powershell脚本的批处理文件)
0

6 答案

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

接下来的问题是你把这个c#程序放在svn中,并让它版本化:)

edit: The benefits of a dedicated C# application is that I can reuse code fragments to create new hooks later, including a simple log output I created to handle hook logging.

0
额外

我刚刚花了几天的时间就这个问题拖延。有第三方产品可用,大量的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语言套件的优势,而IMHO远远优于其他选择。我会大大扩展我的钩子,并针对他们编写适当的测试?有点难以用DOS批处理文件做到这一点!

顺便说一句,代码已经从这个帖子进行了改编。

0
额外

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

0
额外
确保获取补丁文件。它修复了2个错误
额外 作者 Greg Woods,

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

0
额外

我们有如下复杂的要求:

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

#5对我们来说是巨大的,没有更好的方法可以知道你不会违反前进的承诺,而是能够通过新的钩子推动所有先前的承诺。让钩子明白1234是一个修订,而1234-1是一个交易,并在调用svnlook时作出适当的论点变更等是我们在这个过程中做出的最好决定。

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

就我个人而言,我认为Powershell与.NET的差异足以作为“脚本”语言。如果通过PS(Exchange,Windows 2k8)等对产品的唯一cmd行支持是很好的,但是如果您只想解析某些文本或访问常规.NET对象,PS只会增加一种疯狂的语法和愚蠢的安全性Iron帷幕什么可能是一个快速和容易的小.NET应用程序。

0
额外

If you have a PHP executable with a help of simple PHP class you may write hook script in PHP like it is shown here http://www.devhands.com/2010/01/subversion-hook-php-framework-in/

0
额外
这不适用于Windows,你需要有一个批处理或exe文件启动php脚本。
额外 作者 Joeri Sebrechts,