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 )