#!/usr/bin/env bash # # Publish a .deb to the Forgejo Debian package registry. # # Usage: scripts/publish-deb.sh [owner] [distribution] [component] # # owner registry owner (user or org), default: heavy-duty # distribution APT distribution, default: stable # component APT component, default: main # # Authentication (first match wins): # 1. STOKE_TOKEN environment variable # 2. The token stored by `stoke auth login` # # The Forgejo URL defaults to the instance in the stoke config, falling back # to https://forgejo.heavyduty.builders. Override with FORGE_URL. set -euo pipefail ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" DEB="${1:?usage: publish-deb.sh [owner] [distribution] [component]}" OWNER="${2:-heavy-duty}" DISTRIBUTION="${3:-stable}" COMPONENT="${4:-main}" [ -f "$DEB" ] || { echo "error: no such file: $DEB" >&2; exit 1; } CONFIG_JSON="$(node -e "const c = require('$ROOT/src/config').loadConfig(); if (c) process.stdout.write(JSON.stringify(c));" 2>/dev/null || true)" TOKEN="${STOKE_TOKEN:-$(node -pe "(JSON.parse(process.argv[1] || '{}').token) || ''" "$CONFIG_JSON")}" FORGE_URL="${FORGE_URL:-$(node -pe "(JSON.parse(process.argv[1] || '{}').url) || 'https://forgejo.heavyduty.builders'" "$CONFIG_JSON")}" [ -n "$TOKEN" ] || { echo "error: no token. Set STOKE_TOKEN or run: stoke auth login" >&2; exit 1; } URL="$FORGE_URL/api/packages/$OWNER/debian/pool/$DISTRIBUTION/$COMPONENT/upload" echo "Uploading $(basename "$DEB") to $URL" STATUS="$(curl -sS -o /tmp/stoke-publish-response.$$ -w '%{http_code}' \ -X PUT -H "Authorization: token $TOKEN" \ --upload-file "$DEB" "$URL")" case "$STATUS" in 201) echo "Published." ;; 409) echo "Already published (409): this exact version already exists in the registry." ;; *) echo "error: upload failed with HTTP $STATUS" >&2 cat /tmp/stoke-publish-response.$$ >&2 || true rm -f /tmp/stoke-publish-response.$$ exit 1 ;; esac rm -f /tmp/stoke-publish-response.$$