You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
3.8 KiB
112 lines
3.8 KiB
#!/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
|