diff options
-rwxr-xr-x | sync-github.py | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/sync-github.py b/sync-github.py new file mode 100755 index 0000000..8cb9c9f --- /dev/null +++ b/sync-github.py @@ -0,0 +1,70 @@ +#!/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)) |