diff --git a/scripts/gitea-transfer.py b/scripts/gitea-transfer.py new file mode 100755 index 0000000..ac22831 --- /dev/null +++ b/scripts/gitea-transfer.py @@ -0,0 +1,58 @@ +import os +import sys +import requests + +def read_token(var: str) -> str: + path = os.getenv(var) + if path is None: + print(f"Missing env var: {var}", file=sys.stderr) + sys.exit(1) + return path.strip() + +GITEA_TOKEN: str = read_token("GITEA_TOKEN_FILE") +GITEA_URL = "https://git.kyren.codes" +GITEA_USER = "kyren223" +TARGET_USER = "archive" + +success = 0 +skipped = 0 +failed = 0 + +def repo_exists(repo_name: str) -> bool: + headers = {'Authorization': f'token {GITEA_TOKEN}'} + r = requests.get(f'{GITEA_URL}/api/v1/repos/{TARGET_USER}/{repo_name}', headers=headers) + return r.status_code == 200 + +def transfer_ownership(repo_name: str): + if repo_exists(repo_name): + print(f"Skipping existing repo: {repo_name}") + global skipped; skipped += 1 + return + + headers = { + 'Authorization': f'token {GITEA_TOKEN}', + 'Content-Type': 'application/json' + } + json = {"new_owner": TARGET_USER} + + try: + r = requests.post(f'{GITEA_URL}/api/v1/repos/{GITEA_USER}/{repo_name}/transfer', headers=headers, json=json) + r.raise_for_status() + + global success; success += 1 + print(f'Transferred {repo_name}') + except requests.exceptions.HTTPError as e: + global failed; failed += 1 + print(f"Failed to transfer {repo_name}: {e}") + +headers = {'Authorization': f'token {GITEA_TOKEN}'} +response = requests.get(f'{GITEA_URL}/api/v1/users/{GITEA_USER}/repos', headers=headers) +if response.status_code != 200: + print(f"Failed to list repos: {response.text}") + sys.exit(1) +repos = response.json() + +for repo in repos: + transfer_ownership(repo['name']) + +print(f"\nSummary: {success} transferred, {skipped} skipped, {failed} failed.")