blob: 94d4e272412767cb6937d183d95d3d2e06f62c49 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
#!/usr/bin/env bash
set -euo pipefail
REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
TMP_ERR="$(mktemp)"
trap 'rm -f "$TMP_ERR"' EXIT
# Packages whose config lives in a well-formed directory (stowable from repo root)
STOW_PKGS=(
darkman doom fastfetch foot gtk matugen mpv niri nvim rmpc starship
tmux vicinae wallust waybar xdg-desktop-portal yazi zshrc
)
# Empty portage dirs, recreated because git does not track empty directories
PORTAGE_EMPTY_DIRS=(
package.mask
postsync.d
profile/package.use.force
)
log() { printf '\033[1;32m[install]\033[0m %s\n' "$*"; }
warn() { printf '\033[1;33m[warn]\033[0m %s\n' "$*"; }
die() { printf '\033[1;31m[fatal]\033[0m %s\n' "$*" >&2; exit 1; }
run_root() {
if [[ $EUID -eq 0 ]]; then
"$@"
elif command -v sudo >/dev/null 2>&1; then
sudo "$@"
else
die "need root (use: $0 as root, or install sudo)"
fi
}
need_stow() {
if command -v stow >/dev/null 2>&1; then
log "GNU Stow found: $(stow --version 2>/dev/null | head -n1 || true)"
return
fi
warn "GNU Stow not installed — installing app-admin/stow"
run_root emerge --ask app-admin/stow
}
stow_dotfiles() {
cd "$REPO_DIR"
local ok=0 fail=0
for pkg in "${STOW_PKGS[@]}"; do
if [[ ! -d "$pkg" ]]; then
warn "package dir '$pkg' missing — skipped"
continue
fi
if stow -R -v "$pkg" >"$TMP_ERR" 2>&1; then
printf ' %s\n' "$(grep '^LINK' "$TMP_ERR" || true)"
ok=$((ok + 1))
else
warn "stow '$pkg' failed — resolve manually:"
sed 's/^/ /' "$TMP_ERR" || true
fail=$((fail + 1))
fi
done
log "stowed: $ok ok, $fail with conflicts"
}
restore_portage() {
log "copying /etc/portage config from repo"
run_root cp -a "$REPO_DIR/portage/etc/portage/." /etc/portage/
log "copying /var/lib/portage/world from repo"
run_root cp -a "$REPO_DIR/portage/var/lib/portage/world" /var/lib/portage/world
run_root find /etc/portage -type f -name .gitkeep -delete
for d in "${PORTAGE_EMPTY_DIRS[@]}"; do
run_root mkdir -p "/etc/portage/$d"
done
if [[ -f "$REPO_DIR/portage/PROFILE" ]]; then
local prof
prof="$(cat "$REPO_DIR/portage/PROFILE")"
log "linking /etc/portage/make.profile -> $prof"
run_root ln -snf "$prof" /etc/portage/make.profile
fi
}
restore_system_configs() {
log "installing /etc/fstab from repo"
run_root cp -a "$REPO_DIR/fstab/etc/fstab" /etc/fstab
if [[ -f "$REPO_DIR/config.toml" ]]; then
log "installing /etc/greetd/config.toml from repo"
run_root mkdir -p /etc/greetd
run_root cp -a "$REPO_DIR/config.toml" /etc/greetd/config.toml
fi
}
check_notes() {
if [[ ! -x "$HOME/.local/bin/start-niri.sh" ]]; then
warn "~/.local/bin/start-niri.sh not found; greetd (config.toml) and PATH reference it."
warn " create it manually or place it in a stowed package before the session is usable."
fi
if grep -q '/home/seraphim' "$REPO_DIR/config.toml" 2>/dev/null; then
warn "config.toml hardcodes /home/seraphim paths — adjust for your username if different."
fi
if grep -q '/march=znver3' "$REPO_DIR/portage/etc/portage/make.conf"; then
warn "make.conf targets Zen 3 (znver3) and CPU_FLAGS_X86 — review if other hardware."
fi
}
emerge_world() {
local ans
read -r -p "Run 'emerge --sync && emerge -uDN @world' now? [y/N] " ans
if [[ "${ans,,}" =~ ^y ]]; then
run_root emerge --sync
run_root emerge -uDN @world
else
log "skip — run manually: emerge --sync && emerge -uDN @world"
fi
}
main() {
need_stow
stow_dotfiles
restore_portage
restore_system_configs
check_notes
emerge_world
log "done."
}
main "$@"
|