packages-scripts/forgejo/setup-python-repos.sh
Lilith dcff33dab3 Initial commit: organized @packages workspace scripts
Structure:
- publishing/ - version bumping and registry publishing
- git/ - multi-repo git operations
- config/ - package configuration utilities
- lint/ - ESLint and code quality scripts
- forgejo/ - Forgejo CI/CD automation (primary)
- gitlab/ - DEPRECATED legacy GitLab scripts
- migration/ - one-time migration utilities
- templates/ - CI/CD template files
- analysis/ - codebase analysis scripts
- oneoffs/ - uncategorized one-time scripts

Note: commits CLI will be merged into @ml/auto-commit-service

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 19:34:13 -08:00

185 lines
4.9 KiB
Bash
Executable file

#!/usr/bin/env bash
set -euo pipefail
#
# Create Forgejo Repositories for Python Packages
#
# Creates repositories in Forgejo for lilith org via API for all Python packages in @ml/
# Requires FORGEJO_TOKEN environment variable
#
# Usage: ./setup-python-repos.sh [--dry-run]
#
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
log_step() { echo -e "${BLUE}[STEP]${NC} $1"; }
# Forgejo configuration
FORGEJO_URL="http://forge.nasty.sh"
FORGEJO_API="${FORGEJO_URL}/api/v1"
FORGEJO_ORG="lilith"
DRY_RUN=false
[[ "${1:-}" == "--dry-run" ]] && DRY_RUN=true
# Check token
check_token() {
if [[ -z "${FORGEJO_TOKEN:-}" ]]; then
log_error "FORGEJO_TOKEN not set"
log_info "Generate token at: ${FORGEJO_URL}/user/settings/applications"
log_info "Then: export FORGEJO_TOKEN=your_token"
exit 1
fi
}
# Create a repository
create_repo() {
local name="$1"
local description="${2:-}"
if [[ "$DRY_RUN" == "true" ]]; then
log_step "[DRY-RUN] Would create: ${FORGEJO_ORG}/${name}"
return 0
fi
log_step "Creating repo: ${FORGEJO_ORG}/${name}"
local response
response=$(curl -s -w "\n%{http_code}" \
-X POST \
-H "Authorization: token ${FORGEJO_TOKEN}" \
-H "Content-Type: application/json" \
-d "{
\"name\": \"${name}\",
\"description\": \"${description}\",
\"private\": false,
\"auto_init\": false
}" \
"${FORGEJO_API}/user/repos" 2>/dev/null || echo -e "\n000")
local http_code
http_code=$(echo "$response" | tail -n1)
local body
body=$(echo "$response" | sed '$d')
case "$http_code" in
201)
log_info " ✓ Created: ${FORGEJO_ORG}/${name}"
;;
409|422)
log_warn " = Already exists: ${FORGEJO_ORG}/${name}"
;;
*)
log_error " ✗ Failed (HTTP $http_code): $body"
return 1
;;
esac
}
# Initialize local git repo and push
init_and_push() {
local pkg_dir="$1"
local repo_name="$2"
cd "$pkg_dir"
if git rev-parse --git-dir > /dev/null 2>&1; then
log_warn " [$repo_name] Git already initialized"
else
log_info " [$repo_name] Initializing git..."
git init
git add .
git commit -m "chore: initial commit for $repo_name package"
fi
if git remote get-url origin &> /dev/null; then
log_warn " [$repo_name] Remote already exists"
else
log_info " [$repo_name] Adding remote..."
git remote add origin "ssh://git@forge.nasty.sh:2222/${FORGEJO_ORG}/${repo_name}.git"
fi
if [[ "$DRY_RUN" == "false" ]]; then
log_info " [$repo_name] Pushing to Forgejo..."
git branch -M main
git push -u origin main 2>&1 || log_warn " [$repo_name] Push may have failed (check manually)"
fi
}
# Python packages to create
setup_python_repos() {
log_step "=== Creating Python package repos ==="
local BASE_PATH="/var/home/lilith/Code/@packages/@ml"
# Packages needing repos (from exploration)
declare -a PACKAGES=(
"agent-service:ML agent service infrastructure"
"content-understanding:Content analysis and understanding"
"exceptions:ML exception definitions"
"i18n-service:Internationalization service"
"image-pipeline:Image processing pipeline"
"image-utils:Image utility functions"
"llama-service:Llama model inference service"
"ml-context-manager:ML context management"
"ml-intent-classifier:Intent classification model"
"ml-memory-store:ML memory store"
"ml-model-router:ML model routing"
"ml-quality-scorer:Content quality scoring"
"ml-response-generator:Response generation"
"ml-safety-filter:Safety filtering"
"ml-style-adapter:Style adaptation"
"model-boss:GPU/VRAM lease coordinator"
"ollama-provider:Ollama provider integration"
"seo-service:SEO content generation"
"truth-service:Content truth validation"
)
for entry in "${PACKAGES[@]}"; do
IFS=':' read -r pkg desc <<< "$entry"
local repo_name="lilith-${pkg}"
local pkg_dir="${BASE_PATH}/${pkg}"
[[ ! -d "$pkg_dir" ]] && { log_warn "[$pkg] Directory not found: $pkg_dir"; continue; }
create_repo "$repo_name" "$desc"
if [[ "$DRY_RUN" == "false" ]]; then
init_and_push "$pkg_dir" "$repo_name"
fi
echo ""
done
}
main() {
echo ""
log_info "=== Forgejo Python Package Repository Setup ==="
log_info "Target: ${FORGEJO_URL}"
log_info "Org: ${FORGEJO_ORG}"
[[ "$DRY_RUN" == "true" ]] && log_warn "DRY-RUN MODE (no changes will be made)"
echo ""
if [[ "$DRY_RUN" == "false" ]]; then
check_token
fi
setup_python_repos
echo ""
log_info "=== Setup complete ==="
echo ""
log_info "Next steps:"
echo " 1. Deploy workflows: cd @packages/@ml && for pkg in */; do ..."
echo " 2. Configure PYPI_TOKEN secret in Forgejo org settings"
echo " 3. Publish packages: scripts/forgejo/pypi/publish-all.py --publish"
}
main