如何在Subversion预提交钩子中避免行分隔符转换(导致错误的行号)?

时间:2010-03-29 12:34:48

标签: svn checkstyle

我们有以下环境:带有Apache 2.2.14的Windows 2008 Server和通过WebDAV的SVN 1.6.6。多个开发人员从不同的Windows平台提交Java代码。

现在我们要实现一个预提交挂钩到我们的存储库,它在已提交的代码上运行Checkstyle。我们使用SVNChecker(http://svnchecker.tigris.org/),这非常有效。不幸的是,当Checkstyle报告错误时,报告中的行号是实际行号的双倍值。

当您在SVN中提交某些内容时,它会使用新文件创建一个临时目录。然后,运行预提交挂钩,如果成功,则新文件实际上将提交到存储库。我在十六进制编辑器中分析了这些临时文件,发现所有换行符(\ n)都被回车符和换行符(\ r \ n)替换。由于我们在文件中使用Windows换行符(\ r \ n),因此导致\ r \ n \ r \ n,这被Checkstyle和几个文本编辑器视为两个换行符。很明显,从我们的存储库中检出时,换行符是正确的,因此它们会以某种方式转换回某处。

我可以通过将属性svn:eol-style(请参阅http://svnbook.red-bean.com/en/1.1/ch07s02.html#svn-ch-7-sect-2.3.5)设置为native来解决此问题。一切都按原样运作。不幸的是,对我们而言,这意味着我们必须将此属性添加到存储库中的每个文件。据我所知,SVN客户端中有一个设置会在您添加新文件时自动执行此操作,但遗憾的是我们无法告诉所有开发人员将此设置添加到其SVN客户端。

eol-style属性的描述说“默认情况下,Subversion不会关注文件中使用的行尾(EOL)标记的类型”。对我来说,看起来SVN中的一个错误就是转换了换行符。

有没有人知道如何在不使用丑陋的解决方法的情况下修复此行为,例如在预提交挂钩中手动转换换行符?

感谢您的帮助, memminger

1 个答案:

答案 0 :(得分:0)

我假设SVN为预提交挂钩创建了一个临时目录是错误的。相反,预提交挂钩可以使用svnlook和事务编号访问源文件。 SVNChecker是将这些文件保存在临时目录中的人。

导致错误行分隔符的原因是Python功能可自动转换换行符,以便所有Python应用程序都可以在内部使用Unix行分隔符。但是,默认情况下,只有一些函数将换行符从外部源转换为Python内部换行符。 SVNChecker没有处理这个问题,已经报告为http://svnchecker.tigris.org/issues/show_bug.cgi?id=33上的错误。