coverity: supports long commands and upload stream [1/1]

PD#SWPL-64962

Problem:
check_coverity bash can not compile with long cmd.

Solution:
bash supports long commands and upload stream.

Verify:
sc2_ah212

Change-Id: I48b386ec86c6b363dbde6a4c6168100988f30503
Signed-off-by: dongqing.li <dongqing.li@amlogic.com>
diff --git a/check_coverity.sh b/check_coverity.sh
index 5a70b6a..0bfee97 100755
--- a/check_coverity.sh
+++ b/check_coverity.sh
@@ -1,8 +1,13 @@
 #!/bin/bash
 #
-#  author: dongqing.li@amlogic.com
-#  2021.11.22 v1.0 init.
-#
+#  =============================================================================
+#  @Module:     BootLoader coverity check
+#  @Author:     Li Dongqing  (dongqing.li@amlogic.com)
+#  @License:    Copyright (c) 2019 Amlogic, Inc. All rights reserved.
+#  @Changes:
+#               1. 2021.11.22 v0.1 - Create bash check_coverity.
+#               2. 2022.09.29 v0.2 - Support run long command
+#  =============================================================================
 
 #############
 # function
@@ -13,9 +18,11 @@
 COV_IM_DIR="./cov-imdir"
 COV_RESULT_HTML="./result-html"
 HIGH_LEVEL="0"
-PATTERN_PATH=""
+DIR_FILTER=""
 PATTERN_ENABLE="0"
 IS_CMD_STRING=0
+RUN_BASH=""
+MANUAL_RUN_FLAG=0
 
 #############
 # function
@@ -27,9 +34,7 @@
 }
 
 function check_cov_path() {
-	echo ""
-	echo "check_cov_path: ${MKPATH}"
-	echo ""
+	echo "[run cov path] : ${MKPATH}"
 	if [ -d "${COV_IM_DIR}" ]; then
 		rm -rf ${COV_IM_DIR}
 	fi
@@ -39,9 +44,25 @@
 	fi
 }
 
+function check_cov_build_version() {
+	COV_CONFIG=`cov-build --help | grep 'Task Reference' -c`
+	if [ "${COV_CONFIG}" = "0" ]; then
+		echo
+		echo -e "\e[1;35m Run cov-build error! Please check: \e[0m"
+		echo "  1.is installed ? if not, call IT. (/proj/coverity/cov-analysis-linux64-2021.12.0/bin)"
+		echo "  2.in PATH env ? if not, export it.(export PATH=/proj/coverity/cov-analysis-linux64-2021.12.0/bin/:$PATH)"
+		echo
+		exit 0
+	else
+		COV_VERSION=`cov-build --help | grep 'Task Reference' | awk '{print $2}'`
+		echo "check_cov_version:   ${COV_VERSION}"
+	fi
+}
+
 function run_coverity() {
 	echo ""
 	echo -e "\e[1;35m[1] run cov-build: $@ \e[0m"
+	check_cov_build_version
 	cov-build --dir ${COV_IM_DIR} $@ || err_exit "cov-build error."
 	echo -e "\e[1;35m[1] run cov-build OK. \e[0m"
 }
@@ -50,14 +71,14 @@
 	echo ""
 	echo -e "\e[1;35m[2] run cov-analyze ... \e[0m"
 	if [ ${HIGH_LEVEL} = "1" ]; then
-        	if [ "${PATTERN_ENABLE}" = "1" ];then
-			cov-analyze --dir ${COV_IM_DIR} --strip-path $MKPATH --all --aggressiveness-level high --fb-max-mem 3072 --tu-pattern "file('/${PATTERN_PATH}')" || err_exit "cov-analyze high level error."
-        	else
+        if [ "${PATTERN_ENABLE}" = "1" ];then
+			cov-analyze --dir ${COV_IM_DIR} --strip-path $MKPATH --all --aggressiveness-level high --fb-max-mem 3072 --tu-pattern "file('/${DIR_FILTER}')" || err_exit "cov-analyze high level error."
+        else
 			cov-analyze --dir ${COV_IM_DIR} --strip-path $MKPATH --all --aggressiveness-level high --fb-max-mem 3072 || err_exit "cov-analyze high level error."
 		fi
 	else
 		if [ "${PATTERN_ENABLE}" = "1" ];then
-			cov-analyze --dir ${COV_IM_DIR} --strip-path $MKPATH --all  --tu-pattern "file('/${PATTERN_PATH}')" || err_exit "cov-analyze normal level error."
+			cov-analyze --dir ${COV_IM_DIR} --strip-path $MKPATH --all  --tu-pattern "file('/${DIR_FILTER}')" || err_exit "cov-analyze normal level error."
 		else
 			cov-analyze --dir ${COV_IM_DIR} --strip-path $MKPATH --all  || err_exit "cov-analyze normal level error."
 		fi
