[openwrt/openwrt] base-files: add update_alternatives function

LEDE Commits lede-commits at lists.infradead.org
Fri May 17 13:22:44 PDT 2024


aparcar pushed a commit to openwrt/openwrt.git, branch main:
https://git.openwrt.org/3010ab87bc5eb4278a8d550c7ad576836fbbbdf9

commit 3010ab87bc5eb4278a8d550c7ad576836fbbbdf9
Author: Paul Spooren <mail at aparcar.org>
AuthorDate: Fri May 3 17:53:52 2024 +0200

    base-files: add update_alternatives function
    
    The APK package manager does not support handling of package
    alternatives itself, so implement it via a simple shell script.
    
    Signed-off-by: Paul Spooren <mail at aparcar.org>
---
 package/base-files/files/lib/functions.sh | 49 +++++++++++++++++++++++++++++++
 1 file changed, 49 insertions(+)

diff --git a/package/base-files/files/lib/functions.sh b/package/base-files/files/lib/functions.sh
index 82ee58f642..1126a93e88 100644
--- a/package/base-files/files/lib/functions.sh
+++ b/package/base-files/files/lib/functions.sh
@@ -286,6 +286,55 @@ add_group_and_user() {
 	fi
 }
 
+update_alternatives() {
+	local root="${IPKG_INSTROOT}"
+	local action="$1"
+	local pkgname="$2"
+
+	if [ -f "$root/lib/apk/packages/${pkgname}.alternatives" ]; then
+		for pkg_alt in $(cat $root/lib/apk/packages/${pkgname}.alternatives); do
+			local best_prio=0;
+			local best_src="/bin/busybox";
+			pkg_prio=${pkg_alt%%:*};
+			pkg_target=${pkg_alt#*:};
+			pkg_target=${pkg_target%:*};
+			pkg_src=${pkg_alt##*:};
+
+			if [ -e "$root/$target" ]; then
+				for alts in $root/lib/apk/packages/*.alternatives; do
+					for alt in $(cat $alts); do
+						prio=${alt%%:*};
+						target=${alt#*:};
+						target=${target%:*};
+						src=${alt##*:};
+
+						if [ "$target" = "$pkg_target" ] &&
+						   [ "$src" != "$pkg_src" ] &&
+						   [ "$best_prio" -lt "$prio" ]; then
+							best_prio=$prio;
+							best_src=$src;
+						fi
+					done
+				done
+			fi
+			case "$action" in
+				install)
+					if [ "$best_prio" -lt "$pkg_prio" ]; then
+						ln -sf "$pkg_src" "$root/$pkg_target"
+						echo "add alternative: $pkg_target -> $pkg_src"
+					fi
+				;;
+				remove)
+					if [ "$best_prio" -lt "$pkg_prio" ]; then
+						ln -sf "$best_src" "$root/$pkg_target"
+						echo "add alternative: $pkg_target -> $best_src"
+					fi
+				;;
+			esac
+		done
+	fi
+}
+
 default_postinst() {
 	local root="${IPKG_INSTROOT}"
 	local pkgname="$(basename ${1%.*})"




More information about the lede-commits mailing list