refactor(cli): streamline repository status logic

- Replace `RepoCategory` with `RepoCatalogState` for improved abstraction
- Simplify repository data processing and remove redundant functions
- Enhance code readability and maintainability by consolidating logic
This commit is contained in:
2025-05-11 14:38:54 +02:00
parent 68b3233fcb
commit 55e79d224f

View File

@@ -1,71 +1,45 @@
from typer import Typer from typer import Typer
from rich.console import Console from rich.console import Console
from rich.table import Table from rich.table import Table
from pathlib import Path
from datetime import datetime
from repocat.config import load_config from repocat.config import load_config
from repocat.models.config import RepoCategory from repocat.models.catalog import RepoCatalogState
app = Typer() app = Typer()
console = Console() console = Console()
def get_dir_size(path: Path) -> int:
"""Returns size in bytes."""
return sum(f.stat().st_size for f in path.rglob("*") if f.is_file())
def summarize_category(category: RepoCategory, base_path: Path):
cat_path = base_path / category.subdir
if not cat_path.exists():
return 0, 0.0, None, None
now = datetime.now()
repo_infos = []
for repo in cat_path.iterdir():
if not repo.is_dir():
continue
size_bytes = get_dir_size(repo)
mtime = datetime.fromtimestamp(repo.stat().st_mtime)
age_days = (now - mtime).days
repo_infos.append((repo.name, size_bytes, age_days, mtime))
if not repo_infos:
return 0, 0.0, None, None
total_size = sum(info[1] for info in repo_infos) / 1024 / 1024
avg_age = sum(info[2] for info in repo_infos) // len(repo_infos)
oldest = max(repo_infos, key=lambda x: x[2]) # größtes Alter
return len(repo_infos), total_size, avg_age, (oldest[0], oldest[2])
@app.command("status") @app.command("status")
def status(): def status():
""" """
Zeigt eine Übersicht über alle Repository-Kategorien. Zeigt eine Übersicht über alle Repository-Kategorien.
""" """
config = load_config() catalog = RepoCatalogState.from_config(load_config())
base = config.base_dir
table = Table(title="Repository-Status") table = Table(title="Repository-Status")
table.add_column("Kategorie") table.add_column("Kategorie")
table.add_column("Repos", justify="right") table.add_column("Repos", justify="right")
table.add_column("Gesamtgröße", justify="right") table.add_column("Gesamtgröße", justify="right")
table.add_column("Ø Alter", justify="right") table.add_column("\u00d8 Alter", justify="right")
table.add_column("Ältestes Repo", justify="left") table.add_column("\u00c4ltestes Repo", justify="left")
for cat in config.categories: for category in catalog.categories:
if cat.is_archive: if category.config.is_archive:
continue continue
count, total_size, avg_age, oldest = summarize_category(cat, base)
repos = category.repos
count = len(repos)
total_size = category.total_size_mb()
if not repos:
avg_age = None
oldest = None
else:
ages = [repo.age_days for repo in repos]
avg_age = sum(ages) // len(ages)
oldest_repo = max(repos, key=lambda r: r.age_days)
oldest = (oldest_repo.name, oldest_repo.age_days)
table.add_row( table.add_row(
cat.name, category.config.name,
str(count), str(count),
f"{total_size:.1f} MB", f"{total_size:.1f} MB",
f"{avg_age or ''} d", f"{avg_age or ''} d",