Last active
August 29, 2015 13:56
-
-
Save alextercete/8978024 to your computer and use it in GitHub Desktop.
GitHub Teams Migrator
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
requests==2.2.1 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"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