# -*- 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' 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], row[3])) return result def lookupUser(email, gitlab): """ Return the first found user; throw if not found """ matches = gitlab.users.list(search=email) if len(matches) == 1: return matches[0] raise IndexError("Found {} matching users".format(len(matches))) 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, token, options={}): # print(groupId, csvFile, options) api = gitlab.Gitlab(GITLAB_URL, token) for (lastName, firstName, email, login) in readNames(csvFile): try: user = lookupUser(f"{lastName} {firstName}", api) print("::: {}Creating project for {} {} <{}> -- {} ({})…".format( "Not " if options.dry_run else "", lastName, firstName, email, user.name, user.id)) if options.dry_run: continue project = createProject('{} {}'.format(lastName, firstName), groupId, api) member = addProjectMember(project, user.id, gitlab.MAINTAINER_ACCESS) except IndexError as e: print("!!! Skipping {}: User not found ({})".format(email, e), file=sys.stderr) except Exception as e: # print("!!! Could not create user for {}: {}".format(email, e), file=sys.stderr) print("!!! Error creating project for {}: {}".format(email, e), file=sys.stderr) if __name__ == '__main__': import argparse # 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) def parse_args(): parser = argparse.ArgumentParser(description="Create GitLab repositories") parser.add_argument("csv", help="CSV file as exported from Synapses. The first four columns are assumed to be last name, first name, email address, login.") parser.add_argument("groupId", help="The GitLab id where all projects will be added.") parser.add_argument("-t", "--token", help="GitLab API token as created at {}/-/profile/personal_access_tokens".format(GITLAB_URL)) parser.add_argument("-n", "--dry-run", help="Do not actually create repositories.", action="store_true") # TODO: parser.add_argument("--extract-groups", help="Extract groups from the fourth column in the CSV file", action="store_true") args = parser.parse_args() return args args = parse_args() makeProjectsInGroupId(args.groupId, args.csv, args.token, args)