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