xref: /rkbin/scripts/checkpatch.sh (revision 844b170f4de10f55c560056d99c47a064d2bead8)
1#!/bin/bash
2set -e
3
4DIFF_SUBSET="scripts/.diff_*"
5DIFF_DOC_ALL="scripts/.diff_all.txt"
6DIFF_DOC_FIXED="scripts/.diff_fixed.txt"
7
8function check_doc()
9{
10	local TOP_SEVERITY LANGUAGE=$1
11
12	if [ "${LANGUAGE}" == "EN" ] ; then
13		SVT_CRITIAL="critical"
14		SVT_IMPORTANT="important"
15		SVT_MODERATE="moderate"
16		DOC=`git log -1 --name-only | sed -n "/_EN\.md/p"`
17	else
18		SVT_CRITIAL="紧急"
19		SVT_IMPORTANT="重要"
20		SVT_MODERATE="普通"
21		DOC=`git log -1 --name-only | sed -n "/_CN\.md/p"`
22	fi
23
24	echo "Checking doc: ${DOC}"
25
26	# check DOS encoding
27	git show -1 ${DOC} | sed -n "/^+/p" > ${DIFF_DOC_ALL}
28	git show -1 ${DOC} | sed -n "/^+/p" > ${DIFF_DOC_ALL}.dos
29	dos2unix ${DIFF_DOC_ALL}.dos >/dev/null 2>&1
30	CSUM1=`md5sum ${DIFF_DOC_ALL} | awk '{ print $1 }'`
31	CSUM2=`md5sum ${DIFF_DOC_ALL}.dos | awk '{ print $1 }'`
32	if [ "${CSUM1}" != "${CSUM2}" ]; then
33		echo "ERROR: ${DOC} is DOS encoding. Fix it by: 'dos2unix ${DOC}'"
34		exit 1
35	fi
36
37	# check new content location
38	if ! grep -q 'Release Note' ${DIFF_DOC_ALL} ; then
39		echo "ERROR: ${DOC}: Adding new content at the beginning but not end"
40		exit 1
41	fi
42
43	TITLE=`sed -n "/^+## /p" ${DIFF_DOC_ALL} | tr -d " +#"`
44	FILE=`sed -n "/^+| 20[0-9][0-9]-/p" ${DIFF_DOC_ALL} | tr -d " " | awk -F "|" '{ print $3 }'`
45	COMMIT=`sed -n "/^+| 20[0-9][0-9]-/p" ${DIFF_DOC_ALL} | tr -d " " | awk -F "|" '{ print $4 }'`
46	SEVERITY=`sed -n "/^+| 20[0-9][0-9]-/p" ${DIFF_DOC_ALL} | tr -d " " | awk -F "|" '{ print $5 }'`
47	HORIZONTAL_LINE=`sed -n "/^+------$/p" ${DIFF_DOC_ALL}`
48	# echo "### ${COMMIT}, ${SEVERITY}, ${TITLE}, ${FILE}"
49
50	# check standalone file
51	if ! echo ${FILE} | grep -q { ; then
52		if ! git log -1 --name-only | grep -q ${FILE}; then
53			echo "ERROR: ${DOC}: '${FILE}' is not update in this patch"
54			exit 1
55		fi
56	fi
57
58	# check title
59	if [ "${TITLE}" != "${FILE}" ]; then
60		echo "ERROR: ${DOC}: Title '${TITLE}' is not match with '${FILE}'"
61		exit 1
62	fi
63
64	# check commit
65	COMMIT=${COMMIT//#/ }
66	for LIST in ${COMMIT}; do
67		CMT=`echo ${LIST} | cut -d : -f 2`
68		if ! git log -1 | grep -q ${CMT} ; then
69			echo "ERROR: ${DOC}: '${CMT}' is not match in commit message"
70			exit 1
71		fi
72
73		if ! echo ${FILE} | grep -q { ; then
74			if echo ${FILE} | grep -Eq 'spl_|tpl_|bl31_|bl32_|tee_' ; then
75				FILE_PATH=`find -name ${FILE}`
76				if ! strings ${FILE_PATH} | grep -q ${CMT} ; then
77					echo "ERROR: ${DOC}: ${FILE} is not build from '${CMT}'"
78					exit 1
79				fi
80			fi
81		fi
82	done
83
84	# check severity
85	if [ "${SEVERITY}" != "${SVT_CRITIAL}" -a "${SEVERITY}" != "${SVT_IMPORTANT}" -a "${SEVERITY}" != "${SVT_MODERATE}" ]; then
86		echo "ERROR: ${DOC}: Unknown main severity: ${SEVERITY}"
87		exit 1
88	fi
89
90	# check horizontal line
91	if [ -z "${HORIZONTAL_LINE}" ]; then
92		echo "ERROR: ${DOC}: No horizontal line '------' at the last"
93		exit 1
94	fi
95
96	# check 'Fixed' content
97	if grep -q "^+### Fixed" ${DIFF_DOC_ALL} ; then
98		awk -v RS='### Fixed' 'END{printf "%s", $0}' ${DIFF_DOC_ALL} > ${DIFF_DOC_FIXED}
99		sed -i "/^$/d"    ${DIFF_DOC_FIXED}
100		sed -i "/Index/d" ${DIFF_DOC_FIXED}
101		sed -i "/---/d"   ${DIFF_DOC_FIXED}
102		sed -i "/^+$/d"   ${DIFF_DOC_FIXED}
103
104		while read LINE
105		do
106			EACH_SEVERITY=`echo "${LINE}" | awk -F "|" '{ print $3 }' | tr -d " "`
107			if [ "${EACH_SEVERITY}" != "${SVT_CRITIAL}" -a "${EACH_SEVERITY}" != "${SVT_IMPORTANT}" -a "${EACH_SEVERITY}" != "${SVT_MODERATE}" ]; then
108				echo "ERROR: ${DOC}: Unknown severity: ${EACH_SEVERITY}"
109				exit 1
110			fi
111
112			# echo "## EACH: $EACH_SEVERITY"
113			if [ -z "${TOP_SEVERITY}" ]; then
114				TOP_SEVERITY="${EACH_SEVERITY}"
115			elif [ "${TOP_SEVERITY}" == "${SVT_MODERATE}" ]; then
116				if [ "${EACH_SEVERITY}" == "${SVT_CRITIAL}" -o "${EACH_SEVERITY}" == "${SVT_IMPORTANT}" ]; then
117						TOP_SEVERITY="${EACH_SEVERITY}"
118				fi
119			elif [ "${TOP_SEVERITY}" == "${SVT_IMPORTANT}" ]; then
120				if [ "${EACH_SEVERITY}" == "${SVT_CRITIAL}" ]; then
121						TOP_SEVERITY="${EACH_SEVERITY}"
122				fi
123			fi
124		done < ${DIFF_DOC_FIXED}
125
126		if [ "${SEVERITY}" != "${TOP_SEVERITY}" ]; then
127			echo "ERROR: ${DOC}: Main severity should be '${TOP_SEVERITY}'"
128			exit 1
129		fi
130	fi
131}
132
133function check_docs()
134{
135	if git log -1 --name-only | grep -Eq '\.bin|\.elf' ; then
136		DOC_CN=`git log -1 --name-only | sed -n "/_CN\.md/p"`
137		DOC_EN=`git log -1 --name-only | sed -n "/_EN\.md/p"`
138		if [ -z "${DOC_CN}" -o -z "${DOC_EN}" ]; then
139			echo "ERROR: Update CN/EN Release-Note when .bin or .elf changes"
140			exit 1
141		fi
142		check_doc CN
143		check_doc EN
144	fi
145
146	rm -f ${DIFF_SUBSET}
147}
148
149function pack_loader_image()
150{
151	for FILE in `ls ./RKBOOT/*MINIALL*.ini`
152	do
153		if [ "${FILE}" = "./RKBOOT/RK302AMINIALL.ini" -o \
154			 "${FILE}" = "./RKBOOT/RK30BMINIALL.ini" -o \
155			 "${FILE}" = "./RKBOOT/RK30MINIALL.ini" -o \
156			 "${FILE}" = "./RKBOOT/RK310BMINIALL.ini" ]; then
157			continue;
158		fi
159
160		if grep -q '^PATH=img/' ${FILE}; then
161			continue;
162		fi
163
164		echo "Pack loader: ${FILE}"
165		./tools/boot_merger ${FILE}
166		rm -f *loader*.bin *download*.bin *idblock*.img
167		echo
168	done
169}
170
171function pack_trust_image()
172{
173	# Pack 32-bit trust
174	for FILE in `ls ./RKTRUST/*TOS*.ini`
175	do
176		if ! test -s ${FILE}; then
177			continue;
178		elif ! grep -q 'TOS' ${FILE}; then
179			continue;
180		elif grep -q '^PATH=img/' ${FILE}; then
181			continue;
182		fi
183
184		echo "Pack trust: ${FILE}"
185		# Parse orignal path
186		TOS=`sed -n "/TOS=/s/TOS=//p" ${FILE}|tr -d '\r'`
187		TOS_TA=`sed -n "/TOSTA=/s/TOSTA=//p" ${FILE}|tr -d '\r'`
188
189		# replace "./tools/rk_tools/" with "./" to compatible legacy ini content of rkdevelop branch
190		TOS=$(echo ${TOS} | sed "s/tools\/rk_tools\//\.\//g")
191		TOS_TA=$(echo ${TOS_TA} | sed "s/tools\/rk_tools\//\.\//g")
192
193		if [ x${TOS_TA} != x -a x${TOS} != x ]; then
194			./tools/loaderimage --pack --trustos ${TOS} ./trust.img 0x68400000
195			./tools/loaderimage --pack --trustos ${TOS_TA} ./trust_with_ta.img 0x68400000
196		elif [ ${TOS} ]; then
197			./tools/loaderimage --pack --trustos ${TOS} ./trust.img 0x68400000
198		elif [ ${TOS_TA} ]; then
199			./tools/loaderimage --pack --trustos ${TOS_TA} ./trust.img 0x68400000
200		else
201			exit 1
202		fi
203		rm -f trust*.img
204		echo
205	done
206
207	# Pack 64-bit trust
208	for FILE in `ls ./RKTRUST/*TRUST*.ini`
209	do
210		if grep -q '^PATH=img/' ${FILE}; then
211			continue;
212		fi
213
214		echo "Pack trust: ${FILE}"
215		./tools/trust_merger ${FILE}
216		rm -f trust*.img
217		echo
218	done
219}
220
221function check_dirty()
222{
223	for FILE in `find -name '*spl*.bin' -o -name '*tpl*.bin' -o -name '*usbplug*.bin' -o -name '*bl31*.elf' -o -name '*bl32*.bin'`; do
224		echo "Checking clean: ${FILE}"
225		if strings ${FILE} | grep '\-dirty ' ; then
226			echo "ERROR: ${FILE} is dirty"
227			exit 1
228		fi
229	done
230}
231
232function check_stripped()
233{
234	for FILE in `find -name '*bl31*.elf'`; do
235		echo "Checking strip: ${FILE}"
236		INFO=`file ${FILE}`
237		if echo ${INFO} | grep -q "not stripped" ; then
238			echo "ERROR: ${FILE} is not stripped"
239			exit 1
240		fi
241	done
242}
243
244function check_mode()
245{
246	echo "Checking file mode..."
247	if git whatchanged -1 --oneline | sed -n '/RKBOOT\//p; /RKTRUST\//p; /bin\//p; /doc\//p;' | awk '{ print $2 }' | grep -q 755 ; then
248		git whatchanged -1 --oneline | sed -n '/RKBOOT\//p; /RKTRUST\//p; /bin\//p; /doc\//p;' | grep 755
249		echo "ERROR: Set 644 permission but not 755."
250		exit 1
251	fi
252}
253
254function finish()
255{
256	echo "OK, everything is nice."
257	echo
258}
259
260check_mode
261check_docs
262check_dirty
263check_stripped
264pack_loader_image
265pack_trust_image
266finish
267