5
0
Fork 0
mirror of https://github.com/pre-commit/action.git synced 2025-11-09 03:26:56 +00:00
a GitHub action to run pre-commit
Find a file
Jeppe Fihl-Pearson 808ec6adfe Add instructions on how to only check changed files to README
These steps don't make use of any extra third-party actions so should hopefully
be a safe suggestion for other people to use, and more efficient than getting
`actions/checkout` to clone the entire Git history, which can take a long time
on large repositories.
2021-02-15 16:50:26 +00:00
.github Add link to GitHub Sponsors + Open Collective 2020-11-19 17:11:29 -08:00
.gitignore Initial commit 2019-11-24 19:27:32 -08:00
.pre-commit-config.yaml [pre-commit.ci] pre-commit autoupdate 2021-02-01 16:48:58 +00:00
action.yml Support extra_args keyword in pre-commit GitHub action 2020-05-15 08:14:38 -07:00
index.js Avoid update remote of repository 2020-10-10 01:57:53 +02:00
LICENSE add LICENSE resolves #25 2020-05-16 09:34:36 -07:00
Makefile include the license in the release output 2020-05-22 13:06:23 -07:00
package-lock.json Bump ini from 1.3.5 to 1.3.8 2020-12-12 02:08:08 +00:00
package.json embedding cache steps by using @actions/cache 2020-06-13 12:43:57 -07:00
README.md Add instructions on how to only check changed files to README 2021-02-15 16:50:26 +00:00
webpack.config.js set mode: production to silence webpack warning 2020-05-22 14:29:06 -07:00

pre-commit.ci status Build Status

pre-commit/action

a GitHub action to run pre-commit

using this action

To use this action, make a file .github/workflows/pre-commit.yml. Here's a template to get started:

name: pre-commit

on:
  pull_request:
  push:
    branches: [master]

jobs:
  pre-commit:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - uses: actions/setup-python@v2
    - uses: pre-commit/action@v2.0.0

This does a few things:

  • clones the code
  • installs python
  • sets up the pre-commit cache

using this action with custom invocations

By default, this action runs all the hooks against all the files. extra_args lets users specify a single hook id and/or options to pass to pre-commit run.

Here's a sample step configuration that only runs the flake8 hook against all the files (use the template above except for the pre-commit action):

    - uses: pre-commit/action@v2.0.0
      with:
        extra_args: flake8 --all-files

only check files that have changed

actions/checkout@v2 does a shallow clone by default which means pre-commit doesn't have enough Git history to determine which files have changed in order to only check them. So you need to expand the history yourself after the checkout action has run.

This can be done effectively by getting a blobless clone with:

    - uses: actions/checkout@v2
    - name: Expand Git history
      run: |
        # Tell Git we want a blobless clone,
        # which excludes file contents of historical commits making the cloning much faster.
        git config remote.origin.partialclonefilter blob:none

        # Then fetch the history of the repository, skip tags since we don't need them.
        git fetch --unshallow --no-tags        

and you can then configure pre-commit to run with:

    - uses: pre-commit/action@v2.0.0
      with:
        extra_args: --from-ref ${{ github.event.pull_request.base.sha }} --to-ref HEAD

using this action in private repositories

this action also provides an additional behaviour when used in private repositories. when configured with a github token, the action will push back fixes to the pull request branch.

using the template above, you'll make two replacements for individual actions:

first is the checkout step, which needs to use unlimited fetch depth for pushing

    - uses: actions/checkout@v2
      with:
        fetch-depth: 0

next is passing the token to the pre-commit action

    - uses: pre-commit/action@v2.0.0
      with:
        token: ${{ secrets.GITHUB_TOKEN }}

note that secrets.GITHUB_TOKEN is automatically provisioned and will not require any special configuration.

while you could technically configure this for a public repository (using a personal access token), I can't think of a way to do this safely without exposing a privileged token to pull requests -- if you have any ideas, please leave an issue!