Compare commits
8
Commits
15d77eeaca
...
e499e63a49
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e499e63a49 | ||
|
|
df5abce062 | ||
|
|
aed6d46846 | ||
|
|
30619b00ce | ||
|
|
545485f3c5 | ||
|
|
a8947283a5 | ||
|
|
496920cbdd | ||
|
|
519432d630 |
@@ -5,8 +5,11 @@ hypr/.config/hypr/monitor_setup.lua
|
||||
# Noctalia template output (shell-owned, regenerated on palette change)
|
||||
hypr/.config/hypr/noctalia.lua
|
||||
hypr/.config/kitty/themes/noctalia.conf
|
||||
# Caelestia runtime output (shell-owned, regenerated on scheme change)
|
||||
hypr/.config/hypr/scheme/
|
||||
*~lock.*#
|
||||
lazy-lock.json
|
||||
fish_variables
|
||||
term/.config/opencode/cli.json
|
||||
term/.config/opencode/service.json
|
||||
hypr/.config/hypr/scheme/current.lua
|
||||
|
||||
@@ -15,7 +15,7 @@ Only entries that would be missed without explicit help are included.
|
||||
|
||||
| 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`. |
|
||||
| **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 |
|
||||
|------|--------|
|
||||
| **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.). |
|
||||
| **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. |
|
||||
|
||||
@@ -6,27 +6,27 @@
|
||||
# Zweige abhaengen. Die uebrigen Ziele haengen nur von basic ab und sind
|
||||
# untereinander unabhaengig.
|
||||
basic:
|
||||
bash basic/setup.sh
|
||||
stow --ignore='.stow-ignore' --ignore='scripts' --ignore='setup.sh' --ignore='packages.txt' basic
|
||||
bash setup/basic/setup.sh
|
||||
stow basic
|
||||
|
||||
term: basic
|
||||
bash term/scripts/setup.sh
|
||||
stow --ignore='.stow-ignore' --ignore='scripts' --ignore='\.config/tmux/plugins' term
|
||||
bash setup/term/setup.sh
|
||||
stow term
|
||||
|
||||
utils: basic
|
||||
bash utils/setup.sh
|
||||
bash _install_skripte/nextcloud.sh
|
||||
bash setup/utils/setup.sh
|
||||
bash setup/nextcloud.sh
|
||||
|
||||
hypr: basic
|
||||
bash hypr/scripts/setup.sh
|
||||
stow --ignore='.stow-ignore' --ignore='scripts' hypr
|
||||
bash setup/hypr/setup.sh
|
||||
stow hypr
|
||||
|
||||
kreation: basic
|
||||
bash _install_skripte/install_kreation_pcks.sh
|
||||
bash setup/kreation/setup.sh
|
||||
stow 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)
|
||||
|
||||
@@ -11,7 +11,7 @@ Personal configuration files for an Arch Linux workstation (Hyprland + Neovim +
|
||||
| `hypr/` | Hyprland compositor config + Noctalia shell config (Catppuccin Mocha) |
|
||||
| `kreation/`| VST plugin (`MT-PowerDrumKit.vst3`) |
|
||||
| `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) |
|
||||
|
||||
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 |
|
||||
|--------|--------------|
|
||||
| `make term` | Runs `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 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 `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 kreation` | `make basic`, installs VST runtime, stows `kreation` |
|
||||
| `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:
|
||||
|
||||
```
|
||||
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:
|
||||
@@ -65,12 +65,12 @@ Add/remove packages on separate lines. Lines starting with `#` are ignored, and
|
||||
@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
|
||||
|
||||
- **`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.
|
||||
- **`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/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.
|
||||
- **`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
|
||||
|
||||
@@ -138,7 +138,7 @@ There are **two tiers**:
|
||||
|
||||
| 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-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 |
|
||||
|
||||
@@ -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.
|
||||
# Part of basic/.config/themes. Managed file: refresh via
|
||||
# basic/scripts/fetch-ports.sh
|
||||
# setup/fetch-ports.sh
|
||||
# (upstream: catppuccin/hyprland generated mocha.conf).
|
||||
# Hyprland consumers load it via: source = ~/.config/themes/current/hypr.conf
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Central theme: catppuccin-mocha (Catppuccin Mocha), kitty colors.
|
||||
# Part of basic/.config/themes. Managed file: refresh via
|
||||
# basic/scripts/fetch-ports.sh
|
||||
# setup/fetch-ports.sh
|
||||
# (upstream: catppuccin/kitty themes/mocha.conf).
|
||||
# vim:ft=kitty
|
||||
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
setup.sh
|
||||
packages.txt
|
||||
scripts
|
||||
.stow-ignore
|
||||
-150
@@ -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
|
||||
@@ -0,0 +1,2 @@
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"appearance": {
|
||||
"transparency": {
|
||||
"enabled": true
|
||||
}
|
||||
},
|
||||
"general": {
|
||||
"apps": {
|
||||
"explorer": ["dolphin"],
|
||||
"terminal": ["kitty"]
|
||||
}
|
||||
},
|
||||
"launcher": {
|
||||
"showOnHover": true,
|
||||
"useFuzzy": {
|
||||
"apps": true
|
||||
},
|
||||
"vimKeybinds": true
|
||||
},
|
||||
"paths": {
|
||||
"wallpaperDir": "~/nextcloud/Photos/Wallpapers"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
# hypridle.conf — idle stages: screensaver (300s, backend in modules/screensaver.lua) -> Noctalia lock (10min) -> DPMS off.
|
||||
# Managed by dotfiles (stow hypr).
|
||||
#
|
||||
# NOTE: this Hyprland (hyprmod Lua runtime, 0.56.x) evaluates `hyprctl dispatch`
|
||||
# args as Lua — classic `dispatch dpms off` syntax fails. Dispatchers must be
|
||||
# hl.dsp.* expressions (e.g. hl.dsp.dpms(false)).
|
||||
|
||||
general {
|
||||
lock_cmd = pidof -q noctalia || noctalia msg session lock
|
||||
before_sleep_cmd = loginctl lock-session
|
||||
after_sleep_cmd = hyprctl dispatch 'hl.dsp.dpms(true)'
|
||||
}
|
||||
|
||||
# Screensaver via backend wrappers (switch backend in modules/screensaver.lua).
|
||||
listener {
|
||||
timeout = 300
|
||||
on-timeout = ~/.config/hypr/scripts/screensaver-start.sh
|
||||
on-resume = ~/.config/hypr/scripts/screensaver-stop.sh
|
||||
}
|
||||
|
||||
# 10min: lock via Noctalia (SUPER+L runs the same command).
|
||||
listener {
|
||||
timeout = 600
|
||||
on-timeout = loginctl lock-session
|
||||
}
|
||||
|
||||
# 10m30s: power off displays.
|
||||
listener {
|
||||
timeout = 630
|
||||
on-timeout = hyprctl dispatch 'hl.dsp.dpms(false)'
|
||||
on-resume = hyprctl dispatch 'hl.dsp.dpms(true)'
|
||||
}
|
||||
@@ -29,7 +29,11 @@ hl.config({
|
||||
-- ##################
|
||||
|
||||
hl.on("hyprland.start", function()
|
||||
hl.exec_cmd("noctalia &")
|
||||
hl.exec_cmd("caelestia shell -d")
|
||||
end)
|
||||
|
||||
hl.on("hyprland.start", function()
|
||||
hl.exec_cmd("hypridle &")
|
||||
end)
|
||||
|
||||
hl.on("hyprland.start", function()
|
||||
@@ -45,6 +49,3 @@ require("modules.windows_and_workspaces")
|
||||
|
||||
-- HyprMod managed settings
|
||||
require("hyprland-gui")
|
||||
|
||||
-- For Noctalia Color templates
|
||||
require("noctalia").apply_theme()
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
# hyprsaver.toml — chill playlist: calm shaders + cool palettes, cycling.
|
||||
# Location: ~/.config/hypr/hyprsaver.toml (stowed from dotfiles).
|
||||
# Names verified against `hyprsaver --list-shaders` / `--list-palettes`.
|
||||
# Everything else uses hyprsaver's built-in defaults (see
|
||||
# /usr/share/hyprsaver/examples/config.toml for the full reference).
|
||||
|
||||
[general]
|
||||
fps = 30
|
||||
shader = "cycle"
|
||||
palette = "cycle"
|
||||
shader_cycle_interval = 300
|
||||
palette_cycle_interval = 60
|
||||
cycle_order = "random"
|
||||
synced = true
|
||||
shader_playlist = "chill"
|
||||
palette_playlist = "chill"
|
||||
|
||||
[playlists.chill]
|
||||
shaders = [
|
||||
"plasma",
|
||||
"marble",
|
||||
"snowfall",
|
||||
"aurora",
|
||||
"clouds",
|
||||
"planet",
|
||||
"starfield",
|
||||
"fireflies",
|
||||
]
|
||||
palettes = [
|
||||
"vaporwave",
|
||||
"frost",
|
||||
"ocean",
|
||||
"aurora",
|
||||
]
|
||||
|
||||
[behavior]
|
||||
fade_in_ms = 800
|
||||
fade_out_ms = 400
|
||||
dismiss_on = ["key", "mouse_move", "mouse_click", "touch"]
|
||||
exclusive_keyboard = true
|
||||
@@ -226,5 +226,12 @@ hl.bind("SHIFT + PRINT", hl.dsp.exec_cmd("hyprshot -m active --output-folder " .
|
||||
})
|
||||
|
||||
hl.bind(var.mainMod .. " + L", hl.dsp.exec_cmd(command.lock), { locked = true, description = "Lock screen" })
|
||||
hl.bind(var.mainMod .. " + SHIFT + L", hl.dsp.exec_cmd(command.screensaver), { description = "Start screensaver (any key quits)" })
|
||||
hl.bind(var.mainMod .. " + K", hl.dsp.exec_cmd(command.keybinds_show), { description = "Show keybind overview" })
|
||||
hl.bind(var.mainMod .. " + W", hl.dsp.exec_cmd(command.wallpaper_select), { description = "Wallpaper select" })
|
||||
|
||||
-- Caelestia extras
|
||||
hl.bind(var.mainMod .. " + SHIFT + V", hl.dsp.exec_cmd(command.clipboard), { description = "Clipboard history" })
|
||||
hl.bind(var.mainMod .. " + period", hl.dsp.exec_cmd(command.emoji), { description = "Emoji picker" })
|
||||
hl.bind(var.mainMod .. " + SHIFT + K", hl.dsp.exec_cmd(command.show_all), { description = "Toggle utilities" })
|
||||
hl.bind("CTRL + ALT + C", hl.dsp.exec_cmd(command.clear_notifications), { description = "Clear notifications" })
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
-- Screensaver commands for idle (hypridle on-timeout/on-resume) and manual
|
||||
-- (SUPER+SHIFT+L) use. scripts/screensaver-start.sh and
|
||||
-- scripts/screensaver-stop.sh exec the .start / .stop command below.
|
||||
--
|
||||
-- Active backend: tte (fullscreen kitty + terminal-text-effects).
|
||||
return {
|
||||
start = "~/.config/hypr/scripts/launch-screensaver.sh",
|
||||
stop = "~/.config/hypr/scripts/screensaver-stop.sh",
|
||||
-- Alternative backend: hyprsaver (GPU fractal shaders, wlr-layer-shell).
|
||||
-- Swap the commented pair in to switch (no other file changes needed).
|
||||
-- start = "hyprsaver",
|
||||
-- stop = "hyprsaver --quit",
|
||||
}
|
||||
@@ -1,12 +1,24 @@
|
||||
-- Caelestia shell commands. This branch is caelestia-only;
|
||||
-- revert to Noctalia by switching branches.
|
||||
-- Caelestia drawers (see ScreenState.qml): bar, osd, session, launcher,
|
||||
-- dashboard, utilities, sidebar. Wallpaper goes through the launcher
|
||||
-- (type `>wallpaper`) or `caelestia wallpaper`.
|
||||
|
||||
return {
|
||||
session = "noctalia msg panel-toggle session",
|
||||
logout = "command -v noctalia >/dev/null 2>&1 && noctalia msg session logout || hyprctl dispatch exit",
|
||||
shutdown = "noctalia msg session shutdown",
|
||||
reboot = "noctalia msg session reboot",
|
||||
menu = "noctalia msg panel-toggle launcher",
|
||||
settings = "noctalia msg settings-toggle",
|
||||
control_center = "noctalia msg panel-toggle control-center",
|
||||
lock = "noctalia msg session lock",
|
||||
wallpaper_select = "noctalia msg panel-toggle wallpaper",
|
||||
session = "caelestia shell drawers toggle session",
|
||||
logout = "hyprctl dispatch exit",
|
||||
shutdown = "systemctl poweroff",
|
||||
reboot = "systemctl reboot",
|
||||
menu = "caelestia shell drawers toggle launcher",
|
||||
settings = "caelestia shell drawers toggle dashboard",
|
||||
control_center = "caelestia shell drawers toggle sidebar",
|
||||
lock = "caelestia shell lock lock",
|
||||
wallpaper_select = "caelestia shell drawers toggle launcher && sleep 0.1 && wtype \">wallpaper \"",
|
||||
clipboard = "caelestia clipboard",
|
||||
clipboard_delete = "caelestia clipboard -d",
|
||||
emoji = "caelestia emoji -p",
|
||||
show_all = "caelestia shell drawers toggle utilities",
|
||||
clear_notifications = "caelestia shell notifs clear",
|
||||
keybinds_show = "sh ~/.config/hypr/scripts/show-keybinds.sh",
|
||||
screensaver = "sh ~/.config/hypr/scripts/screensaver-start.sh force",
|
||||
}
|
||||
|
||||
@@ -76,6 +76,16 @@ hl.layer_rule({
|
||||
blur = true,
|
||||
blur_popups = true,
|
||||
})
|
||||
hl.layer_rule({
|
||||
name = "caelestia",
|
||||
match = {
|
||||
namespace = "^caelestia-.*$",
|
||||
},
|
||||
no_anim = true,
|
||||
ignore_alpha = 0.5,
|
||||
blur = true,
|
||||
blur_popups = true,
|
||||
})
|
||||
hl.window_rule({
|
||||
name = "noctalia-settings",
|
||||
match = {
|
||||
@@ -93,6 +103,16 @@ hl.window_rule({
|
||||
border_size = 0,
|
||||
})
|
||||
|
||||
-- Manual tte screensaver preview (SUPER+SHIFT+L): fullscreen kitty.
|
||||
hl.window_rule({
|
||||
name = "screensaver-fullscreen",
|
||||
match = {
|
||||
class = "org.screensaver",
|
||||
},
|
||||
fullscreen = true,
|
||||
float = true,
|
||||
})
|
||||
|
||||
-- windowrule {
|
||||
|
||||
-- name = no-rounding-steam-games
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
hyprland
|
||||
// idle looks good on you
|
||||
|
||||
ArchTop is relaxing 🧘
|
||||
+51
@@ -0,0 +1,51 @@
|
||||
#!/usr/bin/env bash
|
||||
# launch-screensaver.sh — idle-triggered tte screensaver (hypridle on-timeout).
|
||||
# Spawns one fullscreen kitty running screensaver-tte.sh per monitor.
|
||||
# Usage: launch-screensaver.sh [force]
|
||||
# force ignore the screensaver-off toggle file.
|
||||
# Toggle off: touch ~/.local/state/hypr/screensaver-off
|
||||
#
|
||||
# Lessons baked in: no focus-restore after spawn (it raced the new window and
|
||||
# caused flash-then-nothing), no pkill -f patterns anywhere (teardown is done
|
||||
# by screensaver-stop.sh via exact client PIDs).
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
SCREENSAVER_CLASS="org.screensaver"
|
||||
TOGGLE_FILE="$HOME/.local/state/hypr/screensaver-off"
|
||||
|
||||
command -v tte >/dev/null 2>&1 || exit 1
|
||||
command -v kitty >/dev/null 2>&1 || exit 1
|
||||
|
||||
# Already running (precise client check).
|
||||
if hyprctl clients -j 2>/dev/null | jq -e '.[] | select(.class=="org.screensaver")' >/dev/null 2>&1; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Opt-out toggle (unless forced, e.g. manual invocation).
|
||||
if [[ -f "$TOGGLE_FILE" ]] && [[ "${1:-}" != "force" ]]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
|
||||
# hyprctl prints plain-text errors (not JSON) when HYPRLAND_INSTANCE_SIGNATURE
|
||||
# is stale (e.g. shell/tmux predates the current compositor). Fail clearly
|
||||
# instead of dumping a jq parse error.
|
||||
monitors_json="$(hyprctl monitors -j 2>/dev/null)" || {
|
||||
echo "launch-screensaver: hyprctl failed - is HYPRLAND_INSTANCE_SIGNATURE stale? (try a fresh terminal)" >&2
|
||||
exit 1
|
||||
}
|
||||
echo "$monitors_json" | jq -e . >/dev/null 2>&1 || {
|
||||
echo "launch-screensaver: hyprctl did not return JSON - stale HYPRLAND_INSTANCE_SIGNATURE?" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
# NOTE: hyprmod Lua runtime (Hyprland 0.56.x) evaluates `hyprctl dispatch` args
|
||||
# as Lua — classic `dispatch focusmonitor eDP-1` fails. Dispatchers must be
|
||||
# hl.dsp.* expressions. Focus each monitor before exec so the saver kitty
|
||||
# spawns there; deliberately no focus-restore afterwards (spawn race).
|
||||
for m in $(echo "$monitors_json" | jq -r '.[] | .name'); do
|
||||
hyprctl dispatch "hl.dsp.focus({monitor=\"$m\"})" >/dev/null 2>&1
|
||||
hyprctl dispatch "hl.dsp.exec_cmd('kitty --class=\"$SCREENSAVER_CLASS\" --override font_size=18 --override window_padding_width=0 --override background_opacity=1 --override mouse_hide_wait=1.0 -e \"$SCRIPT_DIR/screensaver-tte.sh\"')" >/dev/null 2>&1
|
||||
done
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
#!/usr/bin/env bash
|
||||
# screensaver-start.sh — exec the start command from modules/screensaver.lua.
|
||||
# Usage: screensaver-start.sh [force] (forwarded to .sh targets, e.g. the tte
|
||||
# launcher's toggle bypass; dropped for bare commands like `hyprsaver`).
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
CMD="$(lua -e 'print(dofile(os.getenv("HOME").."/.config/hypr/modules/screensaver.lua").start)' 2>/dev/null)" || {
|
||||
echo "screensaver-start: cannot read modules/screensaver.lua" >&2
|
||||
exit 1
|
||||
}
|
||||
CMD="${CMD/#\~/$HOME}"
|
||||
[[ -n "$CMD" ]] || {
|
||||
echo "screensaver-start: empty start command" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
if [[ "$CMD" == *.sh ]]; then
|
||||
exec "$CMD" "$@"
|
||||
else
|
||||
# Bare command, may carry flags (e.g. "hyprsaver --quit").
|
||||
# shellcheck disable=SC2086
|
||||
exec $CMD
|
||||
fi
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
#!/usr/bin/env bash
|
||||
# screensaver-stop.sh — exec the stop command from modules/screensaver.lua.
|
||||
# When it points back here (tte backend), run the built-in teardown below:
|
||||
# kill saver windows by Hyprland client PID (class org.screensaver) plus
|
||||
# stray tte processes (exact comm match). Never `pkill -f <pattern>`: a
|
||||
# full-cmdline pattern also matches bystander shells merely mentioning it.
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
ME="$(realpath "$SCRIPT_DIR/screensaver-stop.sh")"
|
||||
|
||||
WANT="$(lua -e 'print(dofile(os.getenv("HOME").."/.config/hypr/modules/screensaver.lua").stop)' 2>/dev/null)" || {
|
||||
echo "screensaver-stop: cannot read modules/screensaver.lua" >&2
|
||||
exit 1
|
||||
}
|
||||
WANT="${WANT/#\~/$HOME}"
|
||||
|
||||
# Alternative backend configured (e.g. "hyprsaver --quit"): run it instead.
|
||||
if [[ "$(realpath -m "$WANT")" != "$ME" ]]; then
|
||||
# shellcheck disable=SC2086
|
||||
exec $WANT
|
||||
fi
|
||||
|
||||
# --- tte teardown ---
|
||||
pids="$(hyprctl clients -j 2>/dev/null | jq -r '.[] | select(.class=="org.screensaver") | .pid' 2>/dev/null)" || pids=""
|
||||
if [[ -n "${pids:-}" ]]; then
|
||||
# shellcheck disable=SC2086
|
||||
kill $pids 2>/dev/null || true
|
||||
fi
|
||||
|
||||
# tte runs under comm "tte" (verified); -x matches the comm only, so this
|
||||
# cannot hit bystander shells.
|
||||
pkill -x tte 2>/dev/null || true
|
||||
|
||||
exit 0
|
||||
Executable
+41
@@ -0,0 +1,41 @@
|
||||
#!/usr/bin/env bash
|
||||
# screensaver-tte.sh — runs inside each fullscreen tte kitty.
|
||||
# Loops random tte effects until any keypress, then exits (kitty closes).
|
||||
# Child teardown uses the exact PID ($!) — never pkill -f patterns, which
|
||||
# would also match bystander shells mentioning the class name.
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
SCREENSAVER_TEXT="$HOME/.config/hypr/screensaver.txt"
|
||||
|
||||
trap 'exit 0' SIGINT SIGTERM SIGHUP SIGQUIT
|
||||
|
||||
printf '\033]11;rgb:00/00/00\007' # black background
|
||||
|
||||
input="$SCREENSAVER_TEXT"
|
||||
[[ -f "$input" ]] || input="/etc/hostname"
|
||||
|
||||
while true; do
|
||||
tte -i "$input" \
|
||||
--frame-rate 60 --canvas-width 0 --canvas-height 0 \
|
||||
--anchor-canvas c --anchor-text c \
|
||||
--random-effect --exclude-effects dev_worm \
|
||||
--no-eol --no-restore-cursor &
|
||||
TPID=$!
|
||||
# Wait for tte to appear (Python startup) before polling it.
|
||||
for _ in $(seq 1 10); do
|
||||
kill -0 "$TPID" 2>/dev/null || break
|
||||
pgrep -x tte >/dev/null 2>&1 && break
|
||||
sleep 0.1
|
||||
done
|
||||
while kill -0 "$TPID" 2>/dev/null; do
|
||||
if read -r -n1 -t 1; then
|
||||
kill "$TPID" 2>/dev/null || true
|
||||
wait "$TPID" 2>/dev/null || true
|
||||
exit 0
|
||||
fi
|
||||
done
|
||||
wait "$TPID" 2>/dev/null || true
|
||||
# Throttle respawn if tte exits instantly (e.g. a sub-second effect).
|
||||
sleep 0.2
|
||||
done
|
||||
@@ -1,2 +0,0 @@
|
||||
scripts
|
||||
.stow-ignore
|
||||
@@ -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
|
||||
# (base system, display manager, audio stack, AUR helper).
|
||||
@@ -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
|
||||
# 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
|
||||
# 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
|
||||
# source of truth; after fetching, re-apply the provenance headers and the
|
||||
@@ -14,7 +14,7 @@
|
||||
set -euo pipefail
|
||||
|
||||
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).
|
||||
KITTY_PIN="main"
|
||||
@@ -1,9 +1,10 @@
|
||||
# ---------------------------------------------------------------------------
|
||||
# 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
|
||||
# shell (bar, launcher, notifications, lock screen, wallpaper, idle, session
|
||||
# menu) is Noctalia, not a set of standalone ecosystem tools.
|
||||
# menu) on this branch is Caelestia (see hypr/.config/hypr/hyprland.lua:
|
||||
# `caelestia shell -d`). Noctalia lives on main.
|
||||
#
|
||||
# - Lines starting with '#' and blank lines are ignored.
|
||||
# - Use "@pacman", "@aur" or "@npm" markers to switch section.
|
||||
@@ -12,6 +13,7 @@
|
||||
|
||||
@pacman
|
||||
hyprland
|
||||
hypridle
|
||||
xdg-desktop-portal-hyprland
|
||||
hyprpolkitagent
|
||||
pantheon-shortcut-overlay
|
||||
@@ -19,7 +21,12 @@ wev
|
||||
wl-clipboard
|
||||
hyprshot
|
||||
brightnessctl
|
||||
noctalia
|
||||
wtype
|
||||
|
||||
@aur
|
||||
hyprmod
|
||||
caelestia-shell
|
||||
caelestia-cli
|
||||
quickshell-git
|
||||
hyprsaver
|
||||
python-terminaltexteffects
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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:
|
||||
# - Add / remove packages on separate lines.
|
||||
Executable → Regular
+14
-62
@@ -1,63 +1,15 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PACKAGES_FILE="$SCRIPT_DIR/packages.txt"
|
||||
SETUP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PACKAGES_FILE="$SETUP_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"
|
||||
}
|
||||
# shellcheck source=../lib/common.sh
|
||||
source "$SETUP_DIR/../lib/common.sh"
|
||||
|
||||
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),
|
||||
# daher braucht der globale Install sudo.
|
||||
sudo npm install -g "${npm_pkgs[@]}"
|
||||
fi
|
||||
}
|
||||
# Arch installiert npm nach /usr/lib/node_modules (root-owned),
|
||||
# daher braucht der globale Install sudo.
|
||||
NPM_USE_SUDO=1
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Post-install configuration.
|
||||
@@ -131,14 +83,14 @@ add_yazi_git_plugin() {
|
||||
# Main
|
||||
# ---------------------------------------------------------------------------
|
||||
main() {
|
||||
# Hinweis: multilib, yay und das System-Update werden von
|
||||
# basic/setup.sh uebernommen (laeuft vor term im Makefile).
|
||||
echo "==> Lese Paketliste: $PACKAGES_FILE"
|
||||
read_packages
|
||||
local -a pacman_pkgs=() aur_pkgs=() npm_pkgs=()
|
||||
|
||||
install_pacman
|
||||
install_aur
|
||||
install_npm
|
||||
# Hinweis: multilib, yay und das System-Update werden von
|
||||
# setup/basic/setup.sh uebernommen (laeuft vor term im Makefile).
|
||||
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
|
||||
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
|
||||
# desktop: office / web / mail / native-app replacements (Wine), the
|
||||
@@ -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
|
||||
+29
-40
@@ -10,7 +10,7 @@
|
||||
# - `stow --simulate` to prove every stow target resolves
|
||||
# 2. REAL SMOKE (guarded by RUN_SMOKE=1)
|
||||
# - 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
|
||||
# - verifies stow actually creates symlinks into $HOME
|
||||
# AUR + kreation/buntes-monster only run with RUN_FULL=1.
|
||||
@@ -78,9 +78,7 @@ done
|
||||
# 1b. stow --simulate for every package the Makefile stows.
|
||||
while IFS= read -r pkg; do
|
||||
[[ -z "$pkg" ]] && continue
|
||||
if stow --simulate --ignore='.stow-ignore' --ignore='scripts' \
|
||||
--ignore='\.config/tmux/plugins' \
|
||||
--dir="$REPO" --target="$REPO" "$pkg" 2>"$ERR_LOG"; then
|
||||
if stow --simulate --dir="$REPO" --target="$REPO" "$pkg" 2>"$ERR_LOG"; then
|
||||
say_ok "stow --simulate $pkg resolves"
|
||||
else
|
||||
say_fail "stow --simulate $pkg (non-existent package or conflict)"
|
||||
@@ -141,7 +139,7 @@ NOOP
|
||||
echo "[stub] chsh $*"
|
||||
exit 0
|
||||
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.
|
||||
# --noconfirm is needed because the container isn't interactive.
|
||||
cat > "$HOME/bin/yay" <<'NOOP'
|
||||
@@ -154,16 +152,11 @@ NOOP
|
||||
export PATH="$HOME/bin:$PATH"
|
||||
|
||||
# 2c. setup.sh package parsing sanity (mirrors read_packages) for each
|
||||
# package dir: basic/term/utils/hypr. term/ and hypr/ keep their scripts
|
||||
# inside scripts/ so stowing the top-level dir only creates .config/ links.
|
||||
for d in basic term utils hypr; do
|
||||
if [[ "$d" == "term" || "$d" == "hypr" ]]; then
|
||||
SETUP_PATH="$d/scripts/setup.sh"
|
||||
PKG_PATH="$d/scripts/packages.txt"
|
||||
else
|
||||
SETUP_PATH="$d/setup.sh"
|
||||
PKG_PATH="$d/packages.txt"
|
||||
fi
|
||||
# setup/$d target. All setup scripts + package lists live in setup/
|
||||
# (outside the stow packages) and share setup/lib/common.sh.
|
||||
for d in basic term utils hypr kreation; do
|
||||
SETUP_PATH="setup/$d/setup.sh"
|
||||
PKG_PATH="setup/$d/packages.txt"
|
||||
if ( cd "$REPO" && bash -n "$SETUP_PATH" ); then
|
||||
say_ok "$SETUP_PATH syntax OK"
|
||||
else
|
||||
@@ -189,12 +182,8 @@ NOOP
|
||||
# AUR-only name (e.g. `rd`) fails here before any install happens.
|
||||
header "package resolvability (@pacman entries)"
|
||||
resolv_fail=0
|
||||
for d in basic term utils hypr; do
|
||||
if [[ "$d" == "term" || "$d" == "hypr" ]]; then
|
||||
PKG_PATH="$d/scripts/packages.txt"
|
||||
else
|
||||
PKG_PATH="$d/packages.txt"
|
||||
fi
|
||||
for d in basic term utils hypr kreation; do
|
||||
PKG_PATH="setup/$d/packages.txt"
|
||||
while IFS= read -r pkg; do
|
||||
[[ -z "$pkg" ]] && continue
|
||||
if pacman -S --print-format '%n' "$pkg" >/dev/null 2>&1; then
|
||||
@@ -214,44 +203,46 @@ NOOP
|
||||
done
|
||||
|
||||
# 2d. If network allowed and not skipped, actually install the pacman
|
||||
# and npm sections of term/setup.sh (mirrors `make term` without AUR;
|
||||
# the @aur section stays RUN_FULL-gated since it needs yay/AUR builds).
|
||||
# and npm sections of setup/term/setup.sh (mirrors `make term` without
|
||||
# AUR; the @aur section stays RUN_FULL-gated since it needs yay/AUR builds).
|
||||
if [[ "${SKIP_NET:-0}" != "1" ]]; then
|
||||
header "make term (pacman + npm packages, AUR skipped)"
|
||||
# Patch packages.txt: keep @pacman and @npm (@npm runs via sudo npm
|
||||
# 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 '
|
||||
/^@aur$/{s="skip"}; /^@npm$/{s="npm"}; /^@pacman$/{s="pacman"}
|
||||
{ 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
|
||||
# the pacman DB).
|
||||
awk '
|
||||
/^@aur$/{s="skip"}; /^@npm$/{s="skip"}; /^@pacman$/{s="pacman"}
|
||||
{ if (s!="skip" && NF>0 && $1 !~ /^#/) print }
|
||||
' "$REPO/term/scripts/packages.txt" > "$HOME/packages.txt.term-only"
|
||||
# set a scratch HOME for setup.sh so it doesn't touch the real one.
|
||||
mkdir -p "$HOME/term"
|
||||
cp "$REPO/term/scripts/setup.sh" "$HOME/term/setup.sh"
|
||||
cp "$HOME/packages.txt.term-smoke" "$HOME/term/packages.txt"
|
||||
' "$REPO/setup/term/packages.txt" > "$HOME/packages.txt.term-only"
|
||||
# Stage a scratch copy of the term setup incl. setup/lib/common.sh
|
||||
# (setup.sh sources it via a path relative to its own location).
|
||||
mkdir -p "$HOME/smoke/term" "$HOME/smoke/lib"
|
||||
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.
|
||||
setup_ok=0
|
||||
if ( cd "$HOME/term" && bash setup.sh ) ; then
|
||||
say_ok "term/setup.sh (pacman+npm) completed"
|
||||
if ( cd "$HOME/smoke/term" && bash setup.sh ) ; then
|
||||
say_ok "setup/term/setup.sh (pacman+npm) completed"
|
||||
setup_ok=1
|
||||
else
|
||||
say_fail "term/setup.sh (pacman+npm) failed (exit $?)"
|
||||
say_fail "setup/term/setup.sh (pacman+npm) failed (exit $?)"
|
||||
fi
|
||||
|
||||
# 2d1. Idempotency probe: a second run must also succeed. Catches
|
||||
# steps that break on re-runs over an already-populated state (e.g.
|
||||
# `ya pkg add` failing with "already exists").
|
||||
if [[ "$setup_ok" == "1" ]]; then
|
||||
if ( cd "$HOME/term" && bash setup.sh ) ; then
|
||||
say_ok "term/setup.sh re-run: idempotent"
|
||||
if ( cd "$HOME/smoke/term" && bash setup.sh ) ; then
|
||||
say_ok "setup/term/setup.sh re-run: idempotent"
|
||||
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
|
||||
else
|
||||
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.
|
||||
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,
|
||||
# so drop the duplicate first, letting stow take ownership of that config.
|
||||
rm -rf "$HOME/.config/yazi"
|
||||
for pkg in term hypr kreation local_ai; do
|
||||
if [[ -d "$REPO/$pkg" ]]; then
|
||||
if stow --ignore='.stow-ignore' --ignore='scripts' \
|
||||
--ignore='\.config/tmux/plugins' \
|
||||
--dir="$REPO" --target="$HOME" "$pkg" 2>"$ERR_LOG"; then
|
||||
if stow --dir="$REPO" --target="$HOME" "$pkg" 2>"$ERR_LOG"; then
|
||||
say_ok "stow $pkg into \$HOME"
|
||||
else
|
||||
say_fail "stow $pkg into \$HOME"
|
||||
|
||||
+18
-20
@@ -77,19 +77,14 @@ else
|
||||
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 =="
|
||||
for pkgdir in term basic utils hypr; do
|
||||
# term/ and hypr/ keep packages.txt + setup.sh inside scripts/ so stowing
|
||||
# the top-level dir only creates .config/ symlinks.
|
||||
if [[ "$pkgdir" == "term" || "$pkgdir" == "hypr" ]]; then
|
||||
PKG_FILE="$pkgdir/scripts/packages.txt"
|
||||
SETUP_FILE="$pkgdir/scripts/setup.sh"
|
||||
else
|
||||
PKG_FILE="$pkgdir/packages.txt"
|
||||
SETUP_FILE="$pkgdir/setup.sh"
|
||||
fi
|
||||
for pkgdir in term basic utils hypr kreation; do
|
||||
# Setup scripts + package lists live in setup/ (outside the stow
|
||||
# packages), sharing one parser in setup/lib/common.sh.
|
||||
PKG_FILE="setup/$pkgdir/packages.txt"
|
||||
SETUP_FILE="setup/$pkgdir/setup.sh"
|
||||
if ! [[ -f "$PKG_FILE" ]]; then
|
||||
say_fail "$PKG_FILE missing"
|
||||
continue
|
||||
@@ -99,12 +94,15 @@ for pkgdir in term basic utils hypr; do
|
||||
else
|
||||
say_fail "$PKG_FILE missing @pacman marker"
|
||||
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
|
||||
if grep -q "^$marker" "$PKG_FILE"; then
|
||||
grep -q "$marker" "$SETUP_FILE" \
|
||||
&& say_pass "$PKG_FILE $marker handled by $SETUP_FILE" \
|
||||
|| say_fail "$PKG_FILE uses $marker but $SETUP_FILE does not handle it"
|
||||
if grep -q "$marker" "$SETUP_FILE" || grep -q "$marker" "setup/lib/common.sh"; then
|
||||
say_pass "$PKG_FILE $marker handled by $SETUP_FILE (via common.sh)"
|
||||
else
|
||||
say_fail "$PKG_FILE uses $marker but neither $SETUP_FILE nor setup/lib/common.sh handles it"
|
||||
fi
|
||||
else
|
||||
say_pass "$PKG_FILE has no $marker section"
|
||||
fi
|
||||
@@ -112,12 +110,12 @@ for pkgdir in term basic utils hypr; do
|
||||
done
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# 5. Makefile <-> install script name consistency.
|
||||
# Catches typos such as `_install_skripte_install_basic_pcks.sh`
|
||||
# 5. Makefile <-> setup script name consistency.
|
||||
# Catches typos such as `setup/basic/setuo.sh`
|
||||
# (missing '/') in Makefile targets.
|
||||
# ---------------------------------------------------------------------------
|
||||
echo "== Checking Makefile references install scripts that exist =="
|
||||
# Pull out every `*_install_*_pcks.sh` token mentioned in the Makefile.
|
||||
echo "== Checking Makefile references setup scripts that exist =="
|
||||
# Pull out every `setup/...sh` token mentioned in the Makefile.
|
||||
while IFS= read -r tok; do
|
||||
[[ -z "$tok" ]] && continue
|
||||
if [[ -e "$REPO_ROOT/$tok" ]]; then
|
||||
@@ -125,7 +123,7 @@ while IFS= read -r tok; do
|
||||
else
|
||||
say_fail "Makefile references missing script: $tok"
|
||||
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.
|
||||
|
||||
+1
-1
@@ -55,7 +55,7 @@ trap cleanup EXIT
|
||||
|
||||
for pkg in "${PACKAGES[@]}"; do
|
||||
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"
|
||||
else
|
||||
echo "FAIL: stow --simulate '$pkg'"
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user