aboutsummaryrefslogtreecommitdiffstats
path: root/.extras/test-build
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-07-13 10:33:50 +0200
committerDanilo M. <danix@danix.xyz>2026-07-13 10:33:50 +0200
commit5d1fb3ab2e027176dfd29e6bcc69d606aa550c2b (patch)
treee564663957d18d4bee00cfb7f9496ac61b1bb687 /.extras/test-build
parent368023455770538ad0f7568ee83cf4cef0a4eabc (diff)
downloadsbo-slackbuilds-5d1fb3ab2e027176dfd29e6bcc69d606aa550c2b.tar.gz
sbo-slackbuilds-5d1fb3ab2e027176dfd29e6bcc69d606aa550c2b.zip
test-build: port dep cache, namespaced by image digest
Diffstat (limited to '.extras/test-build')
-rwxr-xr-x.extras/test-build86
1 files changed, 86 insertions, 0 deletions
diff --git a/.extras/test-build b/.extras/test-build
index a7e796e..1f7920c 100755
--- a/.extras/test-build
+++ b/.extras/test-build
@@ -286,6 +286,92 @@ apply_overrides_to_order() {
RESOLVED_ORDER=("${keep[@]:-}")
}
+# =============================================================================
+# Dependency cache. Layout: $CACHE_ROOT/<cat>/<prog>/<prog>-<ver>-...txz where
+# CACHE_ROOT = $PKG_CACHE/<image-digest> (set per run by resolve_cache_root).
+# Key is prog+version. --no-cache (USE_CACHE=0) or empty PKG_CACHE disables.
+# =============================================================================
+CACHE_ROOT="" # set by resolve_cache_root once the image digest is known
+
+# True when the cache is usable this run.
+_cache_on() { [[ $USE_CACHE -eq 1 && -n "$PKG_CACHE" && -n "$CACHE_ROOT" ]]; }
+
+_cache_ver_of() {
+ local prog="$1" base="$2"
+ base="${base#"$prog"-}"
+ echo "${base%%-*}"
+}
+
+# cache_decision <cat> <prog> <version> -> cached | bump:OLD:NEW | new
+cache_decision() {
+ local cat="$1" prog="$2" version="$3"
+ _cache_on || { echo new; return; }
+ local dir="$CACHE_ROOT/$cat/$prog"
+ local f newest=""
+ for f in "$dir/$prog"-*.t?z; do
+ [[ -e "$f" ]] || continue
+ [[ -z "$newest" || "$f" -nt "$newest" ]] && newest="$f"
+ done
+ [[ -z "$newest" ]] && { echo new; return; }
+ local have; have="$(_cache_ver_of "$prog" "$(basename "$newest")")"
+ if [[ "$have" == "$version" ]]; then echo cached; else echo "bump:$have:$version"; fi
+}
+
+cache_path() {
+ local cat="$1" prog="$2" version="$3"
+ _cache_on || return
+ local dir="$CACHE_ROOT/$cat/$prog"
+ local f newest=""
+ for f in "$dir/$prog"-*.t?z; do
+ [[ -e "$f" ]] || continue
+ [[ -z "$newest" || "$f" -nt "$newest" ]] && newest="$f"
+ done
+ [[ -z "$newest" ]] && return
+ [[ "$(_cache_ver_of "$prog" "$(basename "$newest")")" == "$version" ]] && echo "$newest"
+}
+
+cache_store() {
+ local cat="$1" prog="$2" src="$3"
+ _cache_on || return
+ local dir="$CACHE_ROOT/$cat/$prog"
+ mkdir -p "$dir"
+ rm -f "$dir"/*.t?z
+ cp -a "$src" "$dir/"
+}
+
+cache_label() {
+ local dir="$1" is_target="$2"
+ local cat prog ver dec
+ cat="$(category_of "$dir")"; prog="$(basename "$dir")"; ver="$(version_of "$dir")"
+ dec="$(cache_decision "$cat" "$prog" "$ver")"
+ local label
+ case "$dec" in
+ cached) label="cached ($ver)" ;;
+ bump:*) label="rebuild: ${dec#bump:}"; label="${label/:/ -> }" ;;
+ *) label="build (new)" ;;
+ esac
+ if [[ "$is_target" == "1" ]]; then
+ case "$dec" in
+ cached) label="build (cached $ver, rebuilt as target)" ;;
+ esac
+ echo "target, $label"
+ else
+ echo "$label"
+ fi
+}
+
+# Compute CACHE_ROOT from the image's digest. Falls back to the tag if the
+# digest cannot be read (still isolates per image reference).
+resolve_cache_root() {
+ [[ -z "$PKG_CACHE" ]] && { CACHE_ROOT=""; return; }
+ local digest
+ digest="$(docker image inspect --format '{{index .Id}}' "$ACTIVE_IMAGE" 2>/dev/null)"
+ [[ -z "$digest" ]] && digest="tag-${ACTIVE_IMAGE//[^a-zA-Z0-9._-]/_}"
+ digest="${digest//[^a-zA-Z0-9._-]/_}"
+ CACHE_ROOT="$PKG_CACHE/$digest"
+ mkdir -p "$CACHE_ROOT"
+}
+
main() {
parse_args "$@"
init_color