67 líneas
Sin EOL
2,3 KiB
Python
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
|
|
)
|
|
|
|
|
|
|
|
|