## The sysroot: a plain directory tree of unpacked Alpine packages, plus a ## manifest of what was installed so `list` and re-runs are cheap. import std/[algorithm, os, sequtils, strutils] import ./index const manifestPath* = ".muslkit/installed.tsv" type Installed* = object name*, version*, repo*: string proc manifestFile*(sysroot: string): string = sysroot / manifestPath proc readManifest*(sysroot: string): seq[Installed] = let path = manifestFile(sysroot) if not fileExists(path): return for line in readFile(path).splitLines: if line.len == 0 or line.startsWith("#"): continue let f = line.split('\t') if f.len >= 3: result.add Installed(name: f[0], version: f[1], repo: f[2]) proc writeManifest*(sysroot: string, entries: seq[Installed]) = createDir manifestFile(sysroot).parentDir var lines = @["# name\tversion\trepo — written by muslkit"] for e in entries.sortedByIt(it.name): lines.add e.name & "\t" & e.version & "\t" & e.repo writeFile(manifestFile(sysroot), lines.join("\n") & "\n") proc record*(sysroot: string, pkgs: openArray[Pkg]) = ## Merge freshly installed packages into the manifest, newest version winning. var entries = readManifest(sysroot) for pkg in pkgs: entries.keepItIf(it.name != pkg.name) entries.add Installed(name: pkg.name, version: pkg.version, repo: pkg.repo) writeManifest(sysroot, entries) proc installed*(sysroot, name: string): bool = readManifest(sysroot).anyIt(it.name == name) proc staticLibs*(sysroot: string): seq[string] = ## Every .a in the sysroot, as absolute paths. for dir in ["usr/lib", "lib", "usr/lib64"]: let d = sysroot / dir if dirExists(d): for path in walkFiles(d / "*.a"): result.add path result.sort()