summaryrefslogtreecommitdiff
path: root/install.sh
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 "$@"