summaryrefslogtreecommitdiffstats
path: root/sync-github.py
blob: 87a30092445b2a66a2a58c0b3e493a757a90395d (plain) (blame)
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))