#!/usr/bin/env python import github2.client import sys 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) 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[:-4] repo = LocalRepo(repo_name[:-4], description, homepage, repo_dir) if repo.name not in blacklist: repos.append(repo) return repos 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 = github2.client.Github(username=user, api_token=token, requests_per_second=1) 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() 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(repo.name, repo.description, repo.homepage, public=True) 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.name) 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))