summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Kwak <82421531+jkwak-work@users.noreply.github.com>2024-08-27 18:13:52 -0700
committerGitHub <noreply@github.com>2024-08-27 18:13:52 -0700
commit5645ecfc9d487a5fe612f17d970332a93ed40c47 (patch)
tree1b673fb79f95e1c37beaa9d6b952a104c225c469
parent6bb32aa976494466bd6303f8ae6e348b297edb44 (diff)
Script for generating a release note (#4776)
* Script for generating a release note Related to #4718 * Adding a comment about how to run --------- Co-authored-by: Yong He <yonghe@outlook.com>
-rw-r--r--docs/scripts/release-note.sh106
1 files changed, 106 insertions, 0 deletions
diff --git a/docs/scripts/release-note.sh b/docs/scripts/release-note.sh
new file mode 100644
index 000000000..f1a93137a
--- /dev/null
+++ b/docs/scripts/release-note.sh
@@ -0,0 +1,106 @@
+#!/bin/bash
+# This script generates a release note.
+# It prints information about breaking-changes first and the rest.
+# The content is mostly based on `git log --oneline --since 202X-YY-ZZ`.
+
+# Usage: the script takes one command-line argument that will be used on '-since' option of git command.
+# As an example, you can run a script with a following command, and it will print commit titles between today and 2024-07-01.
+# ```
+# docs/scripts/release-note.sh 2024-07-01
+# ```
+
+# This script is supposed to work on all Windows based shell systems including WSL and git-bash.
+# If you make any modifications, please test them, because CI doesn't test this script.
+
+verbose=true
+$verbose && echo "Reminder: PLEASE make sure your local repo is up-to-date before running the script." >&2
+
+gh=""
+for candidate in "$(which gh.exe)" "/mnt/c/Program Files/GitHub CLI/gh.exe" "/c/Program Files/GitHub CLI/gh.exe"
+do
+ if [ -x "$candidate" ]
+ then
+ gh="$candidate"
+ break
+ fi
+done
+if [ "x$gh" = "x" ] || ! [ -x "$gh" ]
+then
+ echo "File not found: gh.exe"
+ echo "gh.exe can be downloaded from https://cli.github.com"
+ exit 1
+fi
+$verbose && echo "gh.exe is found from: $gh" >&2
+
+if [ "x$1" = "x" ]
+then
+ echo "This script requires 'since' information for git-log command."
+ echo "Usage: $0 2024-07-30"
+ exit 1
+fi
+since="$1"
+
+commits="$(git log --oneline --since $since)"
+commitsCount="$(echo "$commits" | wc -l)"
+
+echo "=== Breaking changes ==="
+breakingChanges=""
+for i in $(seq $commitsCount)
+do
+ line="$(echo "$commits" | head -$i | tail -1)"
+
+ # Get PR number from the git commit title
+ pr="$(echo "$line" | grep '#[1-9][0-9][0-9][0-9][0-9]*' | sed 's|.* (\#\([1-9][0-9][0-9][0-9][0-9]*\))|\1|')"
+ [ "x$pr" = "x" ] && break
+
+ # Check if the PR is marked as a breaking change
+ if "$gh" issue view $pr --json labels | grep -q 'pr: breaking change'
+ then
+ breakingChanges+="$line"
+ fi
+done
+if [ "x$breakingChanges" = "x" ]
+then
+ echo "No breaking changes"
+else
+ echo "$breakingChanges"
+fi
+echo ""
+
+echo "=== All changes for this release ==="
+for i in $(seq $commitsCount)
+do
+ line="$(echo "$commits" | head -$i | tail -1)"
+
+ result="$line"
+ for dummy in 1
+ do
+ # Get PR number from the git commit title
+ pr="$(echo "$line" | grep '#[1-9][0-9][0-9][0-9][0-9]*' | sed 's|.* (\#\([1-9][0-9][0-9][0-9][0-9]*\))|\1|')"
+ [ "x$pr" = "x" ] && break
+
+ # Mark breaking changes with "[BREAKING]"
+ if "$gh" issue view $pr --json labels | grep -q 'pr: breaking change'
+ then
+ result="[BREAKING] $line"
+ fi
+
+ # Get the issue number for the PR
+ body="$("$gh" issue view $pr --json body)"
+ [ "x$body" = "x" ] && break
+ issue="$(echo "$body" | grep '#[1-9][0-9][0-9][0-9][0-9]*' | sed 's|.*\#\([1-9][0-9][0-9][0-9][0-9]*\).*|\1|')"
+ [ "x$issue" = "x" ] && break
+
+ # Get the labels of the issue
+ label="$("$gh" issue view $issue --json labels)"
+ [ "x$label" = "x" ] && break
+
+ # Get the goal type from the labels
+ goal="$(echo "$label" | grep '"goal:' | sed 's|.*"goal:\([^"]*\)".*|\1|')"
+ [ "x$goal" = "x" ] && break
+
+ result+=" (#$issue:$goal)"
+ done
+ echo "$result"
+done
+