#!/usr/bin/env python #Git manager for elo 329-elo330 import argparse import csv import gitlab import json import subprocess import sys import threading import urllib3 def check_tag_in_project_list(gl,project_name_list,tag): for project_name in project_name_list: threading.Thread(target=check_tag_in_project_thread, args=(gl,project_name,tag,)).start() return def check_tag_in_project_thread(gl,project_name,tag): try: gl.projects.list(all=True,search=project_name)[0].tags.get(tag) print project_name, 'has the tag', tag except gitlab.exceptions.GitlabGetError: project_name, 'doesn\'t have the tag', tag except Exception as e: print e return def clone_project_list(gl,project_name_list): for project_name in project_name_list: threading.Thread(target=clone_thread, args=(gl,project_name,)).start() return def clone_thread(gl,project_name): git_url=gl.projects.list(all=True,search=project_name)[0].ssh_url_to_repo subprocess.call(['git','clone',git_url]) print "Clone de",project_name,"termino." return def create_users_from_csv(gl,new_users_csv_name,delimiter_csv=';'): with open(new_users_csv_name) as csv_file: csv_reader = csv.reader(csv_file,delimiter=delimiter_csv) new_users_list = list() for row in csv_reader: user_dictionary = {} user_dictionary['name'] = " ".join([row[2],row[0],row[1]]) user_dictionary['email'] = row[3] user_dictionary['username'] = row[3].split('@')[0] new_users_list.append(user_dictionary) for new_user in new_users_list: threading.Thread(target=create_user_thread, args=(gl,new_user,)).start() return def create_user_thread(gl,new_user): gl.users.create({'email':new_user['email'],'name':new_user['name'],'username':new_user['username'],'reset_password':True}) print "Se creo exitosamente usuario",new_user["username"]+"." return def get_project_list(gl,project_search=''): project_list = gl.projects.list(all=True,search=project_search) with open("example.txt",'w') as file: for project in project_list: file.write(project.name.encode("utf-8")+'\n') if (project_search != ''): print "Se termino de listar los projectos que contienen el texto", project_search+". Se almaceno el resultado en example.txt" else: print "Se termino de listar los projectos. Se almaceno el resultado en example.txt" return if __name__ == '__main__': #Desactivamos warning por certificado SSL urllib3.disable_warnings() # Inicializa parser para manejo de argumentos parser = argparse.ArgumentParser(description = 'Programa utilizado para realizar diversas acciones sobre el git ELO UTFSM',formatter_class = argparse.RawTextHelpFormatter) # Alternativas de operacion excluyentes mutually_exclusive = parser.add_mutually_exclusive_group(required = 'True') # Alternativa de chequeo de tags mutually_exclusive.add_argument('--check', nargs=2 , metavar=('Project_List_File','Tag_To_Search'), help="Modo de operacion que permite verificar la existencia del tag tag_to_search en cada uno de los projectos almacenados en el archivo Project_List_File.") # Alternativa de clonacion de repositorios mutually_exclusive.add_argument('--clone', nargs=1 , metavar='Project_List_File', help="Modo de operacion que permite descargar cada uno de los projectos almacenados en el archivo Project_List_File.") # Alternativa de creacion de usuarios mutually_exclusive.add_argument('--create', nargs=1 , metavar='New_User_List_File', help="Modo de operacion que permite crear nuevos usuarios en el repositorio git en base a los datos almacenados en el archivo New_User_List_File.") # Alternativa de enlistar projectos de git mutually_exclusive.add_argument('--list',nargs='*', metavar='Search_in_Projects_Text', help="Crea un archivo example.exe con todos los projectos del Git ELO. Si se agrega parametro Search_in_Projects_Text, se almacenan solos los projectos que contengan dicha seccion de texto en su nombre.") # Se verifica el modo seleccionado args = parser.parse_args(); for mode, mode_arguments in vars(args).items(): if mode_arguments != None: break #Creacion de objeto gitlab para manipulacion #Se elimina private_token para publicacion web gl = gitlab.Gitlab('https://git.elo.utfsm.cl',private_token='',api_version=4,ssl_verify=False) # En base al modo de operacion, se llama una funcion que lo implementa # Operacion de Chequeo if mode == 'check': with open(mode_arguments[0],'r') as file: project_list = list() for line in file: project_list.append(line.strip('\n')) check_tag_in_project_list(gl,project_list,mode_arguments[1]); # Operacion de clonacion elif mode == 'clone': with open(mode_arguments[0],'r') as file: project_list = list() for line in file: project_list.append(line.strip('\n')) clone_project_list(gl,project_list) # Operacion de Creacion elif mode == 'create': create_users_from_csv(gl,mode_arguments[0]) # Operacion de Enlistar elif mode == 'list': if(len(mode_arguments) == 1): get_project_list(gl,project_search=mode_arguments[0]) else: get_project_list(gl) # Finalizacion del programa sys.exit(0)