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