commit ef80e348d2ebdfe39e4a6a5addda6f8942c40bb0 Author: Vivian Elisabeth H <36878099+SparkleDEV@users.noreply.github.com> Date: Fri Jan 23 14:43:45 2026 +0100 well diff --git a/dort.sh b/dort.sh new file mode 100755 index 0000000..5bd6c1c --- /dev/null +++ b/dort.sh @@ -0,0 +1,243 @@ +#!/usr/bin/env bash + +set -e + +## Environment variables +CONFIG_FILE=./dort.yaml +DOTS_DIR=$(pwd) + +## Fail if running as sudo +if [[ "$EUID" -eq 0 ]]; then + echo "Don't run this script directly as root (you will be prompted for your sudo password once because installing things from the AUR is weird)" + exit 1 +fi + +## Keep sudo alive +echo "This script keeps sudo active in the background for yay/paru, be aware of that, don't randomly trust me and check the source code" +sudo -v || exit 1 + +while true; do + sudo -n true + sleep 60 + kill -0 "$$" || exit +done 2>/dev/null & + +############### +## Functions ## +############### + +install_packages() { + local pkg_str=$* + case $package_manager in + "pacman") + sudo pacman -S --noconfirm --needed $pkg_str || exit 1 + ;; + "paru") + paru -S --noconfirm --needed $pkg_str || exit 1 + ;; + "yay") + yay -S --noconfirm --needed $pkg_str || exit 1 + ;; + esac +} + +check_and_install_dependencies() { + local deps=(yq gum stow) + + local all_installed=true + + for program in "${deps[@]}"; do + if ! command -v "$program" &>/dev/null; then + all_installed=false + break + fi + done + + if [[ "$all_installed" == false ]]; then + while true; do + read -r -p "Required dependencies (${deps[*]}) for dort are not installed, do you want to install them now? [y/n] " yn + case $yn in + [Yy]*) + break + ;; + [Nn]*) + echo "Exiting dort..." + exit 1 + ;; + esac + done + fi + + install_packages "${deps[@]}" +} + +setup_aur_helper() { + AUR=$(yq -r '.dort.aur' "$CONFIG_FILE") + case $AUR in + "paru") + if ! command -v paru &>/dev/null; then + install_packages base-devel git + + local temp_dir=$(mktemp -d) + git clone https://aur.archlinux.org/paru-bin.git "$temp_dir"/paru + cd "$temp_dir"/paru + + makepkg -si --noconfirm + fi + + cd "$DOTS_DIR" + package_manager=paru + ;; + "yay") + if ! command -v yay &>/dev/null; then + install_packages base-devel git + + local temp_dir=$(mktemp -d) + git clone https://aur.archlinux.org/yay-bin.git "$temp_dir"/yay + cd "$temp_dir"/yay + + makepkg -si --noconfirm + fi + + cd "$DOTS_DIR" + package_manager=yay + ;; + *) + package_manager=pacman + ;; + esac +} + +load_categories_from_config() { + local dort_cats="$(yq -r '.configs | keys[]' "$CONFIG_FILE")" + readarray -d $'\n' -t categories <<<"$dort_cats" +} + +load_current_profiles() { + local profiles_arr=() + local dort_cats="$(yq -r ".configs.$1 | keys[]" "$CONFIG_FILE")" + readarray -d $'\n' -t profiles_arr <<<"$dort_cats" + + for profile in "${profiles_arr[@]}"; do + if [ "$profile" == "category" ]; then + continue + fi + local display_name="$(yq -r ".configs.$1.$profile.display" "$CONFIG_FILE")" + current_profiles[$display_name]="$profile" + done +} + +select_profiles_in_category() { + mapfile -t selected < <(gum choose --header "$1" "$([[ "$2" == "false" ]] && printf "%s" '--no-limit')" "${!current_profiles[@]}") + + for p in "${selected[@]}"; do + if [[ "$p" != "" && "$p" != "%" ]]; then + selected_profiles+=(".configs.$category.${current_profiles["$p"]}") + fi + done + + unset selected +} + +apply_profiles() { + local packages_to_install=() + local stow_dirs=() + local set_environs=() + + local systemd_enable=() + local systemd_user_enable=() + local systemd_wants=() + local systemd_user_wants=() + local systemd_disable=() + local systemd_user_disable=() + + local run_lines=() + + for p in "${selected_profiles[@]}"; do + mapfile -t profile_pkgs < <(yq -r "$p.packages | values []" "$CONFIG_FILE") + mapfile -t profile_stows < <(yq -r "$p.stow | values []" "$CONFIG_FILE") + mapfile -t profile_env < <(yq -r "$p.environment | values []" "$CONFIG_FILE") + mapfile -t profile_sysd_enable < <(yq -r "$p.systemd.enable | values []" "$CONFIG_FILE") + mapfile -t profile_sysd_user_enable < <(yq -r "$p.systemd.user.enable | values []" "$CONFIG_FILE") + mapfile -t profile_sysd_wants < <(yq -r "$p.systemd.wants | values []" "$CONFIG_FILE") + mapfile -t profile_sysd_user_wants < <(yq -r "$p.systemd.user.wants | values []" "$CONFIG_FILE") + mapfile -t profile_sysd_disable < <(yq -r "$p.systemd.disable | values []" "$CONFIG_FILE") + mapfile -t profile_sysd_user_disable < <(yq -r "$p.systemd.user.disable | values []" "$CONFIG_FILE") + mapfile -t profile_run_lines < <(yq -r "$p.run | values[]" "$CONFIG_FILE") + + packages_to_install+=("${profile_pkgs[@]}") + stow_dirs+=("${profile_stows[@]}") + set_environs+=("${profile_env[@]}") + systemd_enable+=("${profile_sysd_enable[@]}") + systemd_user_enable+=("${profile_sysd_user_enable[@]}") + systemd_wants+=("${profile_sysd_wants[@]}") + systemd_user_wants+=("${profile_sysd_user_wants[@]}") + systemd_disable+=("${profile_sysd_disable[@]}") + systemd_user_disable+=("${profile_sysd_user_disable[@]}") + run_lines+=("${profile_run_lines[@]}") + + unset profile_pkgs + unset profile_stows + unset profile_env + unset profile_sysd_enable + unset profile_sysd_user_enable + unset profile_sysd_wants + unset profile_sysd_user_wants + unset profile_sysd_disable + unset profile_sysd_user_disable + unset profile_run_lines + done + + install_packages "${packages_to_install[@]}" + stow "${stow_dirs[@]}" --adopt + mkdir -p "$HOME"/.config/environment.d + echo "$( + IFS=$'\n' + echo "${set_environs[*]}" + )" >"$HOME"/.config/environment.d/90-dort.conf + + if ((${#systemd_enable[@]} != 0)); then + sudo systemctl enable "${systemd_enable[@]}" + fi + if ((${#systemd_user_enable[@]} != 0)); then + systemctl enable --user "${systemd_user_enable[@]}" + fi + if ((${#systemd_disable[@]} != 0)); then + sudo systemctl disable "${systemd_disable[@]}" + fi + if ((${#systemd_user_disable[@]} != 0)); then + systemctl disable --user "${systemd_user_disable[@]}" + fi + if ((${#systemd_wants[@]} != 0)); then + sudo systemctl add-wants "${systemd_wants[@]}" + fi + if ((${#systemd_user_wants[@]} != 0)); then + systemctl add-wants --user "${systemd_user_wants[@]}" + fi + + for run_cmd in "${run_lines[@]}"; do + eval "$run_cmd" + done +} + +main() { + local package_manager="pacman" + local categories=() + local selected_profiles=() + + check_and_install_dependencies + setup_aur_helper + + load_categories_from_config + + for category in "${categories[@]}"; do + declare -A current_profiles + load_current_profiles "$category" + select_profiles_in_category "Header text" "false" + unset current_profiles + done + + apply_profiles +} + +main diff --git a/dort.yaml b/dort.yaml new file mode 100644 index 0000000..4879631 --- /dev/null +++ b/dort.yaml @@ -0,0 +1,88 @@ +version: 1 +dort: + aur: paru + stow: true + stow_force: true +configs: + desktop: + category: + display: "Desktop" + exclusive: true + niri: + display: "Niri" + packages: + - "niri" + - "nautilus" + - "gnome-keyring" + - "brightnessctl" + - "cava" + - "candy-icons-git" + - "power-profiles-daemon" + - "qt6ct-kde" + - "xdg-desktop-portal-gnome" + - "xdg-desktop-portal-gtk" + - "xdg-desktop-portal-wlr" + - "quickshell-git" + - "cliphist" + - "wl-clipboard" + - "dgop" + - "matugen-bin" + - "qt6-multimedia" + - "dms-shell-bin" + - "xwayland-satellite" + - "ly" + - "noto-fonts-emoji" + stow: + - "niri" + - "qt6ct" + environment: + - "QT_QPA_PLATFORMTHEME=qt6ct" + systemd: + enable: + - "ly@tty1" + user: + enable: + - "dms" + wants: + - "niri.service dms" + - "niri.service gnome-keyring-daemon.service" + run: + - "xdg-mime default org.gnome.nautilus.desktop inode/directory" + plasma: + display: "KDE Plasma" + packages: + - "plasma" + - "kde-applications" + systemd: + enable: + - "sddm" + tools: + category: + display: "Tools" + exclusive: false + zsh: + display: "Terminal Shell (ZSH)" + packages: + - "fastfetch" + - "hyfetch" + - "neovim" + - "zsh" + - "eza" + - "fzf" + - "tealdeer" + - "ttf-sourcecodepro-nerd" + - "vim" + - "wl-clipboard" + - "zoxide" + - "reflector" + - "inetutils" + - "imagemagick" + - "tree" + stow: + - "zsh" + - "fastfetch" + - "hyfetch" + - "nvim" + run: + - "tldr --update" + - 'sudo chsh -s /bin/zsh "$USER"'