PyBase/DepenciesIns/Main.py
Nique_372 c60504bbbd
2026-03-11 22:18:32 -05:00

67 líneas
Sin EOL
2,3 KiB
Python

import sys
import os
import json
import subprocess
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
import Utils.Funciones
class CLeoDepencies(Utils.SimpleLogger.CLoggerBase):
def __init__(self, params : dict):
super().__init__()
# parametros de la clase
# terminal data path
# ejemplo:
# C:\Users\USER\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075
self.m_folder_shared_proyects = os.path.join(params["terminal_data_path"],"MQL5","Shared Projects")
def clone_or_update_repo(self, url: str, rama: str = "main", visited: set = None):
if visited is None:
visited = set()
# Extraemos el nombre del repo de la URL
repo_name: str = url.rstrip("/").split("/")[-1]
if repo_name in visited:
self.LogInfo(f"Ya procesado: {repo_name}, saltando")
return
visited.add(repo_name)
repo_path: str = os.path.join(self.m_folder_shared_proyects, repo_name)
# Clone o pull
if os.path.exists(repo_path):
self.LogInfo(f"Pull: {repo_name} ({rama})")
try:
subprocess.run(["git", "-C", repo_path, "checkout", rama], check=True, timeout=30)
subprocess.run(["git", "-C", repo_path, "pull"], check=True, timeout=60)
except (subprocess.CalledProcessError, subprocess.TimeoutExpired) as e:
self.LogError(f"Fallo git pull {repo_name}, usando version local: {e}")
else:
self.LogInfo(f"Clone: {repo_name} rama={rama} desde {url}")
subprocess.run(["git", "clone", "-b", rama, url, repo_path], check=True)
# Buscamos dependencies.json
dependencies_json: str = os.path.join(repo_path, "dependencies.json")
if not os.path.exists(dependencies_json):
self.LogInfo(f"{repo_name} no tiene dependencies.json")
return
# Parseamos y recursivo
with open(dependencies_json, "r") as f:
data = json.load(f)
for r in data["repos"]:
self.clone_or_update_repo(
url = r["url"],
rama = r.get("rama", "main"), # si no tiene rama usa main
visited = visited
)