Interfície en català, botó Esborra i botons d'icona segons l'estat
This commit is contained in:
+18
-8
@@ -17,7 +17,7 @@ from pathlib import Path
|
||||
|
||||
from .config import Game
|
||||
from .metadata import GameMeta, icon_path, load_meta, save_meta
|
||||
from .paths import metadata_dir, repo_dir
|
||||
from .paths import game_dir, metadata_dir, repo_dir
|
||||
|
||||
LogFn = Callable[[str], None]
|
||||
|
||||
@@ -76,6 +76,16 @@ def check_update(root: Path, game: Game, log: LogFn = _noop) -> bool:
|
||||
return int(behind or "0") > 0
|
||||
|
||||
|
||||
def delete_local(root: Path, game: Game, log: LogFn = _noop) -> None:
|
||||
"""Esborra la descàrrega local del joc (clon + metadata), sense tocar el TOML."""
|
||||
target = game_dir(root, game.id)
|
||||
if not target.exists():
|
||||
log(f"{game.name}: no hi ha res a esborrar")
|
||||
return
|
||||
log(f"Esborrant la descàrrega local de {game.name}…")
|
||||
shutil.rmtree(target, ignore_errors=True)
|
||||
|
||||
|
||||
def download(root: Path, game: Game, log: LogFn = _noop) -> GameMeta:
|
||||
"""Clona (si no existe) o trae el remoto forzado (descartando cambios locales).
|
||||
|
||||
@@ -87,13 +97,13 @@ def download(root: Path, game: Game, log: LogFn = _noop) -> GameMeta:
|
||||
branch = _fetch_default_branch(game, log)
|
||||
|
||||
if (repo / ".git").exists():
|
||||
log(f"Actualizando {game.name} (forzado, descartando cambios locales)…")
|
||||
log(f"Actualitzant {game.name} (forçat, descartant canvis locals)…")
|
||||
_run_git(["fetch", "origin", "--prune"], repo, log)
|
||||
target = branch or _detect_origin_head(repo, log) or "HEAD"
|
||||
_run_git(["reset", "--hard", f"origin/{target}"], repo, log)
|
||||
_run_git(["clean", "-fd"], repo, log)
|
||||
else:
|
||||
log(f"Clonando {game.name}…")
|
||||
log(f"Clonant {game.name}…")
|
||||
if repo.exists(): # carpeta a medias sin .git: limpiarla
|
||||
shutil.rmtree(repo, ignore_errors=True)
|
||||
_run_git(["clone", game.clone_url, str(repo)], None, log)
|
||||
@@ -131,14 +141,14 @@ def refresh_metadata(
|
||||
def _copy_icon(root: Path, game: Game, repo: Path, log: LogFn) -> None:
|
||||
src = repo / game.icon_rel
|
||||
if not src.exists():
|
||||
log(f"(sin icono en {game.icon_rel})")
|
||||
log(f"(sense icona a {game.icon_rel})")
|
||||
return
|
||||
metadata_dir(root, game.id).mkdir(parents=True, exist_ok=True)
|
||||
try:
|
||||
shutil.copyfile(src, icon_path(root, game.id))
|
||||
log(f"Icono actualizado desde {game.icon_rel}")
|
||||
log(f"Icona actualitzada des de {game.icon_rel}")
|
||||
except OSError as exc:
|
||||
log(f"No se pudo copiar el icono: {exc}")
|
||||
log(f"No s'ha pogut copiar la icona: {exc}")
|
||||
|
||||
|
||||
def _read_version(game: Game, repo: Path, log: LogFn) -> str:
|
||||
@@ -154,7 +164,7 @@ def _read_version(game: Game, repo: Path, log: LogFn) -> str:
|
||||
timeout=20,
|
||||
)
|
||||
except (OSError, subprocess.SubprocessError) as exc:
|
||||
log(f"version_cmd falló: {exc}")
|
||||
log(f"version_cmd ha fallat: {exc}")
|
||||
return ""
|
||||
out = (proc.stdout or "").strip()
|
||||
return out.splitlines()[0] if out else ""
|
||||
@@ -168,7 +178,7 @@ def _fetch_gitea_info(game: Game, log: LogFn) -> dict | None:
|
||||
with urllib.request.urlopen(req, timeout=_HTTP_TIMEOUT) as resp:
|
||||
return json.loads(resp.read().decode("utf-8"))
|
||||
except (urllib.error.URLError, OSError, json.JSONDecodeError, ValueError) as exc:
|
||||
log(f"No se pudo leer la info de Gitea ({game.info_url}): {exc}")
|
||||
log(f"No s'ha pogut llegir la info de Gitea ({game.info_url}): {exc}")
|
||||
return None
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user