Skip to content

Instantly share code, notes, and snippets.

@keyiflerolsun
Last active August 7, 2024 07:07
Show Gist options
  • Save keyiflerolsun/9a1b7efa3643d77e19c68d1c2995e610 to your computer and use it in GitHub Desktop.
Save keyiflerolsun/9a1b7efa3643d77e19c68d1c2995e610 to your computer and use it in GitHub Desktop.
GitHub Profilinizi Tamamen (Organizasyonlar, Fork'lar ve Arşivler) Local Gitea Ortamınıza Klonlayın
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
from Kekik.cli import konsol
import os, subprocess, requests
class Hub2Tea:
def __init__(self, github_kullanici_adi, github_token, gitea_kullanici_adi, gitea_sifre, gitea_url):
self.github_kullanici_adi = github_kullanici_adi
self.github_token = github_token
self.gitea_kullanici_adi = gitea_kullanici_adi
self.gitea_sifre = gitea_sifre
self.gitea_url = gitea_url
self.github_headers = {"Authorization": f"token {self.github_token}"}
def repolari_tasi(self):
konsol.log("[magenta][~] GitHub2Gitea 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.gitea_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}")
gitea_commit = self.son_commit_hashi_al(f"{self.gitea_url}/api/v1/repos/{hedef_ad}/{repo_adi}")
if github_commit is None and gitea_commit is None:
return None
if github_commit is None or gitea_commit is None:
return False
return github_commit == gitea_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", auth=(self.gitea_kullanici_adi, self.gitea_sifre))
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.gitea_repo_sil(repo_adi, hedef_ad)
self.gitea_repo_olustur_ve_tasi(repo_adi, repo_url, repo_private, aciklama, hedef_ad, archived)
def gitea_repo_sil(self, repo_adi, hedef_ad):
response = requests.get(f"{self.gitea_url}/api/v1/repos/{hedef_ad}/{repo_adi}", auth=(self.gitea_kullanici_adi, self.gitea_sifre))
if response.status_code == 404:
return
elif response.status_code == 200:
konsol.log(f"[yellow][~] {hedef_ad:<20} » {repo_adi:^30} » Gitea'dan siliniyor...")
delete_response = requests.delete(f"{self.gitea_url}/api/v1/repos/{hedef_ad}/{repo_adi}", auth=(self.gitea_kullanici_adi, self.gitea_sifre))
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 gitea_repo_arsivle(self, repo_adi, hedef_ad):
konsol.log(f"[blue][~] {hedef_ad:<20} » {repo_adi:^30} » Arşivleniyor...")
response = requests.patch(
url = f"{self.gitea_url}/api/v1/repos/{hedef_ad}/{repo_adi}",
json = {"archived": True},
auth = (self.gitea_kullanici_adi, self.gitea_sifre)
)
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 gitea_repo_olustur_ve_tasi(self, repo_adi, repo_url, repo_private, aciklama, hedef_ad, archived=False):
gitea_org_url = f"{self.gitea_url}/api/v1/orgs/{hedef_ad}"
gitea_repo_url = f"{self.gitea_url}/api/v1/user/repos" if hedef_ad == self.gitea_kullanici_adi else f"{self.gitea_url}/api/v1/orgs/{hedef_ad}/repos"
if hedef_ad != self.gitea_kullanici_adi:
response = requests.get(gitea_org_url, auth=(self.gitea_kullanici_adi, self.gitea_sifre))
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 = f"{self.gitea_url}/api/v1/orgs",
json = create_org_payload,
auth = (self.gitea_kullanici_adi, self.gitea_sifre)
)
response = requests.post(
url = gitea_repo_url,
json = {
"name" : repo_adi,
"private" : repo_private,
"description" : aciklama
},
auth = (self.gitea_kullanici_adi, self.gitea_sifre)
)
if response.status_code == 201:
self.github_repo_tasi(repo_adi, repo_url, hedef_ad)
if archived:
self.gitea_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} » Gitea'ya yükleniyor...")
push_url = f"http://{self.gitea_kullanici_adi}:{self.gitea_sifre}@{self.gitea_url.split('://')[1]}/{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 gitea_repolarini_sil(self):
page = 1
while True:
response = requests.get(f"{self.gitea_url}/api/v1/user/repos?type=all&page={page}&limit=100", auth=(self.gitea_kullanici_adi, self.gitea_sifre))
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"{self.gitea_url}/api/v1/repos/{repo_sahibi}/{repo_adi}", auth=(self.gitea_kullanici_adi, self.gitea_sifre))
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 gitea_organizasyon_sil(self):
orgs_response = requests.get(f"{self.gitea_url}/api/v1/user/orgs", auth=(self.gitea_kullanici_adi, self.gitea_sifre))
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"{self.gitea_url}/api/v1/orgs/{org_name}", auth=(self.gitea_kullanici_adi, self.gitea_sifre))
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