在Windows中为Subversion编写挂钩的最佳方法是什么?据我所知,只能使用可执行文件。那么最好的选择是什么?
- 普通批处理文件(非常有限,但对于非常简单的解决方案可能还可以)
- 专用的编译可执行应用程序(大锤破解简而言之?)
- 其他一些混合选择(例如运行 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 的 hooks 文件夹中,使用以下行在预提交时调用它:
[path]\PreCommit.exe %1 %2
您可能会认为这有点过头了,但最终只需要几分钟的编码。更重要的是,您可以获得 .NET 语言套件的优势,恕我直言,它比其他语言套件更可取。我将显着扩展我的钩子并针对它们编写适当的测试 - 使用 DOS 批处理文件很难做到这一点!
顺便说一句,代码已改编自这篇文章。
我们有复杂的要求,例如:
#5 对我们来说意义重大,没有比能够通过新钩子推送所有以前的提交更好的方法来知道你不会破坏提交。让钩子明白 1234 是修订版,1234-1 是事务,并在调用 svnlook 时进行适当的参数更改等是我们在此过程中做出的最佳决定。
对我们来说,坚果变得足够大,完全可单元测试、可回归测试的 C# 控制台 exe 最有意义。我们有提供目录限制的配置文件,解析现有的 httpd_authz 文件以获取“特权”用户等。如果我们没有在 Windows 上运行 .NET 开发人员,我可能会全部用 Python 编写,但是因为其他人将来可能需要支持它,所以我通过 .BAT、.VBS、Powershell 愚蠢去了 .NET。
就我个人而言,我认为 Powershell 与 .NET 的不同之处在于,它几乎不能用作“脚本”语言。如果产品的唯一 cmd 行支持来自 PS(Exchange、Windows 2k8)等,那很好,但如果您只想解析一些文本或访问常规 .NET 对象,PS 只会添加疯狂的语法和愚蠢的 Security Iron窗帘可能是一个快速简单的小型 .NET 应用程序。
检查CaptainHook,“一个使用 .NET 编写 Subversion 挂钩的简单插件框架”。
根据复杂程度,每种情况都不同,如果我只是简单地移动文件,我将编写一个快速批处理文件。如果我想做一些更复杂的事情,我通常只是跳过脚本部分并编写一个可以处理它的快速 c# 程序。
那么问题是你是否把那个 c# 程序放在 svn 中并对其进行版本控制:)
编辑:专用 c# 应用程序的好处是我可以在以后重用代码片段来创建新的挂钩,包括我为处理挂钩日志而创建的简单日志输出。
如果您有一个借助简单 php 类的 php 可执行文件,您可以在 php 中编写钩子脚本,如下所示http://www.devhands.com/2010/01/subversion-hook-php-framework-in/