pygrep pre-commit ловушка для проверки наличия строки

Если я хочу написать хук перед фиксацией, чтобы проверить, например, что строка, которую я люблю перед фиксацией, отсутствует где-либо в моем исходном коде, я мог бы сделать

- repo: local
  hooks:
    - id: love_statement
      name: Check that I love pre-commit isn't in source code
      types: [python]
      entry: 'I love pre-commit'
      language: pygrep

Однако что, если я хочу сделать наоборот, то есть проверить, что я люблю предварительную фиксацию is в каждом файле исходного кода? Как я могу изменить свою ловушку так, чтобы вместо ошибки, если я люблю предварительную фиксацию, она не удалась, если я люблю, чтобы предварительная фиксация не была найдена?


теперь это можно сделать с

args: [--negate]

person ignoring_gravity    schedule 13.10.2020    source источник


Ответы (1)


Для этого вы можете использовать несколько трюков с регулярными выражениями:

repos:
- repo: local
  hooks:
    - id: love_statement
      name: Check that I love pre-commit is in source code
      types: [python]
      args: [--multiline]
      entry: '\A((?!I love pre-commit).)*\Z'
      language: pygrep

это сочетает в себе следующее:

  • используйте грубый шаблон отрицательного просмотра назад из этот ответ
  • используйте args: [--multiline], чтобы перевести pygrep в режим сопоставления всего файла
  • переключиться с ^ и $ (якоря для каждой строки) на \A и \Z (якоря для всей строки)

вот пример выполнения:

$ git ls-files -- '*.py' | xargs tail -n999
==> t.py <==
print('I do not love pre-commit')

==> t2.py <==
print('I love pre-commit')

$ pre-commit  run --all-files
Check that I love pre-commit is in source code...........................Failed
- hook id: love_statement
- exit code: 1

t.py:1:print('I do not love pre-commit')

отказ от ответственности: я автор предварительной фиксации

person Anthony Sottile    schedule 13.10.2020
comment
дисклеймер: я автор пре-коммита. Похоже, лесть является хорошей стратегией :) Спасибо! - person ignoring_gravity; 14.10.2020
comment
Я нахожу это решение медленным, хотя оно работает - есть ли возможность изменить код выхода pygrep? Если нет, не могли бы вы принять запрос на включение, чтобы добавить это? - person ignoring_gravity; 14.10.2020
comment
нет, иначе я бы предложил это. PR можно рассматривать, если вы можете продемонстрировать его реальный вариант использования. - person Anthony Sottile; 14.10.2020