name: pre-commit on: push: branches: [main] pull_request: branches: [main] jobs: # mypy and pylint check the whole repo and are the two slowest hooks, so # each gets its own runner and the other hooks share a third; the workflow # takes as long as the slowest group rather than the sum. pre-commit: runs-on: ubuntu-latest strategy: fail-fast: false matrix: include: - group: mypy hooks: mypy skip: "" - group: pylint hooks: pylint skip: "" # free-days-interop needs Flutter and the freedays venv; it runs as # its own job in python-tests.yml, so skipping it here is not # fail-open. - group: rest hooks: "" skip: mypy,pylint,free-days-interop name: pre-commit (${{ matrix.group }}) steps: - uses: actions/checkout@v4 # Two hooks here delegate to the shared gates in kuhyx/utils. Without # this checkout they exit 1 with "shared gate not found at # /home/runner/utils/..." -- which is what this workflow had been doing # on every run since those hooks were added. - name: Check out the shared gates uses: actions/checkout@v4 with: repository: kuhyx/utils path: .utils - name: Point the delegates at that checkout run: echo "UTILS_ROOT=$GITHUB_WORKSPACE/.utils" >> "$GITHUB_ENV" - uses: actions/setup-python@v5 with: python-version: "3.x" - uses: astral-sh/setup-uv@v10.2.0 # Every hook brings its own environment except the language: system # ones; of those only dependency-freshness imports third-party code # (pyyaml, packaging). The whole requirements.txt used to be installed # here for nothing -- 28 s of a 60 s run. - name: Install pre-commit and the system hooks' imports run: uv pip install --system pre-commit pyyaml packaging # One cache per group: a shared key would hold whichever group saved # first, and the others would rebuild their hook envs on every run. The # restore key lets a config change reuse every env whose rev it kept. - uses: actions/cache@v4 with: path: ~/.cache/pre-commit key: pre-commit-${{ matrix.group }}-${{ env.pythonLocation }}-${{ hashFiles('.pre-commit-config.yaml') }} restore-keys: pre-commit-${{ matrix.group }}-${{ env.pythonLocation }}- - name: pre-commit run (${{ matrix.group }}) env: SKIP: ${{ matrix.skip }} run: pre-commit run ${{ matrix.hooks }} --all-files --show-diff-on-failure --color=always