@@ -23,24 +23,88 @@ jobs:
2323 steps :
2424 - name : Download release assets from source release
2525 run : |
26+ set -euo pipefail
2627 mkdir -p release-assets
2728 gh release download "$SOURCE_TAG" --repo "$REPOSITORY" --pattern "*" --dir release-assets --clobber
2829
2930 - name : Recreate rolling release alias
3031 run : |
32+ set -euo pipefail
3133 shopt -s nullglob
3234 assets=(release-assets/*)
3335 if [ ${#assets[@]} -eq 0 ]; then
3436 echo "No assets were found on release $SOURCE_TAG."
3537 exit 1
3638 fi
3739
40+ find_asset() {
41+ local platform="$1"
42+ local f name
43+ for f in release-assets/*; do
44+ name=$(basename "$f")
45+ name=${name,,}
46+ case "$platform" in
47+ windows-x64)
48+ [[ "$name" == *win* && "$name" != *arm* && ( "$name" == *x64* || "$name" == *amd64* || "$name" == *x86_64* ) ]] && { echo "$f"; return 0; }
49+ ;;
50+ windows-arm)
51+ [[ "$name" == *win* && ( "$name" == *arm* || "$name" == *aarch64* ) ]] && { echo "$f"; return 0; }
52+ ;;
53+ macos)
54+ [[ ( "$name" == *macos* || "$name" == *darwin* || "$name" == *osx* ) && ( "$name" == *arm* || "$name" == *aarch64* || "$name" == *apple* ) ]] && { echo "$f"; return 0; }
55+ ;;
56+ linux-x64)
57+ [[ "$name" == *linux* && "$name" != *arm* && ( "$name" == *x64* || "$name" == *amd64* || "$name" == *x86_64* ) ]] && { echo "$f"; return 0; }
58+ ;;
59+ linux-arm)
60+ [[ "$name" == *linux* && ( "$name" == *arm* || "$name" == *aarch64* ) ]] && { echo "$f"; return 0; }
61+ ;;
62+ esac
63+ done
64+ return 1
65+ }
66+
67+ win_x64_asset="$(find_asset windows-x64 || true)"
68+ win_arm_asset="$(find_asset windows-arm || true)"
69+ macos_asset="$(find_asset macos || true)"
70+ linux_x64_asset="$(find_asset linux-x64 || true)"
71+ linux_arm_asset="$(find_asset linux-arm || true)"
72+
73+ if [ -z "$win_x64_asset" ] || [ -z "$win_arm_asset" ] || [ -z "$macos_asset" ] || [ -z "$linux_x64_asset" ] || [ -z "$linux_arm_asset" ]; then
74+ echo "Unable to map all required platform assets from release $SOURCE_TAG."
75+ echo "Found files:"
76+ printf ' - %s\n' "${assets[@]}"
77+ exit 1
78+ fi
79+
3880 if gh release view release --repo "$REPOSITORY" >/dev/null 2>&1; then
3981 gh release delete release --repo "$REPOSITORY" --yes --cleanup-tag
4082 fi
4183
42- gh release create release "${assets[@]}" \
84+ gh release create release \
4385 --repo "$REPOSITORY" \
4486 --target "$SOURCE_TAG" \
4587 --title "Latest release" \
46- --notes "Rolling release that keeps https://github.com/$REPOSITORY/releases/download/release/pict.exe pointed at the newest published binary."
88+ --notes "Rolling release that keeps platform-scoped download aliases in sync with the newest published binaries."
89+
90+ upload_url="$(gh api "repos/$REPOSITORY/releases/tags/release" --jq .upload_url)"
91+ upload_url="${upload_url%\{*}"
92+
93+ upload_asset() {
94+ local src="$1"
95+ local alias_name="$2"
96+ local encoded_name
97+ encoded_name="$(jq -rn --arg v "$alias_name" '$v|@uri')"
98+ curl --fail-with-body --silent --show-error \
99+ -X POST \
100+ -H "Authorization: Bearer $GH_TOKEN" \
101+ -H "Content-Type: application/octet-stream" \
102+ --data-binary @"$src" \
103+ "$upload_url?name=$encoded_name" >/dev/null
104+ }
105+
106+ upload_asset "$win_x64_asset" "windows-x64/pict.exe"
107+ upload_asset "$win_arm_asset" "windows-arm/pict.exe"
108+ upload_asset "$macos_asset" "macos/pict.exe"
109+ upload_asset "$linux_x64_asset" "linux-x64/pict.exe"
110+ upload_asset "$linux_arm_asset" "linux-arm/pict.exe"
0 commit comments