100 lines
4.2 KiB
Python
100 lines
4.2 KiB
Python
# -*- 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 <james.eagan@telecom-paris.fr>
|
|
# 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 {} <csv> <groupId> <token>".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)
|