2017-01-06 6 views
0

мы используем pep8 цели в Makefile нашего Repo, чтобы проверить PEP8 соответствие на всех файлах питон:Makefile проверяет 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 - это то, что я ищу здесь. Любая помощь приветствуется!

+0

Вы не упомянули, какой конкретный вариант «make» вы используете, но если он является GNU make или совместимым, вы либо хотите «var! = Command», либо «var: = $ (команда оболочки). В вашей настройке также есть несколько других потенциальных проблем, в зависимости от того, что вы пытаетесь выполнить здесь. В частности, если вы хотите сделать это, прежде чем совершать фиксацию, остерегайтесь различий между тем, что находится в * index * и том, что находится в * дереве работы *. – torek

+0

@torek это будет GNU make. И, более конкретно, 'make pep8-changes' - это команда, выполняемая Jenkins при каждом нажатии, поэтому разница между нажатой ветвью и восходящим/ведущим. – BoltzmannBrain

+0

ОК - в этом случае нет смысла ни в git diff (index vs work-tree), ни в 'git diff --staged' (' HEAD' vs index). Отбрасывая эти два средства, нет необходимости в 'uniq', что упрощает все. Вероятно, разумно избегать состояний файла 'C' и' R' (которые генерируют два имени файла, а не только один), используя 'git diff-tree -r', хотя это исключает удобный трехточечный синтаксис' ... ' для поиска баз слияния, но также маловероятно, что вы * хотите * найти базу слияния здесь. – torek

ответ

0

Хорошо. Проблемы, казалось, были вокруг экранирования $. Вот окончательный вариант:

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)` 
+0

Вам все еще не нужен '| сортировать | uniq', и использование синтаксиса с тремя точками по-прежнему кажется неправильным (вы не намерены разграничивать базу * слияния «вверх»/«master» и «HEAD» с «HEAD», вы намерены различать 'upstream/master' против HEAD). Вы также можете получить соответствие '* .py' непосредственно из Git (используя pathspecs), хотя исключение' __init __. Py', вероятно, еще проще всего с 'grep -v'. – torek