From 813ccc4bd2a98b97c377efea294dc296a23abfbc Mon Sep 17 00:00:00 2001 From: "steven.liatti" <steven.liatti@hesge.ch> Date: Thu, 21 Nov 2019 11:38:54 +0100 Subject: [PATCH] Add create_group script and update others and readme --- README.md | 16 +++++++++++----- scripts/clone_all_forks.py | 17 +++++++++++++---- scripts/clone_all_repos_in_group.py | 17 +++++++++++++---- scripts/create_group.py | 29 +++++++++++++++++++++++++++++ 4 files changed, 66 insertions(+), 13 deletions(-) create mode 100755 scripts/create_group.py diff --git a/README.md b/README.md index 041764c..3818299 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,12 @@ Tous les scripts sont (actuellement) écrits en python et testés avec la versio  +### create_group.py +```bash +python3 create_group.py <token> <group_name> <visibility> +``` +Crée un groupe au sens gitlab du terme, nommé `group_name`, avec la visibilité optionnelle `visibility` (`private`, `internal` ou `public`), par défaut privée. Si le groupe existe déjà, ne fait rien. Retourne le `group_id` du groupe créé, nécessaire pour `create_repo_for_students.py` par exemple. + ### create_repo_for_students.py ```bash python3 create_repo_for_students.py <token> <import_url> <group_id> <project_name> <student1,student2,...,studentN> @@ -29,18 +35,18 @@ python3 create_repo_for_students.py <token> <import_url> <group_id> <project_nam Crée un dépôt git (projet) au sein d'un groupe à partir de l'URL d'un projet existant pour une liste d'étudiants. Détail des arguments : - `token` : le token gitlab. - `import_url` : l'URL (http) du projet (repository) existant. Ce projet doit être public. -- `group_id` : l'identifiant du groupe dédié au cours/TP, créé précédemment. +- `group_id` : l'identifiant du groupe dédié au cours/TP, créé précédemment (avec `create_group.py` par exemple). - `project_name` : le nom du nouveau repository à créer pour le ou les étudiants concernés. - `student1,student2,...,studentN` : une liste de login gitlab des étudiants. Les login sont séparés par une virgule. Peut contenir un seul login. ### clone_all_repos_in_group.py ```bash -python3 clone_all_repos_in_group.py <token> <group_id> +python3 clone_all_repos_in_group.py <token> <group_id> <directory> ``` -Clone tous les repositories d'un groupe `group_id` donné dans un répertoire nommé `repositories`. Affiche sur la sortie standard les membres du groupe, l'url web du repo et dans quel sous-répertoire se trouvent les fichiers. +Clone tous les repositories d'un groupe `group_id` donné dans un répertoire nommé `directory`. Affiche sur la sortie standard les membres du groupe, l'url web du repo et dans quel sous-répertoire se trouvent les fichiers. ### clone_all_forks.py ```bash -python3 clone_all_forks.py <token> <project_id> +python3 clone_all_forks.py <token> <project_id> <directory> ``` -Clone tous les forks d'un projet `project_id` donné dans un répertoire nommé `repositories`. Affiche sur la sortie standard les membres du groupe (avec un droit d'accès supérieur à *Reporter*), l'url web du repo et dans quel sous-répertoire se trouvent les fichiers. +Clone tous les forks d'un projet `project_id` donné dans un répertoire nommé `directory`. Affiche sur la sortie standard les membres du groupe (avec un droit d'accès supérieur à *Reporter*), l'url web du repo et dans quel sous-répertoire se trouvent les fichiers. diff --git a/scripts/clone_all_forks.py b/scripts/clone_all_forks.py index 36fd50e..1c6ba5b 100755 --- a/scripts/clone_all_forks.py +++ b/scripts/clone_all_forks.py @@ -1,12 +1,20 @@ #!/usr/bin/env python3 +import os import sys import json import requests import subprocess -if len(sys.argv) < 3: - print('Usage: ' + sys.argv[0] + ' <token> <project_id>') +if len(sys.argv) < 4: + print('Usage: ' + sys.argv[0] + ' <token> <project_id> <directory>') + exit(1) + +directory = sys.argv[3] +try: + os.mkdir(directory) +except OSError: + print("Creation of the directory '%s' failed, exit\n" % directory) exit(1) token = sys.argv[1] @@ -32,5 +40,6 @@ for repo in repositories: print('Members: ' + members_names) print('Web url: ' + web_url) - print('Cloning in "repositories/' + repo['namespace']['name'] + '"\n') - subprocess.run(["git", "clone", "-q", ssh_url_to_repo, "repositories/" + repo['namespace']['name']]) + print('Cloning in "' + directory + '/' + repo['namespace']['name'] + '"\n') + # TODO: checkout at date + subprocess.run(["git", "clone", "-q", ssh_url_to_repo, directory + '/' + repo['namespace']['name']]) diff --git a/scripts/clone_all_repos_in_group.py b/scripts/clone_all_repos_in_group.py index ad3d7c2..f30d4fc 100755 --- a/scripts/clone_all_repos_in_group.py +++ b/scripts/clone_all_repos_in_group.py @@ -1,12 +1,20 @@ #!/usr/bin/env python3 +import os import sys import json import requests import subprocess -if len(sys.argv) < 3: - print('Usage: ' + sys.argv[0] + ' <token> <group_id>') +if len(sys.argv) < 4: + print('Usage: ' + sys.argv[0] + ' <token> <group_id> <directory>') + exit(1) + +directory = sys.argv[3] +try: + os.mkdir(directory) +except OSError: + print("Creation of the directory '%s' failed, exit\n" % directory) exit(1) token = sys.argv[1] @@ -37,5 +45,6 @@ for repo in repositories: print('Members: ' + members_names) print('Web url: ' + web_url) - print('Cloning in "repositories/' + repo['path'] + '"\n') - subprocess.run(["git", "clone", "-q", ssh_url_to_repo, "repositories/" + repo['path']]) + print('Cloning in "' + directory + '/' + repo['path'] + '"\n') + # TODO: checkout at date + subprocess.run(["git", "clone", "-q", ssh_url_to_repo, directory + '/' + repo['path']]) \ No newline at end of file diff --git a/scripts/create_group.py b/scripts/create_group.py new file mode 100755 index 0000000..418e31c --- /dev/null +++ b/scripts/create_group.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python3 + +import os +import sys +import json +import requests +import subprocess + +if len(sys.argv) < 3: + print('Usage: ' + sys.argv[0] + ' <token> <group_name> <visibility>') + exit(1) + +token = sys.argv[1] +group_name = sys.argv[2] +visibility = 'private' +if len(sys.argv) > 3: + visibility = sys.argv[3] + +base_url = 'https://gitedu.hesge.ch/api/v4/' +params = {'path': group_name, 'name': group_name, 'visibility': visibility} +headers = {'PRIVATE-TOKEN': token} + +group = requests.post(base_url + '/groups', params=params, headers=headers).json() +if 'message' in group: + print('Error in creating group: %s' % group) + exit(1) + +print("Group '" + group['name'] + "' with id '" + str(group['id']) + "' and visibility '" + group['visibility'] + "' available at '" + group['web_url'] + "'") +print(str(group['id'])) \ No newline at end of file -- GitLab