1cb93a386Sopenharmony_ci#!/bin/bash 2cb93a386Sopenharmony_ci 3cb93a386Sopenharmony_ciROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}")"/.. >/dev/null 2>&1 && pwd )" 4cb93a386Sopenharmony_ciSRC_DIR=${ROOT_DIR}/src 5cb93a386Sopenharmony_ciTESTS_DIR=${ROOT_DIR}/tests 6cb93a386Sopenharmony_ci 7cb93a386Sopenharmony_ci# Presubmit Checks Script. 8cb93a386Sopenharmony_ciCLANG_FORMAT=${CLANG_FORMAT:-clang-format} 9cb93a386Sopenharmony_ciGOFMT=${GOFMT:-gofmt} 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ciif test -t 1; then 12cb93a386Sopenharmony_ci ncolors=$(tput colors) 13cb93a386Sopenharmony_ci if test -n "$ncolors" && test $ncolors -ge 8; then 14cb93a386Sopenharmony_ci normal="$(tput sgr0)" 15cb93a386Sopenharmony_ci red="$(tput setaf 1)" 16cb93a386Sopenharmony_ci green="$(tput setaf 2)" 17cb93a386Sopenharmony_ci fi 18cb93a386Sopenharmony_cifi 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_cifunction check() { 21cb93a386Sopenharmony_ci local name=$1; shift 22cb93a386Sopenharmony_ci echo -n "Running check $name... " 23cb93a386Sopenharmony_ci 24cb93a386Sopenharmony_ci if ! "$@"; then 25cb93a386Sopenharmony_ci echo "${red}FAILED${normal}" 26cb93a386Sopenharmony_ci echo " Error executing: $@"; 27cb93a386Sopenharmony_ci exit 1 28cb93a386Sopenharmony_ci fi 29cb93a386Sopenharmony_ci 30cb93a386Sopenharmony_ci if ! git diff --quiet HEAD; then 31cb93a386Sopenharmony_ci echo "${red}FAILED${normal}" 32cb93a386Sopenharmony_ci echo " Git workspace not clean:" 33cb93a386Sopenharmony_ci git --no-pager diff -p HEAD 34cb93a386Sopenharmony_ci echo "${red}Check $name failed.${normal}" 35cb93a386Sopenharmony_ci exit 1 36cb93a386Sopenharmony_ci fi 37cb93a386Sopenharmony_ci 38cb93a386Sopenharmony_ci echo "${green}OK${normal}" 39cb93a386Sopenharmony_ci} 40cb93a386Sopenharmony_ci 41cb93a386Sopenharmony_ci# Validate commit message 42cb93a386Sopenharmony_cifunction run_bug_in_commit_msg() { 43cb93a386Sopenharmony_ci git log -1 --pretty=%B | grep -E '^(Bug|Issue|Fixes):(\s?)(((b\/)|(\w+:))([0-9]+)|[^0-9]+)$|(^Regres:)|(^PiperOrigin-RevId:)' 44cb93a386Sopenharmony_ci 45cb93a386Sopenharmony_ci if [ $? -ne 0 ] 46cb93a386Sopenharmony_ci then 47cb93a386Sopenharmony_ci echo "${red}Git commit message must have a Bug: line" 48cb93a386Sopenharmony_ci echo "followed by a bug ID in the form b/# for Buganizer bugs or" 49cb93a386Sopenharmony_ci echo "project:# for Monorail bugs (e.g. 'Bug: chromium:123' or 'Bug: fuchsia:123')." 50cb93a386Sopenharmony_ci echo "Omit any digits when no ID is required (e.g. 'Bug: fix build').${normal}" 51cb93a386Sopenharmony_ci return 1 52cb93a386Sopenharmony_ci fi 53cb93a386Sopenharmony_ci} 54cb93a386Sopenharmony_ci 55cb93a386Sopenharmony_cifunction run_copyright_headers() { 56cb93a386Sopenharmony_ci tmpfile=`mktemp` 57cb93a386Sopenharmony_ci for suffix in "cpp" "hpp" "go" "h"; do 58cb93a386Sopenharmony_ci # Grep flag '-L' print files that DO NOT match the copyright regex 59cb93a386Sopenharmony_ci # Grep seems to match "(standard input)", filter this out in the for loop output 60cb93a386Sopenharmony_ci find ${SRC_DIR} -type f -name "*.${suffix}" | xargs grep -L "Copyright .* The SwiftShader Authors\|Microsoft Visual C++ generated\|GNU Bison" 61cb93a386Sopenharmony_ci done | grep -v "(standard input)" > ${tmpfile} 62cb93a386Sopenharmony_ci if test -s ${tmpfile}; then 63cb93a386Sopenharmony_ci # tempfile is NOT empty 64cb93a386Sopenharmony_ci echo "${red}Copyright issue in these files:" 65cb93a386Sopenharmony_ci cat ${tmpfile} 66cb93a386Sopenharmony_ci rm ${tmpfile} 67cb93a386Sopenharmony_ci echo "${normal}" 68cb93a386Sopenharmony_ci return 1 69cb93a386Sopenharmony_ci else 70cb93a386Sopenharmony_ci rm ${tmpfile} 71cb93a386Sopenharmony_ci return 0 72cb93a386Sopenharmony_ci fi 73cb93a386Sopenharmony_ci} 74cb93a386Sopenharmony_ci 75cb93a386Sopenharmony_cifunction run_clang_format() { 76cb93a386Sopenharmony_ci ${SRC_DIR}/clang-format-all.sh 77cb93a386Sopenharmony_ci} 78cb93a386Sopenharmony_ci 79cb93a386Sopenharmony_cifunction run_gofmt() { 80cb93a386Sopenharmony_ci find ${SRC_DIR} ${TESTS_DIR} -name "*.go" | xargs $GOFMT -w 81cb93a386Sopenharmony_ci} 82cb93a386Sopenharmony_ci 83cb93a386Sopenharmony_cifunction run_check_build_files() { 84cb93a386Sopenharmony_ci go run ${TESTS_DIR}/check_build_files/main.go --root="${ROOT_DIR}" 85cb93a386Sopenharmony_ci} 86cb93a386Sopenharmony_ci 87cb93a386Sopenharmony_cifunction run_scan_sources() { 88cb93a386Sopenharmony_ci python3 ${TESTS_DIR}/scan_sources/main.py ${SRC_DIR} 89cb93a386Sopenharmony_ci} 90cb93a386Sopenharmony_ci 91cb93a386Sopenharmony_ci# Ensure we are clean to start out with. 92cb93a386Sopenharmony_cicheck "git workspace must be clean" true 93cb93a386Sopenharmony_ci 94cb93a386Sopenharmony_ci# Check for 'Bug: ' line in commit 95cb93a386Sopenharmony_cicheck bug-in-commi-msg run_bug_in_commit_msg 96cb93a386Sopenharmony_ci 97cb93a386Sopenharmony_ci# Check copyright headers 98cb93a386Sopenharmony_cicheck copyright-headers run_copyright_headers 99cb93a386Sopenharmony_ci 100cb93a386Sopenharmony_ci# Check clang-format. 101cb93a386Sopenharmony_cicheck clang-format run_clang_format 102cb93a386Sopenharmony_ci 103cb93a386Sopenharmony_ci# Check gofmt. 104cb93a386Sopenharmony_cicheck gofmt run_gofmt 105cb93a386Sopenharmony_ci 106cb93a386Sopenharmony_ci# Check build files. 107cb93a386Sopenharmony_cicheck "build files don't reference non-existent files" run_check_build_files 108cb93a386Sopenharmony_ci 109cb93a386Sopenharmony_ci# Check source files. 110cb93a386Sopenharmony_cicheck scan_sources run_scan_sources 111cb93a386Sopenharmony_ci 112cb93a386Sopenharmony_ciecho 113cb93a386Sopenharmony_ciecho "${green}All check completed successfully.${normal}" 114