dotfiles/.chezmoiscripts/run_onchange_before_linux-install-packages.sh.tmpl

240 lines
8.3 KiB
Cheetah
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{{ if eq .chezmoi.os "linux" -}}
#!/bin/bash
{{/* **** unRoot Mode *************************************************** */ -}}
{{/* 如果強制設定unRoot */}}
{{/* 或是沒有.chezmoi.osRelease.id因為環境有可能是Synology極精簡環境直接視同unRoot Mode處理 */}}
{{ if or .unRootMode (not (hasKey .chezmoi.osRelease "id")) -}}
{{/* 部份已由.chezmoiexternal.toml處理了 */ -}}
{{/* 其他自訂手動安裝腳本: */ -}}
{{/* 手動安裝 zsh */ -}}
if ! command -v zsh &> /dev/null; then
sh -c "$(curl -fsSL https://raw.githubusercontent.com/romkatv/zsh-bin/master/install)" -- -d ~/.local -e no
fi
{{/* 手動安裝 tmux */ -}}
if ! command -v tmux &> /dev/null; then
curl -s https://api.github.com/repos/nelsonenzo/tmux-appimage/releases/latest \
| grep "browser_download_url.*appimage" \
| cut -d : -f 2,3 \
| tr -d \" \
| wget -qi - \
&& chmod +x tmux.appimage
## optionaly, move it into your $PATH
mv tmux.appimage ~/.local/bin/tmux
fi
{{/* 手動安裝 neovim 0.11.1 */ -}}
{{ if eq .chezmoi.arch "amd64"}}
if ! command -v nvim &> /dev/null; then
curl -LO https://github.com/neovim/neovim/releases/download/v0.11.1/nvim-linux-x86_64.appimage
chmod u+x nvim-linux-x86_64.appimage
./nvim-linux-x86_64.appimage --appimage-extract
cp -rf squashfs-root/usr/* ~/.local/
rm -r nvim-linux-x86_64.appimage squashfs-root
fi
{{ end }}
{{/* **** Root Mode ***************************************************** */ -}}
{{ else -}}
{{/* ==== Debian ======================================================== */ -}}
{{ if or (eq .chezmoi.osRelease.id "debian") (eq .chezmoi.osRelease.id "ubuntu") -}}
{{/* ---- 整理待安裝清單 -------------------------------------------------- */ -}}
{{- $aptInstall := .packages.linux.debian.apt -}}
{{- if eq .chezmoi.osRelease.versionCodename "trixie" -}}
{{- $aptInstall = concat .packages.linux.debian.apt .packages.linux.debian.apt_13 -}}
{{ else if and (eq .chezmoi.osRelease.id "debian") (hasKey .chezmoi.osRelease "versionID") (le .chezmoi.osRelease.versionID "12") }}
{{- $aptInstall = concat .packages.linux.debian.apt .packages.linux.debian.apt_12 -}}
{{- end -}}
{{ if eq .chezmoi.osRelease.id "ubuntu" -}}
{{- $aptInstall = .packages.linux.ubuntu.apt -}}
{{ end -}}
apt_packages=( {{ $aptInstall | quoteList | join " " }} )
to_install_apt=()
for package in "${apt_packages[@]}"; do
to_install_apt+=("$package")
done
echo " - Installing packages via apt: ${to_install_apt[@]}"
if [ "$EUID" -ne 0 ]; then
sudo apt install -y "${to_install_apt[@]}"
else
apt install -y "${to_install_apt[@]}"
fi
{{/* 手動安裝 neovim 0.11.1 */ -}}
{{ if and (eq .chezmoi.osRelease.id "debian") (eq .chezmoi.arch "amd64") (hasKey .chezmoi.osRelease "versionID") (le .chezmoi.osRelease.versionID "12") }}
curl -LO https://github.com/neovim/neovim/releases/download/v0.11.1/nvim-linux-x86_64.appimage
chmod u+x nvim-linux-x86_64.appimage
./nvim-linux-x86_64.appimage --appimage-extract
if [ "$EUID" -ne 0 ]; then
sudo cp -rf squashfs-root/usr/* /usr/
else
cp -rf squashfs-root/usr/* /usr/
fi
rm -r nvim-linux-x86_64.appimage squashfs-root
{{ end }}
{{/* 手動安裝 lazygit */ -}}
{{ if and (eq .chezmoi.osRelease.id "debian") (hasKey .chezmoi.osRelease "versionID") (le .chezmoi.osRelease.versionID "12") }}
LAZYGIT_VERSION=$(curl -s "https://api.github.com/repos/jesseduffield/lazygit/releases/latest" | \grep -Po '"tag_name": *"v\K[^"]*')
curl -Lo lazygit.tar.gz "https://github.com/jesseduffield/lazygit/releases/download/v${LAZYGIT_VERSION}/lazygit_${LAZYGIT_VERSION}_Linux_x86_64.tar.gz"
tar xf lazygit.tar.gz lazygit
if [ "$EUID" -ne 0 ]; then
sudo install lazygit -D -t /usr/local/bin/
else
install lazygit -D -t /usr/local/bin/
fi
rm -rf lazygit.tar.gz lazygit
{{ end -}}
{{ end }} {{/* if or (eq .chezmoi.osRelease.id "debian") (eq .chezmoi.osRelease.id "ubuntu") */}}
{{/* ==== Arch Linux / Manjaro ========================================== */ -}}
{{ if or (eq .chezmoi.osRelease.id "manjaro") (eq .chezmoi.osRelease.id "arch") -}}
{{/* ---- 整理待安裝清單 -------------------------------------------------- */ -}}
{{- $pacman_force := .packages.linux.arch.pacman_force -}}
{{- $pacmanInstall := .packages.linux.arch.pacman -}}
{{- $aurInstall := .packages.linux.arch.aur -}}
{{- if .noGUI -}}
{{- $pacmanInstall = concat .packages.linux.arch.pacman .packages.linux.arch.pacman_nogui -}}
{{- else -}}
{{- $pacmanInstall = concat .packages.linux.arch.pacman .packages.linux.arch.pacman_gui -}}
{{- $aurInstall = concat .packages.linux.arch.aur .packages.linux.arch.aur_gui -}}
{{- end -}}
{{ if eq .chezmoi.osRelease.id "manjaro" -}}
{{- $pacman_force = .packages.linux.manjaro.pacman_force -}}
{{- $pacmanInstall = .packages.linux.manjaro.pacman -}}
{{- $aurInstall = .packages.linux.manjaro.aur -}}
{{- if .noGUI -}}
{{- $pacmanInstall = concat .packages.linux.manjaro.pacman .packages.linux.manjaro.pacman_nogui -}}
{{- else -}}
{{- $pacmanInstall = concat .packages.linux.manjaro.pacman .packages.linux.manjaro.pacman_gui -}}
{{- $aurInstall = concat .packages.linux.manjaro.aur .packages.linux.manjaro.aur_gui -}}
{{- end -}}
{{ end -}}
{{/* ---- 安裝腳本 ------------------------------------------------------- */ -}}
{{- /* https://github.com/mriehl/dotfiles/blob/master/run_onchange_packages.sh.tmpl */ -}}
#!/usr/bin/env bash
wait_for_pacman_unlock() {
local LOCKFILE="/var/lib/pacman/db.lck"
local MAX_IDLE=10 # 如果沒有 pacman process最多等這麼久再自動移除殘留
local WAITED=0
echo "⏳ 檢查 pacman 鎖定中..."
while [ -e "$LOCKFILE" ]; do
if ! pgrep -x pacman >/dev/null && \
! pgrep -x packagekitd >/dev/null && \
! pgrep -x packagekit >/dev/null; then
echo "🔍 找不到 pacman 或 PackageKit疑似殘留鎖檔。"
if [ "$WAITED" -ge "$MAX_IDLE" ]; then
echo "🧹 自動移除殘留鎖檔(已閒置 $MAX_IDLE 秒)"
sudo rm -f "$LOCKFILE"
break
fi
WAITED=$((WAITED + 1))
fi
sleep 1
done
echo "✅ 鎖定解除,繼續執行。"
}
pacmanForce_packages=( {{ $pacman_force | quoteList | join " " }})
pacman_packages=( {{ $pacmanInstall | quoteList | join " " }} )
aur_packages=( {{ $aurInstall | quoteList | join " " }})
installed_packages=($(pacman -Qq))
is_installed() {
[[ " ${installed_packages[*]} " =~ " $1 " ]]
}
to_install_pacmanForce=()
for package in "${pacmanForce_packages[@]}"; do
to_install_pacmanForce+=("$package")
done
# 等待鎖定檔案被移除
wait_for_pacman_unlock
if [[ ${#to_install_pacmanForce[@]} -gt 0 ]]; then
echo " - Installing missing packages via pacman: ${to_install_pacmanForce[@]}"
sudo pacman -Sy --needed --noconfirm --overwrite \* "${to_install_pacmanForce[@]}"
else
sudo pacman -Sy
fi
# 等待鎖定檔案被移除
wait_for_pacman_unlock
to_install_pacman=()
for package in "${pacman_packages[@]}"; do
if ! is_installed "$package"; then
to_install_pacman+=("$package")
fi
done
if [[ ${#to_install_pacman[@]} -gt 0 ]]; then
echo " - Installing missing packages via pacman: ${to_install_pacman[@]}"
sudo pacman -S --needed --noconfirm --overwrite \* "${to_install_pacman[@]}"
fi
# 等待鎖定檔案被移除
wait_for_pacman_unlock
{{ if eq .chezmoi.osRelease.id "manjaro" -}}
if ! is_installed "yay"; then
echo " - Installing yay"
sudo pacman -S --needed --noconfirm yay
fi
{{ else -}}
if ! command -v yay &> /dev/null; then
if [ "$EUID" -ne 0 ]; then
git clone https://aur.archlinux.org/yay-bin.git && cd yay-bin && makepkg -si
else
mkdir -p /tmp/yay-build
useradd -m -G wheel builder && passwd -d builder
chown -R builder:builder /tmp/yay-build
echo 'builder ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers
su - builder -c "git clone https://aur.archlinux.org/yay-bin.git /tmp/yay-build/yay"
su - builder -c "cd /tmp/yay-build/yay && makepkg -si --noconfirm"
rm -rf /tmp/yay-build
fi
fi
{{ end -}}
to_install_aur=()
for package in "${aur_packages[@]}"; do
if ! is_installed "$package"; then
to_install_aur+=("$package")
fi
done
if [[ ${#to_install_aur[@]} -gt 0 ]]; then
echo " - Installing missing AUR packages via yay: ${to_install_aur[@]}"
yay -S --noconfirm "${to_install_aur[@]}"
fi
{{ end -}} {{/* if or (eq .chezmoi.osRelease.id "manjaro") (eq .chezmoi.osRelease.id "arch") */}}
{{ end -}} {{/* else .unRootMode */}}
{{ end -}} {{/* if eq .chezmoi.os "linux" */}}