Last active
August 7, 2024 07:07
-
-
Save keyiflerolsun/935f3baa68de54cff1fc5bdb326416b9 to your computer and use it in GitHub Desktop.
GitHub Profilinizi Tamamen (Organizasyonlar, Fork'lar ve Arşivler) CodeBerg'e Klonlayın
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır. | |
from Kekik.cli import konsol | |
import os, subprocess, requests | |
class Hub2Berg: | |
def __init__(self, github_kullanici_adi, github_token, codeberg_kullanici_adi, codeberg_token): | |
self.github_kullanici_adi = github_kullanici_adi | |
self.github_token = github_token | |
self.codeberg_kullanici_adi = codeberg_kullanici_adi | |
self.codeberg_token = codeberg_token | |
self.github_headers = {"Authorization": f"token {self.github_token}"} | |
self.codeberg_headers = {"Authorization": f"Bearer {self.codeberg_token}"} | |
def repolari_tasi(self): | |
konsol.log("[magenta][~] GitHub2CodeBerg Başlatıldı...") | |
repos = [] | |
page = 1 | |
while True: | |
response = requests.get(f"https://api.github.com/user/repos?type=all&page={page}&per_page=100", headers=self.github_headers) | |
data = response.json() | |
if not data: | |
break | |
repos.extend(data) | |
page += 1 | |
forked_repos = [repo for repo in repos if repo["fork"]] | |
archived_repos = [repo for repo in repos if repo["archived"]] | |
all_repos = repos + forked_repos + archived_repos | |
unique_repos = {repo["full_name"]: repo for repo in all_repos}.values() | |
sorted_repos = sorted(unique_repos, key=lambda x: x["pushed_at"]) | |
for repo in sorted_repos: | |
repo_sahibi = repo["owner"]["login"] | |
hedef_ad = self.codeberg_kullanici_adi if repo_sahibi == self.github_kullanici_adi else repo_sahibi | |
konsol.log(f"[yellow][»] {hedef_ad:<20} » {repo['name']:^30} » Taşıma Başladı") | |
repolar_ayni = self.repolar_ayni_mi(repo["name"], hedef_ad) | |
if repolar_ayni is None: | |
print() | |
continue | |
if repolar_ayni: | |
konsol.log(f"[cyan][~] {hedef_ad:<20} » {repo['name']:^30} » Depolar aynı, yüklenmeyecek.") | |
else: | |
self.tasi_ve_yeniden_yukle(repo["name"], repo["clone_url"], repo["private"], repo["description"], hedef_ad, repo["archived"]) | |
print() | |
def repolar_ayni_mi(self, repo_adi, hedef_ad): | |
github_commit = self.son_commit_hashi_al(f"https://api.github.com/repos/{hedef_ad}/{repo_adi}") | |
codeberg_commit = self.son_commit_hashi_al(f"https://codeberg.org/api/v1/repos/{hedef_ad}/{repo_adi}") | |
if github_commit is None and codeberg_commit is None: | |
return None | |
if github_commit is None or codeberg_commit is None: | |
return False | |
return github_commit == codeberg_commit | |
def son_commit_hashi_al(self, api_url): | |
if "github" in api_url: | |
response = requests.get(api_url + "/commits", headers=self.github_headers) | |
else: | |
response = requests.get(api_url + "/commits", headers=self.codeberg_headers) | |
data = response.json() | |
if isinstance(data, list) and len(data) > 0: | |
return data[0]["sha"] | |
return None | |
def tasi_ve_yeniden_yukle(self, repo_adi, repo_url, repo_private, aciklama, hedef_ad, archived=False): | |
self.codeberg_repo_sil(repo_adi, hedef_ad) | |
self.codeberg_repo_olustur_ve_tasi(repo_adi, repo_url, repo_private, aciklama, hedef_ad, archived) | |
def codeberg_repo_sil(self, repo_adi, hedef_ad): | |
response = requests.get(f"https://codeberg.org/api/v1/repos/{hedef_ad}/{repo_adi}", headers=self.codeberg_headers) | |
if response.status_code == 404: | |
return | |
elif response.status_code == 200: | |
konsol.log(f"[yellow][~] {hedef_ad:<20} » {repo_adi:^30} » CodeBerg'den siliniyor...") | |
delete_response = requests.delete(f"https://codeberg.org/api/v1/repos/{hedef_ad}/{repo_adi}", headers=self.codeberg_headers) | |
if delete_response.status_code == 204: | |
konsol.log(f"[green][~] {hedef_ad:<20} » {repo_adi:^30} » Silindi.") | |
else: | |
konsol.log(f"[red][!] {hedef_ad:<20} » {repo_adi:^30} » Silinemedi: {delete_response.json()}") | |
else: | |
konsol.log(f"[red][!] {hedef_ad:<20} » {repo_adi:^30} » Repo kontrolü sırasında hata oluştu: {response.json()}") | |
def codeberg_repo_arsivle(self, repo_adi, hedef_ad): | |
konsol.log(f"[blue][~] {hedef_ad:<20} » {repo_adi:^30} » Arşivleniyor...") | |
response = requests.patch( | |
url = f"https://codeberg.org/api/v1/repos/{hedef_ad}/{repo_adi}", | |
json = {"archived": True}, | |
headers = self.codeberg_headers | |
) | |
if response.status_code == 200: | |
konsol.log(f"[green][+] {hedef_ad:<20} » {repo_adi:^30} » Başarıyla arşivlendi.") | |
else: | |
konsol.log(f"[red][!] {hedef_ad:<20} » {repo_adi:^30} » Arşivlenemedi: {response.json()}") | |
def github_org_bilgilerini_al(self, org_adi): | |
response = requests.get(f"https://api.github.com/orgs/{org_adi}", headers=self.github_headers) | |
if response.status_code == 200: | |
return response.json() | |
else: | |
return None | |
def codeberg_repo_olustur_ve_tasi(self, repo_adi, repo_url, repo_private, aciklama, hedef_ad, archived=False): | |
codeberg_org_url = f"https://codeberg.org/api/v1/orgs/{hedef_ad}" | |
codeberg_repo_url = "https://codeberg.org/api/v1/user/repos" if hedef_ad == self.codeberg_kullanici_adi else f"https://codeberg.org/api/v1/orgs/{hedef_ad}/repos" | |
if hedef_ad != self.codeberg_kullanici_adi: | |
response = requests.get(codeberg_org_url, headers=self.codeberg_headers) | |
if response.status_code != 200: | |
github_org_info = self.github_org_bilgilerini_al(hedef_ad) | |
if github_org_info: | |
org_description = github_org_info.get("description", "") | |
org_visibility = "public" if github_org_info.get("public_repos") > 0 else "private" | |
create_org_payload = { | |
"username" : hedef_ad, | |
"full_name" : github_org_info.get("name", hedef_ad), | |
"description" : org_description, | |
"visibility" : org_visibility | |
} | |
else: | |
create_org_payload = { | |
"username" : hedef_ad, | |
"full_name" : hedef_ad, | |
"description" : f"{hedef_ad} Organizasyonu", | |
"visibility" : "private" | |
} | |
requests.post( | |
url = "https://codeberg.org/api/v1/orgs", | |
json = create_org_payload, | |
headers = self.codeberg_headers | |
) | |
response = requests.post( | |
url = codeberg_repo_url, | |
json = { | |
"name" : repo_adi, | |
"private" : repo_private, | |
"description" : aciklama | |
}, | |
headers = self.codeberg_headers | |
) | |
if response.status_code == 201: | |
self.github_repo_tasi(repo_adi, repo_url, hedef_ad) | |
if archived: | |
self.codeberg_repo_arsivle(repo_adi, hedef_ad) | |
else: | |
konsol.log(f"[red][!] {hedef_ad:<20} » {repo_adi:^30} » Repo oluşturulamadı.") | |
def github_repo_tasi(self, repo_adi, repo_url, hedef_ad): | |
konsol.log(f"[blue][~] {hedef_ad:<20} » {repo_adi:^30} » GitHub'dan klonlanıyor...") | |
repo_url_with_token = repo_url.replace("https://", f"https://{self.github_token}@") | |
clone_result = subprocess.run(["git", "clone", "--mirror", repo_url_with_token], capture_output=True, text=True) | |
if clone_result.returncode == 0: | |
if os.path.exists(f"{repo_adi}.git"): | |
os.chdir(f"{repo_adi}.git") | |
konsol.log(f"[blue][~] {hedef_ad:<20} » {repo_adi:^30} » CodeBerg'e yükleniyor...") | |
push_url = f"https://{self.codeberg_kullanici_adi}:{self.codeberg_token}@codeberg.org/{hedef_ad}/{repo_adi}.git" | |
push_result = subprocess.run(["git", "push", "--mirror", push_url], capture_output=True, text=True) | |
if push_result.returncode == 0: | |
konsol.log(f"[green][+] {hedef_ad:<20} » {repo_adi:^30} » Taşıma başarılı.") | |
else: | |
konsol.log(f"[red][!] {hedef_ad:<20} » {repo_adi:^30} » Taşıma hatası: {push_result.stderr}") | |
os.chdir("..") | |
subprocess.run(["rm", "-rf", "--", f"{repo_adi}.git"]) | |
else: | |
konsol.log(f"[red][!] {hedef_ad:<20} » {repo_adi:^30} » Klonlanan dizin bulunamadı.") | |
else: | |
konsol.log(f"[red][!] {hedef_ad:<20} » {repo_adi:^30} » Klonlama hatası: {clone_result.stderr}") | |
def codeberg_repolarini_sil(self): | |
page = 1 | |
while True: | |
response = requests.get(f"https://codeberg.org/api/v1/user/repos?type=all&page={page}&limit=100", headers=self.codeberg_headers) | |
repos = response.json() | |
if not repos: | |
break | |
for repo in repos: | |
repo_adi = repo["name"] | |
repo_sahibi = repo["owner"]["login"] | |
delete_response = requests.delete(f"https://codeberg.org/api/v1/repos/{repo_sahibi}/{repo_adi}", headers=self.codeberg_headers) | |
if delete_response.status_code == 204: | |
konsol.log(f"[green][~] {repo_sahibi:<20} » {repo_adi:^30} » Silindi.") | |
else: | |
konsol.log(f"[red][!] {repo_sahibi:<20} » {repo_adi:^30} » Silinemedi: {delete_response.json()}") | |
page += 1 | |
print() | |
def codeberg_organizasyon_sil(self): | |
orgs_response = requests.get("https://codeberg.org/api/v1/user/orgs", headers=self.codeberg_headers) | |
orgs = orgs_response.json() | |
for org in orgs: | |
org_name = org["username"] | |
konsol.log(f"[yellow][~] {org_name:<20} » Organizasyon Siliniyor...") | |
delete_response = requests.delete(f"https://codeberg.org/api/v1/orgs/{org_name}", headers=self.codeberg_headers) | |
if delete_response.status_code == 204: | |
konsol.log(f"[green][~] {org_name:<20} » Organizasyon Silindi.") | |
else: | |
konsol.log(f"[red][!] {org_name:<20} » Organizasyon Silinemedi: {delete_response.json()}") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment