lib/deps.sh

6.9 KB · 240 lines · bash

1#!/usr/bin/env bash
2
3BRT_DEPS_MANIFEST="${HOME}/.brt/installed-deps"
4
5# Auto-installed on setup
6BRT_AUTO_DEP_CMDS=(mpv chafa yt-dlp)
7# Optional — installed only with BRT_FULL_DEPS=1
8BRT_OPTIONAL_DEP_CMDS=(ffmpeg)
9
10brt_deps_info() {
11 if declare -f brt_info &>/dev/null; then brt_info "$@"; else printf '\033[36m●\033[0m %s\n' "$*"; fi
12}
13
14brt_deps_ok() {
15 if declare -f brt_ok &>/dev/null; then brt_ok "$@"; else printf '\033[32m✓\033[0m %s\n' "$*"; fi
16}
17
18brt_deps_warn() {
19 if declare -f brt_warn &>/dev/null; then brt_warn "$@"; else printf '\033[33m!\033[0m %s\n' "$*" >&2; fi
20}
21
22brt_deps_record() {
23 local mgr="$1"
24 shift
25 local pkg
26
27 [[ $# -gt 0 ]] || return 0
28 mkdir -p "${HOME}/.brt"
29 touch "$BRT_DEPS_MANIFEST"
30
31 for pkg in "$@"; do
32 [[ -n "$pkg" ]] || continue
33 grep -qxF "${mgr}:${pkg}" "$BRT_DEPS_MANIFEST" 2>/dev/null && continue
34 echo "${mgr}:${pkg}" >> "$BRT_DEPS_MANIFEST"
35 done
36}
37
38brt_deps_missing_cmds() {
39 local -a list=("$@")
40 local cmd
41 local -a out=()
42 for cmd in "${list[@]}"; do
43 command -v "$cmd" &>/dev/null || out+=("$cmd")
44 done
45 ((${#out[@]})) && printf '%s\n' "${out[@]}"
46}
47
48brt_deps_install_pkgs() {
49 local mgr="$1"
50 shift
51 local -a pkgs=()
52
53 while [[ $# -gt 0 ]]; do
54 pkgs+=("$1")
55 shift
56 done
57
58 ((${#pkgs[@]} == 0)) && return 0
59
60 case "$mgr" in
61 brew)
62 brt_deps_info "Installing via Homebrew: ${pkgs[*]}"
63 brew install "${pkgs[@]}" && brt_deps_record brew "${pkgs[@]}"
64 ;;
65 apt)
66 brt_deps_info "Installing via apt: ${pkgs[*]}"
67 sudo apt-get update -qq
68 sudo apt-get install -y "${pkgs[@]}" && brt_deps_record apt "${pkgs[@]}"
69 ;;
70 dnf)
71 brt_deps_info "Installing via dnf: ${pkgs[*]}"
72 sudo dnf install -y "${pkgs[@]}" && brt_deps_record dnf "${pkgs[@]}"
73 ;;
74 pacman)
75 brt_deps_info "Installing via pacman: ${pkgs[*]}"
76 sudo pacman -S --noconfirm "${pkgs[@]}" && brt_deps_record pacman "${pkgs[@]}"
77 ;;
78 zypper)
79 brt_deps_info "Installing via zypper: ${pkgs[*]}"
80 sudo zypper install -y "${pkgs[@]}" && brt_deps_record zypper "${pkgs[@]}"
81 ;;
82 esac
83}
84
85brt_install_media_dependencies() {
86 local -a auto_missing=() optional_missing=() to_install=()
87 local cmd mgr pkgs_line
88
89 brt_deps_info "Checking media dependencies..."
90
91 while IFS= read -r cmd; do
92 [[ -n "$cmd" ]] && auto_missing+=("$cmd")
93 done < <(brt_deps_missing_cmds "${BRT_AUTO_DEP_CMDS[@]}")
94
95 while IFS= read -r cmd; do
96 [[ -n "$cmd" ]] && optional_missing+=("$cmd")
97 done < <(brt_deps_missing_cmds "${BRT_OPTIONAL_DEP_CMDS[@]}")
98
99 if [[ "${BRT_FULL_DEPS:-}" == "1" ]]; then
100 to_install=()
101 brt_arr_append to_install auto_missing
102 brt_arr_append to_install optional_missing
103 else
104 to_install=()
105 brt_arr_append to_install auto_missing
106 fi
107
108 if ((${#to_install[@]} == 0)); then
109 if ((${#optional_missing[@]} == 0)); then
110 brt_deps_ok "Media dependencies ready"
111 else
112 brt_deps_ok "Required media tools ready"
113 brt_deps_info "Optional (install when needed): ${optional_missing[*]}"
114 fi
115 return 0
116 fi
117
118 if [[ "${BRT_SKIP_DEPS:-}" == "1" ]]; then
119 brt_deps_warn "Missing media tools: ${to_install[*]} (set BRT_SKIP_DEPS=0 to auto-install)"
120 return 0
121 fi
122
123 pkgs_line="${to_install[*]}"
124
125 if command -v brew &>/dev/null; then
126 if brt_deps_install_pkgs brew "${to_install[@]}"; then
127 :
128 else
129 brt_deps_warn "Some Homebrew packages failed to install"
130 fi
131 ((${#optional_missing[@]} > 0 && "${BRT_FULL_DEPS:-}" != "1")) \
132 && brt_deps_info "Optional later: ${optional_missing[*]} (brew install …, or BRT_FULL_DEPS=1)"
133 return 0
134 fi
135
136 if command -v apt-get &>/dev/null && command -v sudo &>/dev/null; then
137 brt_deps_install_pkgs apt "${to_install[@]}" || brt_deps_warn "apt install failed"
138 return 0
139 fi
140
141 if command -v dnf &>/dev/null && command -v sudo &>/dev/null; then
142 brt_deps_install_pkgs dnf "${to_install[@]}" || brt_deps_warn "dnf install failed"
143 return 0
144 fi
145
146 if command -v pacman &>/dev/null && command -v sudo &>/dev/null; then
147 brt_deps_install_pkgs pacman "${to_install[@]}" || brt_deps_warn "pacman install failed"
148 return 0
149 fi
150
151 if command -v zypper &>/dev/null && command -v sudo &>/dev/null; then
152 brt_deps_install_pkgs zypper "${to_install[@]}" || brt_deps_warn "zypper install failed"
153 return 0
154 fi
155
156 brt_deps_warn "Could not detect a package manager. Install manually: ${pkgs_line}"
157}
158
159brt_uninstall_media_dependencies() {
160 local line mgr pkg removed=0
161
162 [[ -f "$BRT_DEPS_MANIFEST" ]] || return 0
163
164 brt_deps_info "Removing packages installed by brt..."
165
166 while IFS= read -r line || [[ -n "$line" ]]; do
167 [[ -z "$line" || "$line" == \#* ]] && continue
168 mgr="${line%%:*}"
169 pkg="${line#*:}"
170 [[ -n "$mgr" && -n "$pkg" && "$mgr" != "$pkg" ]] || continue
171
172 case "$mgr" in
173 brew)
174 if command -v brew &>/dev/null && brew list --formula "$pkg" &>/dev/null; then
175 if brew uninstall "$pkg" 2>/dev/null; then
176 brt_deps_ok "Removed ${pkg} (Homebrew)"
177 ((removed++)) || true
178 else
179 brt_deps_warn "Could not remove ${pkg} (Homebrew)"
180 fi
181 fi
182 ;;
183 apt)
184 if command -v apt-get &>/dev/null && command -v sudo &>/dev/null; then
185 if dpkg -l "$pkg" 2>/dev/null | grep -q '^ii'; then
186 if sudo apt-get remove -y "$pkg" &>/dev/null; then
187 brt_deps_ok "Removed ${pkg} (apt)"
188 ((removed++)) || true
189 else
190 brt_deps_warn "Could not remove ${pkg} (apt)"
191 fi
192 fi
193 fi
194 ;;
195 dnf)
196 if command -v dnf &>/dev/null && command -v sudo &>/dev/null; then
197 if rpm -q "$pkg" &>/dev/null; then
198 if sudo dnf remove -y "$pkg" &>/dev/null; then
199 brt_deps_ok "Removed ${pkg} (dnf)"
200 ((removed++)) || true
201 else
202 brt_deps_warn "Could not remove ${pkg} (dnf)"
203 fi
204 fi
205 fi
206 ;;
207 pacman)
208 if command -v pacman &>/dev/null && command -v sudo &>/dev/null; then
209 if pacman -Q "$pkg" &>/dev/null; then
210 if sudo pacman -R --noconfirm "$pkg" &>/dev/null; then
211 brt_deps_ok "Removed ${pkg} (pacman)"
212 ((removed++)) || true
213 else
214 brt_deps_warn "Could not remove ${pkg} (pacman)"
215 fi
216 fi
217 fi
218 ;;
219 zypper)
220 if command -v zypper &>/dev/null && command -v sudo &>/dev/null; then
221 if rpm -q "$pkg" &>/dev/null; then
222 if sudo zypper remove -y "$pkg" &>/dev/null; then
223 brt_deps_ok "Removed ${pkg} (zypper)"
224 ((removed++)) || true
225 else
226 brt_deps_warn "Could not remove ${pkg} (zypper)"
227 fi
228 fi
229 fi
230 ;;
231 esac
232 done < "$BRT_DEPS_MANIFEST"
233
234 rm -f "$BRT_DEPS_MANIFEST"
235
236 if [[ "$removed" -eq 0 ]]; then
237 brt_deps_info "No tracked packages to remove"
238 fi
239}
240