Add extra folder with dependency resolver scripts. Eventually this will cover several distributions, but for now Arch only.
This commit is contained in:
Executable
+229
@@ -0,0 +1,229 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Keep select menus one item per line for screen readers.
|
||||||
|
export COLUMNS=1
|
||||||
|
|
||||||
|
missingRequired=()
|
||||||
|
installPlan=()
|
||||||
|
|
||||||
|
add_missing_package() {
|
||||||
|
local package="$1"
|
||||||
|
local existing
|
||||||
|
|
||||||
|
for existing in "${missingRequired[@]}"; do
|
||||||
|
[[ "$existing" == "$package" ]] && return
|
||||||
|
done
|
||||||
|
missingRequired+=("$package")
|
||||||
|
}
|
||||||
|
|
||||||
|
add_install_package() {
|
||||||
|
local package="$1"
|
||||||
|
local existing
|
||||||
|
|
||||||
|
for existing in "${installPlan[@]}"; do
|
||||||
|
[[ "$existing" == "$package" ]] && return
|
||||||
|
done
|
||||||
|
installPlan+=("$package")
|
||||||
|
}
|
||||||
|
|
||||||
|
command_exists() {
|
||||||
|
command -v "$1" &> /dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
python_import_works() {
|
||||||
|
local code="$1"
|
||||||
|
|
||||||
|
command_exists python3 && python3 -c "$code" &> /dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
has_any_command() {
|
||||||
|
local commandName
|
||||||
|
|
||||||
|
for commandName in "$@"; do
|
||||||
|
if command_exists "$commandName"; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
prompt_install() {
|
||||||
|
local prompt="$1"
|
||||||
|
shift
|
||||||
|
local packages=("$@")
|
||||||
|
local choice
|
||||||
|
|
||||||
|
printf '%s\n' "$prompt"
|
||||||
|
printf 'Packages: %s\n' "${packages[*]}"
|
||||||
|
PS3="Select an option: "
|
||||||
|
select choice in "Yes" "Exit installer"; do
|
||||||
|
case "$choice" in
|
||||||
|
"Yes")
|
||||||
|
for package in "${packages[@]}"; do
|
||||||
|
add_install_package "$package"
|
||||||
|
done
|
||||||
|
return
|
||||||
|
;;
|
||||||
|
"Exit installer")
|
||||||
|
echo "Exiting without installing packages."
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Please choose 1 or 2."
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
install_packages() {
|
||||||
|
if command_exists yay; then
|
||||||
|
yay -S --needed "$@"
|
||||||
|
else
|
||||||
|
sudo pacman -S --needed "$@"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
prompt_install_choice() {
|
||||||
|
local prompt="$1"
|
||||||
|
shift
|
||||||
|
local choice
|
||||||
|
local index
|
||||||
|
local reply
|
||||||
|
local options=("Skip" "$@" "Exit installer")
|
||||||
|
local packages
|
||||||
|
|
||||||
|
printf '%s\n' "$prompt"
|
||||||
|
while true; do
|
||||||
|
for index in "${!options[@]}"; do
|
||||||
|
printf '%d) %s\n' "$((index + 1))" "${options[$index]}"
|
||||||
|
done
|
||||||
|
read -r -p "Select a package to install [1]: " reply
|
||||||
|
if [[ -z "$reply" ]]; then
|
||||||
|
reply=1
|
||||||
|
fi
|
||||||
|
if [[ ! "$reply" =~ ^[0-9]+$ ]] || (( reply < 1 || reply > ${#options[@]} )); then
|
||||||
|
echo "Please choose a listed option."
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
choice="${options[$((reply - 1))]}"
|
||||||
|
case "$choice" in
|
||||||
|
"Skip")
|
||||||
|
return
|
||||||
|
;;
|
||||||
|
"Exit installer")
|
||||||
|
echo "Exiting without installing packages."
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
read -r -a packages <<< "$choice"
|
||||||
|
for package in "${packages[@]}"; do
|
||||||
|
add_install_package "$package"
|
||||||
|
done
|
||||||
|
return
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
check_required_dependencies() {
|
||||||
|
command_exists dialog || add_missing_package dialog
|
||||||
|
command_exists i3 || add_missing_package i3-wm
|
||||||
|
command_exists jq || add_missing_package jq
|
||||||
|
command_exists python3 || add_missing_package python
|
||||||
|
command_exists rsync || add_missing_package rsync
|
||||||
|
command_exists yad || add_missing_package yad
|
||||||
|
command_exists xdotool || add_missing_package xdotool
|
||||||
|
command_exists xdg-open || add_missing_package xdg-utils
|
||||||
|
|
||||||
|
if ! python_import_works 'import i3ipc'; then
|
||||||
|
add_missing_package python-i3ipc
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! python_import_works 'import gi; gi.require_version("Atk", "1.0"); gi.require_version("Gdk", "3.0"); gi.require_version("Gio", "2.0"); gi.require_version("GLib", "2.0"); gi.require_version("Gtk", "3.0"); from gi.repository import Atk, Gdk, Gio, GLib, Gtk'; then
|
||||||
|
add_missing_package python-gobject
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command_exists pandoc && ! command_exists markdown; then
|
||||||
|
add_missing_package discount
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
check_provider_dependencies() {
|
||||||
|
local emailChoices=(thunderbird evolution)
|
||||||
|
local browserChoices=(firefox chromium epiphany midori seamonkey vivaldi)
|
||||||
|
local screenReaderChoices=(orca)
|
||||||
|
|
||||||
|
if command_exists yay; then
|
||||||
|
emailChoices+=(betterbird)
|
||||||
|
browserChoices+=(brave-bin)
|
||||||
|
screenReaderChoices+=(cthulhu)
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! has_any_command betterbird evolution thunderbird; then
|
||||||
|
prompt_install_choice "Missing email client. Select one to install." "${emailChoices[@]}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! has_any_command brave chromium epiphany firefox google-chrome-stable google-chrome-unstable microsoft-edge-stable microsoft-edge-beta microsoft-edge-dev midori seamonkey vivaldi; then
|
||||||
|
prompt_install_choice "Missing web browser. Select one to install." "${browserChoices[@]}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! has_any_command emacs geany gedit kate kwrite l3afpad leafpad libreoffice mousepad pluma; then
|
||||||
|
prompt_install_choice "Missing graphical text editor. Select one to install." geany gedit kate kwrite l3afpad leafpad libreoffice-fresh mousepad pluma
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! has_any_command caja nemo nautilus pcmanfm pcmanfm-qt thunar; then
|
||||||
|
prompt_install_choice "Missing file manager. Select one to install." pcmanfm thunar caja nemo nautilus pcmanfm-qt
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! has_any_command mate-terminal lxterminal gnome-terminal terminator xfce4-terminal tilix ptyxis kgx sakura roxterm termit guake tilda qterminal konsole && { ! command_exists xterm || ! command_exists fenrir; }; then
|
||||||
|
prompt_install_choice "Missing supported accessible terminal. Select one to install." mate-terminal lxterminal gnome-terminal terminator xfce4-terminal tilix ptyxis kgx sakura qterminal konsole "xterm fenrir"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! has_any_command cthulhu orca; then
|
||||||
|
prompt_install_choice "Missing screen reader. Select one to install." "${screenReaderChoices[@]}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
add_optional_dependencies() {
|
||||||
|
command_exists bc || add_install_package bc
|
||||||
|
command_exists notify-send || add_install_package libnotify
|
||||||
|
command_exists pamixer || add_install_package pamixer
|
||||||
|
command_exists playerctl || add_install_package playerctl
|
||||||
|
command_exists scrot || add_install_package scrot
|
||||||
|
command_exists sox || add_install_package sox
|
||||||
|
command_exists udiskie || add_install_package udiskie
|
||||||
|
command_exists xclip || add_install_package xclip
|
||||||
|
command_exists xprintidle || add_install_package xprintidle
|
||||||
|
command_exists xset || add_install_package xorg-xset
|
||||||
|
|
||||||
|
echo "Skipping optional packages that need manual choice or are intentionally not installed automatically:"
|
||||||
|
echo " dex"
|
||||||
|
echo " tesseract"
|
||||||
|
echo " xzoom"
|
||||||
|
}
|
||||||
|
|
||||||
|
if ! command_exists pacman && ! command_exists yay; then
|
||||||
|
echo "This helper is for Arch Linux systems with pacman or yay."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
check_required_dependencies
|
||||||
|
|
||||||
|
if [[ ${#missingRequired[@]} -gt 0 ]]; then
|
||||||
|
prompt_install "Missing required I38 dependencies. Add them to the install list?" "${missingRequired[@]}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
check_provider_dependencies
|
||||||
|
add_optional_dependencies
|
||||||
|
|
||||||
|
if [[ ${#installPlan[@]} -gt 0 ]]; then
|
||||||
|
echo "Installing selected packages:"
|
||||||
|
printf ' %s\n' "${installPlan[@]}"
|
||||||
|
install_packages "${installPlan[@]}"
|
||||||
|
else
|
||||||
|
echo "No packages selected for installation."
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "I38 dependency check complete."
|
||||||
Reference in New Issue
Block a user