仅从'git diff'获取静态代码分析器消息?

时间:2014-12-15 14:49:22

标签: git pylint

在我们的构建系统中(使用git版本控制下的源代码),我想为每个构建获取静态代码分析器(在本例中为pylint)消息。我希望它们是增量的:在新的构建报告中,只显示新提交引入的消息。

我可以轻松获得“旧”和“新”提交。然后,一般路径是在“新”提交上运行分析器,然后,对于带有消息的每个源代码行,查找该行是新的/修改的,还是来自“旧”提交的完整。然后,仅打印来自新/修改行的消息。

pylint是否有更简单的方法来实现这一目标?或者是否存在类似的现有实现?

2 个答案:

答案 0 :(得分:0)

您可以获取提交之间更改的文件列表,然后将其传递给pylint。使用github pullrequest工作流程,它看起来像这样:

git --no-pager diff --name-only FETCH_HEAD $(git merge-base FETCH_HEAD master) | grep .py | xargs pylint

答案 1 :(得分:0)

git diff-tree命令有一个--diff-filter参数,可用于过滤特定类型的修改:

来自git diff-tree documentation

  

- DIFF-滤波器= [(A | C | d | M | R | T | U | X | B)... [*]]
  仅选择已添加(A),复制(C),删除(D),修改(M),重命名(R)的文件,其类型(即常规文件,符号链接,子模块,...)已更改(T),是未合并(U),未知(X),或已配对破碎(B)。可以使用过滤器字符的任何组合(包括无)。

如果要获取所有添加文件的名称列表,可以使用如下命令:

git diff-tree -r --name-only --diff-filter A <oldCommit>..<newCommit>

在这种情况下,-r选项意味着以递归方式对树进行区分。 --name-only选项仅导致打印文件名,而不显示其状态,并阻止打印diff标头。

由于这是git diff命令之一,因此它还需要额外的参数来过滤文件列表。如果您只对以&#39; .py&#39;结尾的文件感兴趣在某个路径上,您可以将-- 'path/*.py'添加到命令中。

如果文件列表进一步发送到xargs等工具,则添加-z选项可能会有意义。此选项使文件名列表由空字节而不是换行符分隔。这使命令对文件名(包括空格)中可能出现的各种特殊字符具有鲁棒性。然后接收端需要知道这一点。对于xargs,使用的选项为--null

一个完整的命令,使用&#39; .py&#39;对添加的文件运行pylint因此,两个提交之间的扩展可能如下所示:

git diff-tree -r -z --name-only --diff-filter A <oldCommit>..<newCommit> -- '*.py' | xargs --null pylint