From ccf96a52298fe8dff5801975dc3020ad70701a97 Mon Sep 17 00:00:00 2001 From: gabry Date: Sat, 9 May 2026 16:16:27 +0200 Subject: [PATCH] i hope i fixed db and dependency shit --- build.py | 27 ++++++++++++++++----------- fempkg | 17 +++++++++-------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/build.py b/build.py index b26dd36..7e6c979 100644 --- a/build.py +++ b/build.py @@ -23,6 +23,7 @@ from utils import download_extract, version_satisfies, PKG_DIR, _ensure_symlink, from tqdm import tqdm # --- basic dirs --- +GLOBAL_INSTALLED = set() TMP_RECIPE_DIR = "/tmp/fempkg" os.makedirs(TMP_RECIPE_DIR, exist_ok=True) @@ -70,10 +71,8 @@ def rebuild_package(packages, repo_dir=None): if isinstance(packages, str): packages = [packages] - db = load_db() # <-- load db once - for pkg in packages: - if pkg not in db["installed"]: + if pkg not in load_db()["installed"]: print(f"[fempkg] Skipping rebuild of {pkg}: not installed.") continue @@ -137,16 +136,22 @@ def build_package(recipe_file, repo_dir=None, force_rebuild=False, _visited=None if _visited is None: _visited = set() # track packages in current build chain - db = load_db() recipe = {} with open(recipe_file, "r") as f: exec(f.read(), recipe) name, version = recipe["pkgname"], recipe["pkgver"] + global GLOBAL_INSTALLED + + if name in GLOBAL_INSTALLED: + return + + GLOBAL_INSTALLED.add(name) + # Prevent infinite recursion from dependency loops if name in _visited: - print(f"[fempkg] Detected circular dependency on {name}, skipping...") + print(f"[fempkg] Something went wrong please report it! (circular dependency)") return _visited.add(name) @@ -159,7 +164,7 @@ def build_package(recipe_file, repo_dir=None, force_rebuild=False, _visited=None source_only = os.environ.get("FEMPKG_SOURCE", "").lower() in ("1", "true", "yes") nodelete_env = os.environ.get("FEMPKG_NODELETE", "").lower() in ("1", "true", "yes") - if not force_rebuild and is_installed(name, version, db=db): + if not force_rebuild and is_installed(name, version): print(f"[fempkg] {name}-{version} is already installed. Skipping installation.") return @@ -177,7 +182,7 @@ def build_package(recipe_file, repo_dir=None, force_rebuild=False, _visited=None with open(dep_recipe, "r") as f: exec(f.read(), dep_info) dep_latest_ver = dep_info["pkgver"] - installed_ver = db["installed"].get(dep_name) + installed_ver = load_db()["installed"].get(dep_name) if installed_ver is None or not version_satisfies(installed_ver, dep_latest_ver): print(f"Installing/updating dependency {dep_name} " f"(installed: {installed_ver}, latest: {dep_latest_ver})") @@ -233,7 +238,7 @@ def build_package(recipe_file, repo_dir=None, force_rebuild=False, _visited=None else: print(f"[fempkg] No manifest available to snapshot for {name} {version}.") - old_installed_version = db["installed"].get(name) + old_installed_version = load_db()["installed"].get(name) if old_installed_version and (not atomic_upgrade) and (not nodelete_env): old_versioned_path = os.path.join(VERSIONED_MANIFEST_DIR, f"{name}-{old_installed_version}.txt") if os.path.exists(old_versioned_path): @@ -277,7 +282,7 @@ def build_package(recipe_file, repo_dir=None, force_rebuild=False, _visited=None print(f"[fempkg] Extracting binary package to / : {local_path}") extract_tar_zst_with_progress(local_path, dest="/") - register_package(name, version, db=db) + register_package(name, version) print(f"[fempkg] Installed {name}-{version} from binary package.") os.system(f"rm -rf {local_path} {asc_path}") @@ -323,7 +328,7 @@ def build_package(recipe_file, repo_dir=None, force_rebuild=False, _visited=None print(f"> {cmd}") subprocess.run(f". /etc/profile && mkdir -p /tmp/fempkg && {cmd}", shell=True, check=True) - register_package(name, version, db=db) + register_package(name, version) try: resolved_manifest = fetch_manifest(name, pkgver=version) if resolved_manifest: @@ -331,7 +336,7 @@ def build_package(recipe_file, repo_dir=None, force_rebuild=False, _visited=None versioned_path = os.path.join(VERSIONED_MANIFEST_DIR, f"{name}-{version}.txt") shutil.copy(resolved_manifest, versioned_path) shutil.copy(versioned_path, os.path.join(MANIFEST_CACHE_DIR, f"{name}.txt")) - old_installed_version = db["installed"].get(name) + old_installed_version = load_db()["installed"].get(name) if old_installed_version and old_installed_version != version: remove_versioned_manifest(name, old_installed_version) except Exception as e: diff --git a/fempkg b/fempkg index 64be537..9a2e587 100755 --- a/fempkg +++ b/fempkg @@ -18,12 +18,13 @@ import sys, os from db import register_package, load_db, save_db from build import build_package, fetch_recipe, MANIFEST_CACHE_DIR from utils import fetch_all +import shutil RECIPE_CACHE_DIR = "/var/lib/fempkg/repo" def list_installed(): - db = load_db() - for pkg, ver in db["installed"].items(): + + for pkg, ver in load_db()["installed"].items(): print(f"{pkg}-{ver}") def update_all(): @@ -31,7 +32,7 @@ def update_all(): print("Recipe, manifest and the binpkg index cache updated.") def upgrade_packages(pkg=None): - db = load_db() + if pkg: recipe_file = os.path.join(RECIPE_CACHE_DIR, f"{pkg}.recipe.py") if not os.path.exists(recipe_file): @@ -39,7 +40,7 @@ def upgrade_packages(pkg=None): return build_package(recipe_file) else: - for pkgname in db["installed"]: + for pkgname in load_db()["installed"]: recipe_file = os.path.join(RECIPE_CACHE_DIR, f"{pkgname}.recipe.py") if not os.path.exists(recipe_file): print(f"Recipe for {pkgname} missing, skipping.") @@ -79,10 +80,10 @@ def uninstall_package(pkgname): print(f"Failed to remove manifest {manifest_path}: {e}") # Remove from DB - db = load_db() - if pkgname in db["installed"]: - db["installed"].pop(pkgname) - save_db(db) + + if pkgname in load_db()["installed"]: + load_db()["installed"].pop(pkgname) + save_db(load_db()) print(f"{pkgname} uninstalled.")