Skip to content

Commit 233c31a

Browse files
committed
🏃 support release notes on new version
This supports generating release notes when we cross "major" version boundaries and need to create a new release branch.
1 parent 4276f38 commit 233c31a

File tree

2 files changed

+65
-17
lines changed

2 files changed

+65
-17
lines changed

hack/release/common.sh

Lines changed: 63 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ cr_other_pattern=":running:|$(printf "\xf0\x9f\x8f\x83")"
1111
# into one of "major", "minor", "patch", "docs", "other", or
1212
# "unknown", ignoring the '!'
1313
cr::symbol-type-raw() {
14+
[[ ${1} == "" ]] && echo "HERE"
1415
case $1 in
1516
@(${cr_major_pattern})?('!'))
1617
echo "major"
@@ -66,6 +67,52 @@ git::ensure-release-branch() {
6667
fi
6768
}
6869
70+
# git::export-version-from-branch outputs the current version
71+
# for the given branch (as the argument) as exported variables
72+
# (${maj,min,patch}_ver, last_tag).
73+
git::export-version-from-branch() {
74+
local target_branch=${1?must specify a branch}
75+
local current_branch=$(git branch --show-current -q)
76+
77+
local expected_maj_ver
78+
local expected_min_ver
79+
if [[ ${target_branch} =~ release-0.([[:digit:]]+) ]]; then
80+
expected_maj_ver=0
81+
expected_min_ver=${BASH_REMATCH[1]}
82+
elif [[ ${target_branch} =~ release-([[:digit:]]+) ]]; then
83+
expected_maj_ver=${BASH_REMATCH[1]}
84+
else
85+
echo "branch ${target_branch} does not appear to be for a release -- it should be release-X or release-0.Y" >&2
86+
exit 1
87+
fi
88+
89+
local tag_pattern='v([[:digit:]]+).([[:digit:]]+).([[:digit:]]+)'
90+
91+
git checkout -q ${target_branch}
92+
93+
# make sure we've got a tag that matches *some* release
94+
last_tag=$(git describe --tags --abbrev=0) # try to fetch just the "current" tag name
95+
if [[ ! ${last_tag} =~ ${tag_pattern} ]]; then
96+
# it's probably for a previous version
97+
echo "tag ${last_tag} does not appear to be for a release -- it should be vX.Y.Z" >&2
98+
git checkout -q ${current_branch}
99+
exit 1
100+
fi
101+
102+
export min_ver=${BASH_REMATCH[2]}
103+
export patch_ver=${BASH_REMATCH[3]}
104+
export maj_ver=${BASH_REMATCH[1]}
105+
export last_tag=${last_tag}
106+
107+
if ${2:-1} && ([[ ${maj_ver} != ${expected_maj_ver} ]] || [[ ${maj_ver} == 0 && ${min_ver} != ${expected_min_ver} ]]); then
108+
echo "tag ${last_tag} does not appear to be for a the right release (${target_branch})" >&2
109+
git checkout ${current_branch}
110+
exit 1
111+
fi
112+
113+
git checkout -q ${current_branch}
114+
}
115+
69116
# git::export-current-version outputs the current version
70117
# as exported variables (${maj,min,patch}_ver, last_tag) after
71118
# checking that we're on the right release branch.
@@ -75,25 +122,26 @@ git::export-current-version() {
75122
76123
# deal with the release-0.1 branch, or similar
77124
local release_ver=${BASH_REMATCH[1]}
78-
maj_ver=${release_ver}
79-
local tag_pattern='v${maj_ver}.([[:digit:]]+).([[:digit]]+)'
80-
if [[ ${maj_ver} =~ 0\.([[:digit:]]+) ]]; then
81-
maj_ver=0
82-
min_ver=${BASH_REMATCH[1]}
83-
local tag_pattern="v0.(${min_ver}).([[:digit:]]+)"
125+
local expected_maj_ver=${release_ver}
126+
if [[ ${expected_maj_ver} =~ 0\.([[:digit:]]+) ]]; then
127+
expected_maj_ver=0
128+
local expected_min_ver=${BASH_REMATCH[1]}
84129
fi
85130
86-
# make sure we've got a tag that matches our release branch
87-
last_tag=$(git describe --tags --abbrev=0) # try to fetch just the "current" tag name
88-
if [[ ! ${last_tag} =~ ${tag_pattern} ]]; then
89-
echo "tag ${last_tag} does not appear to be a release for this release (${release_ver})-- it should be v${maj_ver}.Y.Z" >&2
90-
exit 1
131+
git::export-version-from-branch "release-${release_ver}" false
132+
133+
local last_tag_branch=""
134+
if [[ ${maj_ver} == "0" && ${min_ver} -eq $((expected_min_ver-1)) ]]; then
135+
echo "most recent tag is a release behind (${last_tag}), checking previous release branch to be safe" >&2
136+
last_tag_branch="release-0.${min_ver}"
137+
elif [[ ${maj_ver} -eq $((expected_maj_ver-1)) ]]; then
138+
echo "most recent tag is a release behind (${last_tag}), checking previous release branch to be safe" >&2
139+
last_tag_branch="release-${maj_ver}"
91140
fi
92141

93-
export min_ver=${BASH_REMATCH[1]}
94-
export patch_ver=${BASH_REMATCH[2]}
95-
export maj_ver=${maj_ver}
96-
export last_tag=${last_tag}
142+
if [[ -n "${last_tag_branch}" ]]; then
143+
git::export-version-from-branch ${last_tag_branch} true
144+
fi
97145
}
98146

99147
# git::next-version figures out the next version to tag

hack/release/release-notes.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ done <<<$(git rev-list ${last_tag}..HEAD --merges --pretty=format:%B)
6464

6565
# TODO: sort non merge commits with tags
6666

67-
[[ -n "${breaking}" ]] && printf '\e[1;31mbreaking changes this version\e[0m' >&2
68-
[[ -n "${unknown}" ]] && printf '\e[1;35munknown changes in this release -- categorize manually\e[0m' >&2
67+
[[ -n "${breaking}" ]] && printf '\e[1;31mbreaking changes this version\e[0m\n' >&2
68+
[[ -n "${unknown}" ]] && printf '\e[1;35munknown changes in this release -- categorize manually\e[0m\n' >&2
6969

7070
echo "" >&2
7171
echo "" >&2

0 commit comments

Comments
 (0)