From c6ebfdd85ffd8f384be1244d9c81846a123c01b9 Mon Sep 17 00:00:00 2001
From: Marty Oehme <marty.oehme@gmail.com>
Date: Fri, 24 Jan 2025 11:26:51 +0100
Subject: [PATCH] bootstrap: Add uv managed package category

Added python packages that should be installed through uv (instead of
pipx). uv provides a modern package and project management solution for
python packages which are not found in the other repositories (or which
should have additional dependencies which are not).

Will also slowly migrate my existing python packages away from pipx
toward uv so we need one tool less.
---
 bootstrap/install_packages.sh | 56 +++++++++++++++++++++++++++++++----
 1 file changed, 50 insertions(+), 6 deletions(-)

diff --git a/bootstrap/install_packages.sh b/bootstrap/install_packages.sh
index 66ac563..a7383fd 100755
--- a/bootstrap/install_packages.sh
+++ b/bootstrap/install_packages.sh
@@ -11,6 +11,7 @@ PKG_TSV_FILE=${PKG_TSV_FILE:-bootstrap/packages_stable.tsv}
 packages_repo="${BOOTSTRAP_PACKAGES:-$(grep -e '	R	' "$PKG_TSV_FILE" | cut -f1 -d'	')}"
 packages_aur="${BOOTSTRAP_PACKAGES_AUR:-$(grep -e '	A	' "$PKG_TSV_FILE" | cut -f1 -d'	')}"
 packages_pipx="${BOOTSTRAP_PACKAGES_PIPX:-$(grep -e '	P	' "$PKG_TSV_FILE" | cut -f1,5 -d'	')}"
+packages_uv="${BOOTSTRAP_PACKAGES_PIPX:-$(grep -e '	U	' "$PKG_TSV_FILE" | cut -f1,5 -d'	')}"
 
 main() {
     local cmd=""
@@ -18,7 +19,7 @@ main() {
 
     case "$1" in
     -v | --version)
-        printf "Package bootstrap script.\n\n©Marty Oehme\n\nVersion: 0.3\n"
+        printf "Package bootstrap script.\n\n©Marty Oehme\n\nVersion: 0.4\n"
         ;;
     -h | --help)
         printf "Usage: install [-f|--force][-v|--version][-h|--help]\n\n-f     Do not ask for any confirmations but force update and installation.\n"
@@ -72,6 +73,14 @@ install_packages() {
     fi
 }
 
+# check if any packages in list
+has_pkg() { # 1=variable containing packages
+    if [ -n "$1" ]; then
+        return 0
+    fi
+    return 1
+}
+
 install_pipx() {
     if type pipx >/dev/null 2>&1; then
         echo "Existing pipx installation found .........................................."
@@ -84,6 +93,18 @@ install_pipx() {
     fi
 }
 
+install_uv() {
+    if type uv >/dev/null 2>&1; then
+        echo "Existing uv installation found .........................................."
+        return
+    fi
+    if "$unattended"; then
+        paru -S --noconfirm uv
+    else
+        paru -S uv
+    fi
+}
+
 install_pipx_pkgs() {
     while IFS= read -r line; do
         if [ -z "$line" ]; then return; fi
@@ -97,6 +118,20 @@ install_pipx_pkgs() {
     done <<<"$packages_pipx"
 }
 
+install_uv_pkgs() {
+    while IFS= read -r line; do
+        if [ -z "$line" ]; then return; fi
+        prog=$(echo "$line" | cut -f1 -d'	')
+        injections=$(echo "$line" | cut -f2 -d'	')
+
+        cmd_with_args="uv tool install"
+        for inject_args in ${injections//,/ }; do
+            cmd_with_args+=" --with $inject_args"
+        done
+        $cmd_with_args "$prog"
+    done <<<"$packages_uv"
+}
+
 install() {
     unattended=$1
     echo "Beginning package bootstrap ..............................................."
@@ -105,11 +140,20 @@ install() {
     echo "Installing apps ..........................................................."
     update_repos "$unattended"
     install_packages "$unattended"
-    echo "Done ......................................................................"
-    echo "Installing pipx ..........................................................."
-    install_pipx
-    echo "Installing pipx packages .................................................."
-    install_pipx_pkgs
+
+    if has_pkg "$packages_pipx"; then
+        echo "Installing pipx ..........................................................."
+        install_pipx
+        echo "Installing pipx packages .................................................."
+        install_pipx_pkgs
+    fi
+
+    if has_pkg "$packages_uv"; then
+        echo "Installing uv ..........................................................."
+        install_uv
+        echo "Installing uv packages .................................................."
+        install_uv_pkgs
+    fi
     echo "Done ......................................................................"
 }