gen_lcov_report.sh 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #! /bin/bash
  2. set -e
  3. if [ "$(uname)" = "Darwin" ]; then
  4. SED=gsed
  5. else
  6. SED=sed
  7. fi
  8. rm -rf ${OUTPUT_DIR}/${LCOV_DIR} ${DIST_DIR}/${LCOV_DIR}
  9. lcov --quiet \
  10. --capture --initial --directory ${OUTPUT_DIR}/ \
  11. -o ${OUTPUT_DIR}/files.info
  12. lcov --quiet \
  13. --capture --directory ${OUTPUT_DIR} \
  14. -o ${OUTPUT_DIR}/tests.info
  15. lcov --quiet \
  16. --add-tracefile ${OUTPUT_DIR}/files.info \
  17. --add-tracefile ${OUTPUT_DIR}/tests.info \
  18. -o ${OUTPUT_DIR}/all.info
  19. lcov --quiet \
  20. --remove ${OUTPUT_DIR}/all.info \
  21. -o ${OUTPUT_DIR}/final.info '*.h'
  22. genhtml --quiet \
  23. --legend --no-branch-coverage \
  24. -o ${OUTPUT_DIR}/${LCOV_DIR} ${OUTPUT_DIR}/final.info 2>/dev/null
  25. cp -rf ${OUTPUT_DIR}/${LCOV_DIR} ${DIST_DIR}/${LCOV_DIR}
  26. cd ${DIST_DIR}/${LCOV_DIR} && \
  27. ${SED} -i 's:\(coverFile.*\)>${OUTPUT_DIR}/:\1>:g' index.html
  28. cd ${OLDPWD}
  29. SRC_NAME_LENGTH=28
  30. DIR_NAME_LENGTH=16
  31. COVERAGE_HIGH=90
  32. COVERAGE_MID=75
  33. echo ""
  34. echo "Processing [${DIST_DIR}/${LCOV_DIR}] for Coverage Brief"
  35. echo ""
  36. #
  37. # sdk-example / example.c : [100.00%] (7/7) [100.00%] (1/1)
  38. #
  39. echo -ne "\033[1;36m"
  40. printf "%${DIR_NAME_LENGTH}s %-${SRC_NAME_LENGTH}s: %-24s %-20s\n\n" \
  41. "Directory" \
  42. "Source File" \
  43. "Line Coverage" \
  44. "Function Coverage"
  45. echo -ne "\033[0m"
  46. REPORT_LIST=$(find ${DIST_DIR}/${LCOV_DIR} -mindepth 2 -name "index.html")
  47. for R in ${REPORT_LIST}; do
  48. SOURCE_LIST=$(grep "coverFile" ${R} | awk -F '<' '{ print $3 }' | cut -d'>' -f2)
  49. for S in ${SOURCE_LIST}; do
  50. STATS=$(grep -A 7 "${S}</a>" ${R} | ${SED} -n '6p;8p'|grep -o -E '[0-9]+')
  51. DIR_NAME=$(echo "$(dirname ${R}|xargs basename)" | cut -c1-15)
  52. SRC_NAME=$(echo "${S}" | cut -c"1-$(( SRC_NAME_LENGTH -1 ))")
  53. COVER_LINE=$(echo ${STATS}|cut -d' ' -f1)
  54. TOTAL_LINE=$(echo ${STATS}|cut -d' ' -f2)
  55. COVER_FUNC=$(echo ${STATS}|cut -d' ' -f3)
  56. TOTAL_FUNC=$(echo ${STATS}|cut -d' ' -f4)
  57. LINE_PERCENT="$(echo "scale=2; ${COVER_LINE} * 100 / ${TOTAL_LINE}"|bc -l)%"
  58. FUNC_PERCENT="$(echo "scale=2; ${COVER_FUNC} * 100 / ${TOTAL_FUNC}"|bc -l)%"
  59. printf \
  60. "%-8s %${DIR_NAME_LENGTH}s / %-${SRC_NAME_LENGTH}s: [ %s ] (%s/%s) \t [ %s ] (%s/%s)\n" \
  61. ${LINE_PERCENT} \
  62. ${DIR_NAME} \
  63. ${SRC_NAME} \
  64. ${LINE_PERCENT} \
  65. ${COVER_LINE} \
  66. ${TOTAL_LINE} \
  67. ${FUNC_PERCENT} \
  68. ${COVER_FUNC} \
  69. ${TOTAL_FUNC}
  70. done
  71. done \
  72. | sort -nr \
  73. | cut -d' ' -f2- \
  74. | awk -v SRC_LEN=${SRC_NAME_LENGTH} -v DIR_LEN=${DIR_NAME_LENGTH} \
  75. -v HIGH=${COVERAGE_HIGH} -v MID=${COVERAGE_MID} \
  76. '{
  77. split($6, arr, ".");
  78. if (arr[1] >= HIGH)
  79. printf("\033[1;32m");
  80. else if (arr[1] >= MID)
  81. printf("\033[1;35m");
  82. else
  83. printf("\033[1;31m");
  84. printf("%" DIR_LEN "s / %-" SRC_LEN "s: [ %-8s] %-12s [ %-8s] %-12s\n",
  85. $1, $3, $6, $8, $10, $12);
  86. }'
  87. #
  88. # 1 2 3 4 5 6 7 8 9 10 11 12
  89. # sdk-example / example.c : [ 100.00% ] (7/7) [ 100.00% ] (1/1)
  90. #
  91. rm -f ${OUTPUT_DIR}/{files,tests,all,final}.info
  92. find ${OUTPUT_DIR} -name "*.gcno" -o -name "*.gcda" -exec rm -f {} \;
  93. echo ""
  94. exit 0