aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-07-13 10:26:01 +0200
committerDanilo M. <danix@danix.xyz>2026-07-13 10:26:01 +0200
commit368023455770538ad0f7568ee83cf4cef0a4eabc (patch)
treee2c5adabee31da3333666b176b33ffc106644906
parentb8281632a92d3b85db0beab8f43022180000720d (diff)
downloadsbo-slackbuilds-368023455770538ad0f7568ee83cf4cef0a4eabc.tar.gz
sbo-slackbuilds-368023455770538ad0f7568ee83cf4cef0a4eabc.zip
test-build: current-vs-stable override engine
-rw-r--r--.extras/overrides.example13
-rwxr-xr-x.extras/test-build60
-rw-r--r--.extras/test-logic.sh37
3 files changed, 110 insertions, 0 deletions
diff --git a/.extras/overrides.example b/.extras/overrides.example
new file mode 100644
index 0000000..706d6ea
--- /dev/null
+++ b/.extras/overrides.example
@@ -0,0 +1,13 @@
+# current-vs-stable dep overrides for test-build.
+# Copy to ~/.config/sbo-testbuild/overrides and edit. Applied only when
+# targeting -current (15.0 is the SBo baseline). One rule per line.
+#
+# drop: <prog> dep is in 15.0 but already in the -current base
+# rename: <old> -> <new> dep was renamed on -current
+# fetch: <prog> dep was removed from the -current tree; pull via sbopkg
+#
+# Start light: add rules only when a real package needs them.
+
+# drop: rust
+# rename: python3-foo -> foo
+# fetch: somelib
diff --git a/.extras/test-build b/.extras/test-build
index fa24fa6..a7e796e 100755
--- a/.extras/test-build
+++ b/.extras/test-build
@@ -178,6 +178,7 @@ declare -A UNMET=()
declare -a CYCLES=()
declare -A HAS_README=()
declare -A _vstate=()
+declare -A FETCH_DEPS=() # prog -> 1: resolve via sbopkg in-container
# Is a prog already present in the container base? Overridden at build time to
# consult the image; in resolution we treat "in base" as a callback so the pure
@@ -203,6 +204,11 @@ _resolve_visit() {
HAS_README["$dir"]=1
continue
fi
+ tok="$(apply_rename "$tok")"
+ if [[ "${OV_FETCH[$tok]:-}" == "1" ]]; then
+ FETCH_DEPS["$tok"]=1
+ continue
+ fi
if depdir="$(find_slackbuild_dir "$tok")"; then
_resolve_visit "$depdir" "$key" || rc=1
elif installed_in_base "$tok"; then
@@ -223,15 +229,69 @@ resolve_target() {
RESOLVED_ORDER=()
CYCLES=()
UNMET=()
+ FETCH_DEPS=()
_vstate=()
_resolve_visit "$dir" "(top)"
}
+# =============================================================================
+# current-vs-stable overrides. Parsed from $TB_OVERRIDES. Applied only when
+# targeting -current (15.0 is the SBo baseline, no deltas).
+# =============================================================================
+declare -A OV_DROP=() # prog -> 1
+declare -A OV_RENAME=() # old -> new
+declare -A OV_FETCH=() # prog -> 1
+
+load_overrides() {
+ OV_DROP=(); OV_RENAME=(); OV_FETCH=()
+ # 15.0 is the baseline: no overrides.
+ [[ "$VERSION_ID" == "15.0" ]] && return
+ [[ -f "$TB_OVERRIDES" ]] || return
+ local line kind rest
+ while IFS= read -r line; do
+ line="${line%%#*}" # strip comments
+ line="${line#"${line%%[![:space:]]*}"}" # ltrim
+ [[ -z "$line" ]] && continue
+ kind="${line%%:*}"; rest="${line#*:}"
+ kind="${kind//[[:space:]]/}"
+ rest="${rest#"${rest%%[![:space:]]*}"}" # ltrim value
+ case "$kind" in
+ drop) OV_DROP["${rest//[[:space:]]/}"]=1 ;;
+ fetch) OV_FETCH["${rest//[[:space:]]/}"]=1 ;;
+ rename)
+ # rest is "old -> new"
+ local old new
+ old="${rest%%->*}"; new="${rest##*->}"
+ old="${old//[[:space:]]/}"; new="${new//[[:space:]]/}"
+ [[ -n "$old" && -n "$new" ]] && OV_RENAME["$old"]="$new" ;;
+ *) echo "WARN: unknown override rule: $line" >&2 ;;
+ esac
+ done < "$TB_OVERRIDES"
+}
+
+# Map a dep token through rename rules (identity if no rule).
+apply_rename() {
+ local tok="$1"
+ echo "${OV_RENAME[$tok]:-$tok}"
+}
+
+# Remove dropped packages from RESOLVED_ORDER in place.
+apply_overrides_to_order() {
+ local d prog keep=()
+ for d in "${RESOLVED_ORDER[@]}"; do
+ prog="$(basename "$d")"
+ [[ "${OV_DROP[$prog]:-}" == "1" ]] && continue
+ keep+=("$d")
+ done
+ RESOLVED_ORDER=("${keep[@]:-}")
+}
+
main() {
parse_args "$@"
init_color
require_config
SBO_TREE_ROOTS=("$ACTIVE_TREE")
+ load_overrides
}
main "$@"
diff --git a/.extras/test-logic.sh b/.extras/test-logic.sh
index 027fdb9..e48586e 100644
--- a/.extras/test-logic.sh
+++ b/.extras/test-logic.sh
@@ -70,6 +70,43 @@ resolve_target "$T/cat/d"
resolve_target "$T/cat/e"
[[ ${#CYCLES[@]} -ge 1 ]] && ok "cycle caught" || bad "cycle missed"
+# --- overrides --------------------------------------------------------------
+VERSION_ID="current" # reset: left at 15.0 by the version-selection checks above
+OV=$(mktemp)
+cat > "$OV" <<'EOF'
+# comment ignored
+drop: dropme
+rename: oldname -> newname
+fetch: fetchme
+EOF
+TB_OVERRIDES="$OV"
+load_overrides
+
+[[ "${OV_DROP[dropme]:-}" == "1" ]] && ok "override drop parsed" || bad "drop not parsed"
+[[ "${OV_RENAME[oldname]:-}" == "newname" ]] && ok "override rename parsed" || bad "rename not parsed"
+[[ "${OV_FETCH[fetchme]:-}" == "1" ]] && ok "override fetch parsed" || bad "fetch not parsed"
+
+# rename maps a token
+[[ "$(apply_rename oldname)" == "newname" ]] && ok "apply_rename maps" || bad "apply_rename wrong: [$(apply_rename oldname)]"
+[[ "$(apply_rename untouched)" == "untouched" ]] && ok "apply_rename passthrough" || bad "apply_rename mangled untouched"
+
+# drop filters the order (build a fake order of dirs; dropme is removed)
+mk dropme ""
+mk keepme ""
+RESOLVED_ORDER=("$T/cat/dropme" "$T/cat/keepme")
+apply_overrides_to_order
+kept=""; for x in "${RESOLVED_ORDER[@]}"; do kept+="$(basename "$x") "; done
+kept="${kept% }"
+[[ "$kept" == "keepme" ]] && ok "drop removes from order" || bad "drop failed, order=[$kept]"
+rm -f "$OV"
+
+# overrides only apply on current; on 15.0 they are a no-op
+VERSION_ID="15.0"
+TB_OVERRIDES="$OV" # file gone; must not error, must clear maps
+load_overrides
+[[ ${#OV_DROP[@]} -eq 0 ]] && ok "overrides inert on 15.0" || bad "overrides applied on 15.0"
+VERSION_ID="current"
+
echo
echo "$pass passed, $fail failed"
[[ $fail -eq 0 ]] || exit 1