Scala has a quite rich build ecosystem, and a myriad of tools to help you writ good code. However, the build system(s) are relatively slow, so any helpers executed via those build system run the risk of interrupting the flow of a developer.
Moreover, some of the code quality tools/features (like unused import checks) are actively in opposition to a "run-often" coding approach.
Moving relevant checks to the pre-commit/pre-push phases partially alleviates those two issues.
This is a set of hooks defined in the excellent pre-commit library.
Currently, they include the following:
-
sbt-fatal-warnings
- turns on-Xfatal-warnings
, runs a clean compilation on the given scope. -
sbt-unused-imports
- as above, but also adds the "unused imports" warning. -
sbt-scalafmt
- runsscalafmtCheckAll
. -
sbt-wartremover
- runs the wartremover plugin.
To add one or more of the hooks into your repo:
-
Have everyone on your team install pre-commit.
-
Add a
.pre-commit-config.yaml
file to your repository, with the following syntax:.pre-commit-config.yamlrepos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v0.3.0 default_phase: push #change to commit if desired hooks: #mix and match any of the following: - id: sbt-fatal-warnings #arguments optional args: [--scope=test:compile] - id: sbt-unused-imports #includes fatal warnings, arguments optional args: [--scope=test:compile] - id: sbt-scalafmt - id: sbt-wartremover #arguments are optional args: [--warts=Warts.unsafe, --scope=test:compile]
-
Run
pre-commit install
to apply your hooks to the repo.
Note
|
All hooks except for |
Important
|
Steps 1-2 are only really required for the person setting up the pre-commit library integration. pre-commit library plugins, once installed, are normal Git hooks and are thus "visible" to everyone using the repo. |
By default, the hooks defined here run on both pre-commit and pre-push. They do, however, require some time to get running on large codebases, especially since each hook’s execution is essentially a clean build.
To limit hook runs to e.g. pre-push
, you need to add a stages
argument with the relevant value:
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v0.3.0
hooks:
- id: sbt-fatal-warnings
stages: [push] #or [commit, push] etc.
Thanks for noticing that! Please create an issue.
Excellent, please create a PR. See the contribution guide for more details.