97 lines
3.0 KiB
Bash
Executable File
97 lines
3.0 KiB
Bash
Executable File
#!/usr/bin/env sh
|
|
# Bootstrap: creates the repo on Gitea (via API) and pushes this project.
|
|
#
|
|
# Requirements:
|
|
# - python3 (for parsing/decoding credentials from ~/.git-credentials)
|
|
# - curl, git
|
|
#
|
|
# The credentials live in ~/.git-credentials (credential-helper "store").
|
|
# This script NEVER prints credentials.
|
|
#
|
|
# Only touches the repository named in REPO_NAME. No other repos on the
|
|
# Gitea server are created, modified or deleted.
|
|
|
|
set -eu
|
|
|
|
HOST="git.dieterunterstrich.de"
|
|
REPO_NAME="anarcho-kommunistisches-internet"
|
|
DESCRIPTION="Nachbarschafts-Netz: gepoolte Bandbreite, Gemeingut, Privacy by Design"
|
|
CRED_FILE="${HOME}/.git-credentials"
|
|
|
|
command -v python3 >/dev/null 2>&1 || { echo "ERROR: python3 required" >&2; exit 1; }
|
|
command -v curl >/dev/null 2>&1 || { echo "ERROR: curl required" >&2; exit 1; }
|
|
|
|
if [ ! -f "$CRED_FILE" ]; then
|
|
echo "ERROR: $CRED_FILE not found" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Parse credentials for HOST (no output of secrets)
|
|
set -- $(python3 - "$CRED_FILE" "$HOST" <<'PYEOF'
|
|
import sys, urllib.parse, shlex
|
|
cred_file, host = sys.argv[1], sys.argv[2]
|
|
line = None
|
|
with open(cred_file) as f:
|
|
for raw in f:
|
|
if host in raw.strip():
|
|
line = raw.strip()
|
|
if not line:
|
|
sys.exit(3)
|
|
u = urllib.parse.urlparse(line)
|
|
user = urllib.parse.unquote(u.username or "")
|
|
pw = urllib.parse.unquote(u.password or "")
|
|
print(shlex.quote(user))
|
|
print(shlex.quote(pw))
|
|
PYEOF
|
|
) || { echo "ERROR: no credentials for $HOST in $CRED_FILE" >&2; exit 1; }
|
|
|
|
GITEA_USER="$1"
|
|
GITEA_PASS="$2"
|
|
|
|
if [ -z "$GITEA_USER" ] || [ -z "$GITEA_PASS" ]; then
|
|
echo "ERROR: could not parse credentials for $HOST" >&2
|
|
exit 1
|
|
fi
|
|
|
|
RESP_FILE=$(mktemp)
|
|
trap 'rm -f "$RESP_FILE"' EXIT
|
|
|
|
echo "Creating repository $REPO_NAME on $HOST (owner: $GITEA_USER) ..."
|
|
STATUS=$(curl -s -o "$RESP_FILE" -w "%{http_code}" \
|
|
-X POST "https://$HOST/api/v1/user/repos" \
|
|
-u "$GITEA_USER:$GITEA_PASS" \
|
|
-H "Content-Type: application/json" \
|
|
-d "{\"name\":\"$REPO_NAME\",\"description\":\"$DESCRIPTION\",\"private\":false,\"auto_init\":false}")
|
|
|
|
case "$STATUS" in
|
|
201) echo "Repository created." ;;
|
|
409) echo "Repository already exists - continuing." ;;
|
|
401) echo "ERROR: authentication failed (HTTP 401). Is 2FA enabled or password wrong? A token may be needed." >&2; exit 1 ;;
|
|
403) echo "ERROR: forbidden (HTTP 403)." >&2; exit 1 ;;
|
|
*) echo "ERROR: unexpected HTTP status $STATUS" >&2; sed -e 's/[^-]*-/x-/g' "$RESP_FILE" >/dev/null 2>&1; cat "$RESP_FILE" >&2; exit 1 ;;
|
|
esac
|
|
|
|
REMOTE_URL="https://$HOST/$GITEA_USER/$REPO_NAME.git"
|
|
|
|
cd "$(dirname "$0")/.."
|
|
|
|
if [ ! -d .git ]; then
|
|
git init -b main
|
|
fi
|
|
|
|
if git remote get-url origin >/dev/null 2>&1; then
|
|
git remote set-url origin "$REMOTE_URL"
|
|
else
|
|
git remote add origin "$REMOTE_URL"
|
|
fi
|
|
|
|
if ! git diff --cached --quiet 2>/dev/null || [ -n "$(git status --porcelain)" ]; then
|
|
git add -A
|
|
git commit -m "Initial project structure: documentation, server concept, agents instructions"
|
|
fi
|
|
|
|
echo "Pushing to $REMOTE_URL (branch: main) ..."
|
|
git push -u origin main
|
|
|
|
echo "Done."
|