dotfiles/bootstrap

147 lines
4.4 KiB
Bash
Executable file

#!/bin/sh
##region Sanity checks and "imports"
[ $ZI_DOTFILES ] && {
. $ZI_DOTFILES/common
} || {
[ -f ./common ] || { >&2 echo "Bootstrap should be ran directly from dotfiles directory ('./bootstrap'), or run './pre-bootstrap' before running bootstrap!"; exit 1; }
. ./common
}
[ $ZI_DOTFILES ] || {
ZI_DOTFILES=$PWD
echo "'./pre-bootstrap' was never ran before. This script will store '$PWD' in \$ZI_DOTFILES as helper variable for automation scripts."
prompt "Run it now? [y/N] " || { >&2 echo "You need to run './pre-bootstrap' before running bootstrap!"; exit 1; }
echo "======include/dotfiles======"
./pre-bootstrap -
echo "============================"
prompt "Set '$PWD' as dotfiles directory? [y/N] " || exit 1
./pre-bootstrap - > $ZI_DOTFILES/.config/zsh/include/dotfiles
}
[ -d $ZI_DOTFILES ] || { >&2 echo "Invalid dotfiles path, please re-run pre-bootstrap!"; exit 1; }
. $ZI_DOTFILES/bootstrap-pkgs
##endregion
##region Function and Variable
is_package_exists() {
[ $(command -v "$1" | wc -l) -gt 0 ] && return 0 || return 1
}
case "$OSTYPE" in
"darwin"* ) DISTRO="apple" ;;
* ) DISTRO="$(cat /etc/*-release | grep ^ID | head -n1 | cut -d '=' -f2 | cut -d '"' -f2)" ;;
esac
[ "$SUDO" = "" ] && {
FALLBACK_SUDO="sudo"
case $DISTRO in
"apple" ) SUDO=$FALLBACK_SUDO ;; # There's no good doas implementation for macOS
* )
is_package_exists doas && SUDO="doas" || SUDO=$FALLBACK_SUDO
doas echo "" >/dev/null 2>/dev/null || SUDO=$FALLBACK_SUDO
;;
esac
}
[ "$PACMAN" = "" ] && {
case $DISTRO in
"arch" ) PACMAN="pacman" ;;
"ubuntu" ) PACMAN="apt" ;;
"apple" ) PACMAN="apple" ;;
esac
}
AUR="${AUR:-paru}"
update_package_db() {
MSG_FAILED="Failed to update package database, skipping..."
case "$PACMAN" in
"pacman" ) $SUDO $PACMAN -Sy || echo $MSG_FAILED ;;
"apt" ) $SUDO $PACMAN -y update || echo $MSG_FAILED ;;
"apple" ) ;;
* ) echo "Not implemented, skipping..." ;;
esac
}
install_package() {
[ "$1" = "" ] && { echo "No package candidate is specified, skipping..."; return; }
MSG_FAILED="Failed to install some packages, skipping..."
case "$PACMAN" in
"pacman" ) $SUDO $PACMAN -S --noconfirm "$@" || echo $MSG_FAILED ;;
"apt" ) $SUDO $PACMAN -y install "$@" || echo $MSG_FAILED ;;
"apple" )
echo "Handled by nix. Read '.config/nix/README.md' for more information."
sleep 5
;;
* ) echo "Not implemented, skipping..." ;;
esac
}
install_aur_package() {
# >> Paranoia checks
[ $DISTRO = "arch" ] || { echo "AUR only available in Arch, skipping..."; return; }
is_package_exists $AUR || { echo "AUR helper '$AUR' is not installed, skipping..."; return; }
[ "$1" = "" ] && { echo "No AUR package candidate is specified, skipping..."; return; }
# <<
case "$AUR" in
"paru" ) $AUR -S --noconfirm --skipreview "$@" ;;
* ) $AUR -S --noconfirm "$@" ;;
esac
}
install_nix() {
is_package_exists nix && { echo "nix is already installed, skipping..."; return; }
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install
}
##endregion
echo "Linking x* configs..."
ln -si $ZI_DOTFILES/.config/xinitrc $HOME/.xinitrc
ln -si $ZI_DOTFILES/.config/xprofile $HOME/.xprofile
echo "Updating package database..."
update_package_db
echo "Installing common packages..."
install_package "${packages[@]}"
echo "Installing distro-specific packages..."
case $DISTRO in
"arch" )
install_package "${packages_arch[@]}"
echo "Installing AUR packages..."
install_aur_package "${packages_arch_aur[@]}"
;;
"ubuntu" ) install_package "${packages_ubuntu[@]}" ;;
* ) echo "Not implemented, skipping..." ;;
esac
echo "Installing nix..."
install_nix
echo "Changing default shell to zsh..."
$SUDO chsh -s $(which zsh)
echo "Configuring zsh to use XDG Base Directory..."
$SUDO $ZI_DOTFILES/zsh-xdg-setup
echo "Installing zsh config..."
ln -si $ZI_DOTFILES/.config/zsh $HOME/.config/zsh
is_package_exists doas && {
echo "Configuring doas..."
case "$OSTYPE" in
"darwin"* ) echo "permit persist :staff" > /tmp/doas.conf.tmp ;;
* ) echo "permit persist :wheel" > /tmp/doas.conf.tmp ;;
esac
echo "permit nopass root as root" >> /tmp/doas.conf.tmp
echo "=======/etc/doas.conf======="
cat /tmp/doas.conf.tmp
echo "============================"
$SUDO cp -i /tmp/doas.conf.tmp /etc/doas.conf
$SUDO ln -si /etc/doas.conf /usr/local/etc/doas.conf
}
echo "============================"
echo "Bootstrap completed, please restart your shell!"