feat(migrate): GITHUB_REPOS and GITHUB_REPOS_FILE for selective import
Made-with: Cursor
This commit is contained in:
@@ -6,6 +6,11 @@ set -euo pipefail
|
||||
#
|
||||
# Пуш в Gitea: PUSH_WITH_SSH=true — нужен SSH-ключ на ЭТОЙ машине (добавлен в Gitea).
|
||||
# На сервере без ключа — PUSH_WITH_SSH=false и GITEA_USERNAME + GITEA_TOKEN (HTTPS).
|
||||
#
|
||||
# Только выбранные репозитории (вместо полного списка с GitHub):
|
||||
# GITHUB_REPOS="owner/repo1,owner/repo2"
|
||||
# и/или
|
||||
# GITHUB_REPOS_FILE=/path/to/list.txt # по одному owner/repo на строку, # — комментарий
|
||||
|
||||
: "${GITHUB_TOKEN:?Set GITHUB_TOKEN}"
|
||||
: "${GITHUB_OWNER:?Set GITHUB_OWNER (user or org on GitHub)}"
|
||||
@@ -21,6 +26,9 @@ PUSH_WITH_SSH="${PUSH_WITH_SSH:-true}" # true/false
|
||||
GITEA_SSH_HOST="${GITEA_SSH_HOST:-git.papatramp.ru}"
|
||||
GITEA_SSH_PORT="${GITEA_SSH_PORT:-2222}"
|
||||
MIGRATE_LFS="${MIGRATE_LFS:-false}" # true/false
|
||||
# См. шапку: если задано — мигрируются только эти репозитории (полный вид owner/name).
|
||||
GITHUB_REPOS="${GITHUB_REPOS:-}"
|
||||
GITHUB_REPOS_FILE="${GITHUB_REPOS_FILE:-}"
|
||||
|
||||
mkdir -p "$WORKDIR"
|
||||
|
||||
@@ -133,7 +141,68 @@ migrate_repo() {
|
||||
echo " [DONE] $full_name"
|
||||
}
|
||||
|
||||
migrate_repo_from_github_api() {
|
||||
local full_name="$1"
|
||||
local repo_json private
|
||||
repo_json="$(gh_api "https://api.github.com/repos/${full_name}")"
|
||||
if ! echo "$repo_json" | jq -e '.full_name' >/dev/null 2>&1; then
|
||||
echo "[ERR] Репозиторий недоступен или не найден на GitHub: ${full_name}"
|
||||
echo "$repo_json" | jq -r '.message // .' 2>/dev/null || echo "$repo_json"
|
||||
exit 1
|
||||
fi
|
||||
private="$(echo "$repo_json" | jq -r '.private')"
|
||||
migrate_repo "$full_name" "$private"
|
||||
}
|
||||
|
||||
migrate_selected_repos() {
|
||||
local names=() line part
|
||||
if [[ -n "$GITHUB_REPOS_FILE" ]]; then
|
||||
if [[ ! -f "$GITHUB_REPOS_FILE" ]]; then
|
||||
echo "[ERR] GITHUB_REPOS_FILE не найден: $GITHUB_REPOS_FILE"
|
||||
exit 1
|
||||
fi
|
||||
while IFS= read -r line || [[ -n "$line" ]]; do
|
||||
line="${line%%#*}"
|
||||
line="$(echo "$line" | xargs)"
|
||||
[[ -z "$line" ]] && continue
|
||||
names+=("$line")
|
||||
done <"$GITHUB_REPOS_FILE"
|
||||
fi
|
||||
if [[ -n "$GITHUB_REPOS" ]]; then
|
||||
local -a repo_parts
|
||||
IFS=',' read -ra repo_parts <<<"${GITHUB_REPOS}"
|
||||
for part in "${repo_parts[@]}"; do
|
||||
part="$(echo "$part" | xargs)"
|
||||
[[ -z "$part" ]] && continue
|
||||
names+=("$part")
|
||||
done
|
||||
fi
|
||||
|
||||
if [[ "${#names[@]}" -eq 0 ]]; then
|
||||
echo "[ERR] Указаны GITHUB_REPOS / GITHUB_REPOS_FILE, но список имён пуст."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "[INFO] Режим выборочной миграции, репозиториев: ${#names[@]}"
|
||||
|
||||
local fn
|
||||
for fn in "${names[@]}"; do
|
||||
if [[ "$fn" != */* ]]; then
|
||||
echo "[ERR] Ожидается полное имя owner/repo, получено: $fn"
|
||||
exit 1
|
||||
fi
|
||||
migrate_repo_from_github_api "$fn"
|
||||
done
|
||||
|
||||
echo "Выбранные репозитории обработаны."
|
||||
}
|
||||
|
||||
main() {
|
||||
if [[ -n "$GITHUB_REPOS" || -n "$GITHUB_REPOS_FILE" ]]; then
|
||||
migrate_selected_repos
|
||||
return 0
|
||||
fi
|
||||
|
||||
local page=1
|
||||
local per_page=100
|
||||
local url repos_json count
|
||||
|
||||
Reference in New Issue
Block a user