| #!/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 |