mutter/.gitlab-ci/check-commit-log.sh
Jonas Ådahl 815ed52ca1 ci: Wait for review stage before continuing
If review fails, it'll fail very early in the pipeline, but we won't see
the test case failure until the whole pipeline succeeds, which might be
10 minutes later.

To avoid sitting there wondering why it failed, let the time consuming
jobs wait until the review stage, which tends to take less than 20
seconds, succeeds. This way the review test result will be presented
earlier.

This changes the pipeline to run the check-commit-log job also for
non-merge requests, with the difference being that it will pass
immediately if it's not a merge request.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1549>
2020-11-16 14:13:07 +01:00

122 lines
3.7 KiB
Bash
Executable File

#!/usr/bin/env bash
if [ -z "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" ]; then
echo This is not a merge request, skipping
exit 0
fi
git fetch $CI_MERGE_REQUEST_PROJECT_URL.git $CI_MERGE_REQUEST_TARGET_BRANCH_NAME
branch_point=$(git merge-base HEAD FETCH_HEAD)
commits=$(git log --format='format:%H' $branch_point..$CI_COMMIT_SHA)
if [ -z "$commits" ]; then
echo Commit range empty
exit 1
fi
function commit_message_has_mr_url() {
commit=$1
commit_message=$(git show -s --format='format:%b' $commit)
echo "$commit_message" | grep -qe "^$CI_MERGE_REQUEST_PROJECT_URL\/\(-\/\)\?merge_requests\/$CI_MERGE_REQUEST_IID$"
return $?
}
JUNIT_REPORT_TESTS_FILE=$(mktemp)
function append_failed_test_case() {
test_name="$1"
commit="$2"
test_message="$3"
commit_short=${commit:0:8}
echo "<testcase name=\"$test_name: $commit_short\"><failure message=\"$commit_short: $test_message\"/></testcase>" >> $JUNIT_REPORT_TESTS_FILE
echo &>2 "Commit check failed: $commit_short: $test_message"
}
function append_passed_test_case() {
test_name="$1"
commit="$2"
commit_short=${commit:0:8}
echo "<testcase name=\"$test_name: $commit_short\"></testcase>" >> $JUNIT_REPORT_TESTS_FILE
}
function generate_junit_report() {
junit_report_file="$1"
num_tests=$(cat "$JUNIT_REPORT_TESTS_FILE" | wc -l)
num_failures=$(grep '<failure />' "$JUNIT_REPORT_TESTS_FILE" | wc -l )
echo Generating JUnit report \"$(pwd)/$junit_report_file\" with $num_tests tests and $num_failures failures.
cat > $junit_report_file << __EOF__
<?xml version="1.0" encoding="utf-8"?>
<testsuites tests="$num_tests" errors="0" failures="$num_failures">
<testsuite name="commit-review" tests="$num_tests" errors="0" failures="$num_failures" skipped="0">
$(< $JUNIT_REPORT_TESTS_FILE)
</testsuite>
</testsuites>
__EOF__
}
function check_commit_message_subject() {
commit=$1
commit_message_subject=$(git show -s --format='format:%s' $commit)
if echo "$commit_message_subject" | grep -qe "\(^meta-\|^Meta\)"; then
append_failed_test_case meta-prefix $commit \
"Commit message subject should not be prefixed with 'meta-' or 'Meta'"
else
append_passed_test_case meta-prefix $commit
fi
if echo "$commit_message_subject" | grep -qe "\(^clutter-\|^Clutter\)"; then
append_failed_test_case clutter-prefix $commit \
"Commit message subject should not be prefixed with 'clutter-' or 'Clutter', use 'clutter/' instead"
else
append_passed_test_case clutter-prefix $commit
fi
if echo "$commit_message_subject" | grep -qe "\(^cogl-\|^Cogl\)"; then
append_failed_test_case cogl-prefix $commit \
"Commit message subject should not be prefixed with 'cogl-' or 'Cogl', use 'cogl/' instead"
else
append_passed_test_case cogl-prefix $commit
fi
if echo "$commit_message_subject" | sed -e 's/^[^:]\+: //' | grep -qe '^[[:lower:]]'; then
append_failed_test_case capitalization $commit \
"Commit message subject should be properly Capitalized. E.g. 'window: Marginalize extradicity'"
else
append_passed_test_case capitalization $commit
fi
if echo "$commit_message_subject" | grep -qe "\.[ch]:"; then
append_failed_test_case not-file-suffix $commit \
"Commit message subject prefix should not include .c, .h, etc."
else
append_passed_test_case not-file-suffix $commit
fi
return 0
}
RET=0
for commit in $commits; do
if commit_message_has_mr_url $commit; then
append_failed_test_case superfluous_url $commit \
"Commit message must not contain a link to its own merge request"
else
append_passed_test_case superfluous_url $commit
fi
check_commit_message_subject $commit
done
generate_junit_report commit-message-junit-report.xml
! grep -q '<failure' commit-message-junit-report.xml
exit $?