#!/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 "$@"