GitLab-Utils/gitlab-create-student-depot...

79 lines
3.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'
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 {} <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)
makeProjectsInGroupId(sys.argv[2], sys.argv[1])