136 lines
3.1 KiB
Bash
136 lines
3.1 KiB
Bash
|
#!/bin/bash
|
||
|
#
|
||
|
# Copyright 2017 The Chromium OS Authors. All rights reserved.
|
||
|
# Use of this source code is governed by a BSD-style license that can be
|
||
|
# found in the LICENSE file.
|
||
|
|
||
|
#######################################
|
||
|
# Test if the following conditions hold for the ec host command
|
||
|
# The alpha numeric value of the define starts with 0x
|
||
|
# The alpha numeric value of the define is 4-hex digits
|
||
|
# The hex digits "A B C D E F" are capitalized
|
||
|
# Arguments:
|
||
|
# string - ec host command to check
|
||
|
# Returns:
|
||
|
# 0 if command is ok, else 1
|
||
|
########################################
|
||
|
check_cmd() {
|
||
|
IFS=" "
|
||
|
# Remove any tabs that may exist
|
||
|
tts=$(echo "$1" | sed 's/\t/ /g')
|
||
|
arr=( $tts )
|
||
|
|
||
|
# Check for 0x
|
||
|
if [[ "${arr[2]}" != 0x* ]]; then
|
||
|
return 1
|
||
|
fi
|
||
|
|
||
|
# Check that length is 6. 0x + 4 hex digits
|
||
|
if [[ ${#arr[2]} != 6 ]]; then
|
||
|
return 1
|
||
|
fi
|
||
|
|
||
|
# Check that hex digits are valid and uppercase
|
||
|
hd=${arr[2]:2}
|
||
|
if ! [[ $hd =~ ^[0-9A-F]{4}$ ]]; then
|
||
|
return 1
|
||
|
fi
|
||
|
|
||
|
# command is ok
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
#######################################
|
||
|
# Test if the string arg is in one of the following formats:
|
||
|
# file.X:#define EC_CMD_X XxXXXX
|
||
|
# file.X:#define EC_PRV_CMD_X XxXXXX
|
||
|
# Arguments:
|
||
|
# string - potential ec host command
|
||
|
# Returns:
|
||
|
# 0 if command is formated properly, else 1
|
||
|
########################################
|
||
|
should_check() {
|
||
|
IFS=" "
|
||
|
arr=( $1 )
|
||
|
|
||
|
# Check for file.X:#define
|
||
|
IFS=":"
|
||
|
temp=( ${arr[0]} )
|
||
|
# Check for file.X
|
||
|
if [ ! -f "${temp[0]}" ]; then
|
||
|
return 1
|
||
|
fi
|
||
|
|
||
|
# Check for #define
|
||
|
if [[ "${temp[1]}" != "#define" ]]; then
|
||
|
return 1
|
||
|
fi
|
||
|
|
||
|
# Check for EC_CMD_XXX or EC_PRV_CMD_XXX
|
||
|
if [[ "${arr[1]}" != EC_CMD_* ]] && [[ "${arr[1]}" != EC_PRV_CMD_* ]]; then
|
||
|
return 1
|
||
|
fi
|
||
|
|
||
|
# Check for EC_XXX_XXX(n)
|
||
|
if [[ "${arr[1]}" =~ ')'$ ]]; then
|
||
|
return 1
|
||
|
fi
|
||
|
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
main() {
|
||
|
|
||
|
# Do not run the check unless an EC_[xxx]CMD change is present.
|
||
|
if [[ -z "$(git diff "${PRESUBMIT_COMMIT}~" "${PRESUBMIT_COMMIT}" -U0 |
|
||
|
egrep 'EC_[^ ]*CMD')" ]]; then
|
||
|
exit 0
|
||
|
fi
|
||
|
|
||
|
ec_errors=()
|
||
|
ei=0
|
||
|
# Search all file occurrences of "EC_CMD" and store in array
|
||
|
IFS=$'\n'
|
||
|
ec_cmds=($(grep -r "EC_CMD"))
|
||
|
|
||
|
# Loop through and find valid occurrences of "EC_CMD" to check
|
||
|
length=${#ec_cmds[@]}
|
||
|
for ((i = 0; i != length; i++)); do
|
||
|
if should_check "${ec_cmds[i]}"; then
|
||
|
if ! check_cmd "${ec_cmds[i]}"; then
|
||
|
ec_errors[$ei]="${ec_cmds[i]}"
|
||
|
((ei++))
|
||
|
fi
|
||
|
fi
|
||
|
done
|
||
|
|
||
|
# Search all file occurrances of "EC_PRV_CMD" and store in array
|
||
|
IFS=$'\n'
|
||
|
ec_prv_cmds=($(grep -r "EC_PRV_CMD"))
|
||
|
|
||
|
# Loop through and find valid occurrences of "EC_PRV_CMD" to check
|
||
|
length=${#ec_prv_cmds[@]}
|
||
|
for ((i = 0; i != length; i++)); do
|
||
|
if should_check "${ec_prv_cmds[i]}"; then
|
||
|
if ! check_cmd "${ec_prv_cmds[i]}"; then
|
||
|
ec_errors[$ei]="${ec_prv_cmds[i]}"
|
||
|
((ei++))
|
||
|
fi
|
||
|
fi
|
||
|
done
|
||
|
|
||
|
# Check if any malformed ec host commands were found
|
||
|
if [ ! $ei -eq 0 ]; then
|
||
|
echo "The following host commands are malformed:"
|
||
|
# print all malformed host commands
|
||
|
for ((i = 0; i != ei; i++)); do
|
||
|
echo "FILE: ${ec_errors[i]}"
|
||
|
done
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
exit 0
|
||
|
}
|
||
|
|
||
|
main "$@"
|