@@ -70,6 +91,25 @@
 	echo -e "\e[1;35m[3] run cov-format-errors OK. \e[0m"
 	echo "end."
 
+	# show coverity result info
+	show_coverity_result
+
+	if [ "${COVERITY_PUSH}" = "1" ]; then
+		echo ""
+		echo -e "\e[1;35m[4] run cov-commit-defects ... \e[0m"
+		if [ -z ${COVERITY_KEY} -o -z ${COVERITY_STREAM} ]; then
+			echo -e "\e[1;35m[4] --key or --stream is not set, push stream exit ! \e[0m"
+		else
+			cov-commit-defects --dir ${COV_IM_DIR} --auth-key-file ${COVERITY_KEY} --host 10.18.11.122 --stream ${COVERITY_STREAM} --noxrefs || err_exit "cov-format-errors error."
+			echo -e "\e[1;35m[4] run cov-commit-defects OK. \e[0m"
+			echo ""
+			echo -e "\e[1;35m[snapshot-result] \e[0m"
+			echo "you can view the result with the [New snapshot ID] above on coverity server!"
+			echo "path: http://10.18.11.122:8080/ -> choose projects -> choose SNAPSHOTS(ALL in Project) -> choose ID"
+			echo " "
+		fi
+	fi
+
 	rm -rf ${COV_IM_DIR}
 }
 
@@ -87,15 +127,15 @@
 function check_coverity() {
 
 	MK_ARGV=$@
-	if [ -z "${PATTERN_PATH}" ];then
-		echo "pattern_path not set, ignore. "
+	if [ -z "${DIR_FILTER}" ];then
+		echo "DIR_FILTER not set, ignore. "
 		PATTERN_ENABLE="0"
 	else
-		if [ -e "./${PATTERN_PATH}" ];then
-			echo "PATTERN_PATH set ok: ${PATTERN_PATH}"
+		if [ -e "./${DIR_FILTER}" ];then
+			echo "DIR_FILTER set ok: ${DIR_FILTER}"
 			PATTERN_ENABLE="1"
 		else
-			echo "PATTERN_PATH invalid, ingore."
+			echo "DIR_FILTER invalid, ingore."
 			PATTERN_ENABLE="2"
 		fi
 	fi
@@ -117,7 +157,7 @@
 		NEW_ARGV=`echo "${MK_ARGV//--cov/ }"`
 	fi
 	if [ "PATTERN_ENABLE" != "0" ];then
-		NEW_ARGV=`echo "${NEW_ARGV//${PATTERN_PATH}/ }"`
+		NEW_ARGV=`echo "${NEW_ARGV//${DIR_FILTER}/ }"`
 	fi
 	echo "coverity new command  : ./mk ${NEW_ARGV}"
 	MKPATH=`pwd -P`
@@ -132,9 +172,6 @@
 
 	# analysis coverity
 	analysis_coverity
-
-	# show coverity result info
-	show_coverity_result
 }
 
 #############
@@ -196,24 +233,32 @@
 }
 
 function show_help() {
-
+	echo
 	echo -e "\e[1;35m [usage] \e[0m"
-	echo "    /path/to/bootloader/fip/`basename $0` -c [cmd_string] -p [pattern_path] -t"
-	echo ""
+	echo "    ./check_coverity.sh -c '[cmd_string]'"
+	echo
 	echo -e "\e[1;35m [option] \e[0m"
-	echo "    -c : cmd string, eg: ./check.sh "
-	echo "    -p : detect path, only output errors in this path."
-	echo "    -t : top level mode, could detect more errors."
+	echo "    -c : set cmd string, eg: './check.sh' or './mk sc2_ah212 --avb'"
+	echo "    -d : set dir filter, eg: 'plat/t3/'(relative path, no prefix './')"
+	echo "    -t : set top level mode, could detect more errors."
+	echo "    -k : set coverity key, must be used with '-p'"
+	echo "    -s : set coverity stream, must be used with '-p'"
+	echo "    -p : push coverity result to cov server."
 	echo "    -h : show help"
-	echo ""
+	echo
 	echo -e "\e[1;35m [example] \e[0m"
-	echo "    1) In path [bl2/core]:"
-	echo "    	/path/to/bootloader/fip/`basename $0` -c bl2_core"
-	echo "    2) In path [bl2/src] [bl2/ree] [bl2/tee] [bl31_1.3/src] [bl32_3.8/src]:"
-	echo "    	/path/to/bootloader/fip/`basename $0` -c ./check.sh"
-	echo "    3) In path [bl33/v2015] [bl33/v2019]:"
-	echo "    	/path/to/bootloader/fip/`basename $0` -c ./check_compile.sh"
-	echo ""
+	echo "    1) run coverity with compile cmd"
+	echo "       cd bl2/core; ../../fip/check_coverity.sh -c './mk sc2 --dsto'"
+	echo "       cd bl2/core; ../../fip/check_coverity.sh -c './mk sc2 --dsto' -d plat/sc2/"
+	echo "    2) quick for [bl2/core]:"
+	echo "       bash /path/to/fip/check_coverity.sh  -c  bl2_core"
+	echo "    3) quick for [bl2/src] [bl2/ree] [bl2/tee] [bl31_1.3/src] [bl32_3.8/src]:"
+	echo "       bash /path/to/fip/check_coverity.sh  -c  ./check.sh"
+	echo "    4) quick for [bl33/v2015] [bl33/v2019]:"
+	echo "       bash /path/to/fip/check_coverity.sh  -c  ./check_compile.sh"
+	echo "    5) run coverity and push result to cov server"
+	echo "       bash /path/to/fip/check_coverity.sh  -c  './mk sc2' -k /path/to/user.key -s bootloader-amlogic-dev-bl2-core -p"
+	echo
 	return
 }
 
