#!/usr/bin/env python from pygithub3 import Github import sys import os import os.path class LocalRepo: def __init__(self, name, description, homepage, path): self.name = name self.description = description self.homepage = homepage self.path = path def __repr__(self): return "%s @ %s: %s" % (self.name, self.homepage, self.description) def localRepos(repo_list, repo_base_dir, url_base, blacklist): repo_names = open(repo_list, "r") repos = [] for repo_name in repo_names: repo_name = repo_name.rstrip() repo_dir = os.path.join(repo_base_dir, repo_name) repo_name = repo_name[:-4] description = os.path.join(repo_dir, "description") if os.path.exists(description): description = open(description, "r").read().strip() else: description = None homepage = os.path.join(repo_dir, "homepage") if os.path.exists(homepage): homepage = open(homepage, "r").read().strip() else: homepage = url_base + repo_name repo = LocalRepo(repo_name, description, homepage, repo_dir) if repo.name not in blacklist: repos.append(repo) def compareHeads(x, y): def mostRecentHeadTime(z): z = os.path.join(z, "refs/heads") return sorted([os.stat(os.path.join(z, f)).st_mtime for f in os.listdir(z)])[-1] return cmp(mostRecentHeadTime(x.path), mostRecentHeadTime(y.path)) return sorted(repos, cmp=compareHeads) def main(argv): if len(sys.argv) < 6: return 1 user = argv[1] token = argv[2] repo_list = argv[3] repo_dir_base = argv[4] url_base = argv[5] github = Github(username=user, token=token, per_page=1000) print "[#] Collecting local repositories." local_repos = localRepos(repo_list, repo_dir_base, url_base, argv[6:]) print "[#] Collecting remote repositories." remote_repos = github.repos.list().all() for repo in local_repos: if repo.name not in [remote.name for remote in remote_repos]: print "[+] Adding repository %s." % repo.name github.repos.create(dict(name=repo.name, description=repo.description, homepage=repo.homepage, private=False, has_issues=False, has_wiki=False, has_downloads=False)) for repo in remote_repos: if repo.name not in [local.name for local in local_repos]: print "[-] Deleting repository %s." % repo.name github.repos.delete(repo=repo.name, user=user) for repo in local_repos: print "[^] Mirroring repository %s." % repo.name os.system("cd \"%s\"; git push --mirror git@github.com:%s/%s.git" % (repo.path, user, repo.name)) return 0 if __name__ == "__main__": sys.exit(main(sys.argv))