From c64e0baf7520b29aa4ace861678baa58ab152a36 Mon Sep 17 00:00:00 2001 From: Florian Berthold Date: Mon, 25 May 2026 11:51:46 +0200 Subject: [PATCH 01/10] ci: use per-job auto GITHUB_TOKEN (Gitea reserves GITEA_TOKEN) --- .gitea/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index c687d59..a03c99a 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -22,4 +22,4 @@ jobs: uses: actions/gitea-release-action@v1 with: files: dist/*.zip - token: ${{ secrets.GITEA_TOKEN }} + token: ${{ secrets.GITHUB_TOKEN }} # auto-injected per job; no org secret needed From adccfdec30cb3db8c832c520db5f3fa274472afd Mon Sep 17 00:00:00 2001 From: Florian Berthold Date: Mon, 25 May 2026 11:55:59 +0200 Subject: [PATCH 02/10] ci: point release-action at gitea.com (github mirror doesn't exist) --- .gitea/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index a03c99a..84d86e5 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -19,7 +19,7 @@ jobs: run: bash tools/build_zip.sh - name: Publish release - uses: actions/gitea-release-action@v1 + uses: https://gitea.com/actions/release-action@main with: files: dist/*.zip token: ${{ secrets.GITHUB_TOKEN }} # auto-injected per job; no org secret needed From 84f045c724b0e3032f5ae17d273be3515f4344a4 Mon Sep 17 00:00:00 2001 From: Florian Berthold Date: Mon, 25 May 2026 11:56:56 +0200 Subject: [PATCH 03/10] ci: replace release-action with curl (no go/action dep, fewer moving parts) --- .gitea/workflows/release.yml | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 84d86e5..4f795b2 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -18,8 +18,32 @@ jobs: - name: Build per-addon zip(s) run: bash tools/build_zip.sh - - name: Publish release - uses: https://gitea.com/actions/release-action@main - with: - files: dist/*.zip - token: ${{ secrets.GITHUB_TOKEN }} # auto-injected per job; no org secret needed + - name: Publish release (Gitea API direct; no action dependency) + env: + GITEA_TOKEN: ${{ secrets.GITHUB_TOKEN }} + REPO: ${{ github.repository }} + TAG: ${{ github.ref_name }} + API: ${{ github.server_url }}/api/v1 + run: | + set -euo pipefail + # Create the release (or reuse if it already exists for this tag). + RID=$(curl -sf -H "Authorization: token $GITEA_TOKEN" \ + "$API/repos/$REPO/releases/tags/$TAG" 2>/dev/null \ + | jq -r '.id // empty') + if [ -z "$RID" ]; then + RID=$(curl -sf -X POST -H "Authorization: token $GITEA_TOKEN" \ + -H "Content-Type: application/json" \ + "$API/repos/$REPO/releases" \ + -d "$(jq -nc --arg t "$TAG" '{tag_name:$t,name:$t,draft:false,prerelease:false}')" \ + | jq -r '.id') + fi + echo "release id: $RID" + # Upload every dist/*.zip + for f in dist/*.zip; do + name=$(basename "$f") + echo "uploading $name" + curl -sf -X POST -H "Authorization: token $GITEA_TOKEN" \ + -F "attachment=@$f" \ + "$API/repos/$REPO/releases/$RID/assets?name=$name" \ + | jq -r '" -> " + .browser_download_url' + done From 737361a29e0dca266e9013049b96b2dc1ae1fa31 Mon Sep 17 00:00:00 2001 From: Florian Berthold Date: Mon, 25 May 2026 11:57:40 +0200 Subject: [PATCH 04/10] ci: tolerate 404 on release-tag existence check (set -e safety) --- .gitea/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 4f795b2..7c1ffe1 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -27,7 +27,7 @@ jobs: run: | set -euo pipefail # Create the release (or reuse if it already exists for this tag). - RID=$(curl -sf -H "Authorization: token $GITEA_TOKEN" \ + RID=$(curl -s -H "Authorization: token $GITEA_TOKEN" \ "$API/repos/$REPO/releases/tags/$TAG" 2>/dev/null \ | jq -r '.id // empty') if [ -z "$RID" ]; then From 1287d50d45a0b7ca3e428985ef82c1c52b9344b1 Mon Sep 17 00:00:00 2001 From: Florian Berthold Date: Mon, 25 May 2026 12:16:43 +0200 Subject: [PATCH 05/10] ci: respect GITHUB_REPOSITORY + tolerate per-asset upload failures --- .gitea/workflows/release.yml | 34 ++++++++++++++++++++++++++++------ tools/build_zip.sh | 13 ++++++++++++- 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 7c1ffe1..709a7cd 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -24,6 +24,9 @@ jobs: REPO: ${{ github.repository }} TAG: ${{ github.ref_name }} API: ${{ github.server_url }}/api/v1 + # Gitea attachment ceiling is 200 MiB (see roles/gitea config). + # Skip anything larger so one oversized asset doesn't fail the job. + MAX_BYTES: 209715200 run: | set -euo pipefail # Create the release (or reuse if it already exists for this tag). @@ -38,12 +41,31 @@ jobs: | jq -r '.id') fi echo "release id: $RID" - # Upload every dist/*.zip + # Upload every dist/*.zip. Per-asset failures don't fail the job — + # we want partial releases to still publish rather than block the + # whole pipeline on one big file. + failed=0 + uploaded=0 for f in dist/*.zip; do name=$(basename "$f") - echo "uploading $name" - curl -sf -X POST -H "Authorization: token $GITEA_TOKEN" \ - -F "attachment=@$f" \ - "$API/repos/$REPO/releases/$RID/assets?name=$name" \ - | jq -r '" -> " + .browser_download_url' + size=$(stat -c '%s' "$f") + if [ "$size" -gt "$MAX_BYTES" ]; then + echo "::warning::skip $name (${size} B > ${MAX_BYTES} B Gitea limit; host on CDN instead)" + failed=$((failed+1)) + continue + fi + echo "uploading $name ($(numfmt --to=iec "$size"))" + if curl -sf -X POST -H "Authorization: token $GITEA_TOKEN" \ + -F "attachment=@$f" \ + "$API/repos/$REPO/releases/$RID/assets?name=$name" \ + | jq -r '" -> " + .browser_download_url'; then + uploaded=$((uploaded+1)) + else + echo "::warning::upload failed for $name" + failed=$((failed+1)) + fi done + echo "release published: $uploaded uploaded, $failed skipped/failed" + # Only fail the job if NO assets uploaded — a release with zero + # attachments isn't useful to anyone. + [ "$uploaded" -gt 0 ] diff --git a/tools/build_zip.sh b/tools/build_zip.sh index f9c2d68..45d1400 100755 --- a/tools/build_zip.sh +++ b/tools/build_zip.sh @@ -6,12 +6,23 @@ # - Always archives HEAD, so the working tree state is irrelevant. # - If more than one addon folder is present, also emits -all.zip # with every addon folder side-by-side at the zip root. +# - When run inside Gitea Actions the working tree lives under a +# per-job dir like /var/lib/act_runner/work/.../hostexecutor, so the +# repo name comes from $GITHUB_REPOSITORY (set by the runner) and +# only falls back to the toplevel basename for local invocations. set -euo pipefail root=$(git rev-parse --show-toplevel) cd "$root" -repo_name=$(basename "$root") +# Gitea Actions sets GITHUB_REPOSITORY=owner/repo. The basename of +# `git rev-parse --show-toplevel` inside the runner is the worker dir +# (e.g. `hostexecutor`), which would name the bundle wrong. +if [ -n "${GITHUB_REPOSITORY:-}" ]; then + repo_name="${GITHUB_REPOSITORY##*/}" +else + repo_name=$(basename "$root") +fi dist="$root/dist" # Find Foo/Foo.toc pairs at depth 1; ignore libs nested deeper. From 7c5fb74e200efaa66729072952612b5c29aad8a7 Mon Sep 17 00:00:00 2001 From: Florian Berthold Date: Fri, 29 May 2026 10:43:54 +0200 Subject: [PATCH 06/10] fix(sync): register OMSYNC addon-message prefix so the threat relay receives on 3.3.5 --- Omen/OmenSync.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Omen/OmenSync.lua b/Omen/OmenSync.lua index 40de513..5c8a3b1 100644 --- a/Omen/OmenSync.lua +++ b/Omen/OmenSync.lua @@ -110,6 +110,12 @@ end -- Receiver -- --------------------------------------------------------------------------- +-- Register the prefix so CHAT_MSG_ADDON fires for our messages on 3.3.5. +-- Without this, incoming OMSYNC packets are silently discarded by the client. +if RegisterAddonMessagePrefix then + RegisterAddonMessagePrefix(PREFIX) +end + local f = CreateFrame("Frame") f:RegisterEvent("CHAT_MSG_ADDON") f:RegisterEvent("PLAYER_LEAVING_WORLD") From 76d441e40969ff23535bf4f7c27dde9713cbd197 Mon Sep 17 00:00:00 2001 From: Florian Berthold Date: Fri, 29 May 2026 20:23:33 +0200 Subject: [PATCH 07/10] fix(libs): pcall AceGUI OnGamePadButtonDown (3.3.5 has no gamepad script type) --- Omen/Libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Omen/Libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua b/Omen/Libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua index ee5a83b..07c8f76 100644 --- a/Omen/Libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua +++ b/Omen/Libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua @@ -199,7 +199,7 @@ local function Constructor() button:SetScript("OnKeyDown", Keybinding_OnKeyDown) button:SetScript("OnMouseDown", Keybinding_OnMouseDown) button:SetScript("OnMouseWheel", Keybinding_OnMouseWheel) - button:SetScript("OnGamePadButtonDown", Keybinding_OnKeyDown) + pcall(button.SetScript, button, "OnGamePadButtonDown", Keybinding_OnKeyDown) button:SetPoint("BOTTOMLEFT") button:SetPoint("BOTTOMRIGHT") button:SetHeight(24) From 0f5e0c7e01c298685187a325b4e91a02f8d26228 Mon Sep 17 00:00:00 2001 From: Florian Berthold Date: Fri, 29 May 2026 20:51:12 +0200 Subject: [PATCH 08/10] ci(release): hide auto-generated source archives (hide_archive_links) --- .gitea/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 709a7cd..1b1b66b 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -37,7 +37,7 @@ jobs: RID=$(curl -sf -X POST -H "Authorization: token $GITEA_TOKEN" \ -H "Content-Type: application/json" \ "$API/repos/$REPO/releases" \ - -d "$(jq -nc --arg t "$TAG" '{tag_name:$t,name:$t,draft:false,prerelease:false}')" \ + -d "$(jq -nc --arg t "$TAG" '{tag_name:$t,name:$t,draft:false,prerelease:false,hide_archive_links:true}')" \ | jq -r '.id') fi echo "release id: $RID" From 3f71d66b0ea053cf07825c227762654068bb0145 Mon Sep 17 00:00:00 2001 From: Florian Berthold Date: Wed, 10 Jun 2026 02:11:46 +0200 Subject: [PATCH 09/10] ci(release): sync release.yml from coa-template MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit hide_archive_links is only honored by Gitea on release edit, not create — add the PATCH step after create/lookup so auto-generated source archive links actually stay hidden (coa-template 90874c5). --- .gitea/workflows/release.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 1b1b66b..2f93975 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -41,6 +41,10 @@ jobs: | jq -r '.id') fi echo "release id: $RID" + # Gitea honors hide_archive_links only on edit, not create — PATCH it + # so the auto-generated Source Code (zip/tar.gz) links stay hidden. + curl -sf -X PATCH -H "Authorization: token $GITEA_TOKEN" -H "Content-Type: application/json" \ + "$API/repos/$REPO/releases/$RID" -d '{"hide_archive_links":true}' >/dev/null || true # Upload every dist/*.zip. Per-asset failures don't fail the job — # we want partial releases to still publish rather than block the # whole pipeline on one big file. From d0c64d75eb9053a2c8dacb7375608eb41a239976 Mon Sep 17 00:00:00 2001 From: Florian Berthold Date: Wed, 10 Jun 2026 02:13:58 +0200 Subject: [PATCH 10/10] fix(sync): enforce THROTTLE as hard floor on threat broadcasts Large threat deltas could bypass the 0.4 s gate entirely, sending unbounded SendAddonMessage traffic in early combat (3.3.5 servers disconnect chatty senders). Throttle now always applies; the MIN_DELTA filter is checked separately afterwards. --- Omen/OmenSync.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Omen/OmenSync.lua b/Omen/OmenSync.lua index 5c8a3b1..e0ec9fc 100644 --- a/Omen/OmenSync.lua +++ b/Omen/OmenSync.lua @@ -34,7 +34,7 @@ local Omen = LibStub("AceAddon-3.0"):GetAddon("Omen") if not Omen then return end local PREFIX = "OMSYNC" -local THROTTLE = 0.4 -- min seconds between sends per (subject, mob) +local THROTTLE = 0.4 -- hard floor: min seconds between sends per (subject, mob) local STALE = 8 -- seconds; entries older than this are ignored local MIN_DELTA = 0.05 -- 5%; smaller changes don't trigger a send @@ -98,7 +98,8 @@ function Omen:SyncBroadcastThreat(subjectGUID, mobGUID, value, isTanking) local age = now - prev.time local maxV = math.max(value, prev.value, 1) local pct = math.abs(value - prev.value) / maxV - if age < THROTTLE and pct < MIN_DELTA then return end + if age < THROTTLE then return end -- hard rate floor + if pct < MIN_DELTA then return end end lastSend[subjectGUID][mobGUID] = { value = value, time = now }