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