# -*- coding: utf-8 -*- # Script to create Git repositories in a group from a list of names and # email addresses in a CSV file (such as exported from SynapseS). # # Minimally tested. Seems to work. Use at your own risk. # # By James Eagan # https://james.eagan.fr import csv import gitlab import sys GITLAB_URL='https://gitlab.telecom-paris.fr' PRIVATE_TOKEN=sys.argv[3] if len(sys.argv) > 3 else '' def readNames(fileName): result = [] with open(fileName) as fd: sneakPeek = fd.read(1024) fd.seek(0) sniffer = csv.Sniffer() dialect = sniffer.sniff(sneakPeek) hasHeader = sniffer.has_header(sneakPeek) reader = csv.reader(fd, dialect) # reader = csv.reader(fd, delimiter=';') if hasHeader: next(reader) for row in reader: result.append((row[0], row[1], row[2])) return result def lookupUser(email, gitlab): return gitlab.users.list(search=email)[0] def createProject(name, groupId, gitlab): return gitlab.projects.create({'name': name, 'namespace_id': groupId}) def addProjectMember(project, userId, accessLevel): return project.members.create({'user_id': userId, 'access_level': accessLevel}) def makeProjectsInGroupId(groupId, csvFile): api = gitlab.Gitlab(GITLAB_URL, PRIVATE_TOKEN) for (lastName, firstName, email) in readNames(csvFile): try: # if email.endswith('@telecom-paris.fr'): # email = email.split('@')[0] + "@telecom-paristech.fr" user = lookupUser(email, api) print("::: Creating project for {} {} <{}>…".format( lastName, firstName, email, user.id)) print("::: Found {} ({})".format(user.name, user.id)) project = createProject('{} {}'.format(lastName, firstName), groupId, api) member = addProjectMember(project, user.id, gitlab.MAINTAINER_ACCESS) except IndexError as e: print >> sys.stderr, "!!! Could not create project for {}: User not found ({})".format(email, e) except Exception as e: # print("!!! Could not create user for {}: {}".format(email, e), file=sys.stderr) print >> sys.stderr, "!!! Error creating project for {}: {}".format(email, e) if __name__ == '__main__': if len(sys.argv) != 4: print("*** Usage: python {} ".format(sys.argv[0])) print("*** csv: a CSV file exported from Synapses.") print("*** The first three columns are assumed to be ") print("*** last name, first name, email address.") print("*** groupId: The GitLab id where all the projects will") print("*** be added.") print("*** token: A GitLab API token as created at ") print("*** {}/-/profile/personal_access_tokens".format(GITLAB_URL)) print("*** Be sure to enable API scope.") sys.exit(1) makeProjectsInGroupId(sys.argv[2], sys.argv[1])