diff --git a/.github/gen-changelog.sh b/.github/gen-changelog.sh new file mode 100755 index 0000000..08543fc --- /dev/null +++ b/.github/gen-changelog.sh @@ -0,0 +1,101 @@ +#!/bin/sh + +set -e +branch="" +tag="" +prev_tag="" +opt_dry_run=0 +opt_help=0 +gh_repo="regclient/actions" +gh_auth="" + +# CLI options to override image, platform, base digest, and comma separated list of tags to push +opt_c=0 +opt_h=0 +while getopts 'dhp:' option; do + case $option in + d) opt_dry_run=1;; + h) opt_help=1;; + p) prev_tag="$OPTARG";; + esac +done +set +e +shift $(expr $OPTIND - 1) +if [ $# -gt 0 ] || [ "$opt_help" = "1" ]; then + echo "Usage: $0 [opts]" + echo " -d: dry run" + echo " -h: this help message" + echo " -p tag: previous tag for generating change list" + exit 1 +fi +set -e + +# cd to base of the git repo this script is located within +cd "$(dirname $0)" +cd "$(git rev-parse --show-toplevel)" + +generate_changelog() { + hashes="$(git log --reverse --merges --format="%h" ${prev_tag:+${prev_tag}..HEAD})" + prs="" + users="" + for hash in ${hashes}; do + subj="$(git show --format=%s ${hash})" + pr="${subj#Merge pull request #}" + if [ "$pr" != "$subj" ]; then + pr="${pr%% *}" + inc_pr=0 + msg="$(get_pr_changelog "${pr}")" + if [ -n "$msg" ]; then + echo "$msg" + prs="${prs} ${pr}" + fi + users="${users}\n$(get_pr_user "${pr}")" + # msg="$(git show --format=%b ${hash})" + # echo "- $msg ([PR ${pr}][pr-${pr}])" + fi + done + echo "\nContributors:\n" + for user in $(echo "$users" | sort -u); do + if [ -n "$user" ]; then + echo "- @${user}" + fi + done + echo + for pr in ${prs}; do + echo "[pr-${pr}]: https://github.com/${gh_repo}/pull/${pr}" + done +} + +if [ -x "$(command -v gh-token)" ]; then + gh_auth="Authorization: Bearer $(gh-token)" +fi +get_pr_changelog() { + # the greps are ugly, better parsing options are welcome + curl -sL ${gh_auth:+-H "${gh_auth}"} \ + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + "https://api.github.com/repos/${gh_repo}/pulls/${1}" \ + | jq -r .body \ + | grep -A 99 '### Changelog text' \ + | grep -B 99 '### Please verify' \ + | grep -v -e '^###' -e '