From aa33f339dc6925501da0df251851cbbf679d2f8e Mon Sep 17 00:00:00 2001
From: "steven.liatti" <steven.liatti@hesge.ch>
Date: Tue, 11 Jun 2019 12:04:15 +0200
Subject: [PATCH] Add script and doc

---
 .gitmodules    |   3 +++
 README.md      |  13 +++++++++++--
 clone_all.py   |  34 ++++++++++++++++++++++++++++++++++
 project_id.png | Bin 0 -> 8378 bytes
 public         |   1 +
 5 files changed, 49 insertions(+), 2 deletions(-)
 create mode 100644 .gitmodules
 create mode 100644 clone_all.py
 create mode 100644 project_id.png
 create mode 160000 public

diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..15c6786
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "public"]
+	path = public
+	url = ssh://git@ssh.hesge.ch:10572/iti_assistants/modele-tp-etudiants-public.git
diff --git a/README.md b/README.md
index e9d1f23..60126f0 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,12 @@
-# modele-tp-etudiants-private
+# Modèle de TP pour étudiants (privé)
 
-Ce repo contient un modèle pour organiser un TP à faire par les étudiants avec la contrainte d'utiliser le gitlab de l'école.
\ No newline at end of file
+Ce repo contient un modèle pour organiser un TP à faire par les étudiants avec la contrainte d'utiliser le gitlab de l'école. Il est constitué des fichiers privés de l'enseignant ainsi que d'un script python pour récupérer tous les forks des étudiants du repo public, ce dernier étant un repository git à part entière et submodule du premier.
+
+La syntaxe du script est la suivante :
+```bash
+python3 clone_all.py <token> <project_id>
+```
+Vous pouvez générer un `token` [sur cette page](https://gitedu.hesge.ch/profile/personal_access_tokens), en cochant la case "api". Le `project_id` correspond à celui affiché sur la page de repo :
+![image](project_id.png)
+
+Le script clone tous les forks du repository public et les place dans le répertoire `repositories`.
\ No newline at end of file
diff --git a/clone_all.py b/clone_all.py
new file mode 100644
index 0000000..a9f5a18
--- /dev/null
+++ b/clone_all.py
@@ -0,0 +1,34 @@
+import sys
+import json
+import requests
+import subprocess
+
+if len(sys.argv) < 3:
+    print('Usage: ' + sys.argv[0] + ' <token> <project_id>')
+    exit(1)
+
+token = sys.argv[1]
+project_id = sys.argv[2]
+
+base_url = 'https://gitedu.hesge.ch/api/v4/projects/'
+params = {'simple': 'true'}
+headers = {'PRIVATE-TOKEN': token}
+
+repositories = requests.get(base_url + project_id + '/forks', params=params, headers=headers).json()
+
+for repo in repositories:
+    repo_url = base_url + str(repo['id']) + '/members'
+    members = requests.get(repo_url, headers=headers).json()
+    
+    ssh_url_to_repo = repo['ssh_url_to_repo']
+    web_url = repo['web_url']
+    members_names = ''
+
+    for member in members:
+        if member['access_level'] > 20: # Access level greater than "Reporter"
+            members_names += member['username'] + ', '
+
+    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']])
diff --git a/project_id.png b/project_id.png
new file mode 100644
index 0000000000000000000000000000000000000000..2671a3fb443acc0b326d14adaf81f5473fb2ea0a
GIT binary patch
literal 8378
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
Gp$Py{I+n-)

literal 0
HcmV?d00001

diff --git a/public b/public
new file mode 160000
index 0000000..51f1685
--- /dev/null
+++ b/public
@@ -0,0 +1 @@
+Subproject commit 51f16857a239d5a0272ad969d97d1c2b726965f6
-- 
GitLab