An open API service indexing awesome lists of open source software.

https://github.com/softwaremill/scala-pre-commit-hooks

Pre-commit/Pre-push hooks for Scala
https://github.com/softwaremill/scala-pre-commit-hooks

Last synced: 9 months ago
JSON representation

Pre-commit/Pre-push hooks for Scala

Awesome Lists containing this project

README

          

= Pre-commit/Pre-push hooks for Scala
:repoRoot: https://github.com/softwaremill/scala-pre-commit-hooks
:repoMaster: {repoRoot}/blob/master
:defaultScope: test:compile
:currentVersion: v0.3.0

== What for?

To make your code go smoother while still maintaining high code quality.

== Why?

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.

== How?

This is a set of hooks defined in the excellent https://pre-commit.com/[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` - runs `scalafmtCheckAll`.
- `sbt-wartremover` - runs the wartremover plugin.
- `sbt-scalafmt-apply` - runs `scalafmtAll`, as sbt-scalafmt but also applies reformatting to changed files.

To add one or more of the hooks into your repo:

. Have everyone on your team install https://pre-commit.com/#install[pre-commit].
. Add a `.pre-commit-config.yaml` file to your repository, with the following syntax:
+
[source,yaml, subs="attributes"]
..pre-commit-config.yaml
----
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: {currentVersion}
default_phase: push #change to commit if desired
hooks: #mix and match any of the following:
- id: sbt-fatal-warnings #arguments optional
args: [--scope={defaultScope}]
- id: sbt-unused-imports #includes fatal warnings, arguments optional
args: [--scope={defaultScope}]
- id: sbt-scalafmt
- id: sbt-scalafmt-apply
- id: sbt-wartremover #arguments are optional
args: [--warts=Warts.unsafe, --scope={defaultScope}]
----
+
. Run `pre-commit install` to apply your hooks to the repo.

[NOTE]
--
All hooks except for `sbt-scalafmt` and `sbt-scalafmt-apply` have the optional `scope` argument, which allows to define what source scopes
are relevant for the hook's check. The default is `{defaultScope}`.
--

[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.
--

== How to control hook run time

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:

[source,yaml, subs="attributes"]
..pre-commit-config.yaml
----
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: {currentVersion}
hooks:
- id: sbt-fatal-warnings
stages: [push] #or [commit, push] etc.
----

== I want more hooks/found a problem!

Thanks for noticing that! Please create an {repoRoot}/issues[issue].

== I want to add a hook!

Excellent, please create a PR. See {repoMaster}/CONTRIBUTING.adoc[the contribution guide] for more details.