-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathinstall-packages.sh
More file actions
executable file
·128 lines (110 loc) · 3.93 KB
/
install-packages.sh
File metadata and controls
executable file
·128 lines (110 loc) · 3.93 KB
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
#!/usr/bin/env bash
# MIT License
#
# Copyright (c) 2025 Daniel Berg <mail@roosta.sh>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy of
# this software and associated documentation files (the “Software”), to deal in
# the Software without restriction, including without limitation the rights to
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
# of the Software, and to permit persons to whom the Software is furnished to do
# so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#
# Drafted May 2025 based on LLM suggestion (claude-3.7-sonnet)
# reviewed and edited by Daniel Berg <mail@roosta.sh>
#
# BEGIN_DOC
# ### [install-packages.sh](./install-packages.sh)
#
# Install packages from YAML configuration using paru. Will look for
# `~/.dependencies.yml` unless `[config.yml]` is provided.
#
# Requirements:
# - https://github.com/morganamilo/paru
# - https://github.com/kislyuk/yq
# - https://archlinux.org/
#
# Usage:
# ```sh
# ./install-packages.sh [config.yml]
# ```
#
# Example configuration:
# ```yml
# packages:
# # Core system utilities
# core:
# - name: cryptsetup
# description: Userspace setup tool for transparent encryption of block devices using dm-crypt
# aur: false
# - name: git
# description: The fast distributed version control system
# aur: false
# # ...
# ```
#
# For a full example of config refer to my [dotfile
# dependencies](https://github.com/roosta/dotfiles/blob/f40a9dbbab2e721d9ec63dd2f51be55701faf5ba/.dependencies.yml)
#
# > [!WARNING]
# > Work in progress
#
# License [MIT](./LICENSES/MIT-LICENSE.txt)
# END_DOC
set -euo pipefail
CONFIG_FILE="${1:-$HOME/.dependencies.yml}"
if [[ ! -f "$CONFIG_FILE" ]]; then
echo "Error: Config file '$CONFIG_FILE' not found."
exit 1
fi
if ! command -v yq &> /dev/null; then
echo "Error: yq is required but not installed."
echo "Please install it first with: paru -S yq"
exit 1
fi
if ! command -v paru &> /dev/null; then
echo "Error: paru is required but not installed."
echo "Please install it first: https://github.com/Morganamilo/paru#installation"
exit 1
fi
echo "🔍 Reading package configuration from $CONFIG_FILE..."
PACKAGE_JSON=$(yq < "$CONFIG_FILE")
CURRENT=0;
# Get all package categories
CATEGORIES=$(jq '.packages | keys | .[]' <<< "$PACKAGE_JSON")
# Count total packages for progress tracking
TOTAL_PACKAGES=$(jq '.packages.[] | .[] | length' <<< "$PACKAGE_JSON" | wc -l)
echo "📦 Found $TOTAL_PACKAGES packages to process across $(echo "$CATEGORIES" | wc -l) categories"
echo "⚙️ Starting installation..."
for category in $CATEGORIES; do
echo "🔹 Processing category: $category"
PACKAGES=$(jq ".packages.${category}" <<< "$PACKAGE_JSON")
csv=$(jq -r '.[]|[.name, .optional // false, .aur] | @tsv' <<< "$PACKAGES");
# Skip optional packages for now
while IFS=$'\t' read -r name optional _; do
if [[ "$optional" == "true" ]]; then
echo " ⏩ Skipping optional package: $name"
continue
fi
CURRENT=$((CURRENT + 1))
echo " 🔄 Installing package ($CURRENT/$TOTAL_PACKAGES): $name"
# Install the package with paru
if ! paru -S --needed --noconfirm "$name"; then
echo " ❌ Failed to install: $name"
else
echo " ✅ Successfully installed: $name"
fi
done <<< "$csv"
done
echo "🎉 Package installation completed!"