[Update] bulk update
This commit is contained in:
@@ -33,8 +33,28 @@ a host override a single file in a shared dir without shadowing the rest.
|
||||
**Editing a config edits the repo copy directly** (it's a symlink) — no deploy step. You only re-run
|
||||
`install.sh` when files are **added or removed** (to create/prune symlinks). See **Syncing** below.
|
||||
|
||||
The repo must be cloned to **`~/.dots`** (the relative `../.dots` symlink convention). A host's
|
||||
package name must match `hostname -s` (or pass the host explicitly, e.g. `./install.sh lw`).
|
||||
The repo must be cloned to **`~/.dots`** (the relative `../.dots` symlink convention).
|
||||
|
||||
### Which host package a machine deploys
|
||||
|
||||
**Hostname is not the authority** — the machine remembers its own choice, so several boxes can deploy
|
||||
the same overlay without sharing a hostname. `install.sh` resolves the host as:
|
||||
|
||||
1. the explicit argument (`./install.sh wm`),
|
||||
2. else the name in **`~/.config/dots-host`** — written by `install.sh` itself on every run that
|
||||
resolved a real package, so a one-time `./install.sh <host>` is all the setup there is,
|
||||
3. else `hostname -s`, purely as a convenience guess for boxes where the two happen to agree.
|
||||
|
||||
`~/.config/dots-host` is a machine-local, hand-editable one-word file — the sibling of the
|
||||
`dots-headless` marker above. It is what makes **`bin/dotsync` correct**: dotsync re-links
|
||||
automatically and has no argument to pass, so without a recorded host it could only guess. Switching
|
||||
a machine to another overlay is just `./install.sh <other>` — the previously recorded host is
|
||||
unstowed first, so the base layers don't collide with its leftover links.
|
||||
|
||||
Mismatched hostnames used to fail in a way worth recognizing: `./install.sh` on a box whose hostname
|
||||
matches no package deploys `common`, aborts `gui` on every file the real overlay owns
|
||||
(`existing target is stowed to a different package`) and skips the overlay entirely — a loud
|
||||
`exit 1`, but a half-applied one, where newly added files silently get no symlink.
|
||||
|
||||
## Install (new machine)
|
||||
|
||||
@@ -42,7 +62,7 @@ package name must match `hostname -s` (or pass the host explicitly, e.g. `./inst
|
||||
sudo pacman -S stow
|
||||
git clone <remote> ~/.dots
|
||||
cd ~/.dots
|
||||
./install.sh # auto-detects host via `hostname -s`
|
||||
./install.sh wm # name the host package once — it is remembered (see above)
|
||||
```
|
||||
|
||||
`./install.sh -h` lists all options: `-n` dry-run, `-a` adopt (first run), `-D` unstow (revert),
|
||||
@@ -89,15 +109,16 @@ Because configs are symlinks into the repo, **you almost never run `install.sh`
|
||||
- **Never `stow` the repo root** (`stow .dots`, `stow */`) — it folds package dirs into `~` as stray
|
||||
`~/common`, `~/gui`, … symlinks. `install.sh` only ever links package *contents*.
|
||||
- **New host:** create a top-level `<name>/` package (at least a `host.fish`), commit, then
|
||||
`./install.sh`. If it's terminal-only, skip the package and just `touch ~/.config/dots-headless`
|
||||
(it runs `common` only).
|
||||
`./install.sh <name>` (naming it once records it — later runs and dotsync need no argument).
|
||||
If it's terminal-only, skip the package and just `touch ~/.config/dots-headless` (it runs
|
||||
`common` only).
|
||||
|
||||
## Tooling (`bin/`)
|
||||
|
||||
| Command | What it does |
|
||||
|---|---|
|
||||
| `./install.sh [host]` | Deploy `common → gui → <host>`. Flags: `-n` dry-run, `-a` adopt (first run), `-D`/`--unstow` revert (remove this host's symlinks; repo + real files kept), `-h` help. Self-heals: headless hosts get any stray `gui` unstowed; fails loudly (exit 1) if a package couldn't stow. |
|
||||
| `./bin/dotsync [-n]` | Sync with least churn: `git pull`, re-stow only if files were added/removed. |
|
||||
| `./install.sh [host]` | Deploy `common → gui → <host>`. Host = arg, else `~/.config/dots-host`, else `hostname -s`; the resolved host is recorded there. Flags: `-n` dry-run, `-a` adopt (first run), `-D`/`--unstow` revert (remove this host's symlinks; repo + real files kept), `-h` help. Self-heals: headless hosts get any stray `gui` unstowed, a previously recorded host is released before re-deploying; fails loudly (exit 1) if a package couldn't stow. |
|
||||
| `./bin/dotsync [-n\|host]` | Sync with least churn: `git pull`, re-stow only if files were added/removed (via `install.sh`, using the recorded host). |
|
||||
| `./bin/reconcile-hyde.sh [-i\|--relink] [host]` | After a HyDE update overwrote `~/.config/hypr`, reconcile HyDE's new files against your dots versions (report / `-i` keep·take·merge each / `--relink` re-symlink). |
|
||||
|
||||
## How per-host differences are expressed
|
||||
@@ -118,9 +139,16 @@ provider also listed so any host can switch) — no per-host overrides.
|
||||
|
||||
The Hyprland config is [HyDE](https://github.com/HyDE-Project/HyDE)-based. `gui/.config/hypr/*` is
|
||||
your customization layer, but it **sources HyDE's framework**:
|
||||
`source = ~/.local/share/hyde/hyprland.conf` — which defines `$mainMod` and other variables and is
|
||||
**not tracked by dots** (HyDE generates it). So a GUI host must have **HyDE installed**, or Hyprland
|
||||
fails to start (`source globbing error` + `invalid mod $mainMod`).
|
||||
`source = ~/.local/share/hyde/hyprland.conf` — which defines `$mainMod` and other variables. So a GUI
|
||||
host must have **HyDE installed**, or Hyprland fails to start (`source globbing error` +
|
||||
`invalid mod $mainMod`).
|
||||
|
||||
That file used to be generated-and-untracked, but **HyDE 26.x deploys neither it nor `hyde.conf`**,
|
||||
so since the 2026-08-14 audit both are **tracked pins** in `gui/.local/share/hyde/` — the one
|
||||
deliberate exception to the generated-files-are-never-tracked rule below, interim until the Lua port.
|
||||
After pulling that audit, a machine must run **`./bin/hyde-materialize.sh` before `./install.sh`**:
|
||||
the newly-untracked files leave dangling stow symlinks otherwise, and hypr/hyprlock treat a missing
|
||||
`source =` as a hard parse error.
|
||||
|
||||
- Install/update HyDE with its own installer (`~/HyDE/Scripts/install.sh`); it also pulls the
|
||||
required apps (`xdg-desktop-portal-hyprland`, `xdg-desktop-portal-gtk`, `hyprpolkitagent`).
|
||||
@@ -143,9 +171,15 @@ track neither. HyDE-managed customization goes via:
|
||||
self-contained two-bar config launched raw (`waybar -c …custom.jsonc -s …custom.css` — exec-once,
|
||||
the Ctrl+Alt+W / Super+Shift+R binds, and the `wbar` abbr). **Never route it through
|
||||
`hyde-shell waybar --set`** — waybar.py would clobber the repo's files as above. HyDE only reads
|
||||
from `layouts/`, which is what makes them safe to track. On a rig host, HyDE's own bar (systemd
|
||||
user unit `hyde-<XDG_SESSION_DESKTOP>-bar.service`, auto-restarting) must be disabled once:
|
||||
`systemctl --user stop <unit>; systemctl --user mask <unit>`.
|
||||
from `layouts/`, which is what makes them safe to track. On a rig host, HyDE's own bar must be
|
||||
disabled once, or **two bars appear at every login** — and the launcher differs by HyDE vintage:
|
||||
|
||||
- current HyDE: systemd user unit `hyde-<XDG_SESSION_DESKTOP>-bar.service` (auto-restarting) —
|
||||
`systemctl --user stop <unit>; systemctl --user mask <unit>`.
|
||||
- older (pre-unit) HyDE, e.g. wm's: `exec-once = $start.BAR` in HyDE's generated `hyprland.conf`
|
||||
— neutralized by `$start.BAR=` in `gui/.config/hypr/hyde.conf` (empty = unset; hyde.conf is
|
||||
sourced before that exec-once). Current HyDE's `variables.conf` re-sets `$start.BAR`, so that
|
||||
line stops working after an update — see HYDE-UPDATE.md step 4.
|
||||
|
||||
Note: the Arch `waybar` build has **no native `cava`** module — the rig uses the script module
|
||||
`custom/cava` running `cava-waybar.sh` (self-contained, no HyDE dependency).
|
||||
|
||||
Reference in New Issue
Block a user