1
0
Fork 0
mirror of https://codeberg.org/JasterV/forgejo-mirror-sync.git synced 2026-04-26 21:53:46 +00:00
forgejo-mirror-sync/sync.sh
2026-04-26 22:30:24 +02:00

80 lines
2.4 KiB
Bash
Executable file

#!/bin/bash
STATE_FILE="./mirrored.txt"
# Initialize counters
SKIPPED=0
MIRRORED=0
FAILED=0
echo "------------------------------------------------"
echo "🚀 Starting Forgejo Sync: $(date)"
echo "------------------------------------------------"
touch "$STATE_FILE"
echo "📡 Fetching repositories from Codeberg..."
REPOS_JSON=$(curl -s --compressed \
-H "Authorization: token $CODEBERG_TOKEN" \
"https://codeberg.org/api/v1/users/$CODEBERG_USER/repos?limit=1000")
# Check if we actually got a JSON array back
if ! echo "$REPOS_JSON" | jq -e 'type == "array"' > /dev/null; then
echo "❌ Error: Could not fetch repositories. Check your CODEBERG_TOKEN."
exit 1
fi
COUNT=$(echo "$REPOS_JSON" | jq '. | length')
echo "📦 Found $COUNT repositories on Codeberg."
echo "⚙️ Processing repositories..."
while read -r repo; do
REPO_NAME=$(echo "$repo" | jq -r '.name')
if grep -q "^$REPO_NAME$" "$STATE_FILE"; then
echo " ⏭️ Skipping: $REPO_NAME (Already cached as mirrored)"
((SKIPPED++))
continue
fi
echo " 🌟 New Repo Found: $REPO_NAME. Triggering Mirror..."
CLONE_URL=$(echo "$repo" | jq -r '.clone_url')
IS_PRIVATE=$(echo "$repo" | jq -r '.private')
# Migration Call
STATUS=$(curl -s -o /dev/null -w "%{http_code}" -X POST "$FORGEJO_URL/api/v1/repos/migrate" \
-H "Authorization: token $FORGEJO_TOKEN" \
-H "Content-Type: application/json" \
-d "{
\"clone_addr\": \"$CLONE_URL\",
\"repo_name\": \"$REPO_NAME\",
\"mirror\": true,
\"private\": $IS_PRIVATE,
\"service\": \"git\",
\"auth_token\": \"$CODEBERG_TOKEN\"
}")
if [ "$STATUS" -eq 201 ]; then
echo " ✅ Successfully mirrored $REPO_NAME"
echo "$REPO_NAME" >> "$STATE_FILE"
((MIRRORED++))
elif [ "$STATUS" -eq 409 ]; then
echo " 🤝 Already exists on Forgejo. Updating cache for $REPO_NAME"
echo "$REPO_NAME" >> "$STATE_FILE"
((MIRRORED++))
else
echo " ❌ Failed $REPO_NAME (Status: $STATUS)"
((FAILED++))
fi
done < <(echo "$REPOS_JSON" | jq -c '.[]')
echo "------------------------------------------------"
echo "🏁 Sync Task Complete!"
echo "✨ Mirrored: $MIRRORED"
echo "⏭️ Skipped: $SKIPPED"
echo "❌ Failed: $FAILED"
echo "------------------------------------------------"