【问题标题】:pygrep pre-commit hook to check string is presentpygrep 预提交钩子检查字符串是否存在
【发布时间】:2020-10-13 16:14:28
【问题描述】:

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

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

【问题讨论】:

    标签: grep pre-commit pre-commit.com


    【解决方案1】:

    您可以使用几个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推入全文件匹配模式
    • ^$(每行锚点)切换到\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 的作者

    【讨论】:

    • "免责声明:我是 pre-commit 的作者" 看起来奉承一个好策略:) 谢谢!
    • 我发现这个解决方案很慢,即使它有效 - 是否有选项可以反转 pygrep 的退出代码?如果没有,你会接受拉取请求来添加它吗?
    • 没有或者我会建议它。如果您可以为其演示一个真实的用例,则可以考虑 PR
    猜你喜欢
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多