feat(script): add migration script for GitHub organization to Gitea
This commit is contained in:
@@ -0,0 +1,148 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
set +x
|
||||||
|
|
||||||
|
# ====== Fill these values before running ======
|
||||||
|
GITHUB_TOKEN="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"
|
||||||
|
GITEA_TOKEN="1928666b31ab82a12a87a9050c764d0e534e2f21"
|
||||||
|
|
||||||
|
GH_ORG="ai-camerist"
|
||||||
|
GITEA_OWNER="banlv"
|
||||||
|
GITEA_URL="https://gitea.banlv-ai.com"
|
||||||
|
|
||||||
|
# Set to true if you want Gitea to keep pulling from GitHub after migration.
|
||||||
|
MIRROR=false
|
||||||
|
MIRROR_INTERVAL="8h"
|
||||||
|
|
||||||
|
# Migrated repository options.
|
||||||
|
MIGRATE_ISSUES=true
|
||||||
|
MIGRATE_LABELS=true
|
||||||
|
MIGRATE_MILESTONES=true
|
||||||
|
MIGRATE_PULL_REQUESTS=true
|
||||||
|
MIGRATE_RELEASES=true
|
||||||
|
MIGRATE_WIKI=true
|
||||||
|
MIGRATE_LFS=true
|
||||||
|
|
||||||
|
require_cmd() {
|
||||||
|
if ! command -v "$1" >/dev/null 2>&1; then
|
||||||
|
echo "Missing required command: $1" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
api_get() {
|
||||||
|
curl -fsSL \
|
||||||
|
-H "Accept: application/vnd.github+json" \
|
||||||
|
-H "Authorization: Bearer ${GITHUB_TOKEN}" \
|
||||||
|
"$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
gitea_repo_status() {
|
||||||
|
local repo_name="$1"
|
||||||
|
|
||||||
|
curl -sS -o /dev/null -w "%{http_code}" \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
"${GITEA_URL}/api/v1/repos/${GITEA_OWNER}/${repo_name}"
|
||||||
|
}
|
||||||
|
|
||||||
|
migrate_repo() {
|
||||||
|
local repo_json="$1"
|
||||||
|
local repo_name clone_url description private status payload
|
||||||
|
|
||||||
|
repo_name="$(echo "$repo_json" | jq -r '.name')"
|
||||||
|
clone_url="$(echo "$repo_json" | jq -r '.clone_url')"
|
||||||
|
description="$(echo "$repo_json" | jq -r '.description // ""')"
|
||||||
|
private="$(echo "$repo_json" | jq -r '.private')"
|
||||||
|
|
||||||
|
echo "==> Migrating ${GH_ORG}/${repo_name}"
|
||||||
|
|
||||||
|
status="$(gitea_repo_status "$repo_name")"
|
||||||
|
if [ "$status" = "200" ]; then
|
||||||
|
echo " Skip existing repository: ${GITEA_OWNER}/${repo_name}"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
payload="$(jq -n \
|
||||||
|
--arg clone_addr "$clone_url" \
|
||||||
|
--arg repo_name "$repo_name" \
|
||||||
|
--arg repo_owner "$GITEA_OWNER" \
|
||||||
|
--arg description "$description" \
|
||||||
|
--arg auth_token "$GITHUB_TOKEN" \
|
||||||
|
--arg mirror_interval "$MIRROR_INTERVAL" \
|
||||||
|
--argjson private "$private" \
|
||||||
|
--argjson mirror "$MIRROR" \
|
||||||
|
--argjson issues "$MIGRATE_ISSUES" \
|
||||||
|
--argjson labels "$MIGRATE_LABELS" \
|
||||||
|
--argjson milestones "$MIGRATE_MILESTONES" \
|
||||||
|
--argjson pull_requests "$MIGRATE_PULL_REQUESTS" \
|
||||||
|
--argjson releases "$MIGRATE_RELEASES" \
|
||||||
|
--argjson wiki "$MIGRATE_WIKI" \
|
||||||
|
--argjson lfs "$MIGRATE_LFS" \
|
||||||
|
'{
|
||||||
|
service: "github",
|
||||||
|
clone_addr: $clone_addr,
|
||||||
|
repo_name: $repo_name,
|
||||||
|
repo_owner: $repo_owner,
|
||||||
|
description: $description,
|
||||||
|
auth_token: $auth_token,
|
||||||
|
private: $private,
|
||||||
|
issues: $issues,
|
||||||
|
labels: $labels,
|
||||||
|
milestones: $milestones,
|
||||||
|
pull_requests: $pull_requests,
|
||||||
|
releases: $releases,
|
||||||
|
wiki: $wiki,
|
||||||
|
lfs: $lfs,
|
||||||
|
mirror: $mirror,
|
||||||
|
mirror_interval: $mirror_interval
|
||||||
|
}')"
|
||||||
|
|
||||||
|
curl -fsSL -X POST \
|
||||||
|
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d "$payload" \
|
||||||
|
"${GITEA_URL}/api/v1/repos/migrate" >/dev/null
|
||||||
|
|
||||||
|
echo " Done: ${GITEA_OWNER}/${repo_name}"
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
require_cmd curl
|
||||||
|
require_cmd jq
|
||||||
|
|
||||||
|
if [ "$GITHUB_TOKEN" = "ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ]; then
|
||||||
|
echo "Please edit GITHUB_TOKEN in this script first." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$GITEA_TOKEN" = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ]; then
|
||||||
|
echo "Please edit GITEA_TOKEN in this script first." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local page repos_json count total
|
||||||
|
page=1
|
||||||
|
total=0
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
echo "Fetching GitHub repositories page ${page}..."
|
||||||
|
|
||||||
|
repos_json="$(api_get "https://api.github.com/orgs/${GH_ORG}/repos?type=all&per_page=100&page=${page}&sort=full_name&direction=asc")"
|
||||||
|
count="$(echo "$repos_json" | jq 'length')"
|
||||||
|
|
||||||
|
if [ "$count" -eq 0 ]; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
|
||||||
|
while IFS= read -r repo; do
|
||||||
|
migrate_repo "$repo"
|
||||||
|
total=$((total + 1))
|
||||||
|
done < <(echo "$repos_json" | jq -c '.[]')
|
||||||
|
|
||||||
|
page=$((page + 1))
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "All done. Processed repositories: ${total}"
|
||||||
|
}
|
||||||
|
|
||||||
|
main "$@"
|
||||||
Reference in New Issue
Block a user