#!/usr/bin/env bash set -Eeuo pipefail ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd) WORK=$(mktemp -d) trap 'rm -rf "$WORK"' EXIT fail() { printf 'Gitea publish fixture failed: %s\n' "$1" >&2 exit 1 } VERSION=1.2.3-preview.1 TAG=v$VERSION TOKEN=fixture-release-token RELEASE_DIR=$WORK/release MOCK_BIN=$WORK/bin mkdir -p "$RELEASE_DIR" "$MOCK_BIN" for name in \ "kaidi-finance-$VERSION.tar.gz" \ backend-sbom.cdx.json \ frontend-sbom.cdx.json \ release-manifest.json \ release-manifest.sig \ release-public.pem \ install.sh \ purge.sh \ bootstrap-checksums.txt \ SHA256SUMS; do printf 'fixture asset %s\n' "$name" > "$RELEASE_DIR/$name" done printf '%s\n' '{"releaseNotes":"Fixture release notes"}' > "$RELEASE_DIR/release-manifest.json" cat > "$MOCK_BIN/curl" <<'SH' #!/usr/bin/env bash set -Eeuo pipefail method=GET output= form= url= header_file= printf '%s\n' "$*" >> "$MOCK_CURL_LOG" while [ "$#" -gt 0 ]; do case "$1" in --request) shift; method=$1 ;; --output) shift; output=$1 ;; --form) shift; form=$1; method=POST ;; --header) shift case "$1" in @*) header_file=${1#@} ;; esac ;; https://*) url=$1 ;; esac shift done [ -r "$header_file" ] || exit 90 grep -Fqx "Authorization: token $MOCK_GITEA_TOKEN" "$header_file" || exit 91 case "$method:$url" in GET:*/releases/tags/*) printf '{"message":"not found"}\n' > "$output" printf '404' ;; POST:*/releases) printf '{"id":7,"draft":true,"prerelease":false}\n' > "$output" printf '201' ;; POST:*/releases/7/assets*) path=${form#attachment=@} path=${path%%;type=*} name=$(basename "$path") size=$(wc -c < "$path" | tr -d '[:space:]') jq -cn --arg name "$name" --argjson size "$size" '{name:$name,size:$size}' >> "$MOCK_ASSET_LOG" printf '{"name":"%s","size":%s}\n' "$name" "$size" > "$output" printf '201' ;; GET:*/releases/7) jq -s '{id:7,draft:true,prerelease:false,assets:.}' "$MOCK_ASSET_LOG" > "$output" printf '200' ;; PATCH:*/releases/7) jq -s '{id:7,draft:false,prerelease:false,assets:.}' "$MOCK_ASSET_LOG" > "$output" printf '200' ;; *) printf 'unexpected mock request: %s %s\n' "$method" "$url" >&2 exit 92 ;; esac SH chmod 0755 "$MOCK_BIN/curl" : > "$WORK/curl.log" : > "$WORK/assets.jsonl" PATH="$MOCK_BIN:$PATH" \ MOCK_CURL_LOG="$WORK/curl.log" \ MOCK_ASSET_LOG="$WORK/assets.jsonl" \ MOCK_GITEA_TOKEN="$TOKEN" \ GITEA_SERVER_URL=https://gitea.fixture.invalid \ GITEA_REPOSITORY=ERP-Team/kaidi \ GITEA_REF_NAME="$TAG" \ GITEA_SHA=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \ GITEA_TOKEN="$TOKEN" \ KAIDI_RELEASE_DIR="$RELEASE_DIR" \ "$ROOT/scripts/publish-gitea-release.sh" > "$WORK/publish.log" grep -Fqx "Published Gitea release $TAG with ten verified assets" "$WORK/publish.log" \ || fail 'publish script did not report success' [ "$(wc -l < "$WORK/assets.jsonl" | tr -d '[:space:]')" -eq 10 ] \ || fail 'publish script did not upload exactly ten assets' ! grep -Fq "$TOKEN" "$WORK/curl.log" \ || fail 'Gitea write token leaked into curl process arguments' printf 'Gitea draft, ten-asset verification, and publication fixture passed\n'