diff options
Diffstat (limited to 'development/auto-changelog.sh')
-rwxr-xr-x | development/auto-changelog.sh | 72 |
1 files changed, 53 insertions, 19 deletions
diff --git a/development/auto-changelog.sh b/development/auto-changelog.sh index f9f577ade..3ed059b3d 100755 --- a/development/auto-changelog.sh +++ b/development/auto-changelog.sh @@ -1,26 +1,60 @@ -#! /bin/bash -# update tags +#!/usr/bin/env bash + +set -e +set -u +set -o pipefail + +readonly URL='https://github.com/MetaMask/metamask-extension' + git fetch --tags -# get origin -URL='https://github.com/MetaMask/metamask-extension' -# get git logs from last tag until HEAD, pretty by 'subject::body' filtered by grep for PRs made with Github squash merge or Github regular merge -LOG=$(git log $(git describe --tags $(git rev-list --tags --max-count=1))..HEAD --pretty="%s::%b" --reverse --grep="Merge pull request #" --grep="(#"); -while read -r line; do - # get git log subject - SUBJECT=$(echo $line | sed -E 's/(.*):{2}(.*)/\1/') - # get git log PR id, PR made with Github squash merge or Github regular merge - PR=$(echo $SUBJECT | sed 's/^.*(#\([^&]*\)).*/\1/' | sed 's/^.*#\([^&]*\) from.*/\1/') - # if PR made with Github squash merge, subject is the body - if [ -z "$(echo $line | sed -E 's/(.*):{2}(.*)/\2/')" ]; then - BODY=$(echo $SUBJECT | sed "s/(#$PR)//g"); else - BODY=$(echo $line | sed -E 's/(.*):{2}(.*)/\2/') + +most_recent_tag="$(git describe --tags "$(git rev-list --tags --max-count=1)")" + +git rev-list "${most_recent_tag}"..HEAD | while read commit +do + subject="$(git show -s --format="%s" "$commit")" + + # Squash & Merge: the commit subject is parsed as `<description> (#<PR ID>)` + if grep -E -q '\(#[[:digit:]]+\)' <<< "$subject" + then + pr="$(awk '{print $NF}' <<< "$subject" | tr -d '()')" + prefix="[$pr]($URL/pull/${pr###}): " + description="$(awk '{NF--; print $0}' <<< "$subject")" + + # Merge: the PR ID is parsed from the git subject (which is of the form `Merge pull request + # #<PR ID> from <branch>`, and the description is assumed to be the first line of the body. + # If no body is found, the description is set to the commit subject + elif grep -E -q '#[[:digit:]]+\sfrom' <<< "$subject" + then + pr="$(awk '{print $4}' <<< "$subject")" + prefix="[$pr]($URL/pull/${pr###}): " + + first_line_of_body="$(git show -s --format="%b" "$commit" | head -n 1 | tr -d '\r')" + if [[ -z "$first_line_of_body" ]] + then + description="$subject" + else + description="$first_line_of_body" + fi + + # Normal commits: The commit subject is the description, and the PR ID is omitted. + else + pr='' + prefix='' + description="$subject" fi + # add entry to CHANGELOG - if [[ "$OSTYPE" == "linux-gnu" ]]; then + if [[ "$OSTYPE" == "linux-gnu" ]] + then + # shellcheck disable=SC1004 sed -i'' '/## Current Develop Branch/a\ -- [#'"$PR"']('"$URL"'/pull/'"$PR"'): '"$BODY"''$'\n' CHANGELOG.md; else +- '"$prefix$description"''$'\n' CHANGELOG.md + else + # shellcheck disable=SC1004 sed -i '' '/## Current Develop Branch/a\ -- [#'"$PR"']('"$URL"'/pull/'"$PR"'): '"$BODY"''$'\n' CHANGELOG.md; +- '"$prefix$description"''$'\n' CHANGELOG.md fi -done <<< "$LOG" +done + echo 'CHANGELOG updated' |