Files
proxmox/scripts/dev-vm/gitea-create-orgs-and-repos.sh
defiQUG bea1903ac9
Some checks failed
Deploy to Phoenix / deploy (push) Has been cancelled
Sync all local changes: docs, config, scripts, submodule refs, verification evidence
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-21 15:46:06 -08:00

113 lines
4.4 KiB
Bash
Executable File

#!/usr/bin/env bash
# Create Gitea organization(s) and repositories via API.
# Usage: GITEA_TOKEN=xxx bash scripts/dev-vm/gitea-create-orgs-and-repos.sh [--dry-run]
# Create token at: https://gitea.d-bis.org/user/settings/applications (scopes: write:organization, write:repository)
# Optional: GITEA_ORG=myorg REPO_NAMES="proxmox dbis_core ..." (default org: d-bis; repos from list or discover)
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
source "$PROJECT_ROOT/config/ip-addresses.conf" 2>/dev/null || true
[ -f "$PROJECT_ROOT/.env" ] && set +u && source "$PROJECT_ROOT/.env" 2>/dev/null || true && set -u
GITEA_URL="${GITEA_URL:-https://gitea.d-bis.org}"
# GITEA_TOKEN from .env or environment
# Token from Gitea: Settings → Applications → Generate New Token (write:organization, write:repository)
# Or set GITEA_USER + GITEA_PASSWORD to create a token automatically (scopes: write:organization, write:repository)
GITEA_TOKEN="${GITEA_TOKEN:-}"
GITEA_USER="${GITEA_USER:-}"
GITEA_PASSWORD="${GITEA_PASSWORD:-}"
DRY_RUN=false
[[ "${1:-}" == "--dry-run" ]] && DRY_RUN=true
# Default org and repos (override with env)
GITEA_ORG="${GITEA_ORG:-d-bis}"
REPO_NAMES="${REPO_NAMES:-proxmox dbis_core explorer-monorepo virtual-banker alltra-lifi-settlement smom-dbis-138 unifi-api metamask-integration fireblocks-integration mcp-omada mcp-proxmox mcp-unifi the-order miracles_in_motion rpc-translator-138 token-lists forge-verification-proxy site-manager-api multi-chain-execution}"
# Create token from username/password if needed
if [ -z "$GITEA_TOKEN" ] && [ -n "$GITEA_USER" ] && [ -n "$GITEA_PASSWORD" ]; then
echo "Creating token for $GITEA_USER..."
TOKEN_RESP=$(curl -s -X POST "${GITEA_URL%/}/api/v1/users/${GITEA_USER}/tokens" \
-H "Content-Type: application/json" -u "$GITEA_USER:$GITEA_PASSWORD" \
-d '{"name":"org-repo-setup","scopes":["write:organization","write:repository"]}')
GITEA_TOKEN=$(echo "$TOKEN_RESP" | jq -r '.sha1 // .token // empty')
if [ -z "$GITEA_TOKEN" ] || [ "$GITEA_TOKEN" = "null" ]; then
echo "Failed to create token: $TOKEN_RESP"
exit 1
fi
echo "Token created."
fi
if [ -z "$GITEA_TOKEN" ]; then
echo "Set GITEA_TOKEN, or GITEA_USER + GITEA_PASSWORD. Create token at: $GITEA_URL/user/settings/applications (scopes: write:organization, write:repository)"
exit 1
fi
API="${GITEA_URL%/}/api/v1"
AUTH="Authorization: token $GITEA_TOKEN"
# Create organization
create_org() {
local org="$1"
local full_name="${2:-$org}"
if $DRY_RUN; then
echo "[DRY-RUN] Would create org: $org ($full_name)"
return 0
fi
local resp
resp=$(curl -s -w "\n%{http_code}" -X POST "$API/orgs" \
-H "Content-Type: application/json" -H "$AUTH" \
-d "{\"username\":\"$org\",\"full_name\":\"$full_name\",\"visibility\":\"public\"}")
local code
code=$(echo "$resp" | tail -1)
local body
body=$(echo "$resp" | sed '$d')
if [ "$code" = "201" ]; then
echo " Created org: $org"
return 0
fi
if echo "$body" | grep -q "already exists\|Username .* is already"; then
echo " Org $org already exists"
return 0
fi
echo " Failed to create org $org: HTTP $code$body"
return 1
}
# Create repository in org
create_repo() {
local org="$1"
local name="$2"
local desc="${3:-}"
if $DRY_RUN; then
echo "[DRY-RUN] Would create repo: $org/$name"
return 0
fi
local payload="{\"name\":\"$name\",\"private\":false}"
[ -n "$desc" ] && payload=$(echo "$payload" | jq -c --arg d "$desc" '. + {description:$d}')
local resp
resp=$(curl -s -w "\n%{http_code}" -X POST "$API/orgs/$org/repos" \
-H "Content-Type: application/json" -H "$AUTH" -d "$payload")
local code
code=$(echo "$resp" | tail -1)
local body
body=$(echo "$resp" | sed '$d')
if [ "$code" = "201" ]; then
echo " Created repo: $org/$name"
return 0
fi
if echo "$body" | grep -q "already exists\|Repository .* already"; then
echo " Repo $org/$name already exists"
return 0
fi
echo " Failed to create repo $org/$name: HTTP $code$body"
return 1
}
echo "Gitea: $GITEA_URL | Org: $GITEA_ORG | DRY_RUN=$DRY_RUN"
echo "Creating org: $GITEA_ORG"
create_org "$GITEA_ORG" "D-BIS" || true
echo "Creating repos in $GITEA_ORG:"
for r in $REPO_NAMES; do
create_repo "$GITEA_ORG" "$r" "" || true
done
echo "Done. Add remote and push: git remote add gitea $GITEA_URL/$GITEA_ORG/<repo>.git && git push -u gitea main"