在 Windows 中为 Subversion 编写 hooks 的最佳方法是什么?据我所知,只能使用可执行文件。那么最佳选择是什么?
答案 0 :(得分: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批处理文件很难做到这一点!
顺便说一句,代码已经改编自this post。
答案 1 :(得分:5)
我们有如下复杂的要求:
对于我们来说,坚果足够大,以至于完全可单元测试,可回归测试,C#console exe最有意义。我们有配置文件来提供目录限制,解析现有的httpd_authz文件以获得“特权”用户等。如果我们没有在带有.NET开发工作的Windows上运行,我可能会用Python编写它,但是因为其他人可能需要在将来支持它。我在.NET上完成了.BAT,.VBS,Powershell愚蠢。
就我个人而言,我认为Powershell与.NET的不同之处在于它作为一种“脚本”语言几乎毫无用处。如果产品的唯一cmd行支持来自PS(Exchange,Windows 2k8)等,这是很好的,但如果您只想解析一些文本或访问常规.NET对象PS只会添加一个疯狂的语法和愚蠢的安全Iron看看什么是一个快速简单的小.NET应用程序。
答案 2 :(得分:2)
检查CaptainHook,“使用.NET编写Subversion挂钩的简单插件框架”。
答案 3 :(得分:1)
根据复杂程度,每种情况都不同,如果我只是简单地移动文件,我会写一个快速的批处理文件。如果我想做更复杂的事情我通常只是跳过脚本部分并编写一个可以处理它的快速c#程序。
那么问题是你把那个c#程序放在svn中并让它版本化了吗:)。
编辑:专用c#应用程序的好处是我可以在以后重用代码片段来创建新的钩子,包括我为处理钩子日志记录而创建的简单日志输出。
答案 4 :(得分:1)
我在Windows上的Python中编写了钩子,因为网上有很多例子(通常用于Linux,但差异很小)。我们还使用与SVN集成的Trac,并且可以通过Python访问Trac API,这样我们就可以从SVN钩子脚本自动创建/修改Trac票据。
答案 5 :(得分:1)
如果你有一个简单的PHP类的PHP可执行文件,你可以在PHP中编写钩子脚本,就像它在这里显示http://www.devhands.com/2010/01/subversion-hook-php-framework-in/