73 lines
1.8 KiB
Python
73 lines
1.8 KiB
Python
|
#!/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
|
||
|
|
||
|
|
||
|
# Progress bar helper, stolen from https://stackoverflow.com/a/34482761
|
||
|
def progressbar(
|
||
|
it: list[Any],
|
||
|
prefix: str = "",
|
||
|
size: int = 60,
|
||
|
file: TextIO = sys.stdout) -> Generator[Any, None, None]:
|
||
|
count = len(it)
|
||
|
|
||
|
def show(j, name=""):
|
||
|
name += " "
|
||
|
x = int(size * j / count)
|
||
|
file.write(
|
||
|
"%s[%s%s] %i/%i %s\r" % (prefix, "#" * x, "." * (size - x), j, count, name)
|
||
|
)
|
||
|
file.flush()
|
||
|
|
||
|
show(0)
|
||
|
for i, item in enumerate(it):
|
||
|
yield item
|
||
|
show(i + 1, item[0])
|
||
|
file.write("\n")
|
||
|
file.flush()
|
||
|
|
||
|
|
||
|
@cache
|
||
|
def get_catalog(working_only=False):
|
||
|
"""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
|