什么是在Windows中为Subversion编写hooks的最佳方法?据我所知,只能使用可执行文件。那么什么是最佳选择?
- 普通批处理文件(非常有限,但可能对于非常简单的解决方案可以接受)
- 专用编译可执行应用程序(杀鸡焉用牛刀?)
- 其他混合选择(例如运行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 文件并包含以下行来在 pre commit 上调用它:
[path]\PreCommit.exe %1 %2
如果你有一个带有简单php类的php可执行文件,你可以像这里http://www.devhands.com/2010/01/subversion-hook-php-framework-in/所示一样用php编写钩子脚本。
根据复杂程度,每种情况都是不同的。如果我只是简单地移动文件,我会写一个快速批处理文件。如果我想做更复杂的事情,通常会跳过脚本部分,编写一个可以处理它的快速c#程序。
问题是你是否将该c#程序放入svn并进行版本控制 :)
编辑:专用c#应用程序的好处是我可以重用代码片段以后创建新的钩子,包括我创建的用于处理钩子日志记录的简单日志输出。