format-changelog.sh 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #!/bin/bash
  2. set -euo pipefail
  3. shopt -s nullglob
  4. export LANG=C.UTF-8
  5. [ "$#" -ne 4 ] && {
  6. echo "Usage $0 <emqx|emqx-enterprise> <LAST TAG> <VERSION> <OUTPUT DIR>" 1>&2;
  7. exit 1
  8. }
  9. profile="${1}"
  10. last_tag="${2}"
  11. version="${3}"
  12. output_dir="${4}"
  13. languages=("en" "zh")
  14. top_dir="$(git rev-parse --show-toplevel)"
  15. templates_dir="$top_dir/scripts/changelog-lang-templates"
  16. declare -a changes
  17. changes=("")
  18. echo "generated changelogs from tag:${last_tag} to HEAD"
  19. item() {
  20. local filename pr indent
  21. filename="${1}"
  22. pr="$(echo "${filename}" | sed -E 's/.*-([0-9]+)\.[a-z]+\.md$/\1/')"
  23. indent="- [#${pr}](https://github.com/emqx/emqx/pull/${pr}) "
  24. while read -r line; do
  25. echo "${indent}${line}"
  26. indent=" "
  27. done < "${filename}"
  28. echo
  29. }
  30. section() {
  31. local prefix=$1
  32. for file in "${changes[@]}"; do
  33. if [[ $file =~ .*$prefix-.*$language.md ]]; then
  34. item "$file"
  35. fi
  36. done
  37. }
  38. generate() {
  39. local language=$1
  40. local output="$output_dir/${version}_$language.md"
  41. local template_file="$templates_dir/$language"
  42. local template
  43. if [ -f "$template_file" ]; then
  44. template=$(cat "$template_file")
  45. eval "echo \"$template\" > $output"
  46. else
  47. echo "Invalid language ${language}" 1>&2;
  48. exit 1
  49. fi
  50. }
  51. changes_dir=("$top_dir/changes/ce")
  52. if [ "$profile" == "emqx-enterprise" ]; then
  53. changes_dir+=("$top_dir/changes/ee")
  54. fi
  55. while read -d "" -r file; do
  56. changes+=("$file")
  57. done < <(git diff --name-only -z -a "tags/${last_tag}...HEAD" "${changes_dir[@]}")
  58. for language in "${languages[@]}"; do
  59. generate "$language"
  60. done