Last active
August 7, 2024 07:07
-
-
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
This file contains hidden or 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 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