2013-01-01 17 views
11

我想在SVN中构建预提交脚本,并且我想在修改后的行上仅运行(而不是整个文件)运行PHP_CodeSniffer。到目前为止,我有这个脚本:使用PHP_CodeSniffer仅用于修改的行

#!/bin/sh 

REPOS="$1" 
TXN="$2" 

# Make sure that the log message contains some text. 
SVNLOOK=/usr/bin/svnlook 
$SVNLOOK log -t "$TXN" "$REPOS" | \ 
    grep "[a-zA-Z0-9]" > /dev/null || exit 1 

# Check for code validation before commiting the script using PHP_CodeSniffer 
/tmp/pear/download/PHP_CodeSniffer-1.4.3/scripts/phpcs-svn-pre-commit "$REPOS" -t "$TXN" >&2 || exit 1 

# All checks passed, so allow the commit. 
exit 0 
+0

你可能应该概述一下你到目前为止所尝试的问题。 +1对于构建和询问;) – hakre

+2

phpcs将该文件解析为AST并对其执行分析。所以在检查步骤中 - 没有可用的原始行数。我很难怀疑这是可能的 – zerkms

+1

像@zerkms说的那样,整个文件必须被解析,但是可能检查是否有任何改变的行在包含cs错误的行集合中。 –

回答

0

概念上,它没有任何意义。

为了正确分析,phpcs需要知道孔的上下文。

只扫描已更改的行将删除上下文。

+0

PHPCS只能与当前文件的上下文一起使用。 我知道只有大约1次嗅探,这确实需要更多的智力,但它使用一些先进的技术来做到这一点。 https://github.com/Symplify/CodingStandard#possible-unused-public-method –

0

这里是它是如何在Phabricator的工具奥术师做:

  1. 它运行在每个被改动过的文件的PHP代码嗅探器,并收集所有的错误
  2. 限制行号,其中只有行号已更改这些错误在这个提交允许

这当然不会涵盖一些特定情况下,当LineA中的更改导致LineB中的错误。

0

您可能正试图加快扫描速度,或者防止将新问题引入已经具有绝大多数问题的代码中。 (http://xyproblem.info/

如果你想加快扫描速度,那么恐怕这是一个不行。正如Max Horvath所说,这没有任何意义。你需要整个文件来提供足够的上下文来评估一个新行(一个简单的例子:我添加一个新行,它引用了一个我没有编辑过的行中定义的变量,你不能确定它是否是一个有效的引用扫描文件以找到对其的引用)。

如果您尝试识别新问题,唯一正确的方法就是运行2次扫描,然后比较结果和未进行新更改。

如果您可以同时运行两个扫描或缓存结果,这并不一定会使处理时间加倍,但它不会更快,这是一个耻辱,因为像这样的技术的明显用例是非常大的文件。

找出两条错误消息是否相同比第一次出现有点棘手,因为行号会改变。您需要对两个原始文件进行比较,找出所有的线偏移量以获得正确的结果。

在对结果进行分析并让开发人员弄清楚之前,可能已经足以模糊行数。如果你想说“这个改变引入了这4个错误中的一个,但我不知道哪个”,开发人员会很容易理解。

0

我知道这个话题已过时。我建立了自己的解决方案来实现这个目标(最近只是改变了内线)。这是不成熟的,但工程

https://github.com/ayeo/sniffer