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