base-files: add update_alternatives function
authorPaul Spooren <mail@aparcar.org>
Fri, 3 May 2024 15:53:52 +0000 (17:53 +0200)
committerPaul Spooren <mail@aparcar.org>
Fri, 17 May 2024 20:21:26 +0000 (23:21 +0300)
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@aparcar.org>
package/base-files/files/lib/functions.sh

index 82ee58f6425ed23ff195e69a034c47b8b17cbb5f..1126a93e889745d25960518fe2977b63fdaf6831 100644 (file)
@@ -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%.*})"