Files
mgmt/test/test-commit-message.sh
Jean-Philippe Evrard 636248ad67 test: Ensure branches are also testable
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
2021-03-03 09:52:49 +01:00

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'