#!/usr/bin/env python3 import sys import subprocess from typing import Any, TextIO, Generator import time from functools import cache from pathlib import Path from git import Repo import toml REPO_APPS_ROOT = Path(Repo(__file__, search_parent_directories=True).working_dir) @cache def apps_repo_root() -> Path: return Path(__file__).parent.parent.parent def git(cmd: list[str], cwd: Path | None = None) -> str: full_cmd = ["git"] if cwd: full_cmd.extend(["-C", str(cwd)]) full_cmd.extend(cmd) return subprocess.check_output( full_cmd, # env=my_env, ).strip().decode("utf-8") def git_repo_age(path: Path) -> bool | int: for file in [path / ".git" / "FETCH_HEAD", path / ".git" / "HEAD"]: if file.exists(): return int(time.time() - file.stat().st_mtime) return False @cache def get_catalog(working_only: bool = False) -> dict[str, dict[str, Any]]: """Load the app catalog and filter out the non-working ones""" catalog = toml.load((REPO_APPS_ROOT / "apps.toml").open("r", encoding="utf-8")) if working_only: catalog = { app: infos for app, infos in catalog.items() if infos.get("state") != "notworking" } return catalog @cache def get_categories() -> dict[str, Any]: categories_path = REPO_APPS_ROOT / "categories.toml" return toml.load(categories_path) @cache def get_antifeatures() -> dict[str, Any]: antifeatures_path = REPO_APPS_ROOT / "antifeatures.toml" return toml.load(antifeatures_path) @cache def get_wishlist() -> dict[str, dict[str, str]]: wishlist_path = REPO_APPS_ROOT / "wishlist.toml" return toml.load(wishlist_path) @cache def get_graveyard() -> dict[str, dict[str, str]]: wishlist_path = REPO_APPS_ROOT / "graveyard.toml" return toml.load(wishlist_path)