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