From 4832fc16f4a4612d8fe949e7eaf6c73133bc16c8 Mon Sep 17 00:00:00 2001
From: "steven.liatti" <steven@liatti.ch>
Date: Wed, 14 Oct 2020 19:31:10 +0200
Subject: [PATCH] Merge clone_all scripts, close #1

---
 ...one_all_repos_in_group.py => clone_all.py} | 29 +++++++---
 scripts/clone_all_forks.py                    | 56 -------------------
 2 files changed, 21 insertions(+), 64 deletions(-)
 rename scripts/{clone_all_repos_in_group.py => clone_all.py} (60%)
 delete mode 100755 scripts/clone_all_forks.py

diff --git a/scripts/clone_all_repos_in_group.py b/scripts/clone_all.py
similarity index 60%
rename from scripts/clone_all_repos_in_group.py
rename to scripts/clone_all.py
index 667761a..f02c74a 100755
--- a/scripts/clone_all_repos_in_group.py
+++ b/scripts/clone_all.py
@@ -6,10 +6,13 @@ import subprocess
 import argparse
 
 parser = argparse.ArgumentParser()
+group = parser.add_mutually_exclusive_group()
+group.add_argument("-g", "--group", action="store_true", help="Clone repositories from a group (with group_id) or forks of a project (with project_id) (default behavior).")
+group.add_argument("-f", "--forks", action="store_true", help="Clone forks of a project (with project_id).")
 parser.add_argument(
     "token", metavar="TOKEN", help="Create a token here: https://gitedu.hesge.ch/profile/personal_access_tokens")
 parser.add_argument(
-    "group_id", metavar="GROUP_ID", help="The group id (int) of the projects.")
+    "id", metavar="ID", help="The group_id (int) of the projects or the project_id (int) of the forks.")
 parser.add_argument(
     "directory", metavar="DIRECTORY", help="Local directory where clone all repositories.")
 parser.add_argument(
@@ -26,8 +29,12 @@ base_url = 'https://gitedu.hesge.ch/api/v4/'
 params = {'simple': 'true', 'per_page': 100}
 headers = {'PRIVATE-TOKEN': args.token}
 
-repositories = requests.get(base_url + '/groups/' + args.group_id +
-                            '/projects', params=params, headers=headers).json()
+if args.forks:
+    url = base_url + 'projects/' + args.id + '/forks'
+else:
+    url = base_url + 'groups/' + args.id + '/projects'
+
+repositories = requests.get(url, params=params, headers=headers).json()
 if 'message' in repositories:
     print('Error retrieving repositories: ' + repositories['message'])
     exit(1)
@@ -44,21 +51,27 @@ for repo in repositories:
     members_names = ''
 
     for member in members:
-        members_names += member['username'] + ', '
+        if member['access_level'] > 20:  # Access level greater than "Reporter"
+            members_names += member['username'] + ', '
+
+    if args.forks:
+        repo_local_name = repo['namespace']['path']
+    else:
+        repo_local_name = repo['path']
 
     print('Members: ' + members_names)
     print('Web url: ' + web_url)
-    print('Cloning in "' + args.directory + '/' + repo['path'] + '"')
+    print('Cloning in "' + args.directory + '/' + repo_local_name + '"')
 
     subprocess.run(["git", "clone", "-q", ssh_url_to_repo,
-                    args.directory + '/' + repo['path']])
+                    args.directory + '/' + repo_local_name])
     if args.until_date:
         commit_id = subprocess.check_output([
             "git", "rev-list", "-n", "1", "--before=\"" + args.until_date + "\"",
-            "master"], cwd=args.directory + '/' + repo['path']).decode('utf-8').rstrip()
+            "master"], cwd=args.directory + '/' + repo_local_name).decode('utf-8').rstrip()
         subprocess.run(
             ["git", "checkout", "-q", str(commit_id)],
-            cwd=args.directory + '/' + repo['path'])
+            cwd=args.directory + '/' + repo_local_name)
         print("Checkout at " + str(commit_id) + "\n")
     else:
         print()
diff --git a/scripts/clone_all_forks.py b/scripts/clone_all_forks.py
deleted file mode 100755
index 1cd2262..0000000
--- a/scripts/clone_all_forks.py
+++ /dev/null
@@ -1,56 +0,0 @@
-#!/usr/bin/env python3
-
-import os
-import sys
-import json
-import requests
-import subprocess
-
-if len(sys.argv) < 4:
-    print('Usage: ' + sys.argv[0] + ' <token> <project_id> <directory> <until_date>')
-    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]
-project_id = sys.argv[2]
-
-base_url = 'https://gitedu.hesge.ch/api/v4/projects/'
-params = {'simple': 'true', 'per_page': 100}
-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['name'] + "' (" + member['username'] + '), '
-
-    print('Members: ' + members_names)
-    print('Web url: ' + web_url)
-    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
-- 
GitLab