This commit is contained in:
2026-01-23 14:43:45 +01:00
commit ef80e348d2
2 changed files with 331 additions and 0 deletions

243
dort.sh Executable file
View File

@@ -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

88
dort.yaml Normal file
View File

@@ -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"'