2024-07-21 22:05:08 +03:00
#!/bin/bash
# Copyright twenty-panda <twenty-panda@posteo.com>
# SPDX-License-Identifier: MIT
2024-07-23 17:45:44 +03:00
label_worth = worth
label_bug = bug
label_feature = feature
label_ui = forgejo/ui
label_breaking = breaking
2024-07-24 07:22:35 +03:00
label_localization = internationalization
2024-07-23 17:45:44 +03:00
2024-07-21 22:05:08 +03:00
payload = $( mktemp)
pr = $( mktemp)
trap " rm $payload $pr " EXIT
2024-07-23 17:45:44 +03:00
function test_main( ) {
set -ex
PS4 = '${BASH_SOURCE[0]}:$LINENO: ${FUNCNAME[0]}: '
test_payload_labels $label_worth $label_breaking $label_feature
test " $( categorize) " = 'AA Breaking features'
test_payload_labels $label_worth $label_breaking $label_bug
test " $( categorize) " = 'AB Breaking bug fixes'
test_payload_labels $label_worth $label_breaking
test " $( categorize) " = 'ZC Breaking changes without a feature or bug label'
test_payload_labels $label_worth $label_ui $label_feature
test " $( categorize) " = 'BA User Interface features'
test_payload_labels $label_worth $label_ui $label_bug
test " $( categorize) " = 'BB User Interface bug fixes'
test_payload_labels $label_worth $label_ui
test " $( categorize) " = 'ZD User Interface changes without a feature or bug label'
test_payload_labels $label_worth $label_feature
test " $( categorize) " = 'CA Features'
test_payload_labels $label_worth $label_bug
test " $( categorize) " = 'CB Bug fixes'
2024-07-24 07:22:35 +03:00
test_payload_labels $label_worth $label_localization
test " $( categorize) " = 'DA Localization'
2024-07-23 17:45:44 +03:00
test_payload_labels $label_worth
test " $( categorize) " = 'ZE Other changes without a feature or bug label'
test_payload_labels
2024-08-01 16:49:05 +03:00
test " $( categorize) " = 'ZF Included for completeness but not worth a release note'
2024-07-23 17:45:44 +03:00
test_payload_draft "feat!: breaking feature"
test " $( categorize) " = 'AA Breaking features'
test_payload_draft "fix!: breaking bug fix"
test " $( categorize) " = 'AB Breaking bug fixes'
test_payload_draft "feat: feature"
test " $( categorize) " = 'CA Features'
test_payload_draft "fix: bug fix"
test " $( categorize) " = 'CB Bug fixes'
test_payload_draft "something with no prefix"
test " $( categorize) " = 'ZE Other changes without a feature or bug label'
}
function main( ) {
cat >$payload
categorize
}
function categorize( ) {
#
# If this is a backport, refer to the original PR to figure
# out the classification.
#
if $( jq --raw-output .IsBackportedFrom <$payload ) ; then
jq --raw-output '.BackportedFrom[0]' <$payload >$pr
else
jq --raw-output '.Pr' <$payload >$pr
fi
labels = $( jq --raw-output '.labels[].name' <$pr )
#
# Was this PR labeled `worth a release note`?
#
if echo " $labels " | grep --quiet $label_worth ; then
worth = true
else
worth = false
2024-07-21 22:05:08 +03:00
fi
2024-07-23 17:45:44 +03:00
#
# If there was no release-notes/N.md file and it is not
# worth a release note, just forget about it.
#
if test -z " $( jq --raw-output .Draft <$payload ) " ; then
if ! $worth ; then
2024-08-01 16:49:05 +03:00
echo -n ZF Included for completeness but not worth a release note
2024-07-23 17:45:44 +03:00
exit 0
fi
2024-07-21 22:05:08 +03:00
fi
2024-07-23 17:45:44 +03:00
is_ui = false
is_bug = false
is_feature = false
2024-07-24 07:22:35 +03:00
is_localization = false
2024-07-23 17:45:44 +03:00
is_breaking = false
#
# first try to figure out the category from the labels
#
case " $labels " in
*$label_bug *)
is_bug = true
; ;
*$label_feature *)
is_feature = true
; ;
2024-07-24 07:22:35 +03:00
*$label_localization *)
is_localization = true
; ;
2024-07-23 17:45:44 +03:00
esac
2024-07-21 22:05:08 +03:00
case " $labels " in
2024-07-23 17:45:44 +03:00
*$label_breaking *)
is_breaking = true
; ;
2024-07-21 22:05:08 +03:00
esac
2024-07-23 17:45:44 +03:00
2024-07-21 22:05:08 +03:00
case " $labels " in
2024-07-23 17:45:44 +03:00
*$label_ui *)
is_ui = true
; ;
2024-07-21 22:05:08 +03:00
esac
2024-07-23 17:45:44 +03:00
#
# then try the prefix of the release note
#
if ! $is_bug && ! $is_feature ; then
draft = " $( jq --raw-output .Draft <$payload ) "
case " $draft " in
fix!:*)
is_bug = true
is_breaking = true
; ;
fix:*)
is_bug = true
; ;
feat!:*)
is_feature = true
is_breaking = true
; ;
feat:*)
is_feature = true
; ;
esac
fi
if $is_bug ; then
if $( jq --raw-output .IsBackportedTo <$payload ) ; then
#
# if it has been backported, it was in the release notes of an older stable release
# and does not need to be in this more recent release notes
#
echo -n ZG Already announced in the release notes of an older stable release
exit 0
fi
fi
if $is_breaking ; then
if $is_feature ; then
echo -n AA Breaking features
elif $is_bug ; then
2024-07-25 09:26:03 +03:00
echo -n AB Breaking bug fixes
2024-07-23 17:45:44 +03:00
else
echo -n ZC Breaking changes without a feature or bug label
fi
elif $is_ui ; then
if $is_feature ; then
echo -n BA User Interface features
elif $is_bug ; then
echo -n BB User Interface bug fixes
else
echo -n ZD User Interface changes without a feature or bug label
fi
2024-07-24 07:22:35 +03:00
elif $is_localization ; then
echo -n DA Localization
2024-07-23 17:45:44 +03:00
else
if $is_feature ; then
echo -n CA Features
elif $is_bug ; then
echo -n CB Bug fixes
else
echo -n ZE Other changes without a feature or bug label
fi
fi
}
function test_payload_labels( ) {
local label1 = " $1 "
local label2 = " $2 "
local label3 = " $3 "
local label4 = " $4 "
cat >$payload <<EOF
{
"Pr" : {
"labels" : [
{
"name" : " $label1 "
} ,
{
"name" : " $label2 "
} ,
{
"name" : " $label3 "
} ,
{
"name" : " $label4 "
}
]
} ,
"IsBackportedFrom" : false,
"Draft" : ""
}
EOF
}
function test_payload_draft( ) {
local draft = " $1 "
cat >$payload <<EOF
{
"Pr" : {
"labels" : [
{
"name" : " $label_worth "
}
]
} ,
"IsBackportedFrom" : false,
"Draft" : " $draft "
}
EOF
}
" ${ @ :- main } "