POSIX compliance

Signed-off-by: crueter <crueter@eden-emu.dev>
This commit is contained in:
crueter 2025-11-14 22:41:48 -05:00
parent 4e9e207cf5
commit d5e77e0b90
No known key found for this signature in database
GPG key ID: 425ACD2D4830EBC6

View file

@ -1,4 +1,4 @@
#!/bin/bash #!/bin/sh -e
# SPDX-License-Identifier: MIT # SPDX-License-Identifier: MIT
set -e set -e
@ -27,9 +27,9 @@ TAG_URL=$(echo "$TAG" | sed 's/\//%2F/g')
export GNUPGHOME export GNUPGHOME
setup_tea() { setup_tea() {
if which tea 2>/dev/null; then if command -v tea >/dev/null 2>&1; then
TEA_BIN=$(which tea) TEA_BIN=$(command -v tea)
elif ! test -f "$TEA_BIN"; then elif [ ! -f "$TEA_BIN" ]; then
ARCH=$(dpkg --print-architecture) ARCH=$(dpkg --print-architecture)
curl -sL "https://dl.gitea.io/tea/$TEA_VERSION/tea-$TEA_VERSION-linux-$ARCH" >"$TEA_BIN" curl -sL "https://dl.gitea.io/tea/$TEA_VERSION/tea-$TEA_VERSION-linux-$ARCH" >"$TEA_BIN"
chmod +x "$TEA_BIN" chmod +x "$TEA_BIN"
@ -83,22 +83,25 @@ upload_release() {
# assets is defined as a list of arguments, where values may contain whitespace and need to be quoted like this -a "my file.txt" -a "file.txt". # assets is defined as a list of arguments, where values may contain whitespace and need to be quoted like this -a "my file.txt" -a "file.txt".
# It is expanded using "${assets[@]}" which preserves the separation of arguments and not split whitespace containing values. # It is expanded using "${assets[@]}" which preserves the separation of arguments and not split whitespace containing values.
# For reference, see https://github.com/koalaman/shellcheck/wiki/SC2086#exceptions # For reference, see https://github.com/koalaman/shellcheck/wiki/SC2086#exceptions
local assets=()
for file in "$RELEASE_DIR"/*; do for file in "$RELEASE_DIR"/*; do
assets=("${assets[@]}" -a "$file") assets="$assets -a $file"
done done
if $PRERELEASE || echo "${TAG}" | grep -qi '\-rc'; then if $PRERELEASE || echo "${TAG}" | grep -qi '\-rc'; then
releaseType="--prerelease" releaseType="--prerelease"
echo "Uploading as Pre-Release" echo "Uploading as Pre-Release"
else else
echo "Uploading as Stable" echo "Uploading as Stable"
fi fi
ensure_tag ensure_tag
if ! $TEA_BIN release create "${assets[@]}" --repo "$REPO" --note "$RELEASENOTES" --tag "$TAG" --title "$TITLE" --draft "$releaseType" >&"$TMP_DIR"/tea.log; then
# shellcheck disable=SC2086
if ! $TEA_BIN release create $assets --repo "$REPO" --note "$RELEASENOTES" --tag "$TAG" --title "$TITLE" --draft "$releaseType" > "$TMP_DIR"/tea.log 2>&1; then
if grep --quiet 'Unknown API Error: 500' "$TMP_DIR"/tea.log && grep --quiet services/release/release.go:194 "$TMP_DIR"/tea.log; then if grep --quiet 'Unknown API Error: 500' "$TMP_DIR"/tea.log && grep --quiet services/release/release.go:194 "$TMP_DIR"/tea.log; then
echo "workaround v1.20 race condition https://codeberg.org/forgejo/forgejo/issues/1370" echo "workaround v1.20 race condition https://codeberg.org/forgejo/forgejo/issues/1370"
sleep 10 sleep 10
$TEA_BIN release create "${assets[@]}" --repo "$REPO" --note "$RELEASENOTES" --tag "$TAG" --title "$TITLE" --draft "$releaseType" $TEA_BIN release create $assets --repo "$REPO" --note "$RELEASENOTES" --tag "$TAG" --title "$TITLE" --draft "$releaseType"
else else
cat "$TMP_DIR"/tea.log cat "$TMP_DIR"/tea.log
return 1 return 1
@ -109,7 +112,7 @@ upload_release() {
} }
release_draft() { release_draft() {
local state="$1" state="$1"
id=$(api GET "repos/$REPO/releases/tags/$TAG_URL" | jq --raw-output .id) id=$(api GET "repos/$REPO/releases/tags/$TAG_URL" | jq --raw-output .id)
@ -127,15 +130,15 @@ maybe_use_release_note_assistant() {
} }
sign_release() { sign_release() {
local passphrase
if test -s "$GPG_PASSPHRASE"; then if test -s "$GPG_PASSPHRASE"; then
passphrase="--passphrase-file $GPG_PASSPHRASE" passphrase="--passphrase-file $GPG_PASSPHRASE"
fi fi
gpg --import --no-tty --pinentry-mode loopback "$passphrase" "$GPG_PRIVATE_KEY" gpg --import --no-tty --pinentry-mode loopback "$passphrase" "$GPG_PRIVATE_KEY"
for asset in "$RELEASE_DIR"/*; do for asset in "$RELEASE_DIR"/*; do
if [[ $asset =~ .sha256$ ]]; then case "$asset" in
continue *.sha256) continue ;;
fi esac
gpg --armor --detach-sign --no-tty --pinentry-mode loopback "$passphrase" <"$asset" >"$asset".asc gpg --armor --detach-sign --no-tty --pinentry-mode loopback "$passphrase" <"$asset" >"$asset".asc
done done
} }
@ -150,7 +153,7 @@ maybe_override() {
if test "$OVERRIDE" = "false"; then if test "$OVERRIDE" = "false"; then
return return
fi fi
api DELETE "repos/$REPO/releases/tags/$TAG_URL" >&/dev/null || true api DELETE "repos/$REPO/releases/tags/$TAG_URL" > /dev/null 2>&1 || true
if get_tag && ! matched_tag; then if get_tag && ! matched_tag; then
delete_tag delete_tag
fi fi
@ -183,7 +186,7 @@ api() {
} }
wait_release() { wait_release() {
local ready=false ready=false
for _ in $(seq "$RETRY"); do for _ in $(seq "$RETRY"); do
if api GET "repos/$REPO/releases/tags/$TAG_URL" | jq --raw-output .draft >"$TMP_DIR"/draft; then if api GET "repos/$REPO/releases/tags/$TAG_URL" | jq --raw-output .draft >"$TMP_DIR"/draft; then
if test "$(cat "$TMP_DIR"/draft)" = "false"; then if test "$(cat "$TMP_DIR"/draft)" = "false"; then
@ -208,10 +211,10 @@ download() {
( (
mkdir -p "$RELEASE_DIR" mkdir -p "$RELEASE_DIR"
cd "$RELEASE_DIR" cd "$RELEASE_DIR"
if [[ ${DOWNLOAD_LATEST} == "true" ]]; then if [ "${DOWNLOAD_LATEST}" = "true" ]; then
echo "Downloading the latest release" echo "Downloading the latest release"
api GET "repos/$REPO/releases/latest" >"$TMP_DIR"/assets.json api GET "repos/$REPO/releases/latest" >"$TMP_DIR"/assets.json
elif [[ ${DOWNLOAD_LATEST} == "false" ]]; then elif [ "${DOWNLOAD_LATEST}" = "false" ]; then
wait_release wait_release
echo "Downloading tagged release ${TAG}" echo "Downloading tagged release ${TAG}"
api GET "repos/$REPO/releases/tags/$TAG_URL" >"$TMP_DIR"/assets.json api GET "repos/$REPO/releases/tags/$TAG_URL" >"$TMP_DIR"/assets.json