forked from digital-asset/daml
-
Notifications
You must be signed in to change notification settings - Fork 0
/
unreleased.sh
executable file
·49 lines (41 loc) · 1.86 KB
/
unreleased.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/usr/bin/env bash
# Copyright (c) 2023 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
if [ "$#" -ne 1 ]; then
echo >&2 "Usage: ./unreleased.sh <revision range>"
echo >&2 "Prints all changelog entries added by the given revision range"
echo >&2 "For info about <revision range> please see gitrevisions(7)"
exit 64
fi
set -euo pipefail
COMMITS_IN_GIVEN_RANGE=$(git log --format=%H "$1")
extract_changelog () {
awk '
# Skip empty lines.
/^[[:space:]]*$/ {next}
# Take entire line, uppercase, compare to CHANGELOG_END.
# If it matches, set flag to 0 (false) and skip current line.
toupper($0) ~ /CHANGELOG_END/ { flag=0; next }
# If uppercased line matches CHANGELOG_BEGIN, skip current line and set
# flag to 1 (true).
toupper($0) ~ /CHANGELOG_BEGIN/ { flag=1; next }
# Because all previous cases skip the current line, if we reach this
# point we know that the current line is not blank, does not contain
# CHANGELOG_END, and does not contain CHANGELOG_BEGIN. Here we match
# the line based on the value of flag, regardless of the content of the
# line. Because there is no action associated with this condition, the
# default one is applied when it matches (i.e. when flag != 0), which
# is to print the entire current line.
flag
'
}
for SHA in $COMMITS_IN_GIVEN_RANGE; do
COMMIT_MESSAGE_BODY=$(git show --quiet --format=%b "$SHA")
COMMIT_CHANGELOG=$(echo "$COMMIT_MESSAGE_BODY" | extract_changelog)
if [[ ! -z "$COMMIT_CHANGELOG" ]]; then
COMMIT_AUTHOR_AND_SUBJECT=$(git show --quiet --format="* %s (committer: %an | hash: %h)" "$SHA")
echo "$COMMIT_AUTHOR_AND_SUBJECT"
echo "$COMMIT_CHANGELOG"
echo "----------------"
fi
done