зеркало из https://github.com/mozilla/hg2github.git
72 строки
2.4 KiB
Python
72 строки
2.4 KiB
Python
|
#!/usr/bin/env python
|
||
|
|
||
|
# A script to batch remove all repositories listed in config.json
|
||
|
# that are stored in the remote gh_user's acct. This might be useful
|
||
|
# during initial setup. Oh, and be *careful* with this thing!
|
||
|
|
||
|
import simplejson
|
||
|
import sys
|
||
|
import os
|
||
|
import urllib2
|
||
|
import urllib
|
||
|
|
||
|
# determine path to configuration file
|
||
|
cwd = os.path.dirname(os.path.abspath(sys.argv[0]))
|
||
|
cfg_file = os.path.join(cwd, "config.json")
|
||
|
|
||
|
if not os.path.isfile(cfg_file):
|
||
|
raise RuntimeError("config file missing, expected at: " + cfg_file)
|
||
|
|
||
|
# parse the configuration file
|
||
|
f = open(cfg_file)
|
||
|
j = simplejson.load(f)
|
||
|
f.close();
|
||
|
|
||
|
# validate config file
|
||
|
if not type(j) is dict or not j.has_key('repos') or not type(j['repos']) is dict:
|
||
|
raise RuntimeError("malformed configuration file (requires a 'repos' key)")
|
||
|
|
||
|
for k in ['gh_user', 'gh_token', 'gh_tgt_acct', 'gh_ssh_alias']:
|
||
|
if not j.has_key(k):
|
||
|
raise RuntimeError("malformed configuration file (requires a '" + k + "' key)")
|
||
|
|
||
|
gh_user = j['gh_user']
|
||
|
gh_token = j['gh_token']
|
||
|
|
||
|
def getExistingGithubRepos(user):
|
||
|
u = urllib2.urlopen("http://github.com/api/v2/json/repos/show/" + user)
|
||
|
r = simplejson.loads(u.read())
|
||
|
return [m["name"] for m in r['repositories']]
|
||
|
|
||
|
def deleteRepoOnGithub(name, user, token):
|
||
|
# ohdamn, in this case we want to authenticate as auth_user but create
|
||
|
# a repository in 'acct' where auth_user != acct. At first blush it doesn't
|
||
|
# appear this is supported in the github WSAPI:
|
||
|
# http://develop.github.com/p/repo.html
|
||
|
query_args = {
|
||
|
'login': user,
|
||
|
'token': token
|
||
|
}
|
||
|
request = urllib2.Request("https://github.com/api/v2/json/repos/delete/" + name)
|
||
|
request.add_data(urllib.urlencode(query_args))
|
||
|
r = simplejson.loads(urllib2.urlopen(request).read())
|
||
|
|
||
|
# second post to seal the deal
|
||
|
query_args['delete_token'] = r['delete_token']
|
||
|
request = urllib2.Request("https://github.com/api/v2/json/repos/delete/" + name)
|
||
|
request.add_data(urllib.urlencode(query_args))
|
||
|
print urllib2.urlopen(request).read()
|
||
|
return True
|
||
|
|
||
|
# and let's get the existing repositories that exist under the syncer account
|
||
|
# (the account that's authenticating, but not really where we want our repos to land)
|
||
|
reposOnGithub = getExistingGithubRepos(gh_user)
|
||
|
|
||
|
for repo in reposOnGithub:
|
||
|
if not repo in [k for k in j['repos']]:
|
||
|
continue
|
||
|
|
||
|
print "need to kill " + repo
|
||
|
|
||
|
deleteRepoOnGithub(repo, gh_user, gh_token)
|