#!/usr/bin/env bash set -euo pipefail source "$(cd "$(dirname "$0")/.." && pwd)/lib/common.sh" require_cmd curl require_env GITEA_PACKAGE_TOKEN work_root="$(ci_work_root)" metadata_file="$work_root/artifacts/package.env" [[ -f "$metadata_file" ]] || die "Package metadata file not found: $metadata_file" set -a # shellcheck disable=SC1090 . "$metadata_file" set +a owner="${GITEA_PACKAGE_OWNER:-${CI_REPO_OWNER:-}}" username="${GITEA_PACKAGE_USERNAME:-${CI_REPO_OWNER:-}}" base_url="${GITEA_BASE_URL:-$DEFAULT_GITEA_BASE_URL}" [[ -n "$owner" ]] || die "Unable to determine Gitea package owner. Set GITEA_PACKAGE_OWNER or CI_REPO_OWNER." [[ -n "$username" ]] || die "Unable to determine Gitea upload username. Set GITEA_PACKAGE_USERNAME or CI_REPO_OWNER." [[ -f "${PACKAGE_FILE:-}" ]] || die "Built package file not found: ${PACKAGE_FILE:-unset}" upload_url="$base_url/api/packages/$owner/debian/pool/$PACKAGE_DISTRIBUTION/$PACKAGE_COMPONENT/upload" upload_response_file="$(mktemp)" urlencode() { local input="$1" local length="${#input}" local index char encoded="" for ((index = 0; index < length; index++)); do char="${input:index:1}" case "$char" in [a-zA-Z0-9._~-]) encoded+="$char" ;; *) printf -v char '%%%02X' "'$char" encoded+="$char" ;; esac done printf '%s\n' "$encoded" } upload_package() { curl \ --silent \ --show-error \ --output "$upload_response_file" \ --write-out '%{http_code}' \ --user "$username:$GITEA_PACKAGE_TOKEN" \ --upload-file "$PACKAGE_FILE" \ "$upload_url" } log "Uploading ${PACKAGE_FILE##*/} to $upload_url" status_code="$(upload_package)" if [[ "$status_code" == "409" ]]; then delete_url="$base_url/api/packages/$owner/debian/pool/$PACKAGE_DISTRIBUTION/$PACKAGE_COMPONENT/$(urlencode "$PACKAGE_NAME")/$(urlencode "$PACKAGE_VERSION")/$(urlencode "$PACKAGE_ARCHITECTURE")" log "Package already exists, deleting current $PACKAGE_NAME/$PACKAGE_VERSION/$PACKAGE_ARCHITECTURE before retry" delete_status="$( curl \ --silent \ --show-error \ --output "$upload_response_file" \ --write-out '%{http_code}' \ --user "$username:$GITEA_PACKAGE_TOKEN" \ --request DELETE \ "$delete_url" )" if [[ "$delete_status" != "204" ]]; then cat "$upload_response_file" >&2 die "Package delete failed with HTTP $delete_status" fi status_code="$(upload_package)" fi if [[ "$status_code" != "201" ]]; then cat "$upload_response_file" >&2 die "Package upload failed with HTTP $status_code" fi rm -f "$upload_response_file" log "Upload finished"