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

问题描述

如果我想编写一个预提交钩子来检查例如源代码中是否没有字符串“ 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

但是,如果我想做相反的事情-也就是说,检查每个源代码文件中的“我喜欢预先提交” ?我该如何修改钩子,以便如果找不到“我爱预提交”而不会失败,而如果找不到“我爱预提交” ,它将失败?

解决方法

您可以使用几个enter image description here来做到这一点:

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')

免责声明:我是预先提交的作者

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...