From 20f15d1abca648918a2ad972679b2b3e5c37f657 Mon Sep 17 00:00:00 2001
From: "steven.liatti" <steven.liatti@hesge.ch>
Date: Thu, 21 Nov 2019 21:29:47 +0100
Subject: [PATCH] Add possible checkout at date in clone_all scripts

---
 README.md                           |  8 ++++----
 scripts/clone_all_forks.py          | 19 +++++++++++++++----
 scripts/clone_all_repos_in_group.py | 19 +++++++++++++++----
 3 files changed, 34 insertions(+), 12 deletions(-)

diff --git a/README.md b/README.md
index 3818299..adb02a9 100644
--- a/README.md
+++ b/README.md
@@ -41,12 +41,12 @@ Crée un dépôt git (projet) au sein d'un groupe à partir de l'URL d'un projet
 
 ### clone_all_repos_in_group.py
 ```bash
-python3 clone_all_repos_in_group.py <token> <group_id> <directory>
+python3 clone_all_repos_in_group.py <token> <group_id> <directory> <until_date>
 ```
-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 tous les repositories d'un groupe `group_id` donné dans un répertoire nommé `directory`. Si une date `until_date` (au format `AAAA-MM-DD hh:mm`) est donnée, exécute un `git checkout` sur le premier commit précédant cette date. 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> <directory>
+python3 clone_all_forks.py <token> <project_id> <directory> <until_date>
 ```
-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.
+Clone tous les forks d'un projet `project_id` donné dans un répertoire nommé `directory`. Si une date `until_date` (au format `AAAA-MM-DD hh:mm`) est donnée, exécute un `git checkout` sur le premier commit précédant cette date. 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 1c6ba5b..1cd2262 100755
--- a/scripts/clone_all_forks.py
+++ b/scripts/clone_all_forks.py
@@ -7,7 +7,7 @@ import requests
 import subprocess
 
 if len(sys.argv) < 4:
-    print('Usage: ' + sys.argv[0] + ' <token> <project_id> <directory>')
+    print('Usage: ' + sys.argv[0] + ' <token> <project_id> <directory> <until_date>')
     exit(1)
 
 directory = sys.argv[3]
@@ -36,10 +36,21 @@ for repo in repositories:
 
     for member in members:
         if member['access_level'] > 20: # Access level greater than "Reporter"
-            members_names += member['username'] + ', '
+            members_names += "'" + member['name'] + "' (" + member['username'] + '), '
 
     print('Members: ' + members_names)
     print('Web url: ' + web_url)
-    print('Cloning in "' + directory + '/' + repo['namespace']['name'] + '"\n')
-    # TODO: checkout at date
+    print('Cloning in "' + directory + '/' + repo['namespace']['name'] + '"')
+
     subprocess.run(["git", "clone", "-q", ssh_url_to_repo, directory + '/' + repo['namespace']['name']])
+    if len(sys.argv) > 4:
+        until_date = sys.argv[4]
+        commit_id = subprocess.check_output([
+            "git","rev-list", "-n", "1", "--before=\"" + until_date + "\"",
+            "master"], cwd=directory + '/' + repo['namespace']['name']).decode('utf-8').rstrip()
+        subprocess.run(
+            ["git", "checkout", "-q", str(commit_id)],
+            cwd=directory + '/' + repo['namespace']['name'])
+        print("Checkout at " + str(commit_id) + "\n")
+    else:
+        print()
\ No newline at end of file
diff --git a/scripts/clone_all_repos_in_group.py b/scripts/clone_all_repos_in_group.py
index a6bfb8d..719f4da 100755
--- a/scripts/clone_all_repos_in_group.py
+++ b/scripts/clone_all_repos_in_group.py
@@ -7,7 +7,7 @@ import requests
 import subprocess
 
 if len(sys.argv) < 4:
-    print('Usage: ' + sys.argv[0] + ' <token> <group_id> <directory>')
+    print('Usage: ' + sys.argv[0] + ' <token> <group_id> <directory> <until_date>')
     exit(1)
 
 directory = sys.argv[3]
@@ -45,6 +45,17 @@ for repo in repositories:
 
     print('Members: ' + members_names)
     print('Web url: ' + web_url)
-    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
+    print('Cloning in "' + directory + '/' + repo['path'] + '"')
+
+    subprocess.run(["git", "clone", "-q", ssh_url_to_repo, directory + '/' + repo['path']])
+    if len(sys.argv) > 4:
+        until_date = sys.argv[4]
+        commit_id = subprocess.check_output([
+            "git","rev-list", "-n", "1", "--before=\"" + until_date + "\"",
+            "master"], cwd=directory + '/' + repo['path']).decode('utf-8').rstrip()
+        subprocess.run(
+            ["git", "checkout", "-q", str(commit_id)],
+            cwd=directory + '/' + repo['path'])
+        print("Checkout at " + str(commit_id) + "\n")
+    else:
+        print()
\ No newline at end of file
-- 
GitLab