# from re import I import gitlab import requests import json from json2html import * import argparse import os from dotenv import load_dotenv from pandas.io.json import json_normalize import pandas as pd from flatten_json import flatten import csv parser = argparse.ArgumentParser(description="Get Project, License and Owners from gitlab") parser.add_argument("--production", action='store_true', help="Use for Production") parser.add_argument("--developer", action='store_true', help="Use for Developer") args = parser.parse_args() load_dotenv() try: if args.production: token = os.getenv('PRODUCTION_TOKEN') print('Production Mode, connect to server') headers = {'PRIVATE-TOKEN': token} gl = gitlab.Gitlab(url='https://gitlab.geant.org', private_token=token) gl_user = 'https://gitlab.geant.org/api/v4/users' gl_proj = 'https://gitlab.geant.org/api/v4/projects' gl_license = 'repository/files/LICENSE?ref=' gl_branch = 'repository/branches' projects = gl.projects.list(all=True) elif args.developer: token = os.getenv('DEVELOPER_TOKEN') print('Developer Mode, connect to server') headers = {'PRIVATE-TOKEN': token} gl = gitlab.Gitlab(url='https://k8s-gitlab.software.geant.org', private_token=token) gl_user = 'https://k8s-gitlab.software.geant.org/api/v4/users' gl_proj = 'https://k8s-gitlab.software.geant.org/api/v4/projects' gl_license = 'repository/files/LICENSE?ref=' gl_branch = 'repository/branches' projects = gl.projects.list(all=True) # projects = gl.projects.list(all=True) else: print("--production or --developer, please, now exit") exit() j_project = {} j_project['projects'] = {} c_project = [] for project in projects: print('Project ID: ', project.attributes['id']) print('Project Name: ', project.attributes['name_with_namespace']) # # print('branch', project.attributes['default_branch']) print('Status:', project.attributes['visibility']) print('aktywny', project.attributes['last_activity_at']) print('grupa', project.attributes['namespace']['name']) # pages = project.wikis.list() # print(pages) x = project.attributes['id'] check_b = gl_proj + '/' + str(x) check_b_response = requests.get(check_b, headers=headers) check_b_data = check_b_response.text check_b_answer = json.loads(check_b_data) if "default_branch" in check_b_answer: branch = project.attributes['default_branch'] # x = project.attributes['id'] c_link = gl_proj + '/' + str(x) + '/' + gl_license + branch c_response = requests.get(c_link, headers=headers) c_data = c_response.text c_answer = json.loads(c_data) if "message" in c_answer: if c_answer['message'] == '404 Commit Not Found': lic = 'No created repository' # print("License file: ", c_answer['message']) else: lic = c_answer['message'] if "file_name" in c_answer: print("License file: ", c_answer['file_name']) lic = c_answer['file_name'] # print('branch', project.attributes['default_branch']) else: lic = 'No created repository' sep = 'T' full_act = project.attributes['last_activity_at'] last_act = full_act.split(sep, 1)[0] tmp = { 'project_id': project.attributes['id'], 'project_name': project.attributes['name_with_namespace'], 'project_group': project.attributes['namespace']['name'], 'project_status': project.attributes['visibility'], 'project_license': lic, 'project_last_activity': last_act } j_project['projects'][x] = {} j_project['projects'][x] = tmp j_project['projects'][x]['owners'] = {} link = (project.attributes['_links']['members'] + '/all') response = requests.get(link, headers=headers) data = response.text owners = json.loads(data) c_user_tmp = [] for owner in owners: # c_user_tmp = [] if owner['access_level'] == 50: # print('User ID: ', owner['id']) # print('User Name: ', owner['name']) # print('Access level: ', owner['access_level']) y = owner['id'] j_project['projects'][x]['owners'][y] = {} # c_user_tmp = [] user = gl.users.get(y) emails = user.emails.list() if user.email == user.commit_email: user_tmp = { 'owner_id': owner['id'], 'owner_name': owner['name'], 'owner_mail': user.email, } # c_user_tmp.append(owner['name'] + '<' + user.email + '>' + ';') else: user_tmp = { 'owner_id': owner['id'], 'owner_name': owner['name'], 'owner_mail': user.email, 'owner_mail_commit': user.commit_email } # c_user_tmp.append(owner['name'] + '<' + user.email + '>' + ';') # c_user_tmp.append(j_project['projects'][x]['owners'][y]['owner_name'] + '<' + # j_project['projects'][x]['owners'][y]['owner_mail'] + '>' + ';') j_project['projects'][x]['owners'][y] = user_tmp print(j_project['projects'][x]['owners'][y]['owner_name'] + '<' + j_project['projects'][x]['owners'][y]['owner_mail'] + '>' + ';') c_user_tmp.append(j_project['projects'][x]['owners'][y]['owner_name'] + '<' + j_project['projects'][x]['owners'][y]['owner_mail'] + '>' + ' ') print(c_user_tmp) # c_owners = j_project['projects'][x]['owners'] # c_user = [] # for c_owner in c_owners: # c_user.append(c_owner['owner_name'] + ':' + c_owner['owner_mail']) c_project.append([project.attributes['id'], project.attributes['name_with_namespace'], project.attributes['visibility'], lic, last_act, c_user_tmp[0]]) print(8*"-") except: print('Something wrong or Cant connect to GitLab server, check credential') exit() new_jproject = json.dumps(j_project, indent=4, ensure_ascii=False) # print(new_jproject) with open("gitlab-projects.json", "w", encoding='utf8') as outfile: outfile.write(new_jproject) new_jproject_html = json2html.convert(json=new_jproject) with open("gitlab-projects.html", "w", encoding='utf8') as outfile: outfile.write(new_jproject_html) print(c_project) with open('gitlab-projects.csv', 'w', encoding='UTF8', newline='') as f: writer = csv.writer(f) # writer = csv.DictWriter(j_project) # write the header # writer.writerow(header) # write multiple rows writer.writerows(c_project) # for project in projects: # print(new_csv) print("This is the end...")