Skip to content

Commit 8f0c719

Browse files
author
Atiqur Rahman
committed
feat: add conventional-pre-commit hook
1 parent e3a2150 commit 8f0c719

File tree

3 files changed

+61
-1
lines changed

3 files changed

+61
-1
lines changed

detekt.gradle

+12
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,15 @@ task createDetektPreCommitHook() {
1717
"""
1818
"chmod +x .git/hooks/pre-commit".execute()
1919
}
20+
21+
task createConventionalMessagePreCommitHook() {
22+
def gitHooksDirectory = new File("$project.rootDir/.git/hooks/")
23+
if (!gitHooksDirectory.exists()) gitHooksDirectory.mkdirs()
24+
new File("$project.rootDir/.git/hooks", "commit-msg").text = """
25+
#!/bin/bash
26+
echo "Running Conventional Commit check"
27+
commit_message="\$1"
28+
./scripts/conventional-pre-commit.sh "\$commit_message"
29+
"""
30+
"chmod +x .git/hooks/commit-msg".execute()
31+
}

scripts/conventional-pre-commit.sh

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#!/usr/bin/env bash
2+
3+
# list of Conventional Commits types
4+
cc_types=("feat" "fix")
5+
default_types=("build" "chore" "ci" "docs" "${cc_types[@]}" "perf" "refactor" "revert" "style" "test")
6+
types=( "${cc_types[@]}" )
7+
8+
if [ $# -eq 1 ]; then
9+
types=( "${default_types[@]}" )
10+
else
11+
# assume all args but the last are types
12+
while [ $# -gt 1 ]; do
13+
types+=( "$1" )
14+
shift
15+
done
16+
fi
17+
18+
# the commit message file is the last remaining arg
19+
msg_file="$1"
20+
21+
commit_msg_type_regex='feat|fix|refactor|style|test|docs|build'
22+
commit_msg_scope_regex='.{1,20}'
23+
commit_msg_subject_regex='.{1,100}'
24+
commit_msg_regex="^(${commit_msg_type_regex})(\(${commit_msg_scope_regex}\))?: (${commit_msg_subject_regex})\$"
25+
merge_msg_regex="^Merge branch '.+'\$"
26+
27+
commit_msg_header=$(git show -s --format=%s $msg_file)
28+
29+
# Check if commit is conventional commit
30+
if ! [[ "$commit_msg_header" =~ (${commit_msg_regex})|(${merge_msg_regex}) ]]; then
31+
exit 0
32+
fi
33+
34+
echo "[Commit message] $( cat "$msg_file" )"
35+
echo "
36+
Your commit message does not follow Conventional Commits formatting
37+
https://www.conventionalcommits.org/
38+
Conventional Commits start with one of the below types, followed by a colon,
39+
followed by the commit message:
40+
$(IFS=' '; echo "${types[*]}")
41+
Example commit message adding a feature:
42+
feat: implement new API
43+
Example commit message fixing an issue:
44+
fix: remove infinite loop
45+
Optionally, include a scope in parentheses after the type for more context:
46+
fix(account): remove infinite loop
47+
"
48+
exit 1

scripts/pre-commit.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
#!/bin/bash
22
echo "Running detekt check"
3-
./gradlew detekt
3+
./gradlew detekt

0 commit comments

Comments
 (0)