diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 000000000..e029da81c --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,9 @@ +repos: +- repo: local + hooks: + - id: detekt + name: detekt check + description: Runs `detekt` on modified .kt files. + language: script + entry: config/detekt/detekt_auto_correct.sh + files: \.kt \ No newline at end of file diff --git a/README.md b/README.md index 73eb8cd27..981a4b3e5 100644 --- a/README.md +++ b/README.md @@ -133,6 +133,7 @@ If you want to build only one of the services, you can launch: Commits follow the [Conventional Commits specification](https://www.conventionalcommits.org/en/v1.0.0/). + ### Code quality Code formatting and standard code quality checks are performed by [Detekt](https://detekt.github.io/detekt/index.html). @@ -144,6 +145,17 @@ that applies changed code refactoring and optimized imports on a save. * You can enable Detekt support with the [Detekt plugin](https://github.com/detekt/detekt-intellij-plugin). +* You can also setup a precommit hook to run detekt autocorrect automatically + +### Pre-commit +#### Automatic setup with [pre-commit](https://pre-commit.com/) tool +(if you don't have Python installed, use the manual setup below) +* install ```pip install pre-commit``` +* then run ```pre-commit install``` +#### Manual setup +* copy the script in ```config/detekt/detekt_auto_correct.sh``` in your ```.git/pre-commit``` file + + ### Working locally with Docker images To work locally with a Docker image of a service without publishing it to Docker Hub, you can follow the below instructions: diff --git a/config/detekt/detekt_auto_correct.sh b/config/detekt/detekt_auto_correct.sh new file mode 100755 index 000000000..b8344d7b2 --- /dev/null +++ b/config/detekt/detekt_auto_correct.sh @@ -0,0 +1,65 @@ +#!/usr/bin/env bash +echo "Running detekt check..." +OUTPUT="/tmp/detekt-$(date +%s)" +COUNTER=0 +EXIT_CODE=1 + + + + +until [ $COUNTER -gt 3 ] || [ $EXIT_CODE -eq 0 ] +do +./gradlew detekt --auto-correct > $OUTPUT +EXIT_CODE=$? +echo "execute $COUNTER time" +cat $OUTPUT +COUNTER=$((COUNTER+1)) +echo "detekt return $EXIT_CODE" +done +rm $OUTPUT + +if [ $EXIT_CODE -eq 0 ] && [ $COUNTER -eq 1 ]; then + echo "***********************************************" + echo " Validation succeeded " + echo "***********************************************" + echo "" + exit 0 +fi + +if [ $EXIT_CODE -eq 0 ] ; then + echo "*************************************************" + echo " Validation failed " + echo " Fix succeeded " + echo "" + echo " The fix were successfully applied " + echo "You can retry the commit with the applied changes" + echo "*************************************************" + echo "" + exit 1 +fi + +if [ $EXIT_CODE -eq 1 ]; then + echo "***********************************************" + echo " detekt failed " + echo " unexpected error " + echo "***********************************************" + echo "" + exit 1 +fi + +if [ $EXIT_CODE -eq 2 ]; then + echo "***********************************************" + echo " detekt failed " + echo " Please fix the above issues before committing " + echo "***********************************************" + exit 1 +fi + +if [ $EXIT_CODE -eq 2 ]; then + echo "***********************************************" + echo " detekt failed " + echo " Invalid detekt configuration file " + echo "***********************************************" + echo "" + exit 1 +fi \ No newline at end of file