在Windows中编写用于颠覆的钩子的最佳策略

时间:2020-03-05 18:38:26  来源:igfitidea点击:

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

  • 纯批处理文件(非常有限,但对于非常简单的解决方案来说可能还可以)
  • 专用的编译可执行应用程序(大锤可以概括一下吗?)
  • 其他一些混合选择(例如运行Powershell脚本的批处理文件)

解决方案

回答

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

然后的问题是,我们是否将该程序放在svn中并进行了版本控制:)

编辑:专用复制的好处在于,我以后可以重用代码片段来创建新的钩子,包括我创建的用于处理钩子日志记录的简单日志输出。

回答

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

回答

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

回答

我们有一些复杂的要求,例如:

  • 只有某些用户可以在SVN树的一部分中创建文件夹,但是每个人都可以在其中编辑文件
  • 某些文件扩展名不能包含文件中的某些文本
  • 某些文件扩展名只能存储在目录的子集中
  • 以及一些更简单的方法,例如,必须具有提交注释
  • 通过对所有先前的SVN提交运行新的钩子,可以测试回归

#5对我们来说是巨大的,没有什么比能够通过所有新钩子推送所有先前提交更好的方法来知道我们不会中断提交了。使挂钩了解1234是修订版,而1234-1是事务,并且在调用svnlook等时进行适当的参数更改是我们在此过程中做出的最佳决定。

对我们来说,螺母足够大,可以使用完全可单元测试,可回归测试的Cconsole exe才是最有意义的。我们有提供目录限制的配置文件,解析现有的httpd_authz文件以获取"特权"用户,等等。如果我们没有在Windows上运行.NET开发人员,我可能会全部用Python编写,但是因为将来其他人可能需要支持它,所以我改用.NET而不是.BAT,.VBS和Powershell傻话。

就我个人而言,我认为Powershell与.NET的区别足以使它作为"脚本"语言几乎没有用。如果对产品的唯一cmd行支持通过PS(Exchange,Windows 2k8)等是很好的,但是如果我们要做的只是解析某些文本或者访问常规.NET对象,PS只会添加疯狂的语法和愚蠢的Security Iron窗帘可能是一个快速,简单的小型.NET应用程序。

回答

我已经花了几天时间才对这个问题进行拖延。有可用的第三方产品以及许多PERL和Python脚本,但是我想要一些简单的东西和一种我熟悉的语言,所以最终只用Cconsole应用程序编写了钩子。它非常简单:

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文件添加到回购的hooks文件夹中来调用它:

[path]\PreCommit.exe %1 %2

我们可能会认为这种矫kill过正,但最终仅需几分钟即可完成编码。此外,我们还获得了.NET语言套件的优势,而IMHO远远优于其他语言套件。病态极大地扩展了我的钩子,并针对它们编写了适当的测试,并且使用DOS批处理文件很难做到这一点!

顺便说一句,代码已从本文改编。

回答

如果我们在简单的php类的帮助下拥有php可执行文件,则可以在php中编写钩子脚本,如下所示:http://www.devhands.com/2010/01/subversion-hook-php-framework-in/