【问题标题】:Makefile pep8 checks only the git diffMakefile pep8 只检查 git diff
【发布时间】:2017-01-06 02:56:47
【问题描述】:

我们在 repo 的 Makefile 中使用 pep8 目标来检查所有 python 文件的 PEP8 合规性:

## Check all python files for compatibility with PEP8
PEP8FLAGS := --ignore=E201,E202,E241,E265,E501,E711,E712,E713,E714,E721,W391,W291,W293,W601,W603
pep8:
    pep8 $(PEP8FLAGS) .

我想要一个类似的 pep8-changes 目标,它只检查拉取请求中更改的 Python 文件:

DIFF_FILES := (git diff --name-only --diff-filter=ACMR ; \  # ACMR: added/copied/modified/renamed
           git diff --staged --name-only --diff-filter=ACMR ; \
           git diff --name-only --diff-filter=ACMR upstream/master...) \
| sort | uniq | grep -e "\.py$$" | grep -v '__init__.py'

## Check all diff python files for compatibility with PEP8
pep8-changes:
    pep8 $(PEP8FLAGS) --filename $(DIFF_FILES)

但我收到以下错误:

pep8 --exclude=sandbox,thirdparty --ignore=E201,E202,E241,E265,E501,E711,E712,E713,E714,E721,W391,W291,W293,W601,W603 --filename (git diff --name-only --diff-filter=ACMR ; \
/bin/sh: -c: line 0: syntax error near unexpected token `('

我在pep8 docs 中找不到太多帮助;我不认为--diff 标志是我在这里寻找的。任何帮助表示赞赏!

【问题讨论】:

  • 你没有提到你正在使用哪个特定的make 变体,但如果它是 GNU make 或兼容的,你要么想要 var != command 要么 var := $(shell command)。您的设置中还有其他几个潜在问题,具体取决于您在此处尝试完成的任务。特别是如果您想在实际提交之前执行此操作,请注意 index 中的内容与 work-tree 中的内容之间的区别。
  • @torek 这将是 GNU make。更具体地说,make pep8-changes 是 Jenkins 在每次推送时运行的命令,所以区别在于推送的分支和 upstream/master 之间。
  • OK - 在这种情况下,git diff(索引与工作树)或git diff --stagedHEAD 与索引)都没有意义。放弃这两个意味着也不需要uniq,这大大简化了一切。使用git diff-tree -r 避免CR 文件状态(产生两个文件名,而不仅仅是一个)可能是明智的,尽管这排除了用于查找合并基的方便的三点... 语法——但它您似乎也不太可能想要在这里找到合并基地。
  • 好的,谢谢,这简化了一些事情。但我仍然遇到DIFF_FILES 未按预期对pep8 命令进行评估的问题。

标签: git makefile pep8


【解决方案1】:

好的,明白了。问题似乎与转义 $ 字符有关。这是决赛:

DIFF_FILES := git diff --name-only --diff-filter=ACMR upstream/master... \
| sort | uniq | grep -e "\.py$$" | grep -v '__init__.py'

pep8-changes:
    pep8 $(PEP8FLAGS) `$(DIFF_FILES)`

【讨论】:

  • 你仍然不需要| sort | uniq,并且使用三点语法似乎仍然是错误的(你不打算区分@987654324的合并基数 @ 和 HEADHEAD,您打算区分 upstream/master 与 HEAD)。您也可以直接从 Git 获取 *.py 匹配项(使用路径规范),尽管使用 grep -v 排除 __init__.py 可能仍然是最简单的。
猜你喜欢
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
  • 2020-09-16
  • 1970-01-01
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
  • 2015-11-28
相关资源
最近更新 更多