Files
auto.s/auto.
2024-08-10 02:41:22 -04:00

200 lines
4.8 KiB
Bash
Executable File

#!/bin/sh
# defaults
topography=.topography
help() {
printf "Usage: auto. [OPTION]\n\
-t,\tspecify the topography of your dotfiles (default: .topography)\n\
-i,\tinstall dotfiles specified by -t\n\
-u,\tuninstall dotfiles specified by -t\n\
-b,\texit as soon as a command errors\n\
-h,\tshows help text\n"
exit 0
}
# setup package management util
for file in\
/etc/os-release\
/etc/lsb-release\
/usr/lib/os-release\
/etc/openwrt_release
do
[ -f "$file" ] && . "$file" && break
done
#######################################
# do root - runs a command as root
# Arguments:
# ... command
#######################################
dort() {
if [ -x /bin/doas ] && [ -f /etc/doas.conf ]; then
doas "$@"
elif [ -x /bin/sudo ]; then
sudo "$@"
fi
}
case "$ID" in
void)
pkg_man=xbps
pkg_install() {
[ -z "$*" ] && return 1
printf "\033[31mRunning: xbps-install -y -- %s\033[m\n" "$*"
dort xbps-install -y -- $*
}
pkg_uninstall() {
[ -z "$*" ] && return 1
printf "\033[31mRunning: xbps-remove -Roy -- %s\033[m\n" "$*"
dort xbps-remove -Roy -- $*
}
pkg_search() {
xbps-query --search= | fzf -f "$1" | head -1 | cut -d ' ' -f 2
}
;;
arch)
pkg_man=pacman
pkg_install() {
[ -z "$*" ] && return 1
printf "\033[31mRunning: pacman -s --noconfirm -- %s\033[m\n" "$*"
dort pacman -S --noconfirm -- $*
}
pkg_uninstall() {
[ -z "$*" ] && return 1
printf "\033[31mRunning: pacman -Runs --noconfirm -- %s\033[m\n" "$*"
dort pacman -Runs --noconfirm -- $*
}
pkg_search() {
pacman -Slq | fzf -f "$1" | head -1
}
;;
pop|debian|ubuntu)
pkg_man=apt
pkg_install() {
[ -z "$*" ] && return 1
printf "\033[31mRunning: apt-get install -y -- %s\033[m\n" "$*"
dort apt-get install -y -- $*
}
pkg_uninstall() {
[ -z "$*" ] && return 1
printf "\033[31mRunning: apt-get purge --autoremove -y -- %s\033[m\n" "$*"
dort apt-get purge --autoremove -y -- $*
}
pkg_search() {
apt list | fzf -f "$1" | head -1 | cut -d '/' -f 1
}
;;
esac
# parse command line options
while getopts :biuht: c; do
case $c in
t)
topography="${OPTARG}"
[ ! -f "$topography" ] &&\
printf "invalid topography file\n" &&\
exit 1
;;
# only install if not already uninstalling
i) [ -z $uninstall ] && install=1 ;;
# only uninstall if not already installing
u) [ -z $install ] && uninstall=1 ;;
b)
set -e
bailout() {
[ $? -eq 0 ] && return # don't run when the script ends successfully
printf "\033[31mlast command failed, bailing out!\033[m\n"
}
trap bailout EXIT
;;
h|*) help ;;
esac
done
[ ! -f "$topography" ] &&\
printf "no '.topography' file found\n" &&\
exit 1
[ -z $install ] && [ -z $uninstall ] &&\
printf "no action specified\n" &&\
help
# parse topography file line by line
while read -r line || return 0; do
# skip lines starting with a # (comments)
if [ "$(printf "%s" "$line" | head -c1)" = "#" ]; then
continue
# run a command
elif [ "$(printf "%s" "$line" | head -c2)" = '$$' ]; then
eval "${line##*\$\$}"
# install/uninstall a package if on a supported distro
elif [ "$(printf "%s" "$line" | head -c2)" = '::' ] && [ -n "$pkg_man" ]; then
# get line without prefix
s=${line##*\:\:}
# get number of packages specified
npkgs=$(printf "%s" "$s" | grep -o ',' | wc -l)
npkgs=$((npkgs + 2))
i=1
while [ $i -lt $npkgs ]; do
pkgname="$(printf "%s" "$s" | cut -d ',' -f $i)"
pkg=$(pkg_search "$pkgname")
[ $install ] && ipkgs=${ipkgs:+$ipkgs }$pkg
[ $uninstall ] && upkgs=${upkgs:+$upkgs }$pkg
i=$((i + 1))
done
pkg_install $ipkgs
pkg_uninstall $upkgs
# remove/add a file
elif printf "%s" "$line" | grep -q -- "->"; then
# get the path of the file
sourcef=$(eval echo "${line%% *->*}")
# get the destination for the file
destf=$(eval echo "${line##*->* }")
# install/uninstall
if printf "%s" "$line" | grep -q -- "#->"; then
[ $install ] && dort cp -rv -- "$sourcef" "$destf"
[ $uninstall ] && dort rm -rv -- "$destf"
else
[ $install ] && cp -rv -- "$sourcef" "$destf"
[ $uninstall ] && rm -rv -- "$destf"
fi
# remove/link a file
elif printf "%s" "$line" | grep -q -- "~>"; then
# get the path of the file
sourcef=$(eval echo "${line%% *->*}")
# get the destination for the file
destf=$(eval echo "${line##*->* }")
# install/uninstall
if printf "%s" "$line" | grep -q -- "#~>"; then
[ $install ] && dort ln -sv -- "$sourcef" "$destf"
[ $uninstall ] && dort rm -v -- "$destf"
else
[ $install ] && ln -sv -- "$sourcef" "$destf"
[ $uninstall ] && rm -rv -- "$destf"
fi
fi
done < "$topography"