pygrep 预提交钩子来检查字符串是否存在

pygrep pre-commit hook to check string is present

如果我想编写一个预提交挂钩来检查,例如,字符串“I love 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

但是,如果我想做相反的事情怎么办 - 即检查每个源代码文件中的“我喜欢预提交”?我如何修改我的钩子,而不是在找到“我喜欢预提交”时失败,如果“我喜欢预提交”没有就会失败?


现在可以用

完成
args: [--negate]

您可以使用一些 regex tricks 来做到这一点:

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

这结合了以下内容:

  • 使用 this answer
  • 中的粗略负向后视模式
  • 使用args: [--multiline]pygrep推入whole-file匹配模式
  • ^$(每行锚点)切换到 \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')

免责声明:我是 pre-commit

的作者