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
 
 ![image](doc/project_id.png)
 
+### 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