仅当所有其他钩子都成功时才运行预提交钩子

时间:2021-04-21 12:20:36

标签: pre-commit.com

我有一个预提交设置,其中包含几个非常标准的存储库(无论如何都适用于 Python 项目),以及一个非常神奇的项目特定操作。

像这样:

repos:
  - repo: https://github.com/timothycrosley/isort
    ...
  - repo: https://github.com/psf/black
    ...
  - repo: https://gitlab.com/pycqa/flake8
    ...

  - repo: local
    hooks:
      - id: local_project_specific_magic
        name: local-magic-script
        entry: magic_script.sh
        language: script

当所有检查都成功时,这一切都运行良好。

我需要实现的是,如果前面的任何一个钩子失败,最后的 local_project_specific_magic 钩子不执行。这可行吗?


我尝试添加 fail_fast: true 并且这似乎有效,但如果其他钩子中的任何一个失败,它也会阻止其他钩子运行。例如,即使 isort 修复了一些导入,我仍然希望 black 做它的事情。

1 个答案:

答案 0 :(得分:1)

fail_fast: true 与您无需重大手术

一样接近

你可以想象,虽然彼此的钩子做了类似的事情:

entry: bash -c 'black "$@" || touch .fail' --

然后您的脚本执行类似 if [ -f .fail ]; then echo 'some other hook failed' && exit 1; fi

您还需要在开头使用 always_run: true 钩子以确保 .fail 也不存在 (rm -f .fail)

但这听起来像是一个大的、无法维护的黑客。我怀疑您有 XY 问题,因为您的要求似乎非常奇怪 - 也许详细说明您为什么需要此设置?


免责声明:我创建了预提交