From 47387821e57189fdeb250989d2d006d48b8a679e Mon Sep 17 00:00:00 2001 From: Crown0815 Date: Fri, 25 Jul 2025 06:50:17 +0000 Subject: [PATCH] fix: support slashes in tags (#62) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Resolves actions/forgejo-release#22 Co-authored-by: Felix Kröner Reviewed-on: https://code.forgejo.org/actions/forgejo-release/pulls/62 Reviewed-by: earl-warren Co-authored-by: Crown0815 Co-committed-by: Crown0815 --- .editorconfig | 3 ++ forgejo-release.sh | 14 ++++---- .../.forgejo/workflows/test.yml | 35 +++++++++++++++++++ 3 files changed, 46 insertions(+), 6 deletions(-) diff --git a/.editorconfig b/.editorconfig index 669640d..556b6b9 100644 --- a/.editorconfig +++ b/.editorconfig @@ -8,3 +8,6 @@ end_of_line = lf charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true + +[*.yml] +indent_size = 2 diff --git a/forgejo-release.sh b/forgejo-release.sh index 4a24998..73b8e7b 100755 --- a/forgejo-release.sh +++ b/forgejo-release.sh @@ -20,6 +20,7 @@ if ${VERBOSE:-false}; then set -x; fi : ${DELAY:=10} TAG_FILE="$TMP_DIR/tag$$.json" +TAG_URL=$(echo "$TAG" | sed 's/\//%2F/g') export GNUPGHOME @@ -35,7 +36,7 @@ setup_tea() { get_tag() { if ! test -f "$TAG_FILE"; then - if api GET repos/$REPO/tags/"$TAG" >"$TAG_FILE"; then + if api GET repos/$REPO/tags/"$TAG_URL" >"$TAG_FILE"; then echo "tag $TAG exists" else echo "tag $TAG does not exists" @@ -71,7 +72,7 @@ create_tag() { delete_tag() { if get_tag; then - api DELETE repos/$REPO/tags/$TAG + api DELETE repos/$REPO/tags/"$TAG_URL" rm -f "$TAG_FILE" fi } @@ -108,7 +109,7 @@ upload_release() { release_draft() { local state="$1" - local id=$(api GET repos/$REPO/releases/tags/"$TAG" | jq --raw-output .id) + local id=$(api GET repos/$REPO/releases/tags/"$TAG_URL" | jq --raw-output .id) api PATCH repos/$REPO/releases/"$id" --data-raw '{"draft": '"$state"', "hide_archive_links": '$HIDE_ARCHIVE_LINK'}' } @@ -145,7 +146,7 @@ maybe_override() { if test "$OVERRIDE" = "false"; then return fi - api DELETE repos/$REPO/releases/tags/"$TAG" >&/dev/null || true + api DELETE repos/$REPO/releases/tags/"$TAG_URL" >&/dev/null || true if get_tag && ! matched_tag; then delete_tag fi @@ -180,7 +181,7 @@ api() { wait_release() { local ready=false for i in $(seq $RETRY); do - if api GET repos/$REPO/releases/tags/"$TAG" | 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 ready=true break @@ -209,9 +210,10 @@ download() { elif [[ ${DOWNLOAD_LATEST} == "false" ]]; then wait_release echo "Downloading tagged release ${TAG}" - api GET repos/$REPO/releases/tags/"$TAG" >"$TMP_DIR"/assets.json + api GET repos/$REPO/releases/tags/"$TAG_URL" >"$TMP_DIR"/assets.json fi jq --raw-output '.assets[] | "\(.browser_download_url) \(.name)"' <"$TMP_DIR"/assets.json | while read url name; do # `name` may contain whitespace, therefore, it must be last + url=$(echo "$url" | sed "s#/download/${TAG}/#/download/${TAG_URL}/#") curl --fail -H "Authorization: token $TOKEN" -o "$name" -L "$url" done ) diff --git a/testdata/upload-download/.forgejo/workflows/test.yml b/testdata/upload-download/.forgejo/workflows/test.yml index 19530df..6254a27 100644 --- a/testdata/upload-download/.forgejo/workflows/test.yml +++ b/testdata/upload-download/.forgejo/workflows/test.yml @@ -45,6 +45,28 @@ jobs: - \backslash escape - !exclamation_mark verbose: true + - if: ${{ !startsWith(github.ref, 'refs/tags/v') }} + id: release-upload-slash-in-tag + uses: SELF@vTest + with: + direction: upload + tag: a/v3.0 + token: FORGEJO_TOKEN + release-dir: upload-dir + release-notes: "RELEASE NOTES" + verbose: true + - if: ${{ !startsWith(github.ref, 'refs/tags/v') }} + id: release-upload-override-slash-in-tag + uses: SELF@vTest + with: + direction: upload + tag: a/v3.0 + token: FORGEJO_TOKEN + release-dir: upload-dir + release-notes-assistant: true + hide-archive-link: true + override: true + verbose: true - if: ${{ !startsWith(github.ref, 'refs/tags/v') }} id: release-download uses: SELF@vTest @@ -69,5 +91,18 @@ jobs: - if: ${{ !startsWith(github.ref, 'refs/tags/v') }} run: | diff -u upload-dir-v2 download-dir-v2 + - if: ${{ !startsWith(github.ref, 'refs/tags/v') }} + id: release-download-with-slash-in-tag + uses: SELF@vTest + with: + direction: download + tag: a/v3.0 + token: FORGEJO_TEST_TOKEN + release-dir: download-dir-v3a + download-latest: true + verbose: true + - if: ${{ !startsWith(github.ref, 'refs/tags/v') }} + run: | + diff -u upload-dir download-dir-v3a - if: failure() run: docker logs forgejo