diff --git a/gitlab-create-student-depots.py b/gitlab-create-student-depots.py index d81a0f7..01a120e 100644 --- a/gitlab-create-student-depots.py +++ b/gitlab-create-student-depots.py @@ -28,12 +28,15 @@ def readNames(fileName): if hasHeader: next(reader) for row in reader: - result.append((row[0], row[1], row[2])) + 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 """ - return gitlab.users.list(search=email)[0] + 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, @@ -44,22 +47,27 @@ def addProjectMember(project, userId, accessLevel): 'access_level': accessLevel}) def makeProjectsInGroupId(groupId, csvFile, token, options={}): - print(groupId, csvFile, options); return + # print(groupId, csvFile, options) api = gitlab.Gitlab(GITLAB_URL, token) - for (lastName, firstName, email) in readNames(csvFile): + for (lastName, firstName, email, login) in readNames(csvFile): try: - user = lookupUser(email, api) - print("::: Creating project for {} {} <{}> -- {} ({})…".format( + 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 >> sys.stderr, "!!! Could not create project for {}: User not found ({})".format(email, 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 >> sys.stderr, "!!! Error creating project for {}: {}".format(email, e) + print("!!! Error creating project for {}: {}".format(email, e), file=sys.stderr) if __name__ == '__main__': import argparse @@ -77,9 +85,10 @@ if __name__ == '__main__': def parse_args(): parser = argparse.ArgumentParser(description="Create GitLab repositories") - parser.add_argument("csv", help="CSV file as exported from Synapses. The first three columns are assumed to be last name, first name, email address.") + 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()