|
| 1 | +#!/bin/bash |
| 2 | +# This is a wrapper around `github_changelog_generator` (https://github.com/github-changelog-generator) |
| 3 | +# to simplify / automate updating of the CHANGELOG.md file. |
| 4 | +# |
| 5 | +# Originally developed for CosmWasm cw_plus (https://github.com/CosmWasm/cw-plus) repository. |
| 6 | +set -o errexit -o pipefail |
| 7 | + |
| 8 | +ORIGINAL_OPTS=$* |
| 9 | +# Requires getopt from util-linux 2.37.4 (brew install gnu-getopt on Mac) |
| 10 | +OPTS=$(getopt -l "help,since-tag:,upcoming-tag:,full,token:" -o "hu:ft" -- "$@") || exit 1 |
| 11 | + |
| 12 | +function print_usage() { |
| 13 | + echo -e "Usage: $0 [-h|--help] [-f|--full] [--since-tag <tag>] [-u|--upcoming-tag] <tag> [-t|--token <token>] |
| 14 | +-h, --help Display help |
| 15 | +-f, --full Process changes since the beginning (by default: since latest git version tag) |
| 16 | +--since-tag <tag> Process changes since git version tag <tag> (by default: since latest git version tag) |
| 17 | +-u, --upcoming-tag <tag> Add a <tag> title in CHANGELOG for the new changes |
| 18 | +--token <token> Pass changelog github token <token>" |
| 19 | +} |
| 20 | + |
| 21 | +function remove_opt() { |
| 22 | + ORIGINAL_OPTS=$(echo "$ORIGINAL_OPTS" | sed "s/\\B$1\\b//") |
| 23 | +} |
| 24 | + |
| 25 | +eval set -- "$OPTS" |
| 26 | +while true |
| 27 | +do |
| 28 | +case $1 in |
| 29 | + -h|--help) |
| 30 | + print_usage |
| 31 | + exit 0 |
| 32 | + ;; |
| 33 | + --since-tag) |
| 34 | + shift |
| 35 | + TAG="$1" |
| 36 | + ;; |
| 37 | + -f|--full) |
| 38 | + TAG="<FULL>" |
| 39 | + remove_opt $1 |
| 40 | + ;; |
| 41 | + -u|--upcoming-tag) |
| 42 | + remove_opt $1 |
| 43 | + shift |
| 44 | + UPCOMING_TAG="$1" |
| 45 | + remove_opt $1 |
| 46 | + ;; |
| 47 | + --) |
| 48 | + shift |
| 49 | + break |
| 50 | + ;; |
| 51 | +esac |
| 52 | +shift |
| 53 | +done |
| 54 | + |
| 55 | +# Get user and repo from ./.git/config |
| 56 | +ORIGIN_URL=$(git config --local remote.origin.url) |
| 57 | +GITHUB_USER=$(echo $ORIGIN_URL | sed -n 's#.*:\([^\/]*\)\/.*#\1#p') |
| 58 | +echo "Github user: $GITHUB_USER" |
| 59 | +GITHUB_REPO=$(echo $ORIGIN_URL | sed -n 's#.*/\(.*\)\.git#\1#p') |
| 60 | +echo "Github repo: $GITHUB_REPO" |
| 61 | + |
| 62 | +if [ -z "$TAG" ] |
| 63 | +then |
| 64 | + # Use latest git version tag |
| 65 | + TAG=$(git tag --sort=creatordate | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+' | tail -1) |
| 66 | + ORIGINAL_OPTS="$ORIGINAL_OPTS --since-tag $TAG" |
| 67 | +fi |
| 68 | + |
| 69 | +echo "Git version tag: $TAG" |
| 70 | + |
| 71 | +cp CHANGELOG.md /tmp/CHANGELOG.md.$$ |
| 72 | +# Consolidate tag for matching changelog entries |
| 73 | +TAG=$(echo "$TAG" | sed -e 's/-[^-]*$//') |
| 74 | +echo "Consolidated tag: $TAG" |
| 75 | +sed -i -n "/^## \\[${TAG}[^]]*\\]/,\$p" CHANGELOG.md |
| 76 | + |
| 77 | +echo github_changelog_generator -u $GITHUB_USER -p $GITHUB_REPO --base CHANGELOG.md $ORIGINAL_OPTS |
| 78 | +github_changelog_generator -u $GITHUB_USER -p $GITHUB_REPO --base CHANGELOG.md $ORIGINAL_OPTS || cp /tmp/CHANGELOG.md.$$ CHANGELOG.md |
| 79 | + |
| 80 | +if [ -n "$UPCOMING_TAG" ] |
| 81 | +then |
| 82 | + # Add "upcoming" version tag |
| 83 | + TODAY=$(date "+%Y-%m-%d") |
| 84 | + sed -i "s+\[Full Changelog\](https://github.com/$GITHUB_USER/$GITHUB_REPO/compare/\(.*\)\.\.\.HEAD)+[Full Changelog](https://github.com/$GITHUB_USER/$GITHUB_REPO/compare/$UPCOMING_TAG...HEAD)\n\n## [$UPCOMING_TAG](https://github.com/$GITHUB_USER/$GITHUB_REPO/tree/$UPCOMING_TAG) ($TODAY)\n\n[Full Changelog](https://github.com/$GITHUB_USER/$GITHUB_REPO/compare/\1...$UPCOMING_TAG)+" CHANGELOG.md |
| 85 | +fi |
| 86 | + |
| 87 | +rm -f /tmp/CHANGELOG.md.$$ |
0 commit comments