diff options
Diffstat (limited to 'MIGRATION.md')
| -rw-r--r-- | MIGRATION.md | 249 |
1 files changed, 0 insertions, 249 deletions
diff --git a/MIGRATION.md b/MIGRATION.md deleted file mode 100644 index 92f6392..0000000 --- a/MIGRATION.md +++ /dev/null | |||
| @@ -1,249 +0,0 @@ | |||
| 1 | # Migrating guix-dotfiles onto nix-combined | ||
| 2 | |||
| 3 | This repo supersedes `guix-dotfiles/home-config/nix-home-manager` (the ad-hoc | ||
| 4 | home-manager flake guix-dotfiles was already using) and pulls Linux desktop | ||
| 5 | config that used to live in `guix-dotfiles/home-config/home-configuration.scm` | ||
| 6 | into home-manager proper. It does **not** replace Guix itself: package | ||
| 7 | management, the system config, and three specific home services stay in | ||
| 8 | Guix (see "Stays in Guix" below). | ||
| 9 | |||
| 10 | `nix-combined` is deliberately its own repo (own history, own remote) so | ||
| 11 | that darwin machines never need to clone anything guix-related. It's wired | ||
| 12 | into `guix-dotfiles` as a **git submodule** at | ||
| 13 | `guix-dotfiles/home-config/nix-combined` - the rest of this section covers | ||
| 14 | that wiring; everything after "Stays in Guix" is still a plan for you to | ||
| 15 | apply by hand. | ||
| 16 | |||
| 17 | ## 1. Submodule wiring (already done in this working tree) | ||
| 18 | |||
| 19 | Already applied, not yet committed/pushed - review with `git status`/`git | ||
| 20 | diff` in `guix-dotfiles` before committing: | ||
| 21 | |||
| 22 | - `guix-dotfiles/.gitmodules` added, pointing `home-config/nix-combined` at | ||
| 23 | **the local filesystem path** to this checkout of `nix-combined`. That | ||
| 24 | only works on this machine. **Before pushing**, create the real remote | ||
| 25 | (recommend `https://git.rschanz.org/nix-combined`, matching the | ||
| 26 | `nix-dotfiles`/`guix-dotfiles` naming convention) and push `nix-combined` | ||
| 27 | there, then run, from `guix-dotfiles`: | ||
| 28 | ``` | ||
| 29 | git submodule set-url home-config/nix-combined https://git.rschanz.org/nix-combined | ||
| 30 | git add .gitmodules | ||
| 31 | git commit | ||
| 32 | ``` | ||
| 33 | - `home-configuration.scm`'s `%home-symlinks` now points | ||
| 34 | `.config/guix/home-config/nix-combined` at `.config/home-manager` | ||
| 35 | (previously `.config/guix/home-config/nix-home-manager`). | ||
| 36 | - `deploy.sh`'s fresh-install clone now uses `git clone --recurse-submodules` | ||
| 37 | so a from-scratch deploy pulls `nix-combined` in the same step. | ||
| 38 | |||
| 39 | **On existing machines**, after pulling this change: | ||
| 40 | ``` | ||
| 41 | git submodule update --init --recursive | ||
| 42 | ``` | ||
| 43 | (or `git clone --recurse-submodules` next time you clone `guix-dotfiles` | ||
| 44 | fresh). Then switch with `home-manager switch --flake ~/.config/home-manager#ryan` | ||
| 45 | (the `rebuild` zsh alias does this on Linux). | ||
| 46 | |||
| 47 | **Updating `nix-combined` later**: since the submodule pins an exact commit, | ||
| 48 | pulling new `nix-combined` changes needs a bump in `guix-dotfiles`: | ||
| 49 | ``` | ||
| 50 | cd home-config/nix-combined && git pull origin main && cd - | ||
| 51 | git add home-config/nix-combined | ||
| 52 | git commit -m "bump nix-combined" | ||
| 53 | ``` | ||
| 54 | |||
| 55 | The old `guix-dotfiles/home-config/nix-home-manager` directory (the | ||
| 56 | pre-submodule ad-hoc flake) can be deleted once you've confirmed the new | ||
| 57 | one builds and switches cleanly. | ||
| 58 | |||
| 59 | **Leave the `nix-config` symlink entry alone for the first switch.** It's | ||
| 60 | what sets `experimental-features = nix-command flakes` for your user today, | ||
| 61 | which is what lets `home-manager`/`nix` read this flake at all - | ||
| 62 | home-manager can't bootstrap its own prerequisite. `linux.nix` now writes | ||
| 63 | its own `~/.config/nix/nix.conf` and `~/.config/nix/registry.json` via | ||
| 64 | `xdg.configFile`, so *after* the first successful switch, remove the | ||
| 65 | `nix-config` entry from `%home-symlinks` too - otherwise HM's files resolve | ||
| 66 | through that symlink and land as untracked files inside the guix-dotfiles | ||
| 67 | checkout instead of in the Nix store. | ||
| 68 | |||
| 69 | ## 2. Remove entries `home-configuration.scm` now duplicates | ||
| 70 | |||
| 71 | Once nix-combined delivers a path, Guix must stop also writing it, or | ||
| 72 | activation will collide (two things trying to own the same symlink target). | ||
| 73 | In `home-configuration.scm`'s `home-xdg-configuration-files-service-type` and | ||
| 74 | `home-files-service-type`, remove these lines (nix-combined now owns them): | ||
| 75 | |||
| 76 | - `"nvim/init.vim"`, `"nvim/after/ftplugin/markdown/custom.vim"`, | ||
| 77 | `"nvim/after/ftplugin/mail/custom.vim"` - nix-combined's neovim config | ||
| 78 | (lazy.nvim-based, in `users/ryan/modules/nvim`) is the canonical one now; | ||
| 79 | the old vim-plug based `nvim/config/init.vim` + `plug.vim` is superseded. | ||
| 80 | - `"hypr/monitors.conf"`, `"hypr/pyprland.toml"`, `"hypr/family_guy.mp4"`, | ||
| 81 | `"hypr/hyprlock.conf"`, `"hypr/hypridle.conf"`, `"hypr/kanshi.conf"`, | ||
| 82 | `"hypr/subwaysurfer.webm"`, `"hypr/scripts"` (the `hyprland.conf` itself | ||
| 83 | was already coming from the old nix-home-manager flake, unchanged in | ||
| 84 | spirit here - just re-homed) | ||
| 85 | - `"wpaperd"`, `"mpv"`, `"foot"`, `"waybar"`, `"alacritty"`, `"aerc"` | ||
| 86 | - `"pulse/client.conf"` | ||
| 87 | - `.local/share/nvim/site/autoload/plug.vim` (dead once nvim is lazy.nvim-based) | ||
| 88 | - `.local/share/mailvelope`, `.mozilla/native-messaging-hosts/tridactyl.json`, | ||
| 89 | `.local/share/tridactyl` | ||
| 90 | - **`.icons`** (from `home-files-service-type`) - this one isn't optional | ||
| 91 | cleanup, it's a hard prerequisite. Guix delivers `.icons` today as a | ||
| 92 | single recursive `local-file` symlink, but `linux.nix`'s | ||
| 93 | `home.pointerCursor` (with `x11.enable = true`) needs to write | ||
| 94 | `~/.icons/default/index.theme` itself. With the old symlink still in | ||
| 95 | place, HM can't create a file inside a symlinked-to-store directory and | ||
| 96 | activation fails outright. Remove this entry before your first | ||
| 97 | `home-manager switch`. | ||
| 98 | - `.gitconfig` (nix-combined's `programs.git` now owns this, with the | ||
| 99 | `filter.lfs` and `[sendemail]` sections merged in - they existed in | ||
| 100 | guix-dotfiles' `.gitconfig` but were missing from the old nix-dotfiles config) | ||
| 101 | - `.ssh/config` (same story - nix-combined's `programs.ssh.settings` is a | ||
| 102 | strict superset: added the `linode` host, the `192.168.216.1` | ||
| 103 | legacy-algorithm host, the `KexAlgorithms` exclusion on `Host *`, and the | ||
| 104 | `Match host * exec "gpg-connect-agent ..."` line) | ||
| 105 | - `.docker/cli-plugins` (docker-compose plugin - if you still want this, | ||
| 106 | it's cheap to add to `users/ryan/linux.nix`'s `home.file`; it wasn't | ||
| 107 | carried over because nothing else referenced it and I didn't want to | ||
| 108 | guess at whether you still use it) | ||
| 109 | |||
| 110 | `hypr/Wallpapers` and the sway config were left alone deliberately - you said | ||
| 111 | you'd handle wallpapers yourself, and `sway` isn't referenced by anything | ||
| 112 | active (Hyprland is the real WM; see "Dead/unused" below). | ||
| 113 | |||
| 114 | ## 3. Switch the login shell to zsh | ||
| 115 | |||
| 116 | `guix-dotfiles/modules/ryan-config/base-system.scm`'s `base-operating-system` | ||
| 117 | has: | ||
| 118 | |||
| 119 | ```scheme | ||
| 120 | ;(shell (file-append zsh "/bin/zsh")) | ||
| 121 | ``` | ||
| 122 | |||
| 123 | commented out, so your account's login shell is still bash even though the | ||
| 124 | canonical config (nix-dotfiles, and now nix-combined) is zsh. Uncomment that | ||
| 125 | line (and rebuild/reconfigure the system) so `programs.zsh` in | ||
| 126 | `users/ryan/common.nix` is actually what runs on login. Until you do, bash | ||
| 127 | still runs (Guix's `home-bash-service-type` config, if still present, keeps | ||
| 128 | working - just don't remove it from `home-configuration.scm` until the shell | ||
| 129 | is actually switched, or you'll drop to a shell with no rc file at all). | ||
| 130 | |||
| 131 | ## Stays in Guix - no home-manager equivalent without systemd | ||
| 132 | |||
| 133 | Home-manager's `services.*` modules assume a systemd user session to | ||
| 134 | autostart things (or launchd on macOS). Guix uses shepherd instead, and | ||
| 135 | home-manager has no shepherd backend. These three keep running exactly as | ||
| 136 | they do today, defined in `guix-dotfiles/modules/ryan-services/`: | ||
| 137 | |||
| 138 | - **`home-pipewire-service-type`** (pipewire + wireplumber daemons) | ||
| 139 | - **`home-dbus-service-type`** (per-user session dbus, since Guix has no | ||
| 140 | systemd --user to provide one) | ||
| 141 | - **`downloads-garbage-collector-service-type`** (the weekly Downloads | ||
| 142 | cleanup shepherd timer) | ||
| 143 | |||
| 144 | `home-gpg-agent-service-type` is the one service that *did* migrate cleanly: | ||
| 145 | gpg-agent doesn't need a supervisor. It's socket-activated the same way on | ||
| 146 | both platforms via the zsh init in `common.nix` | ||
| 147 | (`gpgconf --launch gpg-agent` + exporting `SSH_AUTH_SOCK`), which is exactly | ||
| 148 | what nix-dotfiles' darwin config already did. `linux.nix` points | ||
| 149 | `services.gpg-agent.pinentry.package` at nixpkgs' `pinentry-qt` rather than | ||
| 150 | Guix's system profile path, so it isn't cross-dependent on Guix. | ||
| 151 | |||
| 152 | `home-spotifyd-service-type` is already commented out/disabled in | ||
| 153 | `home-configuration.scm` - nothing to do there. | ||
| 154 | |||
| 155 | ## Dead/unused - candidates to delete from guix-dotfiles | ||
| 156 | |||
| 157 | Found while comparing the two repos; none of these are referenced by | ||
| 158 | anything active, so nothing carried them into nix-combined: | ||
| 159 | |||
| 160 | - **fish** (`home-config/fish/`) - the `fish` package is commented out of | ||
| 161 | `home-configuration.scm`'s package list, but the dotfiles are still | ||
| 162 | checked in. Orphaned. | ||
| 163 | - **`.nix-channels`** - classic (non-flake) nix-channel file. Now that | ||
| 164 | everything is flake-based, this shouldn't be needed. | ||
| 165 | - **`icons/XCursor-Pro-Dark*`** - not referenced anywhere; only | ||
| 166 | `Bibata-Modern-*` appears in `hypr/hyprland.conf`. | ||
| 167 | - **`fonts/Fira Code`, `fonts/Lilex`, `fonts/Monofur For Powerline`, | ||
| 168 | `fonts/AnonymicePro`, `fonts/MonofurNerdFont`** - superseded by | ||
| 169 | `nerd-fonts.{fira-code,lilex,anonymice,monofur}` from nixpkgs | ||
| 170 | (`linux.nix`'s `home.packages`), which ship the same font families. | ||
| 171 | - **`home-spotifyd-service-type`** usage - already disabled. | ||
| 172 | - **`alacritty`** - config exists in both repos, but no package installs the | ||
| 173 | `alacritty` binary in either the guix or the old nix-home-manager config. | ||
| 174 | `foot` is what's actually wired into the system (Guix package list, | ||
| 175 | kmscon login). I added `pkgs.alacritty` to `linux.nix` so the config isn't | ||
| 176 | dead weight, but confirm whether you still use it - if not, drop both the | ||
| 177 | package and `users/ryan/linux/alacritty/`. | ||
| 178 | - **`sway` config** - not referenced by anything; Hyprland (via | ||
| 179 | home-manager) is the actual compositor in use. | ||
| 180 | |||
| 181 | ## Additive merges (things nix-dotfiles was missing, now fixed) | ||
| 182 | |||
| 183 | - **aerc**: `signature_personal`, `signature_rit_personal`, | ||
| 184 | `templates/quoted_reply`, `templates/thanks` existed only in | ||
| 185 | guix-dotfiles' aerc config, even though `accounts.conf`/`aerc.conf` | ||
| 186 | already referenced them by path. Copied into `users/ryan/aerc/`. | ||
| 187 | - **git**: `filter.lfs` and `[sendemail]` sections, merged into | ||
| 188 | `common.nix`'s `programs.git.settings`. | ||
| 189 | - **ssh**: `linode`, `192.168.216.1` (legacy host key/pubkey algorithms), | ||
| 190 | the `KexAlgorithms` exclusion, and the `Match host * exec ...` line, | ||
| 191 | merged into `common.nix`'s `programs.ssh`. | ||
| 192 | |||
| 193 | ## Linux desktop stack re-pin (see also the flake-version conversation) | ||
| 194 | |||
| 195 | The old `guix-dotfiles/home-config/nix-home-manager/flake.nix` pinned | ||
| 196 | home-manager to a 2024 commit specifically so it'd match separately-pinned | ||
| 197 | `hyprland`/`hyprlock`/`hyprpicker`/`wpaperd` flake inputs (plus a | ||
| 198 | `ryan77627/nixGL` fork and a `rust-overlay` pin for wpaperd). Sharing | ||
| 199 | `common.nix` with the darwin config (which tracks home-manager master) | ||
| 200 | required moving Linux onto the same nixpkgs/home-manager as darwin. | ||
| 201 | |||
| 202 | The good news: current nixpkgs-unstable now packages `hyprland` (0.52.2), | ||
| 203 | `hyprlock`, `hypridle`, `hyprpicker`, `wpaperd`, `kanshi`, and `pyprland` | ||
| 204 | directly, so those five extra flake inputs (and the rust-overlay pin) are | ||
| 205 | gone entirely - `linux.nix` just uses `pkgs.hyprland` etc. Only two | ||
| 206 | Linux-specific flake inputs remain in `flake.nix`: | ||
| 207 | |||
| 208 | - `nixgl` (still needed - it exists specifically to patch Guix's mesa/GL | ||
| 209 | mismatch, unrelated to nixpkgs version) | ||
| 210 | - `clipboard-sync` (not in nixpkgs) | ||
| 211 | |||
| 212 | **Dropped**: the `hypr-dynamic-cursors` Hyprland plugin (animated cursor | ||
| 213 | trails). It has no nixpkgs package and pinning a matching flake input just | ||
| 214 | for one cosmetic plugin didn't seem worth the added re-pin risk. If you want | ||
| 215 | it back, add it as a flake input with `inputs.nixpkgs.follows = "nixpkgs"` | ||
| 216 | and pass it as a plugin in `wayland.windowManager.hyprland.plugins`. | ||
| 217 | |||
| 218 | **Dropped**: `mozff` (firefox-nightly flake) - unused. The | ||
| 219 | `firefox-nightly` module's package line was already commented out in the | ||
| 220 | guix config; it just configures `programs.firefox` (nixpkgs' own package). | ||
| 221 | |||
| 222 | **Cursor theme changed**: the vendored `Bibata-Modern-Classic-Hyprland` / | ||
| 223 | `Bibata-Modern-daed9-v1.0.2-x11` asset had oddly-versioned internal theme | ||
| 224 | names from however that release was originally packaged. Replaced with | ||
| 225 | nixpkgs' `bibata-cursors` (`home.pointerCursor` in `linux.nix`) - the | ||
| 226 | `HYPRCURSOR_THEME`/`XCURSOR_THEME` env vars in `hyprland.conf` were updated | ||
| 227 | to the plain name `Bibata-Modern-Classic` to match. nixpkgs' build doesn't | ||
| 228 | have a `-Hyprland`-suffixed hyprcursor variant; Hyprland falls back to | ||
| 229 | rendering the XCursor theme directly, which works fine, just without the | ||
| 230 | optional cleaner hyprcursor rendering path. | ||
| 231 | |||
| 232 | ## Verification note | ||
| 233 | |||
| 234 | `homeConfigurations.ryan` was checked with: | ||
| 235 | |||
| 236 | ``` | ||
| 237 | nix eval --raw .#homeConfigurations.ryan.activationPackage.drvPath | ||
| 238 | ``` | ||
| 239 | |||
| 240 | which forces full module evaluation (catches missing options and | ||
| 241 | darwin-only packages referenced on Linux) without building anything. | ||
| 242 | |||
| 243 | `darwinConfigurations.RyanMac` could not be evaluated on this machine (no | ||
| 244 | aarch64-darwin builder). It was verified by structural diff instead: | ||
| 245 | `flake.nix`'s darwin-facing inputs/outputs, `hosts/RyanMac/configuration.nix`, | ||
| 246 | and `modules/darwin/random-wallpaper` are unchanged from `nix-dotfiles`; | ||
| 247 | `common.nix`/`darwin.nix` reproduce `nix-dotfiles/users/ryan/home.nix` | ||
| 248 | line-for-line except where noted above. Please run | ||
| 249 | `darwin-rebuild build --flake .#RyanMac` yourself before switching for real. | ||
