在我们的构建系统中(使用git
版本控制下的源代码),我想为每个构建获取静态代码分析器(在本例中为pylint
)消息。我希望它们是增量的:在新的构建报告中,只显示新提交引入的消息。
我可以轻松获得“旧”和“新”提交。然后,一般路径是在“新”提交上运行分析器,然后,对于带有消息的每个源代码行,查找该行是新的/修改的,还是来自“旧”提交的完整。然后,仅打印来自新/修改行的消息。
pylint
是否有更简单的方法来实现这一目标?或者是否存在类似的现有实现?
答案 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