Skip to content
Verified Commit 88fb9648 authored by Matthew Clarkson's avatar Matthew Clarkson
Browse files

feat: implement `pre_commit` macro

This is a **huge** patch that implements the functionality to use Bazel run targets as `pre-commit` hooks.

It provides the following rules:

- `pre_commit`: a macro that bundles the below rules
- `pre_commit_hook`: a macro to select a specific Bazel command rule such as `pre_commit_hook_run`
- `pre_commit_hook_run`: creates a `pre-commit` hook description that executes `bazel run` for the provided target
- `pre_commit_hooks`: bundles multiple `pre_commit_hook` rules together for easy usage
- `pre_commit_config`: accepts `pre_commit_hook{,s}` and generates a `.pre-commit-config.yaml` file
- `pre_commit_install`: installs a provided `.pre-commit-config.yaml` file into `.git/hooks`
- `pre_commit_run`: performs `pre-commit run` against the provided `.pre-commit-config.yaml` file
- `pre_commit_stage`: describes a `pre-commit` hook stage to be used with `pre_commit_hook`
- `pre_commit_tag`: describes a `pre-commit` hook file type tag to be used with `pre_commit_hook`

It has the following providers:

- `PreCommitConfigInfo`: a generated configuration file
- `PreCommitHookJSONInfo`: a provider that can be serialized to JSON for ingestion into `pre_commit_config`
- `PreCommitHookInfo`: a generated JSON file that `pre_commit_config` can parse and generate a configuration from
- `PreCommitHooksInfo`: contains a `depset` of `PreCommitHookInfo` providers
- `PreCommitTagInfo`: contains a `identify` file kind tag
- `PreCommitStageInfo`: contains a `pre-commit` hook stage

It has the following public labels:

- `@pre-commit`: a monkey patched `pre-commit` to ensure it works with Bazel effectively and provides a hermetic `git` and `bazel` implementation for running the hooks
- `@pre-commit//pre-commit:pkg`: a `py_library` that provdes the `pre_commit` Python module. Uses universal lockfiles and Python version `select` to provide the correct module to downstream users.
- `@pre-commit//pre-commit/git`: a `label_flag` for changing the hermetic `git` implementation used
- `@pre-commit//pre-commit/bazel`: a `label_flag` for changing the hermetic `bazel` implementation used
- `@pre-commit//pre-commit/stage:*`: stages to be used with `pre_commit_hook#stages`
- `@pre-commit//pre-commit/tag:*`: tags to be used with `pre_commit_hook#types{,_or}`
parent da75780d
Loading
Loading
Loading
Pipeline #23906 passed with stages
in 9 minutes and 2 seconds