xref: /rkbin/scripts/checkpatch.sh (revision f3572ad96620d709b8936f3495065130fd8bd667)
124a8c2d6SJoseph Chen#!/bin/bash
224a8c2d6SJoseph Chenset -e
324a8c2d6SJoseph Chen
4*f3572ad9SJoseph ChenDIFF_DOC_ALL="scripts/.diff_all.txt"
5*f3572ad9SJoseph ChenDIFF_DOC_FIXED="scripts/.diff_fixed.txt"
6*f3572ad9SJoseph Chen
7*f3572ad9SJoseph Chenfunction check_doc()
8*f3572ad9SJoseph Chen{
9*f3572ad9SJoseph Chen	local TOP_SEVERITY LANGUAGE=$1
10*f3572ad9SJoseph Chen
11*f3572ad9SJoseph Chen	if [ "${LANGUAGE}" == "EN" ] ; then
12*f3572ad9SJoseph Chen		SVT_CRITIAL="critical"
13*f3572ad9SJoseph Chen		SVT_IMPORTANT="important"
14*f3572ad9SJoseph Chen		SVT_MODERATE="moderate"
15*f3572ad9SJoseph Chen		DOC=`git log -1 --name-only | sed -n "/_EN\.md/p"`
16*f3572ad9SJoseph Chen	else
17*f3572ad9SJoseph Chen		SVT_CRITIAL="紧急"
18*f3572ad9SJoseph Chen		SVT_IMPORTANT="重要"
19*f3572ad9SJoseph Chen		SVT_MODERATE="普通"
20*f3572ad9SJoseph Chen		DOC=`git log -1 --name-only | sed -n "/_CN\.md/p"`
21*f3572ad9SJoseph Chen	fi
22*f3572ad9SJoseph Chen
23*f3572ad9SJoseph Chen	echo "Checking doc: ${DOC}"
24*f3572ad9SJoseph Chen
25*f3572ad9SJoseph Chen	git show -1 ${DOC} | sed -n "/^+/p" > ${DIFF_DOC_ALL}
26*f3572ad9SJoseph Chen	TITLE=`sed -n "/^+## /p" ${DIFF_DOC_ALL} | tr -d " +#"`
27*f3572ad9SJoseph Chen	FILE=`sed -n "/^+| 20[0-9][0-9]-/p" ${DIFF_DOC_ALL} | tr -d " " | awk -F "|" '{ print $3 }'`
28*f3572ad9SJoseph Chen	COMMIT=`sed -n "/^+| 20[0-9][0-9]-/p" ${DIFF_DOC_ALL} | tr -d " " | awk -F "|" '{ print $4 }'`
29*f3572ad9SJoseph Chen	SEVERITY=`sed -n "/^+| 20[0-9][0-9]-/p" ${DIFF_DOC_ALL} | tr -d " " | awk -F "|" '{ print $5 }'`
30*f3572ad9SJoseph Chen	HORIZONTAL_LINE=`sed -n "/^+------$/p" ${DIFF_DOC_ALL}`
31*f3572ad9SJoseph Chen	# echo "### ${COMMIT}, ${SEVERITY}, ${TITLE}, ${FILE}"
32*f3572ad9SJoseph Chen
33*f3572ad9SJoseph Chen	# check standalone file
34*f3572ad9SJoseph Chen	if ! echo ${FILE} | grep -q { ; then
35*f3572ad9SJoseph Chen		if ! git log -1 --name-only | grep -q ${FILE}; then
36*f3572ad9SJoseph Chen			echo "ERROR: ${DOC}: '${FILE}' is not update in this patch"
37*f3572ad9SJoseph Chen			exit 1
38*f3572ad9SJoseph Chen		fi
39*f3572ad9SJoseph Chen	fi
40*f3572ad9SJoseph Chen
41*f3572ad9SJoseph Chen	# check title
42*f3572ad9SJoseph Chen	if [ "${TITLE}" != "${FILE}" ]; then
43*f3572ad9SJoseph Chen		echo "ERROR: ${DOC}: Title '${TITLE}' is not match with '${FILE}'"
44*f3572ad9SJoseph Chen		exit 1
45*f3572ad9SJoseph Chen	fi
46*f3572ad9SJoseph Chen
47*f3572ad9SJoseph Chen	# check commit
48*f3572ad9SJoseph Chen	COMMIT=${COMMIT//#/ }
49*f3572ad9SJoseph Chen	for LIST in ${COMMIT}; do
50*f3572ad9SJoseph Chen		CMT=`echo ${LIST} | cut -d : -f 2`
51*f3572ad9SJoseph Chen		if ! git log -1 | grep -q ${CMT} ; then
52*f3572ad9SJoseph Chen			echo "ERROR: ${DOC}: '${CMT}' is not match in commit message"
53*f3572ad9SJoseph Chen			exit 1
54*f3572ad9SJoseph Chen		fi
55*f3572ad9SJoseph Chen	done
56*f3572ad9SJoseph Chen
57*f3572ad9SJoseph Chen	# check severity
58*f3572ad9SJoseph Chen	if [ "${SEVERITY}" != "${SVT_CRITIAL}" -a "${SEVERITY}" != "${SVT_IMPORTANT}" -a "${SEVERITY}" != "${SVT_MODERATE}" ]; then
59*f3572ad9SJoseph Chen		echo "ERROR: ${DOC}: Unknown main severity: ${SEVERITY}"
60*f3572ad9SJoseph Chen		exit 1
61*f3572ad9SJoseph Chen	fi
62*f3572ad9SJoseph Chen
63*f3572ad9SJoseph Chen	# check horizontal line
64*f3572ad9SJoseph Chen	if [ -z "${HORIZONTAL_LINE}" ]; then
65*f3572ad9SJoseph Chen		echo "ERROR: ${DOC}: No horizontal line '------' at the last"
66*f3572ad9SJoseph Chen		exit 1
67*f3572ad9SJoseph Chen	fi
68*f3572ad9SJoseph Chen
69*f3572ad9SJoseph Chen	# check 'Fixed' content
70*f3572ad9SJoseph Chen	if grep -q "^+### Fixed" ${DIFF_DOC_ALL} ; then
71*f3572ad9SJoseph Chen		awk -v RS='### Fixed' 'END{printf "%s", $0}' ${DIFF_DOC_ALL} > ${DIFF_DOC_FIXED}
72*f3572ad9SJoseph Chen		sed -i "/^$/d"    ${DIFF_DOC_FIXED}
73*f3572ad9SJoseph Chen		sed -i "/Index/d" ${DIFF_DOC_FIXED}
74*f3572ad9SJoseph Chen		sed -i "/---/d"   ${DIFF_DOC_FIXED}
75*f3572ad9SJoseph Chen		sed -i "/^+$/d"   ${DIFF_DOC_FIXED}
76*f3572ad9SJoseph Chen
77*f3572ad9SJoseph Chen		while read LINE
78*f3572ad9SJoseph Chen		do
79*f3572ad9SJoseph Chen			EACH_SEVERITY=`echo "${LINE}" | awk -F "|" '{ print $3 }' | tr -d " "`
80*f3572ad9SJoseph Chen			if [ "${EACH_SEVERITY}" != "${SVT_CRITIAL}" -a "${EACH_SEVERITY}" != "${SVT_IMPORTANT}" -a "${EACH_SEVERITY}" != "${SVT_MODERATE}" ]; then
81*f3572ad9SJoseph Chen				echo "ERROR: ${DOC}: Unknown severity: ${EACH_SEVERITY}"
82*f3572ad9SJoseph Chen				exit 1
83*f3572ad9SJoseph Chen			fi
84*f3572ad9SJoseph Chen
85*f3572ad9SJoseph Chen			# echo "## EACH: $EACH_SEVERITY"
86*f3572ad9SJoseph Chen			if [ -z "${TOP_SEVERITY}" ]; then
87*f3572ad9SJoseph Chen				TOP_SEVERITY="${EACH_SEVERITY}"
88*f3572ad9SJoseph Chen			elif [ "${TOP_SEVERITY}" == "${SVT_MODERATE}" ]; then
89*f3572ad9SJoseph Chen				if [ "${EACH_SEVERITY}" == "${SVT_CRITIAL}" -o "${EACH_SEVERITY}" == "${SVT_IMPORTANT}" ]; then
90*f3572ad9SJoseph Chen						TOP_SEVERITY="${EACH_SEVERITY}"
91*f3572ad9SJoseph Chen				fi
92*f3572ad9SJoseph Chen			elif [ "${TOP_SEVERITY}" == "${SVT_IMPORTANT}" ]; then
93*f3572ad9SJoseph Chen				if [ "${EACH_SEVERITY}" == "${SVT_CRITIAL}" ]; then
94*f3572ad9SJoseph Chen						TOP_SEVERITY="${EACH_SEVERITY}"
95*f3572ad9SJoseph Chen				fi
96*f3572ad9SJoseph Chen			fi
97*f3572ad9SJoseph Chen		done < ${DIFF_DOC_FIXED}
98*f3572ad9SJoseph Chen
99*f3572ad9SJoseph Chen		if [ "${SEVERITY}" != "${TOP_SEVERITY}" ]; then
100*f3572ad9SJoseph Chen			echo "ERROR: ${DOC}: Main severity should be '${TOP_SEVERITY}'"
101*f3572ad9SJoseph Chen			exit 1
102*f3572ad9SJoseph Chen		fi
103*f3572ad9SJoseph Chen	fi
104*f3572ad9SJoseph Chen}
105*f3572ad9SJoseph Chen
106*f3572ad9SJoseph Chenfunction check_docs()
107*f3572ad9SJoseph Chen{
108*f3572ad9SJoseph Chen	if git log -1 --name-only | grep -Eq '.bin|.elf' ; then
109*f3572ad9SJoseph Chen		DOC_CN=`git log -1 --name-only | sed -n "/_CN\.md/p"`
110*f3572ad9SJoseph Chen		DOC_EN=`git log -1 --name-only | sed -n "/_EN\.md/p"`
111*f3572ad9SJoseph Chen		if [ -z "${DOC_CN}" -o -z "${DOC_EN}" ]; then
112*f3572ad9SJoseph Chen			echo "ERROR: Update CN/EN Release-Note when .bin or .elf changes"
113*f3572ad9SJoseph Chen			exit 1
114*f3572ad9SJoseph Chen		fi
115*f3572ad9SJoseph Chen		check_doc CN
116*f3572ad9SJoseph Chen		check_doc EN
117*f3572ad9SJoseph Chen	fi
118*f3572ad9SJoseph Chen}
119*f3572ad9SJoseph Chen
12015aaf94fSJoseph Chenfunction pack_loader_image()
12124a8c2d6SJoseph Chen{
12215aaf94fSJoseph Chen	for FILE in `ls ./RKBOOT/*MINIALL*.ini`
12324a8c2d6SJoseph Chen	do
12415aaf94fSJoseph Chen		if [ "${FILE}" = "./RKBOOT/RK302AMINIALL.ini" -o \
12515aaf94fSJoseph Chen			 "${FILE}" = "./RKBOOT/RK30BMINIALL.ini" -o \
12615aaf94fSJoseph Chen			 "${FILE}" = "./RKBOOT/RK30MINIALL.ini" -o \
12715aaf94fSJoseph Chen			 "${FILE}" = "./RKBOOT/RK310BMINIALL.ini" ]; then
12824a8c2d6SJoseph Chen			continue;
12924a8c2d6SJoseph Chen		fi
13024a8c2d6SJoseph Chen
13115aaf94fSJoseph Chen		if grep -q '^PATH=img/' ${FILE}; then
13207c86261SJoseph Chen			continue;
13307c86261SJoseph Chen		fi
13407c86261SJoseph Chen
13515aaf94fSJoseph Chen		echo "Pack loader: ${FILE}"
13615aaf94fSJoseph Chen		./tools/boot_merger ${FILE}
137f3822d68SJoseph Chen		rm -f *loader*.bin *download*.bin *idblock*.img
13824a8c2d6SJoseph Chen		echo
13924a8c2d6SJoseph Chen	done
14024a8c2d6SJoseph Chen}
14124a8c2d6SJoseph Chen
14215aaf94fSJoseph Chenfunction pack_trust_image()
14324a8c2d6SJoseph Chen{
14424a8c2d6SJoseph Chen	# Pack 32-bit trust
14515aaf94fSJoseph Chen	for FILE in `ls ./RKTRUST/*TOS*.ini`
14624a8c2d6SJoseph Chen	do
14715aaf94fSJoseph Chen		if ! test -s ${FILE}; then
148075296bdSJoseph Chen			continue;
14915aaf94fSJoseph Chen		elif ! grep -q 'TOS' ${FILE}; then
150d4bf7444SJoseph Chen			continue;
15115aaf94fSJoseph Chen		elif grep -q '^PATH=img/' ${FILE}; then
15207c86261SJoseph Chen			continue;
15307c86261SJoseph Chen		fi
15407c86261SJoseph Chen
15515aaf94fSJoseph Chen		echo "Pack trust: ${FILE}"
15624a8c2d6SJoseph Chen		# Parse orignal path
15715aaf94fSJoseph Chen		TOS=`sed -n "/TOS=/s/TOS=//p" ${FILE}|tr -d '\r'`
15815aaf94fSJoseph Chen		TOS_TA=`sed -n "/TOSTA=/s/TOSTA=//p" ${FILE}|tr -d '\r'`
15924a8c2d6SJoseph Chen
16024a8c2d6SJoseph Chen		# replace "./tools/rk_tools/" with "./" to compatible legacy ini content of rkdevelop branch
16124a8c2d6SJoseph Chen		TOS=$(echo ${TOS} | sed "s/tools\/rk_tools\//\.\//g")
16224a8c2d6SJoseph Chen		TOS_TA=$(echo ${TOS_TA} | sed "s/tools\/rk_tools\//\.\//g")
16324a8c2d6SJoseph Chen
1649d00b70aSJoseph Chen		if [ x${TOS_TA} != x -a x${TOS} != x ]; then
16524a8c2d6SJoseph Chen			./tools/loaderimage --pack --trustos ${TOS} ./trust.img 0x68400000
16624a8c2d6SJoseph Chen			./tools/loaderimage --pack --trustos ${TOS_TA} ./trust_with_ta.img 0x68400000
1679d00b70aSJoseph Chen		elif [ ${TOS} ]; then
16824a8c2d6SJoseph Chen			./tools/loaderimage --pack --trustos ${TOS} ./trust.img 0x68400000
1699d00b70aSJoseph Chen		elif [ ${TOS_TA} ]; then
17024a8c2d6SJoseph Chen			./tools/loaderimage --pack --trustos ${TOS_TA} ./trust.img 0x68400000
17124a8c2d6SJoseph Chen		else
17224a8c2d6SJoseph Chen			exit 1
17324a8c2d6SJoseph Chen		fi
174f3822d68SJoseph Chen		rm -f trust*.img
17524a8c2d6SJoseph Chen		echo
17624a8c2d6SJoseph Chen	done
17724a8c2d6SJoseph Chen
17824a8c2d6SJoseph Chen	# Pack 64-bit trust
17915aaf94fSJoseph Chen	for FILE in `ls ./RKTRUST/*TRUST*.ini`
18024a8c2d6SJoseph Chen	do
18115aaf94fSJoseph Chen		if grep -q '^PATH=img/' ${FILE}; then
18207c86261SJoseph Chen			continue;
18307c86261SJoseph Chen		fi
18407c86261SJoseph Chen
18515aaf94fSJoseph Chen		echo "Pack trust: ${FILE}"
18615aaf94fSJoseph Chen		./tools/trust_merger ${FILE}
18715aaf94fSJoseph Chen		rm -f trust*.img
18824a8c2d6SJoseph Chen		echo
18924a8c2d6SJoseph Chen	done
19024a8c2d6SJoseph Chen}
19124a8c2d6SJoseph Chen
19215aaf94fSJoseph Chenfunction check_dirty()
1937448aaf2SJoseph Chen{
194*f3572ad9SJoseph Chen	for FILE in `find -name '*spl*.bin' -o -name '*tpl*.bin' -o -name '*usbplug*.bin' -o -name '*bl31*.elf' -o -name '*bl32*.bin'`; do
195*f3572ad9SJoseph Chen		echo "Checking clean: ${FILE}"
19615aaf94fSJoseph Chen		if strings ${FILE} | grep '\-dirty ' ; then
19715aaf94fSJoseph Chen			echo "ERROR: ${FILE} is dirty"
1987448aaf2SJoseph Chen			exit 1
1997448aaf2SJoseph Chen		fi
2007448aaf2SJoseph Chen	done
2017448aaf2SJoseph Chen}
2027448aaf2SJoseph Chen
20315aaf94fSJoseph Chenfunction check_stripped()
204c0efc7efSJoseph Chen{
20515aaf94fSJoseph Chen	for FILE in `find -name '*bl31*.elf'`; do
20615aaf94fSJoseph Chen		echo "Checking strip: ${FILE}"
20715aaf94fSJoseph Chen		INFO=`file ${FILE}`
20815aaf94fSJoseph Chen		if echo ${INFO} | grep -q "not stripped" ; then
20915aaf94fSJoseph Chen			echo "ERROR: ${FILE} is not stripped"
210c0efc7efSJoseph Chen			exit 1
211c0efc7efSJoseph Chen		fi
212c0efc7efSJoseph Chen	done
213c0efc7efSJoseph Chen}
214c0efc7efSJoseph Chen
215*f3572ad9SJoseph Chenfunction check_mode()
216*f3572ad9SJoseph Chen{
217*f3572ad9SJoseph Chen	echo "Checking file mode..."
218*f3572ad9SJoseph Chen	if git whatchanged -1 --oneline | sed -n '/RKBOOT\//p; /RKTRUST\//p; /bin\//p; /doc\//p;' | awk '{ print $2 }' | grep -q 755 ; then
219*f3572ad9SJoseph Chen		git whatchanged -1 --oneline | sed -n '/RKBOOT\//p; /RKTRUST\//p; /bin\//p; /doc\//p;' | grep 755
220*f3572ad9SJoseph Chen		echo "ERROR: Set 644 permission but not 755."
221*f3572ad9SJoseph Chen		exit 1
222*f3572ad9SJoseph Chen	fi
223*f3572ad9SJoseph Chen}
224*f3572ad9SJoseph Chen
22515aaf94fSJoseph Chenfunction finish()
22624a8c2d6SJoseph Chen{
227*f3572ad9SJoseph Chen	rm -f ${DIFF_DOC_ALL} ${DIFF_DOC_FIXED}
228*f3572ad9SJoseph Chen	echo "OK, everything is nice."
22924a8c2d6SJoseph Chen	echo
23024a8c2d6SJoseph Chen}
23124a8c2d6SJoseph Chen
232*f3572ad9SJoseph Chencheck_mode
233*f3572ad9SJoseph Chencheck_docs
2347448aaf2SJoseph Chencheck_dirty
235c0efc7efSJoseph Chencheck_stripped
23624a8c2d6SJoseph Chenpack_loader_image
23724a8c2d6SJoseph Chenpack_trust_image
23824a8c2d6SJoseph Chenfinish
239