From e3a2150b0488d5d7039e6b3691ba7dc3d1d57319 Mon Sep 17 00:00:00 2001 From: Atiqur Rahman Date: Mon, 11 Apr 2022 15:40:01 +0600 Subject: [PATCH 1/2] feat: add git pre-commit hooks for detekt --- detekt.gradle | 18 +++++++++++++++--- scripts/pre-commit.sh | 3 +++ 2 files changed, 18 insertions(+), 3 deletions(-) create mode 100755 scripts/pre-commit.sh diff --git a/detekt.gradle b/detekt.gradle index a9a42e51..28637e5c 100644 --- a/detekt.gradle +++ b/detekt.gradle @@ -1,7 +1,19 @@ apply plugin: 'io.gitlab.arturbosch.detekt' detekt { - buildUponDefaultConfig = true // preconfigure defaults - allRules = false // activate all available (even unstable) rules. - config = files("$rootDir/detekt-config.yml") // point to your custom config defining rules to run, overwriting default behavior + buildUponDefaultConfig = true // preconfigure defaults + allRules = false // activate all available (even unstable) rules. + config = files("$rootDir/detekt-config.yml") + // point to your custom config defining rules to run, overwriting default behavior +} + +task createDetektPreCommitHook() { + def gitHooksDirectory = new File("$project.rootDir/.git/hooks/") + if (!gitHooksDirectory.exists()) gitHooksDirectory.mkdirs() + new File("$project.rootDir/.git/hooks", "pre-commit").text = """ + #!/bin/bash + echo "Running detekt check" + ./scripts/pre-commit.sh +""" + "chmod +x .git/hooks/pre-commit".execute() } diff --git a/scripts/pre-commit.sh b/scripts/pre-commit.sh new file mode 100755 index 00000000..14d24616 --- /dev/null +++ b/scripts/pre-commit.sh @@ -0,0 +1,3 @@ +#!/bin/bash +echo "Running detekt check" +./gradlew detekt \ No newline at end of file From 42fb69cb7d2e80b365eff9e75fd12d40cc06ab8c Mon Sep 17 00:00:00 2001 From: Atiqur Rahman Date: Mon, 11 Apr 2022 18:07:55 +0600 Subject: [PATCH 2/2] feat: add conventional-pre-commit hook --- detekt.gradle | 12 +++++++ scripts/conventional-pre-commit.sh | 51 ++++++++++++++++++++++++++++++ scripts/pre-commit.sh | 2 +- 3 files changed, 64 insertions(+), 1 deletion(-) create mode 100755 scripts/conventional-pre-commit.sh diff --git a/detekt.gradle b/detekt.gradle index 28637e5c..d1cd0f06 100644 --- a/detekt.gradle +++ b/detekt.gradle @@ -17,3 +17,15 @@ task createDetektPreCommitHook() { """ "chmod +x .git/hooks/pre-commit".execute() } + +task createConventionalMessagePreCommitHook() { + def gitHooksDirectory = new File("$project.rootDir/.git/hooks/") + if (!gitHooksDirectory.exists()) gitHooksDirectory.mkdirs() + new File("$project.rootDir/.git/hooks", "commit-msg").text = """ + #!/bin/bash + echo "Running Conventional Commit check" + commit_message="\$1" + ./scripts/conventional-pre-commit.sh "\$commit_message" +""" + "chmod +x .git/hooks/commit-msg".execute() +} diff --git a/scripts/conventional-pre-commit.sh b/scripts/conventional-pre-commit.sh new file mode 100755 index 00000000..f2d39bd1 --- /dev/null +++ b/scripts/conventional-pre-commit.sh @@ -0,0 +1,51 @@ +#!/usr/bin/env bash + +# list of Conventional Commits types +cc_types=("feat" "fix") +default_types=("build" "chore" "ci" "docs" "${cc_types[@]}" "perf" "refactor" "revert" "style" "test") +types=( "${cc_types[@]}" ) + +if [ $# -eq 1 ]; then + types=( "${default_types[@]}" ) +else + # assume all args but the last are types + while [ $# -gt 1 ]; do + types+=( "$1" ) + shift + done +fi + +# the commit message file is the last remaining arg +msg_file="$1" + +# join types with | to form regex ORs +r_types="($(IFS='|'; echo "${types[*]}"))" +# optional (scope) +r_scope="(\([[:alnum:] \/-]+\))?" +# optional breaking change indicator and colon delimiter +r_delim='!?:' +# subject line, body, footer +r_subject=" [[:alnum:]].+" +# the full regex pattern +pattern="^$r_types$r_scope$r_delim$r_subject$" + +# Check if commit is conventional commit +if grep -Eq "$pattern" "$msg_file"; then + exit 0 +fi + +echo "[Commit message] $( cat "$msg_file" )" +echo " +Your commit message does not follow Conventional Commits formatting +https://www.conventionalcommits.org/ +Conventional Commits start with one of the below types, followed by a colon, +followed by the commit message: + $(IFS=' '; echo "${types[*]}") +Example commit message adding a feature: + feat: implement new API +Example commit message fixing an issue: + fix: remove infinite loop +Optionally, include a scope in parentheses after the type for more context: + fix(account): remove infinite loop +" +exit 1 \ No newline at end of file diff --git a/scripts/pre-commit.sh b/scripts/pre-commit.sh index 14d24616..5f57afec 100755 --- a/scripts/pre-commit.sh +++ b/scripts/pre-commit.sh @@ -1,3 +1,3 @@ #!/bin/bash echo "Running detekt check" -./gradlew detekt \ No newline at end of file +./gradlew detekt