@@ -221,42 +266,24 @@
 # main
 #############
 function main() {
-	if [[ "$0" =~ "coverity" ]]; then
-		echo "cmd string: $0 $@"
-		if [ $# -lt 1 ]; then
-			show_help
-		fi
-	else
-		return
+	echo
+	echo "[shell   name] : $RUN_BASH"
+	echo "[compile  cmd] : $CMD_STRING"
+	if [ ! -z "${DIR_FILTER}" ]; then
+		echo "[pattern path] : $DIR_FILTER"
 	fi
 
-	while getopts c:C:p:P:t:T:hH opt; do
-			case ${opt} in
-			c|C)
-					CMD_STRING=${OPTARG}
-					IS_CMD_STRING=1
-					;;
-			p|P)
-					PATTERN_PATH=${OPTARG}
-					;;
-			t|T)
-					HIGH_LEVEL="1"
-					;;
-			h|H)
-					show_help
-					;;
-			*)
-					show_help
-					;;
-			esac
-	done
+	if [ "${COVERITY_PUSH}" = "1" ]; then
+		echo "[coverity keynum] : $COVERITY_KEY"
+		echo "[coverity stream] : $COVERITY_STREAM"
+	fi
 
 	if [ $IS_CMD_STRING -eq 1 ]; then
 		# check coverity path
 		check_cov_path
 
 		# run_coverity
-		if [ ${CMD_STRING} = "bl2_core" ]; then
+		if [[ "${CMD_STRING}" = "bl2_core" ]]; then
 			run_cov_for_bl2_core
 		else
 			run_coverity ${CMD_STRING}
@@ -264,14 +291,73 @@
 
 		# analysis coverity
 		analysis_coverity
-
-		# show coverity result path
-		show_coverity_result
 	fi
+
+	return
 }
 
 #
 # start here.
 #
 MKPATH=`pwd -P`
-main $@
+
+if [[ "$0" =~ "check_coverity" ]]; then
+	RUN_BASH="$0"
+	if [ $# -gt 0 ]; then
+		MANUAL_RUN_FLAG=1
+	fi
+fi
+
+if [ ${MANUAL_RUN_FLAG} -eq 1 ]; then
+	ARGS=$(getopt -o d:k:s:pth -a -l c:,d:,k:,s:pth -n "check_coverity.sh" -- "$@")
+	if [ $? != 0 ]; then
+		exit 0
+	fi
+
+	eval set -- "$ARGS"
+	while true
+	do
+		case "$1" in
+		-c | --c | --cmd)
+			CMD_STRING="$2"
+			IS_CMD_STRING=1
+			shift 2
+			;;
+		-d | --dir)
+			DIR_FILTER="$2"
+			if [ -e "./${DIR_FILTER}" ];then
+				PATTERN_ENABLE="1"
+			else
+				PATTERN_ENABLE="2"
+			fi
+			shift 2
+			;;
+		-t | --top)
+			HIGH_LEVEL="1"
+			shift
+			;;
+		-k | --key)
+			COVERITY_KEY="$2"
+			shift 2
+			;;
+		-s | --stream)
+			COVERITY_STREAM="$2"
+			shift 2
+			;;
+		-p | --push)
+			COVERITY_PUSH="1"
+			shift
+			;;
+		-h | --help)
+			show_help
+			exit 0
+			;;
+		--)
+			shift
+			break
+			;;
+		esac
+	done
+
+	main
+fi