115 lines
3.1 KiB
Bash
Executable File
115 lines
3.1 KiB
Bash
Executable File
#!/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'
|