Skip to content

Instantly share code, notes, and snippets.

@alextercete
Last active August 29, 2015 13:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alextercete/8978024 to your computer and use it in GitHub Desktop.
Save alextercete/8978024 to your computer and use it in GitHub Desktop.
GitHub Teams Migrator
import requests
import json
GITHUB_API = 'https://api.github.com/'
ORG = "<your-org>"
AUTH = ('<your-personal-access-token>', '')
class GitHubTeam:
_ids_by_name = {}
def __init__(self, name):
self.name = name
@property
def id(self):
if self.name not in self.__class__._ids_by_name:
response = requests.get(GITHUB_API + 'orgs/{0}/teams'.format(ORG), auth=AUTH)
response.raise_for_status()
teams_json = json.loads(response.text or response.content)
team_id = next(j['id'] for j in teams_json if j['name'].lower() == self.name.lower())
self.__class__._ids_by_name[self.name] = team_id
return self.__class__._ids_by_name[self.name]
def get_repositories(self):
response = requests.get(GITHUB_API + 'teams/{0}/repos'.format(self.id), auth=AUTH)
response.raise_for_status()
repos_json = json.loads(response.text or response.content)
repos_names = [j['full_name'] for j in repos_json]
return repos_names
def get_members(self):
response = requests.get(GITHUB_API + 'teams/{0}/members'.format(self.id), auth=AUTH)
response.raise_for_status()
members_json = json.loads(response.text or response.content)
members_logins = [j['login'] for j in members_json]
return members_logins
def create_with(self, repos, members):
payload = {'name': self.name, 'repo_names': repos}
response = requests.post(GITHUB_API + 'orgs/{0}/teams'.format(ORG), data=json.dumps(payload), auth=AUTH)
response.raise_for_status()
for member in members:
response = requests.put(GITHUB_API + 'teams/{0}/members/{1}'.format(self.id, member), auth=AUTH)
response.raise_for_status()
if __name__ == '__main__':
with open('team_mappings.json') as team_mappings_file:
team_mappings_json = json.load(team_mappings_file)
for new_team, old_teams in team_mappings_json.items():
new_team_repos = []
new_team_members = []
for old_team in old_teams:
github_team = GitHubTeam(old_team)
new_team_repos.extend(github_team.get_repositories())
new_team_members.extend(github_team.get_members())
new_team_repos = list(set(new_team_repos))
new_team_members = list(set(new_team_members))
GitHubTeam(new_team).create_with(new_team_repos, new_team_members)
print "Created team '{0}' with {1} repos and {2} members".format(
new_team, len(new_team_repos), len(new_team_members))
{
"New Team 1": [
"Old Team 1",
"Old Team 2",
"Old Team 3"
],
"New Team 2": [
"Old Team 4",
"Old Team 5"
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment