test-commit-message runs on PR, but also on push in other branches which aren't PRs. We need to test those too. This is fixed by ensuring the same kind of behaviour than travis CI: When a patch is put on a branch, it's using the branchname for testing [1]. [1]: https://docs-staging.travis-ci.com/user/environment-variables/#default-environment-variables
146 lines
4.7 KiB
Bash
Executable File
146 lines
4.7 KiB
Bash
Executable File
#!/bin/bash -e
|
|
# tests if commit message conforms to convention
|
|
|
|
# library of utility functions
|
|
# shellcheck disable=SC1091
|
|
. test/util.sh
|
|
|
|
echo running "$0"
|
|
|
|
ROOT=$(dirname "${BASH_SOURCE}")/..
|
|
cd "${ROOT}" || exit 1
|
|
|
|
commit_title_regex='^\([a-z0-9]\(\(, \)\|[a-z0-9]\)\+[a-z0-9]: \)\+[A-Z0-9][^:]\+[^:.]$'
|
|
|
|
# Testing the regex itself.
|
|
|
|
# Correct patterns.
|
|
[[ $(echo "foo, bar: Bar" | grep -c "$commit_title_regex") -eq 1 ]]
|
|
[[ $(echo "foo: Bar" | grep -c "$commit_title_regex") -eq 1 ]]
|
|
[[ $(echo "f1oo, b2ar: Bar" | grep -c "$commit_title_regex") -eq 1 ]]
|
|
[[ $(echo "2foo: Bar" | grep -c "$commit_title_regex") -eq 1 ]]
|
|
[[ $(echo "foo: bar: Barfoo" | grep -c "$commit_title_regex") -eq 1 ]]
|
|
[[ $(echo "foo: bar, foo: Barfoo" | grep -c "$commit_title_regex") -eq 1 ]]
|
|
[[ $(echo "foo: bar, foo: Barfoo" | grep -c "$commit_title_regex") -eq 1 ]]
|
|
[[ $(echo "resources: augeas: New resource" | grep -c "$commit_title_regex") -eq 1 ]]
|
|
|
|
# Space required after :
|
|
[[ $(echo "foo:bar" | grep -c "$commit_title_regex") -eq 0 ]]
|
|
|
|
# First char must be a a-z0-9
|
|
[[ $(echo ", bar: bar" | grep -c "$commit_title_regex") -eq 0 ]]
|
|
|
|
# Last char before : must be a a-z0-9
|
|
[[ $(echo "foo, : bar" | grep -c "$commit_title_regex") -eq 0 ]]
|
|
|
|
# Last char before : must be a a-z0-9
|
|
[[ $(echo "foo,: bar" | grep -c "$commit_title_regex") -eq 0 ]]
|
|
|
|
# No caps
|
|
[[ $(echo "Foo: bar" | grep -c "$commit_title_regex") -eq 0 ]]
|
|
|
|
# No dot at the end of the message.
|
|
[[ $(echo "foo: bar." | grep -c "$commit_title_regex") -eq 0 ]]
|
|
|
|
# Capitalize the first word after :
|
|
[[ $(echo "foo: bar" | grep -c "$commit_title_regex") -eq 0 ]]
|
|
|
|
# More than one char is required before :
|
|
[[ $(echo "a: bar" | grep -c "$commit_title_regex") -eq 0 ]]
|
|
|
|
# Run checks agains multiple :.
|
|
[[ $(echo "a: bar:" | grep -c "$commit_title_regex") -eq 0 ]]
|
|
[[ $(echo "a: bar, fooX: Barfoo" | grep -c "$commit_title_regex") -eq 0 ]]
|
|
[[ $(echo "a: bar, foo: barfoo foo: Nope" | grep -c "$commit_title_regex") -eq 0 ]]
|
|
[[ $(echo "nope a: bar, foo: barfoofoo: Nope" | grep -c "$commit_title_regex") -eq 0 ]]
|
|
|
|
test_commit_message() {
|
|
echo "Testing commit message $1"
|
|
if ! git log --format=%s $1 | head -n 1 | grep -q "$commit_title_regex"
|
|
then
|
|
echo "FAIL: Commit message should match the following regex: '$commit_title_regex'"
|
|
echo
|
|
echo "eg:"
|
|
echo "prometheus: Implement rest api"
|
|
echo "resources: svc: Fix a race condition with reloads"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
test_commit_message_common_bugs() {
|
|
echo "Testing commit message for common bugs $1"
|
|
if git log --format=%s $1 | head -n 1 | grep -q "^resource:"
|
|
then
|
|
echo 'FAIL: Commit message starts with `resource:`, did you mean `engine: resources:` ?'
|
|
exit 1
|
|
fi
|
|
if git log --format=%s $1 | head -n 1 | grep -q "^resources:"
|
|
then
|
|
echo 'FAIL: Commit message starts with `resources:`, did you mean `engine: resources:` ?'
|
|
exit 1
|
|
fi
|
|
if git log --format=%s $1 | head -n 1 | grep -q "^engine: resource:"
|
|
then
|
|
echo 'FAIL: Commit message starts with `engine: resource:`, did you mean `engine: resources:` ?'
|
|
exit 1
|
|
fi
|
|
if git log --format=%s $1 | head -n 1 | grep -q "^tests:"
|
|
then
|
|
echo 'FAIL: Commit message starts with `tests:`, did you mean `test:` ?'
|
|
exit 1
|
|
fi
|
|
if git log --format=%s $1 | head -n 1 | grep -q "^doc:"
|
|
then
|
|
echo 'FAIL: Commit message starts with `doc:`, did you mean `docs:` ?'
|
|
exit 1
|
|
fi
|
|
if git log --format=%s $1 | head -n 1 | grep -q "^example:"
|
|
then
|
|
echo 'FAIL: Commit message starts with `example:`, did you mean `examples:` ?'
|
|
exit 1
|
|
fi
|
|
if git log --format=%s $1 | head -n 1 | grep -q "^language:"
|
|
then
|
|
echo 'FAIL: Commit message starts with `language:`, did you mean `lang:` ?'
|
|
exit 1
|
|
fi
|
|
if git log --format=%s $1 | head -n 1 | grep -q "^lang: func:"
|
|
then
|
|
echo 'FAIL: Commit message starts with `lang: func:`, did you mean `lang: funcs:` ?'
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
if [[ -n "$TRAVIS_PULL_REQUEST_SHA" ]]
|
|
then
|
|
commits=$(git log --format=%H origin/${TRAVIS_BRANCH}..${TRAVIS_PULL_REQUEST_SHA})
|
|
[[ -n "$commits" ]]
|
|
|
|
for commit in $commits
|
|
do
|
|
test_commit_message $commit
|
|
test_commit_message_common_bugs $commit
|
|
done
|
|
elif [[ -n "$GITHUB_SHA" ]]
|
|
then
|
|
# GITHUB_SHA is the HEAD of the branch
|
|
# GITHUB_REF: The branch or tag ref that triggered the workflow. For example, refs/heads/feature-branch-1. If neither a branch or tag is available for the event type, the variable will not exist.
|
|
# GITHUB_BASE_REF: Only set for pull request events. The name of the base branch.
|
|
if [[ -n "${GITHUB_BASE_REF}" ]]; then
|
|
ref=${GITHUB_BASE_REF}
|
|
head=${GITHUB_SHA}
|
|
else
|
|
ref=$(echo $GITHUB_REF | awk 'BEGIN { FS = "/" } ; { print $3 }')
|
|
head=""
|
|
fi
|
|
commits=$(git log --no-merges --format=%H origin/${ref}..${head})
|
|
[[ -n "$commits" ]]
|
|
|
|
for commit in $commits
|
|
do
|
|
test_commit_message $commit
|
|
test_commit_message_common_bugs $commit
|
|
done
|
|
fi
|
|
echo 'PASS'
|