-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathrepos_downloader.py
122 lines (96 loc) · 3.99 KB
/
repos_downloader.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import os
import argparse
import re
import shutil
from auxiliares import parsear_datos_csv
parser = argparse.ArgumentParser()
parser.add_argument("-p", "--path", help="Ruta del archivo csv", type=str, nargs="?")
parser.add_argument(
"-c", "--corrector", help="Nombre/usuario del corrector", type=str, nargs="?"
)
parser.add_argument(
"-a", "--actividad", help="Nombre de la actividad", type=str, required=True
)
parser.add_argument(
"-m", "--modo", help="[A] automático, [M] manual", type=str, nargs="?", default="A"
)
parser.add_argument(
"-e", "--estudiante", help="Nickname estudiante", type=str, nargs="?"
)
args = parser.parse_args()
# ---- Parámetros cambiables ----
# Path al archivo CSV que contiene la información de los correctores
path_csv = args.path
# Tu nombre/usuario en el archivo CSV
corrector = args.corrector
# Subdirectorio a descargar: T3, AF6, AS2 ...
actividad = args.actividad
# URL absoluta al repositorio, no debería ser necesario cambiarla
repo_base = r"https://github.com/IIC2233/"
path_repo = repo_base + actividad
def modo_automatico():
# Transforma el CSV a una lista de tuplas (corrector, alumno)
datos = parsear_datos_csv(path_csv)
# Comando inicial, crea el repositorio respectivo vacío, para poder agregarle contenido
git_setup = "git clone --depth 1 --filter=blob:none --sparse " + path_repo
os.system(git_setup)
# Itera sobre los alumnos y correctores, para agregar a la carpeta sólo las subcarpetas
for linea in datos:
alumno, corr = (linea[0], linea[1])
if corr == corrector:
os.system(f"cd {actividad} && git sparse-checkout add {alumno}")
def modo_manual(actividad_especifica, alumno):
print(f"Descargando {actividad_especifica} de {alumno}!")
git_setup = (
"git clone --depth 1 --filter=blob:none --sparse "
+ repo_base
+ actividad_especifica
)
os.system(git_setup)
os.system(f"cd {actividad_especifica} && git sparse-checkout add {alumno}")
def modo_forzado():
if actividad in os.listdir():
acepta_a_borrar_carpeta = input(
f"Esto borrará la carpeta {actividad}/ en {os.getcwd()}/ Estás seguro?: (y/n) "
).lower()
if acepta_a_borrar_carpeta == "n" or acepta_a_borrar_carpeta != "y":
print("el modo forzado no se ejecutará. Saliendo...")
return
print(f"borrando carpeta {actividad} ...")
shutil.rmtree(actividad)
# Comando inicial, clona todo el repositorio
print("Clonando todo el repositorio...")
git_setup = f"git clone {path_repo}"
os.system(git_setup)
datos = parsear_datos_csv(path_csv)
alumnos_del_corrector = set()
# Itera sobre los alumnos y correctores, para extraer los alumnos a corregir
for linea in datos:
alumno, corr = (linea[0], linea[1])
if corr == corrector:
alumnos_del_corrector.add(alumno)
# borra las carpetas de los alumnos que NO tengan que corregir
for alumno in os.listdir(path=actividad):
if alumno not in alumnos_del_corrector:
shutil.rmtree(os.path.join(actividad, alumno))
if __name__ == "__main__":
if re.search("[m]", args.modo, re.IGNORECASE):
print("Modo manual")
# argumentos: actividad y alumno
assert isinstance(args.estudiante, str)
modo_manual(args.actividad, args.estudiante)
elif re.search("[a]", args.modo, re.IGNORECASE):
# toma las variables globales como parámetros, y descarga todos los elementos del CSV
print("Modo automático")
assert isinstance(args.path, str)
assert isinstance(args.corrector, str)
modo_automatico()
elif re.search("[f]", args.modo, re.IGNORECASE):
# toma las variables globales como parámetros, y descarga FORZOSAMENTE
# los elementos del CSV
print("Modo forzado")
assert isinstance(args.path, str)
assert isinstance(args.corrector, str)
modo_forzado()
else:
print("ERROR: los argumentos no son correctos.")