blob: 8b7c3ceabc3071de7c8961b38fe7b6b52cf016c0 [file] [log] [blame]
#!/bin/bash
# Copyright (c) 2018 Valve Corporation
# Copyright (c) 2018 LunarG, Inc.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Checks commit messages against project standards in CONTRIBUTING.md document
# Script to determine if commit messages in Pull Request are properly formatted.
# Exits with non 0 exit code if reformatting is needed.
# Disable subshells
shopt -s lastpipe
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m' # No Color
# TRAVIS_COMMIT_RANGE contains range of commits for this PR
# Get user-supplied commit message text for applicable commits and insert
# a unique separator string identifier. The git command returns ONLY the
# subject line and body for each of the commits.
TRAVIS_COMMIT_RANGE="${TRAVIS_COMMIT_RANGE/.../..}"
COMMIT_TEXT=$(git log ${TRAVIS_COMMIT_RANGE} --pretty=format:"XXXNEWLINEXXX"%n%B)
# Bail if there are none
if [ -z "${COMMIT_TEXT}" ]; then
echo -e "${GREEN}No commit messgages to check for formatting.${NC}"
exit 0
elif ! echo $TRAVIS_COMMIT_RANGE | grep -q "\.\.\."; then
echo -e "${GREEN}No commit messgages to check for formatting.${NC}"
exit 0
fi
# Process commit messages
success=1
current_line=0
prevline=""
# Process each line of the commit message output, resetting counter on separator
printf %s "$COMMIT_TEXT" | while IFS='' read -r line; do
# echo "Count = $current_line <Line> = $line"
current_line=$((current_line+1))
if [ "$line" = "XXXNEWLINEXXX" ]; then
current_line=0
fi
chars=${#line}
if [ $current_line -eq 1 ]; then
# Subject line should be 64 chars or less
if [ $chars -gt 64 ]; then
echo "The following subject line exceeds 64 characters in length."
echo " '$line'"
success=0
fi
i=$(($chars-1))
last_char=${line:$i:1}
# Output error if last char of subject line is not alpha-numeric
if [[ $last_char =~ [.,] ]]; then
echo "For the following commit, the last character of the subject line must not be a period or comma."
echo " '$line'"
success=0
fi
# Checking if subject line doesn't start with 'module: '
prefix=$(echo $line | cut -f1 -d " ")
if [ "${prefix: -1}" != ":" ]; then
echo "The following subject line must start with a single word specifying the functional area of the change, followed by a colon and space. I.e., 'layers: Subject line here'"
echo " '$line'"
success=0
fi
# Check if first character after the colon is lower-case
subject=$(echo $line | cut -f2 -d " ")
firstchar=$(echo ${subject} | cut -c 1)
if [[ "${firstchar}" =~ [a-z] ]]; then
echo "The first word of the subject line after the ':' character must be capitalized."
echo " '$line'"
success=0
fi
elif [ $current_line -eq 2 ]; then
# Commit message must have a blank line between subject and body
if [ $chars -ne 0 ]; then
echo "The following subject line must be followed by a blank line."
echo " '$prevline'"
success=0
fi
else
# Lines in a commit message body must be less than 72 characters in length (but give some slack)
if [ $chars -gt 76 ]; then
echo "The following commit message body line exceeds the 72 character limit."
echo "'$line\'"
success=0
fi
fi
prevline=$line
done
if [ $success -eq 1 ]; then
echo -e "${GREEN}All commit messages in pull request are properly formatted.${NC}"
exit 0
else
exit 1
fi