mirror of
https://codeberg.org/JasterV/forgejo-mirror-sync.git
synced 2026-04-26 21:53:46 +00:00
80 lines
2.4 KiB
Bash
Executable file
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 "------------------------------------------------"
|