问题描述
如果我想编写一个预提交钩子来检查例如源代码中是否没有字符串“ 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
但是,如果我想做相反的事情-也就是说,检查每个源代码文件中的“我喜欢预先提交” 是?我该如何修改钩子,以便如果找不到“我爱预提交”而不会失败,而如果找不到“我爱预提交” ,它将失败?
解决方法
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
这结合了以下内容:
- 使用regex tricks中的粗略的负向后看模式
- 使用
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')
免责声明:我是预先提交的作者