1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
#!/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))
|