2024-07-21 14:05:08 -05:00
|
|
|
#!/bin/bash
|
|
|
|
# Copyright twenty-panda <twenty-panda@posteo.com>
|
|
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
|
2024-07-23 09:45:44 -05:00
|
|
|
label_worth=worth
|
|
|
|
label_bug=bug
|
|
|
|
label_feature=feature
|
|
|
|
label_ui=forgejo/ui
|
|
|
|
label_breaking=breaking
|
2024-11-17 14:03:11 -05:00
|
|
|
label_security=security
|
2024-10-25 09:36:22 -05:00
|
|
|
label_localization=forgejo/i18n
|
2024-07-23 09:45:44 -05:00
|
|
|
|
2024-07-21 14:05:08 -05:00
|
|
|
payload=$(mktemp)
|
|
|
|
pr=$(mktemp)
|
|
|
|
trap "rm $payload $pr" EXIT
|
|
|
|
|
2024-07-23 09:45:44 -05:00
|
|
|
function test_main() {
|
|
|
|
set -ex
|
|
|
|
PS4='${BASH_SOURCE[0]}:$LINENO: ${FUNCNAME[0]}: '
|
|
|
|
|
2024-11-17 14:03:11 -05:00
|
|
|
test_payload_labels $label_worth $label_breaking $label_security $label_bug
|
|
|
|
test "$(categorize)" = 'AA Breaking security bug fixes'
|
|
|
|
|
|
|
|
test_payload_labels $label_worth $label_security $label_bug
|
|
|
|
test "$(categorize)" = 'AB Security bug fixes'
|
|
|
|
|
|
|
|
test_payload_labels $label_worth $label_breaking $label_security $label_feature
|
|
|
|
test "$(categorize)" = 'AC Breaking security features'
|
|
|
|
|
|
|
|
test_payload_labels $label_worth $label_security $label_feature
|
|
|
|
test "$(categorize)" = 'AD Security features'
|
|
|
|
|
|
|
|
test_payload_labels $label_worth $label_security
|
|
|
|
test "$(categorize)" = 'ZA Security changes without a feature or bug label'
|
|
|
|
|
2024-07-23 09:45:44 -05:00
|
|
|
test_payload_labels $label_worth $label_breaking $label_feature
|
2024-11-17 14:03:11 -05:00
|
|
|
test "$(categorize)" = 'BA Breaking features'
|
2024-07-23 09:45:44 -05:00
|
|
|
|
|
|
|
test_payload_labels $label_worth $label_breaking $label_bug
|
2024-11-17 14:03:11 -05:00
|
|
|
test "$(categorize)" = 'BB Breaking bug fixes'
|
2024-07-23 09:45:44 -05:00
|
|
|
|
|
|
|
test_payload_labels $label_worth $label_breaking
|
2024-11-17 14:03:11 -05:00
|
|
|
test "$(categorize)" = 'ZB Breaking changes without a feature or bug label'
|
2024-07-23 09:45:44 -05:00
|
|
|
|
|
|
|
test_payload_labels $label_worth $label_ui $label_feature
|
2024-11-17 14:03:11 -05:00
|
|
|
test "$(categorize)" = 'CA User Interface features'
|
2024-07-23 09:45:44 -05:00
|
|
|
|
|
|
|
test_payload_labels $label_worth $label_ui $label_bug
|
2024-11-17 14:03:11 -05:00
|
|
|
test "$(categorize)" = 'CB User Interface bug fixes'
|
2024-07-23 09:45:44 -05:00
|
|
|
|
|
|
|
test_payload_labels $label_worth $label_ui
|
2024-11-17 14:03:11 -05:00
|
|
|
test "$(categorize)" = 'ZC User Interface changes without a feature or bug label'
|
|
|
|
|
|
|
|
test_payload_labels $label_worth $label_localization
|
|
|
|
test "$(categorize)" = 'DA Localization'
|
2024-07-23 09:45:44 -05:00
|
|
|
|
|
|
|
test_payload_labels $label_worth $label_feature
|
2024-11-17 14:03:11 -05:00
|
|
|
test "$(categorize)" = 'EA Features'
|
2024-07-23 09:45:44 -05:00
|
|
|
|
|
|
|
test_payload_labels $label_worth $label_bug
|
2024-11-17 14:03:11 -05:00
|
|
|
test "$(categorize)" = 'EB Bug fixes'
|
2024-07-23 23:22:35 -05:00
|
|
|
|
2024-07-23 09:45:44 -05:00
|
|
|
test_payload_labels $label_worth
|
|
|
|
test "$(categorize)" = 'ZE Other changes without a feature or bug label'
|
|
|
|
|
|
|
|
test_payload_labels
|
2024-08-01 08:49:05 -05:00
|
|
|
test "$(categorize)" = 'ZF Included for completeness but not worth a release note'
|
2024-07-23 09:45:44 -05:00
|
|
|
|
2024-11-17 14:03:11 -05:00
|
|
|
test_payload_draft "fix(security)!: breaking security bug fix"
|
|
|
|
test "$(categorize)" = 'AA Breaking security bug fixes'
|
|
|
|
|
|
|
|
test_payload_draft "fix(security): security bug fix"
|
|
|
|
test "$(categorize)" = 'AB Security bug fixes'
|
|
|
|
|
2024-07-23 09:45:44 -05:00
|
|
|
test_payload_draft "feat!: breaking feature"
|
2024-11-17 14:03:11 -05:00
|
|
|
test "$(categorize)" = 'BA Breaking features'
|
2024-07-23 09:45:44 -05:00
|
|
|
|
|
|
|
test_payload_draft "fix!: breaking bug fix"
|
2024-11-17 14:03:11 -05:00
|
|
|
test "$(categorize)" = 'BB Breaking bug fixes'
|
2024-07-23 09:45:44 -05:00
|
|
|
|
|
|
|
test_payload_draft "feat: feature"
|
2024-11-17 14:03:11 -05:00
|
|
|
test "$(categorize)" = 'EA Features'
|
2024-07-23 09:45:44 -05:00
|
|
|
|
|
|
|
test_payload_draft "fix: bug fix"
|
2024-11-17 14:03:11 -05:00
|
|
|
test "$(categorize)" = 'EB Bug fixes'
|
2024-07-23 09:45:44 -05:00
|
|
|
|
|
|
|
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 14:05:08 -05:00
|
|
|
fi
|
2024-07-23 09:45:44 -05: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 08:49:05 -05:00
|
|
|
echo -n ZF Included for completeness but not worth a release note
|
2024-07-23 09:45:44 -05:00
|
|
|
exit 0
|
|
|
|
fi
|
2024-07-21 14:05:08 -05:00
|
|
|
fi
|
|
|
|
|
2024-07-23 09:45:44 -05:00
|
|
|
is_ui=false
|
|
|
|
is_bug=false
|
|
|
|
is_feature=false
|
2024-07-23 23:22:35 -05:00
|
|
|
is_localization=false
|
2024-07-23 09:45:44 -05:00
|
|
|
is_breaking=false
|
2024-11-17 14:03:11 -05:00
|
|
|
is_security=false
|
2024-07-23 09:45:44 -05:00
|
|
|
|
|
|
|
#
|
|
|
|
# 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-23 23:22:35 -05:00
|
|
|
*$label_localization*)
|
|
|
|
is_localization=true
|
|
|
|
;;
|
2024-07-23 09:45:44 -05:00
|
|
|
esac
|
|
|
|
|
2024-11-17 14:03:11 -05:00
|
|
|
case "$labels" in
|
|
|
|
*$label_security*)
|
|
|
|
is_security=true
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
2024-07-21 14:05:08 -05:00
|
|
|
case "$labels" in
|
2024-07-23 09:45:44 -05:00
|
|
|
*$label_breaking*)
|
|
|
|
is_breaking=true
|
|
|
|
;;
|
2024-07-21 14:05:08 -05:00
|
|
|
esac
|
2024-07-23 09:45:44 -05:00
|
|
|
|
2024-07-21 14:05:08 -05:00
|
|
|
case "$labels" in
|
2024-07-23 09:45:44 -05:00
|
|
|
*$label_ui*)
|
|
|
|
is_ui=true
|
|
|
|
;;
|
2024-07-21 14:05:08 -05:00
|
|
|
esac
|
2024-07-23 09:45:44 -05:00
|
|
|
|
|
|
|
#
|
|
|
|
# then try the prefix of the release note
|
|
|
|
#
|
|
|
|
if ! $is_bug && ! $is_feature; then
|
|
|
|
draft="$(jq --raw-output .Draft <$payload)"
|
|
|
|
case "$draft" in
|
2024-11-17 14:03:11 -05:00
|
|
|
fix\(security\)!:*)
|
|
|
|
is_bug=true
|
|
|
|
is_breaking=true
|
|
|
|
is_security=true
|
|
|
|
;;
|
|
|
|
fix\(security\):*)
|
|
|
|
is_bug=true
|
|
|
|
is_security=true
|
|
|
|
;;
|
2024-07-23 09:45:44 -05:00
|
|
|
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
|
|
|
|
|
2024-11-17 14:03:11 -05:00
|
|
|
if $is_security; then
|
|
|
|
if $is_bug; then
|
|
|
|
if $is_breaking; then
|
|
|
|
echo -n AA Breaking security bug fixes
|
|
|
|
else
|
|
|
|
echo -n AB Security bug fixes
|
|
|
|
fi
|
|
|
|
elif $is_feature; then
|
|
|
|
if $is_breaking; then
|
|
|
|
echo -n AC Breaking security features
|
|
|
|
else
|
|
|
|
echo -n AD Security features
|
|
|
|
fi
|
|
|
|
else
|
|
|
|
echo -n ZA Security changes without a feature or bug label
|
|
|
|
fi
|
|
|
|
elif $is_breaking; then
|
2024-07-23 09:45:44 -05:00
|
|
|
if $is_feature; then
|
2024-11-17 14:03:11 -05:00
|
|
|
echo -n BA Breaking features
|
2024-07-23 09:45:44 -05:00
|
|
|
elif $is_bug; then
|
2024-11-17 14:03:11 -05:00
|
|
|
echo -n BB Breaking bug fixes
|
2024-07-23 09:45:44 -05:00
|
|
|
else
|
2024-11-17 14:03:11 -05:00
|
|
|
echo -n ZB Breaking changes without a feature or bug label
|
2024-07-23 09:45:44 -05:00
|
|
|
fi
|
|
|
|
elif $is_ui; then
|
|
|
|
if $is_feature; then
|
2024-11-17 14:03:11 -05:00
|
|
|
echo -n CA User Interface features
|
2024-07-23 09:45:44 -05:00
|
|
|
elif $is_bug; then
|
2024-11-17 14:03:11 -05:00
|
|
|
echo -n CB User Interface bug fixes
|
2024-07-23 09:45:44 -05:00
|
|
|
else
|
2024-11-17 14:03:11 -05:00
|
|
|
echo -n ZC User Interface changes without a feature or bug label
|
2024-07-23 09:45:44 -05:00
|
|
|
fi
|
2024-07-23 23:22:35 -05:00
|
|
|
elif $is_localization; then
|
|
|
|
echo -n DA Localization
|
2024-07-23 09:45:44 -05:00
|
|
|
else
|
|
|
|
if $is_feature; then
|
2024-11-17 14:03:11 -05:00
|
|
|
echo -n EA Features
|
2024-07-23 09:45:44 -05:00
|
|
|
elif $is_bug; then
|
2024-11-17 14:03:11 -05:00
|
|
|
echo -n EB Bug fixes
|
2024-07-23 09:45:44 -05:00
|
|
|
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}"
|