2

如果我想编写一个预提交挂钩来检查,例如,字符串“我喜欢预提交”不在我的源代码中的任何位置,我可以这样做

- 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]
4

1 回答 1

4

您可以使用一些正则表达式技巧来做到这一点:

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入全文件匹配模式
  • ^and $(per line anchors) 切换到\Aand \Z(整个 string anchors)

这是一个示例执行:

$ 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 的作者

于 2020-10-13T23:30:20.873 回答