Improve auto changelog script (#6753)
* Improve auto changelog script The auto changelog script was creating empty or invalid entries in a number of different cases, such as when the body of a commit spanned multiple lines. This has been fixed, and the following additional improvements have been made: - Error handling (it will now crash upon encountering an error) - Commits without a PR number in the subject are listed without the PR prefix - Invalid shellcheck warnings ignored - Only the first line of the commit body is shown - Carriage returns are stripped (some commits contain them) This script should be more reliable for helping to manually update the changelog. It's still not sufficiently robust to use as part of an automated process - I don't think that's feasible without maintaining stricter control over commit messages conventions and/or merge strategies.feature/default_network_editable
parent
1ca23078c4
commit
09eca3cc60
@ -1,26 +1,60 @@ |
|||||||
#! /bin/bash |
#!/usr/bin/env bash |
||||||
# update tags |
|
||||||
|
set -e |
||||||
|
set -u |
||||||
|
set -o pipefail |
||||||
|
|
||||||
|
readonly URL='https://github.com/MetaMask/metamask-extension' |
||||||
|
|
||||||
git fetch --tags |
git fetch --tags |
||||||
# get origin |
|
||||||
URL='https://github.com/MetaMask/metamask-extension' |
most_recent_tag="$(git describe --tags "$(git rev-list --tags --max-count=1)")" |
||||||
# 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="(#"); |
git rev-list "${most_recent_tag}"..HEAD | while read commit |
||||||
while read -r line; do |
do |
||||||
# get git log subject |
subject="$(git show -s --format="%s" "$commit")" |
||||||
SUBJECT=$(echo $line | sed -E 's/(.*):{2}(.*)/\1/') |
|
||||||
# get git log PR id, PR made with Github squash merge or Github regular merge |
# Squash & Merge: the commit subject is parsed as `<description> (#<PR ID>)` |
||||||
PR=$(echo $SUBJECT | sed 's/^.*(#\([^&]*\)).*/\1/' | sed 's/^.*#\([^&]*\) from.*/\1/') |
if grep -E -q '\(#[[:digit:]]+\)' <<< "$subject" |
||||||
# if PR made with Github squash merge, subject is the body |
then |
||||||
if [ -z "$(echo $line | sed -E 's/(.*):{2}(.*)/\2/')" ]; then |
pr="$(awk '{print $NF}' <<< "$subject" | tr -d '()')" |
||||||
BODY=$(echo $SUBJECT | sed "s/(#$PR)//g"); else |
prefix="[$pr]($URL/pull/${pr###}): " |
||||||
BODY=$(echo $line | sed -E 's/(.*):{2}(.*)/\2/') |
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 |
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 |
# add entry to CHANGELOG |
||||||
if [[ "$OSTYPE" == "linux-gnu" ]]; then |
if [[ "$OSTYPE" == "linux-gnu" ]] |
||||||
|
then |
||||||
|
# shellcheck disable=SC1004 |
||||||
sed -i'' '/## Current Develop Branch/a\ |
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\ |
sed -i '' '/## Current Develop Branch/a\ |
||||||
- [#'"$PR"']('"$URL"'/pull/'"$PR"'): '"$BODY"''$'\n' CHANGELOG.md; |
- '"$prefix$description"''$'\n' CHANGELOG.md |
||||||
fi |
fi |
||||||
done <<< "$LOG" |
done |
||||||
|
|
||||||
echo 'CHANGELOG updated' |
echo 'CHANGELOG updated' |
||||||
|
Loading…
Reference in new issue