Merge branch 'main' into hypr-caelestia

This commit is contained in:
2026-09-23 21:52:27 +02:00
30 changed files with 400 additions and 493 deletions
+1
View File
@@ -12,3 +12,4 @@ lazy-lock.json
fish_variables fish_variables
term/.config/opencode/cli.json term/.config/opencode/cli.json
term/.config/opencode/service.json term/.config/opencode/service.json
hypr/.config/hypr/scheme/current.lua
+2 -2
View File
@@ -15,7 +15,7 @@ Only entries that would be missed without explicit help are included.
| Task | Command | Why it matters | | Task | Command | Why it matters |
|------|---------|----------------| |------|---------|----------------|
| **Install required programs** | `bash term/setup.sh` <br>`bash _install_skripte/install_basic_pcks.sh` <br>`bash hypr/setup.sh` <br>`bash _install_skripte/install_kreation_pcks.sh` | These scripts install Neovim, hyprland, VST runtime, and other utilities. Edit `term/packages.txt` to add/remove terminal packages. | | **Install required programs** | `bash setup/term/setup.sh` <br>`bash setup/basic/setup.sh` <br>`bash setup/hypr/setup.sh` <br>`bash setup/kreation/setup.sh` | These scripts install Neovim, hyprland, VST runtime, and other utilities. Edit `setup/term/packages.txt` to add/remove terminal packages. |
| **Link configuration directories** | `ln -s ~/.dotfiles/hypr/.config/hypr ~/.config/hypr` <br>`ln -s ~/.dotfiles/term/.config/nvim ~/.config/nvim` | The repository expects the configs to live in `~/.config`. | | **Link configuration directories** | `ln -s ~/.dotfiles/hypr/.config/hypr ~/.config/hypr` <br>`ln -s ~/.dotfiles/term/.config/nvim ~/.config/nvim` | The repository expects the configs to live in `~/.config`. |
| **Add VST plugin** | Copy `kreation/.vst3/MT-PowerDrumKit.vst3` into your DAW’s plugins folder (usually `~/.vst`). | The repo contains a pre‑built VST for use in audio software. | | **Add VST plugin** | Copy `kreation/.vst3/MT-PowerDrumKit.vst3` into your DAW’s plugins folder (usually `~/.vst`). | The repo contains a pre‑built VST for use in audio software. |
@@ -26,7 +26,7 @@ Only entries that would be missed without explicit help are included.
| Item | Detail | | Item | Detail |
|------|--------| |------|--------|
| **Wayland compositor** | Requires `hyprland` (and dependencies like `wlroots`). The script `hypr/setup.sh` installs it from `hypr/packages.txt`. | | **Wayland compositor** | Requires `hyprland` (and dependencies like `wlroots`). The script `setup/hypr/setup.sh` installs it from `setup/hypr/packages.txt`. |
| **MIME defaults** | Run `bash hypr/.config/hypr/scripts/ensure-env.sh` after installing to set environment variables (`$XDG_DATA_HOME`, etc.). | | **MIME defaults** | Run `bash hypr/.config/hypr/scripts/ensure-env.sh` after installing to set environment variables (`$XDG_DATA_HOME`, etc.). |
| **Dolphin file associations** | `bash hypr/.config/hypr/scripts/fix_dolphin_file_associations.sh` must be executed once to register the compositor with KDE. | | **Dolphin file associations** | `bash hypr/.config/hypr/scripts/fix_dolphin_file_associations.sh` must be executed once to register the compositor with KDE. |
| **Portal host override** | `bash hypr/.config/hypr/scripts/portal-host-override.sh` fixes Wayland portal issues on some distros. | | **Portal host override** | `bash hypr/.config/hypr/scripts/portal-host-override.sh` fixes Wayland portal issues on some distros. |
+10 -10
View File
@@ -6,27 +6,27 @@
# Zweige abhaengen. Die uebrigen Ziele haengen nur von basic ab und sind # Zweige abhaengen. Die uebrigen Ziele haengen nur von basic ab und sind
# untereinander unabhaengig. # untereinander unabhaengig.
basic: basic:
bash basic/setup.sh bash setup/basic/setup.sh
stow --ignore='.stow-ignore' --ignore='scripts' --ignore='setup.sh' --ignore='packages.txt' basic stow basic
term: basic term: basic
bash term/scripts/setup.sh bash setup/term/setup.sh
stow --ignore='.stow-ignore' --ignore='scripts' --ignore='\.config/tmux/plugins' term stow term
utils: basic utils: basic
bash utils/setup.sh bash setup/utils/setup.sh
bash _install_skripte/nextcloud.sh bash setup/nextcloud.sh
hypr: basic hypr: basic
bash hypr/scripts/setup.sh bash setup/hypr/setup.sh
stow --ignore='.stow-ignore' --ignore='scripts' hypr stow hypr
kreation: basic kreation: basic
bash _install_skripte/install_kreation_pcks.sh bash setup/kreation/setup.sh
stow kreation stow kreation
buntes-monster: hypr kreation buntes-monster: hypr kreation
_install_skripte/buntes-monster-links.sh bash setup/buntes-monster-links.sh
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Testing (see README.md "Testing" and test/ for details) # Testing (see README.md "Testing" and test/ for details)
+8 -8
View File
@@ -11,7 +11,7 @@ Personal configuration files for an Arch Linux workstation (Hyprland + Neovim +
| `hypr/` | Hyprland compositor config + Noctalia shell config (Catppuccin Mocha) | | `hypr/` | Hyprland compositor config + Noctalia shell config (Catppuccin Mocha) |
| `kreation/`| VST plugin (`MT-PowerDrumKit.vst3`) | | `kreation/`| VST plugin (`MT-PowerDrumKit.vst3`) |
| `local_ai/`| Local AI / MCP tooling config | | `local_ai/`| Local AI / MCP tooling config |
| `_install_skripte/` | Miscellaneous install helper scripts | | `setup/` | Install/setup scripts + package lists (one subdir per target, shared helpers in `setup/lib/`; not stowed) |
| `test/` | Docker test harness (lint + smoke tests) | | `test/` | Docker test harness (lint + smoke tests) |
Each top-level directory is a **stow package**. `stow` symlinks the files from the repository into your home directory (e.g. `term/.config/...` → `~/.config/...`). Each top-level directory is a **stow package**. `stow` symlinks the files from the repository into your home directory (e.g. `term/.config/...` → `~/.config/...`).
@@ -43,8 +43,8 @@ Run `make <target>` from the repository root. Each target first runs the relevan
| Target | What it does | | Target | What it does |
|--------|--------------| |--------|--------------|
| `make term` | Runs `term/setup.sh` (installs terminal packages, sets fish as default shell, clones tmuxifier), then `stow term`. Pulls in `basic`. | | `make term` | Runs `setup/term/setup.sh` (installs terminal packages, sets fish as default shell, clones tmuxifier), then `stow term`. Pulls in `basic`. |
| `make basic` | Runs `basic/setup.sh`: enables multilib, updates the system, installs `yay` if missing, installs the `basic/packages.txt` packages, and sets up Docker (enables/starts the service, adds your user to the `docker` group, verifies the service) | | `make basic` | Runs `setup/basic/setup.sh`: enables multilib, updates the system, installs `yay` if missing, installs the `setup/basic/packages.txt` packages, and sets up Docker (enables/starts the service, adds your user to the `docker` group, verifies the service) |
| `make hypr` | `make basic`, installs Hyprland packages, stows `hypr`, runs the Hyprland setup scripts (`ensure-env.sh`, `portal-host-override.sh`, `fix_dolphin_file_associations.sh`) | | `make hypr` | `make basic`, installs Hyprland packages, stows `hypr`, runs the Hyprland setup scripts (`ensure-env.sh`, `portal-host-override.sh`, `fix_dolphin_file_associations.sh`) |
| `make kreation` | `make basic`, installs VST runtime, stows `kreation` | | `make kreation` | `make basic`, installs VST runtime, stows `kreation` |
| `make buntes-monster` | Everything (`basic` + `hypr` + `kreation`), then wires up symlinks | | `make buntes-monster` | Everything (`basic` + `hypr` + `kreation`), then wires up symlinks |
@@ -54,7 +54,7 @@ Run `make <target>` from the repository root. Each target first runs the relevan
The terminal package list lives in a single editable file: The terminal package list lives in a single editable file:
``` ```
term/packages.txt setup/term/packages.txt
``` ```
Add/remove packages on separate lines. Lines starting with `#` are ignored, and you can switch between package sources with section markers: Add/remove packages on separate lines. Lines starting with `#` are ignored, and you can switch between package sources with section markers:
@@ -65,12 +65,12 @@ Add/remove packages on separate lines. Lines starting with `#` are ignored, and
@npm # install via npm -g @npm # install via npm -g
``` ```
The default section is `@pacman`. The AUR helper `yay` is bootstrapped automatically by `basic/setup.sh`. The default section is `@pacman`. The AUR helper `yay` is bootstrapped automatically by `setup/basic/setup.sh`.
## What the install scripts do ## What the install scripts do
- **`basic/setup.sh`** – enables multilib, updates the system (`pacman -Syu`), ensures `yay` is installed, reads `basic/packages.txt` and installs all packages with `--needed` (skips already-installed ones), and sets up Docker (`sudo systemctl enable --now docker`, adds the current user to the `docker` group, checks the service). Idempotent and safe to re-run. - **`setup/basic/setup.sh`** – enables multilib, updates the system (`pacman -Syu`), ensures `yay` is installed, reads `setup/basic/packages.txt` and installs all packages with `--needed` (skips already-installed ones), and sets up Docker (`sudo systemctl enable --now docker`, adds the current user to the `docker` group, checks the service). Idempotent and safe to re-run.
- **`term/setup.sh`** – reads `term/packages.txt` and installs all packages (pacman/AUR via `yay --needed`, npm via `sudo npm install -g`), sets `fish` as the default shell (`chsh`), clones `tmuxifier`, adds the `git` yazi plugin (skips if already present), and runs `sudo updatedb`. Idempotent and safe to re-run. - **`setup/term/setup.sh`** – reads `setup/term/packages.txt` and installs all packages (pacman/AUR via `yay --needed`, npm via `sudo npm install -g`), sets `fish` as the default shell (`chsh`), clones `tmuxifier`, adds the `git` yazi plugin (skips if already present), and runs `sudo updatedb`. Idempotent and safe to re-run.
## Stow: resolving conflicts with existing paths ## Stow: resolving conflicts with existing paths
@@ -138,7 +138,7 @@ There are **two tiers**:
| Target | What it does | Docker required? | | Target | What it does | Docker required? |
|--------|--------------|------------------| |--------|--------------|------------------|
| `make test-lint` | Fast, offline integrity checks: `bash -n` syntax pass over every script, `shellcheck` (if installed), `packages.txt` marker validation, and Makefile ↔ script/stow-package name consistency. Catches typos like `_install_skripte_install_basic_pcks.sh` (missing `/`). | No | | `make test-lint` | Fast, offline integrity checks: `bash -n` syntax pass over every script, `shellcheck` (if installed), `packages.txt` marker validation, and Makefile ↔ script/stow-package name consistency. Catches typos like `setup/basic/setuo.sh` (missing `/`). | No |
| `make test-stow` | `stow --simulate` for every stow-able package; fails if a package the Makefile stows doesn't exist (e.g. `stow nvim` — nvim lives under `term/`). | No | | `make test-stow` | `stow --simulate` for every stow-able package; fails if a package the Makefile stows doesn't exist (e.g. `stow nvim` — nvim lives under `term/`). | No |
| `make test-shellcheck` | Runs shellcheck over all tracked scripts (shellcheck must be installed). | No | | `make test-shellcheck` | Runs shellcheck over all tracked scripts (shellcheck must be installed). | No |
| `make test-lint-docker` | Builds the `/dev` stage (`archlinux:latest` + shellcheck) and runs `test/lint.sh` inside it. | Yes | | `make test-lint-docker` | Builds the `/dev` stage (`archlinux:latest` + shellcheck) and runs `test/lint.sh` inside it. | Yes |
-16
View File
@@ -1,16 +0,0 @@
#!/bin/bash
sudo pacman -S --needed \
reaper \
guitarix \
kdenlive \
yabridge \
yabridgectl \
obs-studio \
surge-xt \
lsp-plugins \
calf \
dragonfly-reverb
yay -S --needed \
numaplayer
@@ -1,6 +1,6 @@
# Central theme: catppuccin-mocha (Catppuccin Mocha), hyprland $vars. # Central theme: catppuccin-mocha (Catppuccin Mocha), hyprland $vars.
# Part of basic/.config/themes. Managed file: refresh via # Part of basic/.config/themes. Managed file: refresh via
# basic/scripts/fetch-ports.sh # setup/fetch-ports.sh
# (upstream: catppuccin/hyprland generated mocha.conf). # (upstream: catppuccin/hyprland generated mocha.conf).
# Hyprland consumers load it via: source = ~/.config/themes/current/hypr.conf # Hyprland consumers load it via: source = ~/.config/themes/current/hypr.conf
@@ -1,6 +1,6 @@
# Central theme: catppuccin-mocha (Catppuccin Mocha), kitty colors. # Central theme: catppuccin-mocha (Catppuccin Mocha), kitty colors.
# Part of basic/.config/themes. Managed file: refresh via # Part of basic/.config/themes. Managed file: refresh via
# basic/scripts/fetch-ports.sh # setup/fetch-ports.sh
# (upstream: catppuccin/kitty themes/mocha.conf). # (upstream: catppuccin/kitty themes/mocha.conf).
# vim:ft=kitty # vim:ft=kitty
-4
View File
@@ -1,4 +0,0 @@
setup.sh
packages.txt
scripts
.stow-ignore
-150
View File
@@ -1,150 +0,0 @@
#!/bin/bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PACKAGES_FILE="$SCRIPT_DIR/packages.txt"
# ---------------------------------------------------------------------------
# Enable multilib in /etc/pacman.conf (with a safety backup)
# ---------------------------------------------------------------------------
enable_multilib() {
sudo sed -i.bak '/^#\[multilib\]/,+1 s/^#//' /etc/pacman.conf
}
# ---------------------------------------------------------------------------
# Ensure yay (AUR helper) is installed.
# ---------------------------------------------------------------------------
install_yay() {
if pacman -Q yay &>/dev/null; then
echo "yay bereits installiert; fahre fort."
return
fi
if pacman -Si yay &>/dev/null; then
echo "Installiere yay mit pacman ..."
sudo pacman -S --needed yay
return
fi
echo "installiere yay via git ..."
sudo pacman -S --needed base-devel git
local tmp
tmp="$(mktemp -d)"
git clone https://aur.archlinux.org/yay.git "$tmp/yay"
(
cd "$tmp/yay"
makepkg -si
)
rm -rf "$tmp"
}
# ---------------------------------------------------------------------------
# Read packages.txt, split into pacman / aur / npm sections.
# ---------------------------------------------------------------------------
read_packages() {
local section="pacman"
local current
current=""
while IFS= read -r line || [[ -n "$line" ]]; do
current="${line%%#*}"
current="${current##*( )}"
current="${current%%*( )}"
[[ -z "$current" ]] && continue
case "$current" in
@pacman) section="pacman" ;;
@aur) section="aur" ;;
@npm) section="npm" ;;
*)
case "$section" in
pacman) pacman_pkgs+=("$current") ;;
aur) aur_pkgs+=("$current") ;;
npm) npm_pkgs+=("$current") ;;
esac
;;
esac
done < "$PACKAGES_FILE"
}
declare -a pacman_pkgs=() aur_pkgs=() npm_pkgs=()
# ---------------------------------------------------------------------------
# Install sections.
# ---------------------------------------------------------------------------
install_pacman() {
if ((${#pacman_pkgs[@]})); then
echo "==> Installiere Pacman-Pakete: ${pacman_pkgs[*]}"
yay -S --needed "${pacman_pkgs[@]}"
fi
}
install_aur() {
if ((${#aur_pkgs[@]})); then
echo "==> Installiere AUR-Pakete: ${aur_pkgs[*]}"
yay -S --needed "${aur_pkgs[@]}"
fi
}
install_npm() {
if ((${#npm_pkgs[@]})); then
echo "==> Installiere globale npm-Pakete: ${npm_pkgs[*]}"
npm install -g "${npm_pkgs[@]}"
fi
}
# ---------------------------------------------------------------------------
# Docker: Dienst aktivieren/starten, Benutzer in die docker-Gruppe aufnehmen
# und den Dienst verifizieren. (docker selbst wird ueber basic/packages.txt
# als Pacman-Paket installiert.)
# ---------------------------------------------------------------------------
setup_docker() {
if ! command -v docker >/dev/null 2>&1; then
echo "Warnung: docker nicht installiert; ueberspringe Docker-Setup."
return
fi
echo "==> Aktiviere und starte Docker-Dienst ..."
sudo systemctl enable --now docker
# Bei Aufruf via `sudo <script>` ist SUDO_USER der eigentliche Benutzer.
local target_user="${SUDO_USER:-$USER}"
echo "==> Stelle sicher, dass $target_user in der docker-Gruppe ist ..."
if [[ "$target_user" == "root" ]] || id -nG "$target_user" 2>/dev/null | grep -qw docker; then
echo "Benutzer $target_user ist bereits in der docker-Gruppe."
else
sudo usermod -aG docker "$target_user"
echo "Benutzer $target_user zur docker-Gruppe hinzugefuegt; wirksam nach dem naechsten Login."
fi
echo "==> Pruefe Docker-Dienst ..."
if systemctl is-active --quiet docker; then
echo "Docker-Dienst laeuft (Socket: /var/run/docker.sock)."
else
echo "Warnung: Docker-Dienst laeuft nicht; pruefe mit: systemctl status docker"
fi
}
# ---------------------------------------------------------------------------
# Main
# ---------------------------------------------------------------------------
main() {
echo "==> Aktiviere multilib ..."
enable_multilib
echo "==> System aktualisieren ..."
sudo pacman -Syu
echo "==> Sicherstelle yay ..."
install_yay
echo "==> Lese Paketliste: $PACKAGES_FILE"
read_packages
install_pacman
install_aur
install_npm
echo "==> Richte Docker ein ..."
setup_docker
echo "Fertig. Die Basis-Systemumgebung ist eingerichtet."
}
main
-2
View File
@@ -1,2 +0,0 @@
scripts
.stow-ignore
-92
View File
@@ -1,92 +0,0 @@
#!/bin/bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PACKAGES_FILE="$SCRIPT_DIR/packages.txt"
# ---------------------------------------------------------------------------
# Read packages.txt, split into pacman / aur / npm sections.
# ---------------------------------------------------------------------------
read_packages() {
local section="pacman"
local current
current=""
while IFS= read -r line || [[ -n "$line" ]]; do
current="${line%%#*}"
current="${current##*( )}"
current="${current%%*( )}"
[[ -z "$current" ]] && continue
case "$current" in
@pacman) section="pacman" ;;
@aur) section="aur" ;;
@npm) section="npm" ;;
*)
case "$section" in
pacman) pacman_pkgs+=("$current") ;;
aur) aur_pkgs+=("$current") ;;
npm) npm_pkgs+=("$current") ;;
esac
;;
esac
done < "$PACKAGES_FILE"
}
declare -a pacman_pkgs=() aur_pkgs=() npm_pkgs=()
# ---------------------------------------------------------------------------
# Install sections.
# ---------------------------------------------------------------------------
install_pacman() {
if ((${#pacman_pkgs[@]})); then
echo "==> Installiere Pacman-Pakete: ${pacman_pkgs[*]}"
yay -S --needed "${pacman_pkgs[@]}"
fi
}
install_aur() {
if ((${#aur_pkgs[@]})); then
echo "==> Installiere AUR-Pakete: ${aur_pkgs[*]}"
yay -S --needed "${aur_pkgs[@]}"
fi
}
install_npm() {
if ((${#npm_pkgs[@]})); then
echo "==> Installiere globale npm-Pakete: ${npm_pkgs[*]}"
npm install -g "${npm_pkgs[@]}"
fi
}
# ---------------------------------------------------------------------------
# Post-install: run Hyprland environment & desktop integration scripts.
# ---------------------------------------------------------------------------
run_hypr_scripts() {
local scripts_dir="$SCRIPT_DIR/../.config/hypr/scripts"
echo "==> Fuehre ensure-env.sh aus ..."
bash "$scripts_dir/ensure-env.sh"
echo "==> Fuehre portal-host-override.sh aus ..."
bash "$scripts_dir/portal-host-override.sh"
echo "==> Fuehre fix_dolphin_file_associations.sh aus ..."
bash "$scripts_dir/fix_dolphin_file_associations.sh"
}
# ---------------------------------------------------------------------------
# Main
# ---------------------------------------------------------------------------
main() {
echo "==> Lese Paketliste: $PACKAGES_FILE"
read_packages
install_pacman
install_aur
install_npm
run_hypr_scripts
echo "Fertig. Hyprland und das Compositor-Okosystem sind eingerichtet."
}
main
@@ -1,5 +1,5 @@
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# System package list for basic/setup.sh # System package list for setup/basic/setup.sh
# #
# Every other dotfile branch depends on these foundational packages # Every other dotfile branch depends on these foundational packages
# (base system, display manager, audio stack, AUR helper). # (base system, display manager, audio stack, AUR helper).
+68
View File
@@ -0,0 +1,68 @@
#!/bin/bash
set -euo pipefail
SETUP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PACKAGES_FILE="$SETUP_DIR/packages.txt"
# shellcheck source=../lib/common.sh
source "$SETUP_DIR/../lib/common.sh"
# ---------------------------------------------------------------------------
# Docker: Dienst aktivieren/starten, Benutzer in die docker-Gruppe aufnehmen
# und den Dienst verifizieren. (docker selbst wird ueber setup/basic/packages.txt
# als Pacman-Paket installiert.)
# ---------------------------------------------------------------------------
setup_docker() {
if ! command -v docker >/dev/null 2>&1; then
echo "Warnung: docker nicht installiert; ueberspringe Docker-Setup."
return
fi
echo "==> Aktiviere und starte Docker-Dienst ..."
sudo systemctl enable --now docker
# Bei Aufruf via `sudo <script>` ist SUDO_USER der eigentliche Benutzer.
local target_user="${SUDO_USER:-$USER}"
echo "==> Stelle sicher, dass $target_user in der docker-Gruppe ist ..."
if [[ "$target_user" == "root" ]] || id -nG "$target_user" 2>/dev/null | grep -qw docker; then
echo "Benutzer $target_user ist bereits in der docker-Gruppe."
else
sudo usermod -aG docker "$target_user"
echo "Benutzer $target_user zur docker-Gruppe hinzugefuegt; wirksam nach dem naechsten Login."
fi
echo "==> Pruefe Docker-Dienst ..."
if systemctl is-active --quiet docker; then
echo "Docker-Dienst laeuft (Socket: /var/run/docker.sock)."
else
echo "Warnung: Docker-Dienst laeuft nicht; pruefe mit: systemctl status docker"
fi
}
# ---------------------------------------------------------------------------
# Main
# ---------------------------------------------------------------------------
main() {
local -a pacman_pkgs=() aur_pkgs=() npm_pkgs=()
echo "==> Aktiviere multilib ..."
enable_multilib
echo "==> System aktualisieren ..."
sudo pacman -Syu
echo "==> Sicherstelle yay ..."
ensure_yay
echo "==> Lese Paketliste: $PACKAGES_FILE"
read_packages "$PACKAGES_FILE" pacman_pkgs aur_pkgs npm_pkgs
install_all_pkgs pacman_pkgs aur_pkgs npm_pkgs
echo "==> Richte Docker ein ..."
setup_docker
echo "Fertig. Die Basis-Systemumgebung ist eingerichtet."
}
main
@@ -1,11 +1,11 @@
#!/bin/bash #!/bin/bash
# Refresh vendored upstream port files (basic/scripts/fetch-ports.sh). # Refresh vendored upstream port files (setup/fetch-ports.sh).
# #
# This script is intentionally NOT stowed (basic/.stow-ignore) and NOT run # This script lives outside the stow packages (setup/) and is NOT run
# by the test harness: it contacts the network. Run it manually when you # by the test harness: it contacts the network. Run it manually when you
# want to pull newer upstream Catppuccin ports into the central theme: # want to pull newer upstream Catppuccin ports into the central theme:
# #
# bash basic/scripts/fetch-ports.sh # bash setup/fetch-ports.sh
# #
# The central palette (theme.lua / theme.css roles / hypr.conf) remains the # The central palette (theme.lua / theme.css roles / hypr.conf) remains the
# source of truth; after fetching, re-apply the provenance headers and the # source of truth; after fetching, re-apply the provenance headers and the
@@ -14,7 +14,7 @@
set -euo pipefail set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
DEST="$SCRIPT_DIR/../.config/themes/themes/catppuccin-mocha" DEST="$SCRIPT_DIR/../basic/.config/themes/themes/catppuccin-mocha"
# Pinned upstream revisions (bump deliberately, then run this script). # Pinned upstream revisions (bump deliberately, then run this script).
KITTY_PIN="main" KITTY_PIN="main"
@@ -1,5 +1,5 @@
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Hyprland compositor package list for hypr/setup.sh # Hyprland compositor package list for setup/hypr/setup.sh
# #
# Wayland compositor, screenshot tool and supporting utilities. The desktop # Wayland compositor, screenshot tool and supporting utilities. The desktop
# shell (bar, launcher, notifications, lock screen, wallpaper, idle, session # shell (bar, launcher, notifications, lock screen, wallpaper, idle, session
+43
View File
@@ -0,0 +1,43 @@
#!/bin/bash
set -euo pipefail
SETUP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PACKAGES_FILE="$SETUP_DIR/packages.txt"
# shellcheck source=../lib/common.sh
source "$SETUP_DIR/../lib/common.sh"
# ---------------------------------------------------------------------------
# Post-install: run Hyprland environment & desktop integration scripts.
# ---------------------------------------------------------------------------
run_hypr_scripts() {
local scripts_dir
scripts_dir="$(repo_root)/hypr/.config/hypr/scripts"
echo "==> Fuehre ensure-env.sh aus ..."
bash "$scripts_dir/ensure-env.sh"
echo "==> Fuehre portal-host-override.sh aus ..."
bash "$scripts_dir/portal-host-override.sh"
echo "==> Fuehre fix_dolphin_file_associations.sh aus ..."
bash "$scripts_dir/fix_dolphin_file_associations.sh"
}
# ---------------------------------------------------------------------------
# Main
# ---------------------------------------------------------------------------
main() {
local -a pacman_pkgs=() aur_pkgs=() npm_pkgs=()
echo "==> Lese Paketliste: $PACKAGES_FILE"
read_packages "$PACKAGES_FILE" pacman_pkgs aur_pkgs npm_pkgs
install_all_pkgs pacman_pkgs aur_pkgs npm_pkgs
run_hypr_scripts
echo "Fertig. Hyprland und das Compositor-Okosystem sind eingerichtet."
}
main
+24
View File
@@ -0,0 +1,24 @@
# ---------------------------------------------------------------------------
# Kreation package list for setup/kreation/setup.sh
#
# DAW, video and audio-plugin runtime.
#
# - Lines starting with '#' and blank lines are ignored.
# - Use "@pacman", "@aur" or "@npm" markers to switch section.
# - The default section is @pacman.
# ---------------------------------------------------------------------------
@pacman
reaper
guitarix
kdenlive
yabridge
yabridgectl
obs-studio
surge-xt
lsp-plugins
calf
dragonfly-reverb
@aur
numaplayer
+24
View File
@@ -0,0 +1,24 @@
#!/bin/bash
set -euo pipefail
SETUP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PACKAGES_FILE="$SETUP_DIR/packages.txt"
# shellcheck source=../lib/common.sh
source "$SETUP_DIR/../lib/common.sh"
# ---------------------------------------------------------------------------
# Main
# ---------------------------------------------------------------------------
main() {
local -a pacman_pkgs=() aur_pkgs=() npm_pkgs=()
echo "==> Lese Paketliste: $PACKAGES_FILE"
read_packages "$PACKAGES_FILE" pacman_pkgs aur_pkgs npm_pkgs
install_all_pkgs pacman_pkgs aur_pkgs npm_pkgs
echo "Fertig. Kreation-Pakete (DAW, Video, Plugins) sind eingerichtet."
}
main
+124
View File
@@ -0,0 +1,124 @@
#!/bin/bash
# setup/lib/common.sh
#
# Shared helpers for the setup/install scripts under setup/.
# Source this file; do not execute it directly:
#
# SETUP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# # shellcheck source=../lib/common.sh
# source "$SETUP_DIR/../lib/common.sh"
#
# Conventions:
# - The caller owns `set -euo pipefail` and PACKAGES_FILE.
# - Package lists use @pacman (default) / @aur / @npm section markers;
# '#' starts a comment, blank lines are ignored.
# - Set NPM_USE_SUDO=1 before calling install_npm_pkgs when the global
# npm root is root-owned (Arch installs npm to /usr/lib/node_modules).
# Print the repository root (setup/lib/ -> repo root).
repo_root() {
cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd
}
log() {
echo "==> $*"
}
# ---------------------------------------------------------------------------
# Read a packages.txt file, split into pacman / aur / npm sections.
# Usage: read_packages <file> <pacman_array> <aur_array> <npm_array>
# ---------------------------------------------------------------------------
read_packages() {
local file="$1" pacman_ref="$2" aur_ref="$3" npm_ref="$4"
local section="pacman"
local line current
local -n _pacman="$pacman_ref" _aur="$aur_ref" _npm="$npm_ref"
while IFS= read -r line || [[ -n "$line" ]]; do
current="${line%%#*}"
current="${current##*( )}"
current="${current%%*( )}"
[[ -z "$current" ]] && continue
case "$current" in
@pacman) section="pacman" ;;
@aur) section="aur" ;;
@npm) section="npm" ;;
*)
case "$section" in
pacman) _pacman+=("$current") ;;
aur) _aur+=("$current") ;;
npm) _npm+=("$current") ;;
esac
;;
esac
done < "$file"
}
# ---------------------------------------------------------------------------
# Install sections (arrays passed by nameref).
# ---------------------------------------------------------------------------
install_pacman_pkgs() {
local -n _pkgs="$1"
if ((${#_pkgs[@]})); then
log "Installiere Pacman-Pakete: ${_pkgs[*]}"
yay -S --needed "${_pkgs[@]}"
fi
}
install_aur_pkgs() {
local -n _pkgs="$1"
if ((${#_pkgs[@]})); then
log "Installiere AUR-Pakete: ${_pkgs[*]}"
yay -S --needed "${_pkgs[@]}"
fi
}
install_npm_pkgs() {
local -n _pkgs="$1"
if ((${#_pkgs[@]})); then
log "Installiere globale npm-Pakete: ${_pkgs[*]}"
if [[ "${NPM_USE_SUDO:-0}" == "1" ]]; then
sudo npm install -g "${_pkgs[@]}"
else
npm install -g "${_pkgs[@]}"
fi
fi
}
# Install all three sections at once.
install_all_pkgs() {
install_pacman_pkgs "$1"
install_aur_pkgs "$2"
install_npm_pkgs "$3"
}
# ---------------------------------------------------------------------------
# Enable multilib in /etc/pacman.conf (with a safety backup).
# ---------------------------------------------------------------------------
enable_multilib() {
sudo sed -i.bak '/^#\[multilib\]/,+1 s/^#//' /etc/pacman.conf
}
# ---------------------------------------------------------------------------
# Ensure yay (AUR helper) is installed.
# ---------------------------------------------------------------------------
ensure_yay() {
if pacman -Q yay &>/dev/null; then
echo "yay bereits installiert; fahre fort."
return
fi
if pacman -Si yay &>/dev/null; then
echo "Installiere yay mit pacman ..."
sudo pacman -S --needed yay
return
fi
echo "installiere yay via git ..."
sudo pacman -S --needed base-devel git
local tmp
tmp="$(mktemp -d)"
git clone https://aur.archlinux.org/yay.git "$tmp/yay"
(
cd "$tmp/yay"
makepkg -si
)
rm -rf "$tmp"
}
@@ -1,5 +1,5 @@
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Terminal package list for term/setup.sh # Terminal package list for setup/term/setup.sh
# #
# Maintenance: # Maintenance:
# - Add / remove packages on separate lines. # - Add / remove packages on separate lines.
+12 -60
View File
@@ -1,63 +1,15 @@
#!/bin/bash #!/bin/bash
set -euo pipefail set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SETUP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PACKAGES_FILE="$SCRIPT_DIR/packages.txt" PACKAGES_FILE="$SETUP_DIR/packages.txt"
# --------------------------------------------------------------------------- # shellcheck source=../lib/common.sh
# Read packages.txt, split into pacman / aur / npm sections. source "$SETUP_DIR/../lib/common.sh"
# ---------------------------------------------------------------------------
read_packages() {
local section="pacman"
local current
current=""
while IFS= read -r line || [[ -n "$line" ]]; do
current="${line%%#*}"
current="${current##*( )}"
current="${current%%*( )}"
[[ -z "$current" ]] && continue
case "$current" in
@pacman) section="pacman" ;;
@aur) section="aur" ;;
@npm) section="npm" ;;
*)
case "$section" in
pacman) pacman_pkgs+=("$current") ;;
aur) aur_pkgs+=("$current") ;;
npm) npm_pkgs+=("$current") ;;
esac
;;
esac
done < "$PACKAGES_FILE"
}
declare -a pacman_pkgs=() aur_pkgs=() npm_pkgs=()
# ---------------------------------------------------------------------------
# Install sections.
# ---------------------------------------------------------------------------
install_pacman() {
if ((${#pacman_pkgs[@]})); then
echo "==> Installiere Pacman-Pakete: ${pacman_pkgs[*]}"
yay -S --needed "${pacman_pkgs[@]}"
fi
}
install_aur() {
if ((${#aur_pkgs[@]})); then
echo "==> Installiere AUR-Pakete: ${aur_pkgs[*]}"
yay -S --needed "${aur_pkgs[@]}"
fi
}
install_npm() {
if ((${#npm_pkgs[@]})); then
echo "==> Installiere globale npm-Pakete: ${npm_pkgs[*]}"
# Arch installiert npm nach /usr/lib/node_modules (root-owned), # Arch installiert npm nach /usr/lib/node_modules (root-owned),
# daher braucht der globale Install sudo. # daher braucht der globale Install sudo.
sudo npm install -g "${npm_pkgs[@]}" NPM_USE_SUDO=1
fi
}
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Post-install configuration. # Post-install configuration.
@@ -131,14 +83,14 @@ add_yazi_git_plugin() {
# Main # Main
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
main() { main() {
# Hinweis: multilib, yay und das System-Update werden von local -a pacman_pkgs=() aur_pkgs=() npm_pkgs=()
# basic/setup.sh uebernommen (laeuft vor term im Makefile).
echo "==> Lese Paketliste: $PACKAGES_FILE"
read_packages
install_pacman # Hinweis: multilib, yay und das System-Update werden von
install_aur # setup/basic/setup.sh uebernommen (laeuft vor term im Makefile).
install_npm echo "==> Lese Paketliste: $PACKAGES_FILE"
read_packages "$PACKAGES_FILE" pacman_pkgs aur_pkgs npm_pkgs
install_all_pkgs pacman_pkgs aur_pkgs npm_pkgs
set_fish_default_shell set_fish_default_shell
install_tmuxifier install_tmuxifier
@@ -1,5 +1,5 @@
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Standalone desktop utility package list for utils/setup.sh # Standalone desktop utility package list for setup/utils/setup.sh
# #
# Programs that are not core to every branch, but are expected on a full # Programs that are not core to every branch, but are expected on a full
# desktop: office / web / mail / native-app replacements (Wine), the # desktop: office / web / mail / native-app replacements (Wine), the
+24
View File
@@ -0,0 +1,24 @@
#!/bin/bash
set -euo pipefail
SETUP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PACKAGES_FILE="$SETUP_DIR/packages.txt"
# shellcheck source=../lib/common.sh
source "$SETUP_DIR/../lib/common.sh"
# ---------------------------------------------------------------------------
# Main
# ---------------------------------------------------------------------------
main() {
local -a pacman_pkgs=() aur_pkgs=() npm_pkgs=()
echo "==> Lese Paketliste: $PACKAGES_FILE"
read_packages "$PACKAGES_FILE" pacman_pkgs aur_pkgs npm_pkgs
install_all_pkgs pacman_pkgs aur_pkgs npm_pkgs
echo "Fertig. Standalone Utilities sind eingerichtet."
}
main
@@ -1,3 +1 @@
scripts
.stow-ignore
.config/tmux/plugins .config/tmux/plugins
+29 -40
View File
@@ -10,7 +10,7 @@
# - `stow --simulate` to prove every stow target resolves # - `stow --simulate` to prove every stow target resolves
# 2. REAL SMOKE (guarded by RUN_SMOKE=1) # 2. REAL SMOKE (guarded by RUN_SMOKE=1)
# - resolves every @pacman entry against the repo DB # - resolves every @pacman entry against the repo DB
# - exercises term/setup.sh (pacman + npm) and re-runs it to prove # - exercises setup/term/setup.sh (pacman + npm) and re-runs it to prove
# idempotency # idempotency
# - verifies stow actually creates symlinks into $HOME # - verifies stow actually creates symlinks into $HOME
# AUR + kreation/buntes-monster only run with RUN_FULL=1. # AUR + kreation/buntes-monster only run with RUN_FULL=1.
@@ -78,9 +78,7 @@ done
# 1b. stow --simulate for every package the Makefile stows. # 1b. stow --simulate for every package the Makefile stows.
while IFS= read -r pkg; do while IFS= read -r pkg; do
[[ -z "$pkg" ]] && continue [[ -z "$pkg" ]] && continue
if stow --simulate --ignore='.stow-ignore' --ignore='scripts' \ if stow --simulate --dir="$REPO" --target="$REPO" "$pkg" 2>"$ERR_LOG"; then
--ignore='\.config/tmux/plugins' \
--dir="$REPO" --target="$REPO" "$pkg" 2>"$ERR_LOG"; then
say_ok "stow --simulate $pkg resolves" say_ok "stow --simulate $pkg resolves"
else else
say_fail "stow --simulate $pkg (non-existent package or conflict)" say_fail "stow --simulate $pkg (non-existent package or conflict)"
@@ -141,7 +139,7 @@ NOOP
echo "[stub] chsh $*" echo "[stub] chsh $*"
exit 0 exit 0
NOOP NOOP
# The AUR section is stripped for the smoke, so term/setup.sh only ever # The AUR section is stripped for the smoke, so setup/term/setup.sh only ever
# passes repo packages (+ npm) here; route yay through pacman directly. # passes repo packages (+ npm) here; route yay through pacman directly.
# --noconfirm is needed because the container isn't interactive. # --noconfirm is needed because the container isn't interactive.
cat > "$HOME/bin/yay" <<'NOOP' cat > "$HOME/bin/yay" <<'NOOP'
@@ -154,16 +152,11 @@ NOOP
export PATH="$HOME/bin:$PATH" export PATH="$HOME/bin:$PATH"
# 2c. setup.sh package parsing sanity (mirrors read_packages) for each # 2c. setup.sh package parsing sanity (mirrors read_packages) for each
# package dir: basic/term/utils/hypr. term/ and hypr/ keep their scripts # setup/$d target. All setup scripts + package lists live in setup/
# inside scripts/ so stowing the top-level dir only creates .config/ links. # (outside the stow packages) and share setup/lib/common.sh.
for d in basic term utils hypr; do for d in basic term utils hypr kreation; do
if [[ "$d" == "term" || "$d" == "hypr" ]]; then SETUP_PATH="setup/$d/setup.sh"
SETUP_PATH="$d/scripts/setup.sh" PKG_PATH="setup/$d/packages.txt"
PKG_PATH="$d/scripts/packages.txt"
else
SETUP_PATH="$d/setup.sh"
PKG_PATH="$d/packages.txt"
fi
if ( cd "$REPO" && bash -n "$SETUP_PATH" ); then if ( cd "$REPO" && bash -n "$SETUP_PATH" ); then
say_ok "$SETUP_PATH syntax OK" say_ok "$SETUP_PATH syntax OK"
else else
@@ -189,12 +182,8 @@ NOOP
# AUR-only name (e.g. `rd`) fails here before any install happens. # AUR-only name (e.g. `rd`) fails here before any install happens.
header "package resolvability (@pacman entries)" header "package resolvability (@pacman entries)"
resolv_fail=0 resolv_fail=0
for d in basic term utils hypr; do for d in basic term utils hypr kreation; do
if [[ "$d" == "term" || "$d" == "hypr" ]]; then PKG_PATH="setup/$d/packages.txt"
PKG_PATH="$d/scripts/packages.txt"
else
PKG_PATH="$d/packages.txt"
fi
while IFS= read -r pkg; do while IFS= read -r pkg; do
[[ -z "$pkg" ]] && continue [[ -z "$pkg" ]] && continue
if pacman -S --print-format '%n' "$pkg" >/dev/null 2>&1; then if pacman -S --print-format '%n' "$pkg" >/dev/null 2>&1; then
@@ -214,44 +203,46 @@ NOOP
done done
# 2d. If network allowed and not skipped, actually install the pacman # 2d. If network allowed and not skipped, actually install the pacman
# and npm sections of term/setup.sh (mirrors `make term` without AUR; # and npm sections of setup/term/setup.sh (mirrors `make term` without
# the @aur section stays RUN_FULL-gated since it needs yay/AUR builds). # AUR; the @aur section stays RUN_FULL-gated since it needs yay/AUR builds).
if [[ "${SKIP_NET:-0}" != "1" ]]; then if [[ "${SKIP_NET:-0}" != "1" ]]; then
header "make term (pacman + npm packages, AUR skipped)" header "make term (pacman + npm packages, AUR skipped)"
# Patch packages.txt: keep @pacman and @npm (@npm runs via sudo npm # Patch packages.txt: keep @pacman and @npm (@npm runs via sudo npm
# in the container), drop @aur so we don't hit AUR builds. # in the container), drop @aur so we don't hit AUR builds.
cp "$REPO/term/scripts/packages.txt" "$HOME/packages.txt.full" cp "$REPO/setup/term/packages.txt" "$HOME/packages.txt.full"
awk ' awk '
/^@aur$/{s="skip"}; /^@npm$/{s="npm"}; /^@pacman$/{s="pacman"} /^@aur$/{s="skip"}; /^@npm$/{s="npm"}; /^@pacman$/{s="pacman"}
{ if (s!="skip" && NF>0 && $1 !~ /^#/) print } { if (s!="skip" && NF>0 && $1 !~ /^#/) print }
' "$REPO/term/scripts/packages.txt" > "$HOME/packages.txt.term-smoke" ' "$REPO/setup/term/packages.txt" > "$HOME/packages.txt.term-smoke"
# pacman-only list for verify_packages.sh (npm packages are not in # pacman-only list for verify_packages.sh (npm packages are not in
# the pacman DB). # the pacman DB).
awk ' awk '
/^@aur$/{s="skip"}; /^@npm$/{s="skip"}; /^@pacman$/{s="pacman"} /^@aur$/{s="skip"}; /^@npm$/{s="skip"}; /^@pacman$/{s="pacman"}
{ if (s!="skip" && NF>0 && $1 !~ /^#/) print } { if (s!="skip" && NF>0 && $1 !~ /^#/) print }
' "$REPO/term/scripts/packages.txt" > "$HOME/packages.txt.term-only" ' "$REPO/setup/term/packages.txt" > "$HOME/packages.txt.term-only"
# set a scratch HOME for setup.sh so it doesn't touch the real one. # Stage a scratch copy of the term setup incl. setup/lib/common.sh
mkdir -p "$HOME/term" # (setup.sh sources it via a path relative to its own location).
cp "$REPO/term/scripts/setup.sh" "$HOME/term/setup.sh" mkdir -p "$HOME/smoke/term" "$HOME/smoke/lib"
cp "$HOME/packages.txt.term-smoke" "$HOME/term/packages.txt" cp "$REPO/setup/term/setup.sh" "$HOME/smoke/term/setup.sh"
cp "$REPO/setup/lib/common.sh" "$HOME/smoke/lib/common.sh"
cp "$HOME/packages.txt.term-smoke" "$HOME/smoke/term/packages.txt"
# chsh is stubbed via $HOME/bin so even `chsh` works without a pty. # chsh is stubbed via $HOME/bin so even `chsh` works without a pty.
setup_ok=0 setup_ok=0
if ( cd "$HOME/term" && bash setup.sh ) ; then if ( cd "$HOME/smoke/term" && bash setup.sh ) ; then
say_ok "term/setup.sh (pacman+npm) completed" say_ok "setup/term/setup.sh (pacman+npm) completed"
setup_ok=1 setup_ok=1
else else
say_fail "term/setup.sh (pacman+npm) failed (exit $?)" say_fail "setup/term/setup.sh (pacman+npm) failed (exit $?)"
fi fi
# 2d1. Idempotency probe: a second run must also succeed. Catches # 2d1. Idempotency probe: a second run must also succeed. Catches
# steps that break on re-runs over an already-populated state (e.g. # steps that break on re-runs over an already-populated state (e.g.
# `ya pkg add` failing with "already exists"). # `ya pkg add` failing with "already exists").
if [[ "$setup_ok" == "1" ]]; then if [[ "$setup_ok" == "1" ]]; then
if ( cd "$HOME/term" && bash setup.sh ) ; then if ( cd "$HOME/smoke/term" && bash setup.sh ) ; then
say_ok "term/setup.sh re-run: idempotent" say_ok "setup/term/setup.sh re-run: idempotent"
else else
say_fail "term/setup.sh re-run failed (exit $?) - not idempotent" say_fail "setup/term/setup.sh re-run failed (exit $?) - not idempotent"
fi fi
else else
echo " skipping idempotency probe (first run did not complete)" echo " skipping idempotency probe (first run did not complete)"
@@ -279,15 +270,13 @@ NOOP
# 2e. stow --actual into $HOME to prove real symlinks are created. # 2e. stow --actual into $HOME to prove real symlinks are created.
header "stow real symlinks into \$HOME" header "stow real symlinks into \$HOME"
# term/setup.sh may have just re-created the yazi plugin (`ya pkg add`) # setup/term/setup.sh may have just re-created the yazi plugin (`ya pkg add`)
# as real files. The repo vendors the same plugin under term/.config/yazi, # as real files. The repo vendors the same plugin under term/.config/yazi,
# so drop the duplicate first, letting stow take ownership of that config. # so drop the duplicate first, letting stow take ownership of that config.
rm -rf "$HOME/.config/yazi" rm -rf "$HOME/.config/yazi"
for pkg in term hypr kreation local_ai; do for pkg in term hypr kreation local_ai; do
if [[ -d "$REPO/$pkg" ]]; then if [[ -d "$REPO/$pkg" ]]; then
if stow --ignore='.stow-ignore' --ignore='scripts' \ if stow --dir="$REPO" --target="$HOME" "$pkg" 2>"$ERR_LOG"; then
--ignore='\.config/tmux/plugins' \
--dir="$REPO" --target="$HOME" "$pkg" 2>"$ERR_LOG"; then
say_ok "stow $pkg into \$HOME" say_ok "stow $pkg into \$HOME"
else else
say_fail "stow $pkg into \$HOME" say_fail "stow $pkg into \$HOME"
+18 -20
View File
@@ -77,19 +77,14 @@ else
fi fi
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# 4. packages.txt parsing sanity (mirrors each setup.sh read_packages). # 4. packages.txt parsing sanity (mirrors setup/lib/common.sh read_packages).
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
echo "== Checking packages.txt markers ==" echo "== Checking packages.txt markers =="
for pkgdir in term basic utils hypr; do for pkgdir in term basic utils hypr kreation; do
# term/ and hypr/ keep packages.txt + setup.sh inside scripts/ so stowing # Setup scripts + package lists live in setup/ (outside the stow
# the top-level dir only creates .config/ symlinks. # packages), sharing one parser in setup/lib/common.sh.
if [[ "$pkgdir" == "term" || "$pkgdir" == "hypr" ]]; then PKG_FILE="setup/$pkgdir/packages.txt"
PKG_FILE="$pkgdir/scripts/packages.txt" SETUP_FILE="setup/$pkgdir/setup.sh"
SETUP_FILE="$pkgdir/scripts/setup.sh"
else
PKG_FILE="$pkgdir/packages.txt"
SETUP_FILE="$pkgdir/setup.sh"
fi
if ! [[ -f "$PKG_FILE" ]]; then if ! [[ -f "$PKG_FILE" ]]; then
say_fail "$PKG_FILE missing" say_fail "$PKG_FILE missing"
continue continue
@@ -99,12 +94,15 @@ for pkgdir in term basic utils hypr; do
else else
say_fail "$PKG_FILE missing @pacman marker" say_fail "$PKG_FILE missing @pacman marker"
fi fi
# every @aur/@npm marker must be matched by a real consumer in setup.sh # every @aur/@npm marker must be matched by a real consumer: either the
# thin setup.sh itself or the shared setup/lib/common.sh it sources.
for marker in '@aur' '@npm'; do for marker in '@aur' '@npm'; do
if grep -q "^$marker" "$PKG_FILE"; then if grep -q "^$marker" "$PKG_FILE"; then
grep -q "$marker" "$SETUP_FILE" \ if grep -q "$marker" "$SETUP_FILE" || grep -q "$marker" "setup/lib/common.sh"; then
&& say_pass "$PKG_FILE $marker handled by $SETUP_FILE" \ say_pass "$PKG_FILE $marker handled by $SETUP_FILE (via common.sh)"
|| say_fail "$PKG_FILE uses $marker but $SETUP_FILE does not handle it" else
say_fail "$PKG_FILE uses $marker but neither $SETUP_FILE nor setup/lib/common.sh handles it"
fi
else else
say_pass "$PKG_FILE has no $marker section" say_pass "$PKG_FILE has no $marker section"
fi fi
@@ -112,12 +110,12 @@ for pkgdir in term basic utils hypr; do
done done
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# 5. Makefile <-> install script name consistency. # 5. Makefile <-> setup script name consistency.
# Catches typos such as `_install_skripte_install_basic_pcks.sh` # Catches typos such as `setup/basic/setuo.sh`
# (missing '/') in Makefile targets. # (missing '/') in Makefile targets.
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
echo "== Checking Makefile references install scripts that exist ==" echo "== Checking Makefile references setup scripts that exist =="
# Pull out every `*_install_*_pcks.sh` token mentioned in the Makefile. # Pull out every `setup/...sh` token mentioned in the Makefile.
while IFS= read -r tok; do while IFS= read -r tok; do
[[ -z "$tok" ]] && continue [[ -z "$tok" ]] && continue
if [[ -e "$REPO_ROOT/$tok" ]]; then if [[ -e "$REPO_ROOT/$tok" ]]; then
@@ -125,7 +123,7 @@ while IFS= read -r tok; do
else else
say_fail "Makefile references missing script: $tok" say_fail "Makefile references missing script: $tok"
fi fi
done < <(grep -P '^\t' Makefile | grep -oE '[_A-Za-z0-9/-]*install_[A-Za-z0-9_-]*\.sh' | sort -u) done < <(grep -P '^\t' Makefile | grep -oE 'setup/[_A-Za-z0-9./-]+\.sh' | sort -u)
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# 6. Makefile <-> stow package name consistency. # 6. Makefile <-> stow package name consistency.
+1 -1
View File
@@ -55,7 +55,7 @@ trap cleanup EXIT
for pkg in "${PACKAGES[@]}"; do for pkg in "${PACKAGES[@]}"; do
echo "--- stow --simulate: $pkg ---" echo "--- stow --simulate: $pkg ---"
if stow --simulate --verbose=1 --ignore='.stow-ignore' --ignore='scripts' --ignore='\.config/tmux/plugins' --dir="$REPO_ROOT" --target="$REPO_ROOT" "$pkg" >/dev/null 2>"$ERR_LOG"; then if stow --simulate --verbose=1 --dir="$REPO_ROOT" --target="$REPO_ROOT" "$pkg" >/dev/null 2>"$ERR_LOG"; then
echo "ok: stow --simulate '$pkg' resolved without conflicts" echo "ok: stow --simulate '$pkg' resolved without conflicts"
else else
echo "FAIL: stow --simulate '$pkg'" echo "FAIL: stow --simulate '$pkg'"
-74
View File
@@ -1,74 +0,0 @@
#!/bin/bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PACKAGES_FILE="$SCRIPT_DIR/packages.txt"
# ---------------------------------------------------------------------------
# Read packages.txt, split into pacman / aur / npm sections.
# ---------------------------------------------------------------------------
read_packages() {
local section="pacman"
local current
current=""
while IFS= read -r line || [[ -n "$line" ]]; do
current="${line%%#*}"
current="${current##*( )}"
current="${current%%*( )}"
[[ -z "$current" ]] && continue
case "$current" in
@pacman) section="pacman" ;;
@aur) section="aur" ;;
@npm) section="npm" ;;
*)
case "$section" in
pacman) pacman_pkgs+=("$current") ;;
aur) aur_pkgs+=("$current") ;;
npm) npm_pkgs+=("$current") ;;
esac
;;
esac
done < "$PACKAGES_FILE"
}
declare -a pacman_pkgs=() aur_pkgs=() npm_pkgs=()
# ---------------------------------------------------------------------------
# Install sections.
# ---------------------------------------------------------------------------
install_pacman() {
if ((${#pacman_pkgs[@]})); then
echo "==> Installiere Pacman-Pakete: ${pacman_pkgs[*]}"
yay -S --needed "${pacman_pkgs[@]}"
fi
}
install_aur() {
if ((${#aur_pkgs[@]})); then
echo "==> Installiere AUR-Pakete: ${aur_pkgs[*]}"
yay -S --needed "${aur_pkgs[@]}"
fi
}
install_npm() {
if ((${#npm_pkgs[@]})); then
echo "==> Installiere globale npm-Pakete: ${npm_pkgs[*]}"
npm install -g "${npm_pkgs[@]}"
fi
}
# ---------------------------------------------------------------------------
# Main
# ---------------------------------------------------------------------------
main() {
echo "==> Lese Paketliste: $PACKAGES_FILE"
read_packages
install_pacman
install_aur
install_npm
echo "Fertig. Standalone Utilities sind eingerichtet."
}
main