-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsetup.sh
More file actions
executable file
·116 lines (95 loc) · 2.87 KB
/
setup.sh
File metadata and controls
executable file
·116 lines (95 loc) · 2.87 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
#!/usr/bin/env bash
## 1. 基础设置
set -euo pipefail
IFS=$'\n\t'
user=$(whoami)
# 设置脚本所在目录
path=$(cd "$(dirname "$0")" && pwd)
# 设置默认的软件包管理器(可通过环境变量 APM_BACKEND 覆盖)
apm="${apm:-yay}"
APM_BACKEND="${APM_BACKEND:-$apm}"
# 导入依赖方法
. "$path/func.sh"
## 2. 判断是否联网
if check_network; then
echo -e "\033[32mNetwork Connected! \033[0m"
else
echo -e "\033[31mNetwork Not Connected! \033[0m"
exit 1
fi
## 3. 配置 pacman 源和包管理后端
# 3.1 Archlinuxcn 源
if ! is_configured 'archlinuxcn' /etc/pacman.conf; then
echo '[archlinuxcn]
Server = https://mirrors.ustc.edu.cn/archlinuxcn/$arch' \
| sudo tee -a /etc/pacman.conf > /dev/null
sudo pacman -Sy && sudo pacman -S --noconfirm archlinuxcn-keyring
fi
# 3.2 如果不是 pacman 管理包,并且没有安装则安装该包管理器
if ! command -v "$APM_BACKEND" >/dev/null 2>&1; then
if [ "$APM_BACKEND" != "pacman" ]; then
sudo pacman -S --noconfirm "$APM_BACKEND"
fi
fi
# 3.3 封装包管理后端命令,处理 pacman 与 AUR helper 的差异
apm_sync() {
if [ "$APM_BACKEND" = "pacman" ]; then
sudo pacman -Sy
else
"$APM_BACKEND" -Sy
fi
}
apm_install() {
if [ "$APM_BACKEND" = "pacman" ]; then
# shellcheck disable=SC2086
sudo pacman -S --noconfirm --needed "$@"
else
# shellcheck disable=SC2086
"$APM_BACKEND" -S --noconfirm --needed "$@"
fi
}
apm_remove() {
if [ "$APM_BACKEND" = "pacman" ]; then
# shellcheck disable=SC2086
sudo pacman --noconfirm -Rns "$@"
else
# shellcheck disable=SC2086
"$APM_BACKEND" --noconfirm -Rns "$@"
fi
}
## 4. 比较软件包的异同进行安装或卸载
lock_file="${path}/.packages.lock"
desired_file="${path}/.packages.desired"
# 合并软件列表,每行一个包名,去重排序
parse_all_packages "${path}/packages.ini" "${path}"/packages.d/*.ini \
| sort -u >"$desired_file"
# 同步软件包数据库
apm_sync
if [ ! -s "$lock_file" ]; then
# 第一次执行:全量安装并生成 lock 文件
if [ -s "$desired_file" ]; then
# shellcheck disable=SC2046
apm_install $(cat "$desired_file")
fi
cp "$desired_file" "$lock_file"
else
# 后续执行:比对 lock 文件,找出新增和移除的软件包
added=$(comm -13 "$lock_file" "$desired_file" | xargs || true)
removed=$(comm -23 "$lock_file" "$desired_file" | xargs || true)
# 先删除再安装,避免包冲突
if [ -n "${removed:-}" ]; then
# shellcheck disable=SC2086
apm_remove $removed
fi
if [ -n "${added:-}" ]; then
# shellcheck disable=SC2086
apm_install $added
fi
cp "$desired_file" "$lock_file"
fi
## 5. 执行 conf.d 中的配置脚本
while IFS= read -r -d '' script; do
# 每个配置脚本都设计为可重复执行
# shellcheck disable=SC1090
source "$script"
done < <(find "${path}/conf.d/" -type f -name "*.sh" -print0)