format-changelog.sh 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. #!/bin/bash
  2. set -euo pipefail
  3. shopt -s nullglob
  4. export LANG=C.UTF-8
  5. logerr() {
  6. echo "$(tput setaf 1)ERROR: $1$(tput sgr0)" 1>&2
  7. }
  8. usage() {
  9. cat <<EOF
  10. $0 [option]
  11. options:
  12. -h|--help: print this usages info
  13. -b|--base:
  14. The git tag of compare base to find included changes.
  15. e.g. v5.0.18, e5.0.0 etc.
  16. -v|--version:
  17. The tag to be released
  18. e.g. v5.0.19, e5.0.1-alpha.1 etc.
  19. -l|--lang: en | zh
  20. EOF
  21. }
  22. while [ "$#" -gt 0 ]; do
  23. case $1 in
  24. -h|--help)
  25. usage
  26. exit 0
  27. ;;
  28. -b|--base)
  29. shift
  30. BASE_TAG="$1"
  31. shift
  32. ;;
  33. -v|--version)
  34. shift
  35. TEMPLATE_VSN_HEADING="$1"
  36. shift
  37. ;;
  38. -l|--lang)
  39. shift
  40. LANGUAGE="$1"
  41. shift
  42. ;;
  43. *)
  44. logerr "Unknown option $1"
  45. exit 1
  46. ;;
  47. esac
  48. done
  49. case "${LANGUAGE:-}" in
  50. en|zh)
  51. true
  52. ;;
  53. *)
  54. logerr "-l|--lang must be 'en' or 'zh'"
  55. exit 1
  56. ;;
  57. esac
  58. case "${BASE_TAG:-}" in
  59. v*)
  60. PROFILE="emqx"
  61. ;;
  62. e*)
  63. PROFILE="emqx-enterprise"
  64. ;;
  65. *)
  66. logerr "Unsupported -b|--base option, must be v* or e*"
  67. exit 1
  68. ;;
  69. esac
  70. TEMPLATE_VSN_HEADING="${TEMPLATE_VSN_HEADING:-<VSN-TAG>}"
  71. top_dir="$(git rev-parse --show-toplevel)"
  72. declare -a PRS
  73. PRS=("")
  74. format_one_pr() {
  75. local filename pr_num indent
  76. filename="${1}"
  77. pr_num="$(echo "${filename}" | sed -E 's/.*-([0-9]+)\.[a-z]+\.md$/\1/')"
  78. re='^[0-9]+$'
  79. if ! [[ $pr_num =~ $re ]]; then
  80. logerr "bad filename format: $filename"
  81. fi
  82. indent="- [#${pr_num}](https://github.com/emqx/emqx/pull/${pr_num}) "
  83. while read -r line; do
  84. echo "${indent}${line}"
  85. indent=" "
  86. done < "${filename}"
  87. echo
  88. }
  89. section() {
  90. local prefix=$1
  91. for file in "${PRS[@]}"; do
  92. if [[ $file =~ .*$prefix-.*$LANGUAGE.md ]]; then
  93. format_one_pr "$file"
  94. fi
  95. done
  96. }
  97. changes_dir=("$top_dir/changes/ce")
  98. if [ "$PROFILE" == "emqx-enterprise" ]; then
  99. changes_dir+=("$top_dir/changes/ee")
  100. fi
  101. while read -d "" -r file; do
  102. PRS+=("$file")
  103. done < <(git diff --name-only -z -a "tags/${BASE_TAG}...HEAD" "${changes_dir[@]}")
  104. TEMPLATE_FEAT_CHANGES="$(section 'feat')"
  105. TEMPLATE_PERF_CHANGES="$(section 'perf')"
  106. TEMPLATE_FIX_CHANGES="$(section 'fix')"
  107. case "$LANGUAGE" in
  108. en)
  109. TEMPLATE_ENH_HEADING="Enhancements"
  110. TEMPLATE_FIX_HEADING="Bug Fixes"
  111. ;;
  112. zh)
  113. TEMPLATE_ENH_HEADING="增强"
  114. TEMPLATE_FIX_HEADING="修复"
  115. ;;
  116. esac
  117. cat <<EOF
  118. # ${TEMPLATE_VSN_HEADING}
  119. ## ${TEMPLATE_ENH_HEADING}
  120. ${TEMPLATE_FEAT_CHANGES}
  121. ${TEMPLATE_PERF_CHANGES}
  122. ## ${TEMPLATE_FIX_HEADING}
  123. ${TEMPLATE_FIX_CHANGES}
  124. EOF