1#!/bin/bash 2set -e 3 4ARG_COMMIT=$1 5DIFF_SUBSET="scripts/.diff_*" 6DIFF_DOC_ALL="scripts/.diff_all.txt" 7DIFF_DOC_FIXED="scripts/.diff_fixed.txt" 8LAST_SEVERITY= 9LAST_DOC= 10 11function check_doc() 12{ 13 local TOP_SEVERITY LANGUAGE=$1 14 15 if [ "${LANGUAGE}" == "EN" ] ; then 16 SVT_CRITIAL="critical" 17 SVT_IMPORTANT="important" 18 SVT_MODERATE="moderate" 19 DOC=`git log ${ARG_COMMIT} -1 --name-only | sed -n "/_EN\.md/p"` 20 else 21 SVT_CRITIAL="紧急" 22 SVT_IMPORTANT="重要" 23 SVT_MODERATE="普通" 24 DOC=`git log ${ARG_COMMIT} -1 --name-only | sed -n "/_CN\.md/p"` 25 fi 26 27 echo "Checking doc: ${DOC}" 28 29 # check DOS encoding 30 git show ${ARG_COMMIT} -1 ${DOC} | sed -n "/^+/p" > ${DIFF_DOC_ALL} 31 git show ${ARG_COMMIT} -1 ${DOC} | sed -n "/^+/p" > ${DIFF_DOC_ALL}.dos 32 dos2unix ${DIFF_DOC_ALL}.dos >/dev/null 2>&1 33 CSUM1=`md5sum ${DIFF_DOC_ALL} | awk '{ print $1 }'` 34 CSUM2=`md5sum ${DIFF_DOC_ALL}.dos | awk '{ print $1 }'` 35 if [ "${CSUM1}" != "${CSUM2}" ]; then 36 echo "ERROR: ${DOC} is DOS encoding. Fix it by: 'dos2unix ${DOC}'" 37 exit 1 38 fi 39 40 TITLE=`sed -n "/^+## /p" ${DIFF_DOC_ALL} | tr -d " +#"` 41 DATE=`sed -n "/^+| 20[0-9][0-9]-/p" ${DIFF_DOC_ALL} | tr -d " " | awk -F "|" '{ print $2 }'` 42 YEAR=`sed -n "/^+| 20[0-9][0-9]-/p" ${DIFF_DOC_ALL} | tr -d " " | awk -F "|" '{ print $2 }' | awk -F "-" '{ print $1 }'` 43 FILE=`sed -n "/^+| 20[0-9][0-9]-/p" ${DIFF_DOC_ALL} | tr -d " " | awk -F "|" '{ print $3 }'` 44 COMMIT=`sed -n "/^+| 20[0-9][0-9]-/p" ${DIFF_DOC_ALL} | tr -d " " | awk -F "|" '{ print $4 }'` 45 SEVERITY=`sed -n "/^+| 20[0-9][0-9]-/p" ${DIFF_DOC_ALL} | tr -d " " | awk -F "|" '{ print $5 }'` 46 END_LINE_3=`tail -n 3 ${DIFF_DOC_ALL} | sed -n '1p'` 47 END_LINE_2=`tail -n 3 ${DIFF_DOC_ALL} | sed -n '2p'` 48 END_LINE_1=`tail -n 3 ${DIFF_DOC_ALL} | sed -n '3p'` 49 HOST_YEAR=`date +%Y` 50 # echo "### ${COMMIT}, ${SEVERITY}, ${TITLE}, ${FILE}" 51 52 # check blank line after Heading 1 53 HEADING_1=`sed -n '1p' ${DOC}` 54 if sed -n '2p' ${DOC} | grep -q [a-z,A-Z] ; then 55 echo "ERROR: ${DOC}: Please add blank line after '${HEADING_1}'" 56 exit 1 57 fi 58 59 # check space 60 if sed -n "/##/p" ${DOC} | grep -v '## [a-z,A-Z]' ; then 61 echo "ERROR: ${DOC}: Please only 1 space between '#' and word" 62 exit 1 63 fi 64 65 # check new content location 66 if ! git show ${ARG_COMMIT} -1 ${DOC} | grep -q 'Release Note' ; then 67 echo "ERROR: ${DOC}: Please add new content at the top but not bottom" 68 exit 1 69 fi 70 71 # check title 72 if grep -Eq '### WARN|### WARNING|### Warning|### warn|### warning' ${DIFF_DOC_ALL} ; then 73 echo "ERROR: ${DOC}: Please use '### Warn'" 74 exit 1 75 fi 76 77 if grep -Eq '### NEW|### new' ${DIFF_DOC_ALL} ; then 78 echo "ERROR: ${DOC}: Please use '### New'" 79 exit 1 80 fi 81 82 if grep -Eq '### FIXED|### fixed' ${DIFF_DOC_ALL} ; then 83 echo "ERROR: ${DOC}: Please use '### Fixed'" 84 exit 1 85 fi 86 87 # check year 88 if [ "${HOST_YEAR}" != "${YEAR}" ]; then 89 echo "ERROR: ${DOC}: '${DATE}' is wrong, the year should be ${HOST_YEAR}" 90 exit 1 91 fi 92 93 # check TAB before index of 'New' body 94 if grep -q $'\t[0-9]' ${DOC} ; then 95 echo "ERROR: ${DOC}: Don't add TAB before index:" 96 grep $'\t[0-9]' ${DOC} 97 exit 1 98 fi 99 100 # check upper case and line end 101 if [ "${LANGUAGE}" == "EN" ] ; then 102 if grep -q '^[0-9]\. [a-z]' ${DOC} ; then 103 echo "ERROR: ${DOC}: Please use upper case of first word(i.e. \"1. add ..\" => \"1. Add ...\"):" 104 grep '^[0-9]\. [a-z]' ${DOC} 105 exit 1 106 fi 107 108 # check end with '.' 109 if sed -n '/^[0-9]\. [A-Z]/p' ${DOC} | grep -q '[^.]$' ; then 110 echo "ERROR: ${DOC}: Please end line with '.'" 111 grep '^[0-9]\. [A-Z]' ${DOC} | grep '[^.]$' 112 exit 1 113 fi 114 115 # check Chinese language 116 if grep -P '[\x{4e00}-\x{9fa5}]' ${DOC} ; then 117 echo "ERROR: ${DOC}: The Chinese language was found" 118 exit 1 119 fi 120 else 121 # check end with '。' 122 if sed -n '/^[0-9]\. /p' ${DOC} | grep -q '[^。]$' ; then 123 echo "ERROR: ${DOC}: Please end line with '。'" 124 grep '^[0-9]\. ' ${DOC} | grep '[^。]$' 125 exit 1 126 fi 127 fi 128 129 # check space after index of 'New' body 130 SUM1=`grep '^[0-9]\.' ${DOC} | wc -l` 131 SUM2=`grep '^[0-9]\.[[:blank:]]' ${DOC} | wc -l` 132 if [ "$SUM1" != "$SUM2" ]; then 133 echo "ERROR: ${DOC}: Please add space after index (e.g: '1. ' but not '1.'):" 134 grep '^+[0-9]\.' ${DIFF_DOC_ALL} 135 exit 1 136 fi 137 138 # check standalone file 139 if ! echo ${FILE} | grep -Eq '\.bin|\.elf|\.img' ; then 140 echo "ERROR: ${DOC}: '${FILE}' missing the file format suffix" 141 exit 1 142 fi 143 if ! echo ${FILE} | grep -q { ; then 144 if ! git log ${ARG_COMMIT} -1 --name-only | grep -q ${FILE}; then 145 echo "ERROR: ${DOC}: '${FILE}' is not updated in this patch" 146 exit 1 147 fi 148 fi 149 150 # check title 151 if [ "${TITLE}" != "${FILE}" ]; then 152 echo "ERROR: ${DOC}: Title '${TITLE}' is not match with '${FILE}'" 153 exit 1 154 fi 155 156 # check commit 157 COMMIT=${COMMIT//#/ } 158 for LIST in ${COMMIT}; do 159 CMT=`echo ${LIST} | cut -d : -f 2` 160 if ! git log ${ARG_COMMIT} -1 | grep -q ${CMT} ; then 161 echo "ERROR: ${DOC}: '${CMT}' is not match in commit message" 162 exit 1 163 fi 164 165 if ! echo ${FILE} | grep -q { ; then 166 if echo ${FILE} | grep -Eq 'spl_|tpl_|bl31_|bl32_|tee_' ; then 167 FILE_PATH=`find -name ${FILE}` 168 if [ -z "${FILE_PATH}" ]; then 169 echo "ERROR: ${DOC}: No ${FILE}" 170 exit 1 171 fi 172 if ! strings ${FILE_PATH} | grep -q ${CMT} ; then 173 echo "ERROR: ${DOC}: ${FILE} is not build from '${CMT}'" 174 exit 1 175 fi 176 fi 177 fi 178 done 179 180 # check severity 181 if [ "${SEVERITY}" != "${SVT_CRITIAL}" -a "${SEVERITY}" != "${SVT_IMPORTANT}" -a "${SEVERITY}" != "${SVT_MODERATE}" ]; then 182 echo "ERROR: ${DOC}: Unknown main severity: ${SEVERITY}" 183 exit 1 184 fi 185 186 # check horizontal line 187 if [ "${END_LINE_2}" != "+------" ]; then 188 echo "ERROR: ${DOC}: Please add horizontal line '------' at the last of new content" 189 exit 1 190 fi 191 if [ "${END_LINE_3}" != "+" ]; then 192 echo "ERROR: ${DOC}: Please add blank line before horizontal line '------'" 193 exit 1 194 fi 195 if [ "${END_LINE_1}" != "+" ]; then 196 echo "ERROR: ${DOC}: Please add blank line after horizontal line '------'" 197 exit 1 198 fi 199 200 # check 'Fixed' content 201 if grep -q "^+### Fixed" ${DIFF_DOC_ALL} ; then 202 awk -v RS='### Fixed' 'END{printf "%s", $0}' ${DIFF_DOC_ALL} > ${DIFF_DOC_FIXED} 203 sed -i "/^$/d" ${DIFF_DOC_FIXED} 204 sed -i "/Index/d" ${DIFF_DOC_FIXED} 205 sed -i "/---/d" ${DIFF_DOC_FIXED} 206 sed -i "/^+$/d" ${DIFF_DOC_FIXED} 207 208 while read LINE 209 do 210 EACH_SEVERITY=`echo "${LINE}" | awk -F "|" '{ print $3 }' | tr -d " "` 211 if [ "${EACH_SEVERITY}" != "${SVT_CRITIAL}" -a "${EACH_SEVERITY}" != "${SVT_IMPORTANT}" -a "${EACH_SEVERITY}" != "${SVT_MODERATE}" ]; then 212 if [ -z "${EACH_SEVERITY}" ]; then 213 echo "ERROR: ${DOC}: No severity found, please use Table to list what you '### Fixed'" 214 else 215 echo "ERROR: ${DOC}: Unknown severity: ${EACH_SEVERITY}" 216 fi 217 exit 1 218 fi 219 220 # echo "## EACH: $EACH_SEVERITY" 221 if [ -z "${TOP_SEVERITY}" ]; then 222 TOP_SEVERITY="${EACH_SEVERITY}" 223 elif [ "${TOP_SEVERITY}" == "${SVT_MODERATE}" ]; then 224 if [ "${EACH_SEVERITY}" == "${SVT_CRITIAL}" -o "${EACH_SEVERITY}" == "${SVT_IMPORTANT}" ]; then 225 TOP_SEVERITY="${EACH_SEVERITY}" 226 fi 227 elif [ "${TOP_SEVERITY}" == "${SVT_IMPORTANT}" ]; then 228 if [ "${EACH_SEVERITY}" == "${SVT_CRITIAL}" ]; then 229 TOP_SEVERITY="${EACH_SEVERITY}" 230 fi 231 fi 232 done < ${DIFF_DOC_FIXED} 233 234 if [ "${SEVERITY}" != "${TOP_SEVERITY}" ]; then 235 echo "ERROR: ${DOC}: Top severity should be '${TOP_SEVERITY}' as it's the highest level of all sub severity" 236 exit 1 237 fi 238 239 # check top severity miss match 240 if [ ! -z ${LAST_SEVERITY} ]; then 241 if [ "${LAST_SEVERITY}" == "普通" -a "${TOP_SEVERITY}" != "moderate" ]; then 242 MISS_MATCH="y" 243 elif [ "${LAST_SEVERITY}" == "重要" -a "${TOP_SEVERITY}" != "important" ]; then 244 MISS_MATCH="y" 245 elif [ "${LAST_SEVERITY}" == "紧急" -a "${TOP_SEVERITY}" != "critical" ]; then 246 MISS_MATCH="y" 247 elif [ "${LAST_SEVERITY}" == "moderate" -a "${TOP_SEVERITY}" != "普通" ]; then 248 MISS_MATCH="y" 249 elif [ "${LAST_SEVERITY}" == "important" -a "${TOP_SEVERITY}" != "重要" ]; then 250 MISS_MATCH="y" 251 elif [ "${LAST_SEVERITY}" == "critical" -a "${TOP_SEVERITY}" != "紧急" ]; then 252 MISS_MATCH="y" 253 fi 254 255 if [ "${MISS_MATCH}" == "y" ]; then 256 echo "ERROR: ${DOC}: top Severity is '${SEVERITY}', while ${LAST_DOC}: top Severity is '${LAST_SEVERITY}'" 257 echo " Available Severity types are: moderate(普通), important(重要), critical(紧急)" 258 exit 1 259 fi 260 fi 261 262 LAST_SEVERITY="${SEVERITY}" 263 LAST_DOC="${DOC}" 264 fi 265} 266 267function check_docs() 268{ 269 if git log ${ARG_COMMIT} -1 --name-only | sed -n '5p' | grep -Eq '^ Revert "' ; then 270 return; 271 fi 272 273 if git log ${ARG_COMMIT} -1 --name-only | grep -Eq '\.bin|\.elf' ; then 274 DOC_CN=`git log ${ARG_COMMIT} -1 --name-only | sed -n "/_CN\.md/p"` 275 DOC_EN=`git log ${ARG_COMMIT} -1 --name-only | sed -n "/_EN\.md/p"` 276 if [ -z "${DOC_CN}" -o -z "${DOC_EN}" ]; then 277 echo "ERROR: Should update CN and EN Release-Note when .bin/elf changed" 278 exit 1 279 fi 280 281 NUM=`git log ${ARG_COMMIT} -1 --name-only | sed -n "/\.md/p" | wc -l` 282 if [ ${NUM} -gt 2 ]; then 283 echo "ERROR: More than 2 release note are updated" 284 exit 1 285 fi 286 287 if ! which dos2unix > /dev/null 2>&1 ; then 288 echo "ERROR: No 'dos2unix'. Fix by: sudo apt-get install dos2unix" 289 exit 1 290 fi 291 292 check_doc CN 293 check_doc EN 294 fi 295 296 rm -f ${DIFF_SUBSET} 297} 298 299function pack_loader_image() 300{ 301 for FILE in `ls ./RKBOOT/*MINIALL*.ini` 302 do 303 if [ "${FILE}" = "./RKBOOT/RK302AMINIALL.ini" -o \ 304 "${FILE}" = "./RKBOOT/RK30BMINIALL.ini" -o \ 305 "${FILE}" = "./RKBOOT/RK30MINIALL.ini" -o \ 306 "${FILE}" = "./RKBOOT/RK310BMINIALL.ini" ]; then 307 continue; 308 fi 309 310 if grep -q '^PATH=img/' ${FILE}; then 311 continue; 312 fi 313 314 echo "Pack loader: ${FILE}" 315 ./tools/boot_merger ${FILE} 316 rm -f *loader*.bin *download*.bin *idblock*.img 317 echo 318 done 319} 320 321function pack_trust_image() 322{ 323 # Pack 32-bit trust 324 for FILE in `ls ./RKTRUST/*TOS*.ini` 325 do 326 if ! test -s ${FILE}; then 327 continue; 328 elif ! grep -q 'TOS' ${FILE}; then 329 continue; 330 elif grep -q '^PATH=img/' ${FILE}; then 331 continue; 332 fi 333 334 echo "Pack trust: ${FILE}" 335 # Parse orignal path 336 TOS=`sed -n "/TOS=/s/TOS=//p" ${FILE}|tr -d '\r'` 337 TOS_TA=`sed -n "/TOSTA=/s/TOSTA=//p" ${FILE}|tr -d '\r'` 338 339 # replace "./tools/rk_tools/" with "./" to compatible legacy ini content of rkdevelop branch 340 TOS=$(echo ${TOS} | sed "s/tools\/rk_tools\//\.\//g") 341 TOS_TA=$(echo ${TOS_TA} | sed "s/tools\/rk_tools\//\.\//g") 342 343 if [ x${TOS_TA} != x -a x${TOS} != x ]; then 344 ./tools/loaderimage --pack --trustos ${TOS} ./trust.img 0x68400000 345 ./tools/loaderimage --pack --trustos ${TOS_TA} ./trust_with_ta.img 0x68400000 346 elif [ ${TOS} ]; then 347 ./tools/loaderimage --pack --trustos ${TOS} ./trust.img 0x68400000 348 elif [ ${TOS_TA} ]; then 349 ./tools/loaderimage --pack --trustos ${TOS_TA} ./trust.img 0x68400000 350 else 351 exit 1 352 fi 353 rm -f trust*.img 354 echo 355 done 356 357 # Pack 64-bit trust 358 for FILE in `ls ./RKTRUST/*TRUST*.ini` 359 do 360 if grep -q '^PATH=img/' ${FILE}; then 361 continue; 362 fi 363 364 echo "Pack trust: ${FILE}" 365 ./tools/trust_merger ${FILE} 366 rm -f trust*.img 367 echo 368 done 369} 370 371function check_dirty() 372{ 373 for FILE in `find -name '*spl*.bin' -o -name '*tpl*.bin' -o -name '*usbplug*.bin' -o -name '*bl31*.elf' -o -name '*bl32*.bin'`; do 374 echo "Checking clean: ${FILE}" 375 if strings ${FILE} | grep '\-dirty ' ; then 376 echo "ERROR: ${FILE} is dirty" 377 exit 1 378 fi 379 done 380} 381 382function check_stripped() 383{ 384 for FILE in `find -name '*bl31*.elf'`; do 385 echo "Checking strip: ${FILE}" 386 INFO=`file ${FILE}` 387 if echo ${INFO} | grep -q "not stripped" ; then 388 echo "ERROR: ${FILE} is not stripped" 389 exit 1 390 fi 391 done 392} 393 394function check_mode() 395{ 396 echo "Checking file mode..." 397 if git whatchanged ${ARG_COMMIT} -1 --oneline | sed -n '/RKBOOT\//p; /RKTRUST\//p; /bin\//p; /doc\//p;' | awk '{ print $2 }' | grep -q 755 ; then 398 git whatchanged ${ARG_COMMIT} -1 --oneline | sed -n '/RKBOOT\//p; /RKTRUST\//p; /bin\//p; /doc\//p;' | grep 755 399 echo "ERROR: Set 644 file permission but not 755." 400 exit 1 401 fi 402} 403 404function finish() 405{ 406 echo "OK, everything is nice." 407 echo 408} 409 410check_mode 411check_docs 412check_dirty 413check_stripped 414pack_loader_image 415pack_trust_image 416finish 417