dotfiles/symlinks/bin/aurfetch

251 lines
6.5 KiB
Bash
Executable File

#!/usr/bin/env bash
set -e
. ~/.config/sh-utils/echo.sh
usage () {
case $1 in
install)
usage_install; exit 0 ;;
uninstall)
usage_uninstall; exit 0 ;;
update)
usage_update; exit 0 ;;
update-all)
usage_update_all; exit 0 ;;
esac
if [ ! -z "$1" ]; then
echo -e "Unknown command: $1 \n"
fi
echo "Basic AUR (Arch User Repository) manager."
echo "Enables easy cloning of AUR packages into known location ($AUR_INSTALL_HOME) and installation using makepkg"
echo -e "\nUsage: aurfetch COMMAND [options] [arguments] \n"
echo "Commands:"
echo " install - installs a new AUR package, no-op if already installed"
echo " update - updates a previously installed AUR package, fails if not found"
echo " update-all - updates all previously installed AUR package"
echo " uninstall - uninstalls an AUR package"
echo ""
echo "Options:"
echo " -h --help - prints this help message (if one of commands is passed, prints help message for that command)"
echo " -v --verbose - enables verbose logging"
if [ ! -z "$1" ]; then
exit 1
fi
}
usage_install () {
echo "Aurfetch Install"
echo "Installs a new AUR package. If the pacakge is already installed, then nothing happens."
echo -e "\nUsage: aurfetch install [options] <package-name>\n"
echo "Arguments:"
echo " package-name - name of the package, use 'aursearch' to find packages"
echo ""
echo "Options:"
echo " -q --quick - skip PKGBUILD preview and install the package directly"
echo " -h --help - prints this help message"
echo " -v --verbose - enables verbose logging"
echov "Examples:"
echov " > aurfetch install neovim-rpc-api-explorer"
echov ""
}
usage_uninstall () {
echo "Aurfetch Uninstall"
echo "Uninstalls an AUR package. Fails if package was not found, but tries to clear cached download regardless."
echo -e "\nUsage: aurfetch uninstall [options] <package-name>\n"
echo "Arguments:"
echo " package-name - name of the package, use 'pacman -Qm' to find installed packages"
echo ""
echo "Options:"
echo " -k --keep-cache - keeps the repository in AUR download location, for quicker installation"
echo " -h --help - prints this help message"
echo " -v --verbose - enables verbose logging"
echov "Examples:"
echov " > aurfetch uninstall neovim-rpc-api-explorer"
echov ""
}
usage_update () {
echo "Aurfetch Update"
echo "Updates an AUR package. Fails if package is not installed (even if cache is present)."
echo -e "\nUsage: aurfetch update [options] <package-name>\n"
echo "Arguments:"
echo " package-name - name of the package, use 'pacman -Qm' to find installed packages"
echo ""
echo "Options:"
echo " -q --quick - skips diff previews"
echo " -h --help - prints this help message"
echo " -v --verbose - enables verbose logging"
echov "Examples:"
echov " > aurfetch update neovim-rpc-api-explorer"
echov ""
}
usage_update_all () {
echo "Aurfetch Update-all"
echo "Updates all installed AUR package."
echo -e "\nUsage: aurfetch update-all [options]\n"
echo ""
echo "Options:"
echo " -q --quick - skips diff previews"
echo " -h --help - prints this help message"
echo " -v --verbose - enables verbose logging"
echov "Examples:"
echov " > aurfetch update-all"
echov ""
}
POSITIONAL=()
QUICK=
HELP=0
VERBOSE=0
ALL=0
KEEP_CACHE=0
while [[ $# -gt 0 ]]; do
key="$1"
case $key in
-h|--help)
HELP=1
shift # past argument
;;
-v|--verbose)
VERBOSE=1
shift # past argument
;;
-q|--quick)
QUICK=1
shift # past argument
;;
-k|--keep-cache)
KEEP_CACHE=1
shift # past argument
;;
*) # unknown option
POSITIONAL+=("$1") # save it in an array for later
shift # past argument
;;
esac
done
COMMAND="${POSITIONAL[0]}"
echov "Detected command: $COMMAND"
if [ $HELP -eq 1 ]; then
usage $COMMAND
exit 0
fi
PACKAGE="${POSITIONAL[1]}"
echov "Detected package: $PACKAGE"
install() {
if [ "$PACKAGE" = "pacman -Qm $PACKAGE" ]; then
echo "$PACKAGE is already installed, exiting!"
exit 0
fi
LOC=$PWD
if [ ! -d "$AUR_INSTALL_HOME/$PACKAGE" ]; then
echov "Cloning package $PACKAGE to $AUR_INSTALL_HOME/$PACKAGE"
git clone https://aur.archlinux.org/$PACKAGE.git $AUR_INSTALL_HOME/$PACKAGE
fi
echov "Changing CWD to $AUR_INSTALL_HOME/$PACKAGE"
cd $AUR_INSTALL_HOME/$PACKAGE
if [ -z "$QUICK" ]; then
nvim PKGBUILD -c 'lua vim.notify("Exit with :q to accept this installation, or with :cq to abort")'
fi
echov "Running makepkg -si"
makepkg -si
echov "Coming back to $LOC"
cd $LOC
}
update() {
if [ ! "$PACKAGE" = "pacman -Qm $PACKAGE" ]; then
echo "$PACKAGE is not installed!"
exit 1
fi
LOC=$PWD
PKG_NAME=$1
EXISTING=1
if [ ! -d "$AUR_INSTALL_HOME/$PACKAGE" ]; then
EXISTING=0
echov "Cloning package $PACKAGE to $AUR_INSTALL_HOME/$PACKAGE"
git clone https://aur.archlinux.org/$PACKAGE.git $AUR_INSTALL_HOME/$PACKAGE
fi
echov "Changing CWD to $AUR_INSTALL_HOME/$PKG_NAME"
cd $AUR_INSTALL_HOME/$PKG_NAME
PREV_HEAD=$(git rev-parse HEAD)
git pull
if [ -z "$QUICK" ]; then
if [ $EXISTING -eq 1 ]; then
git difftool $PREV_HEAD
read -p "Accept these updates? [y/n]" ACCEPTED
if [ ! "$ACCEPTED" = "y" ]; then
echo "Exiting"
exit 1
fi
else
nvim PKGBUILD -c 'lua vim.notify("Exit with :q to accept this installation, or with :cq to abort")'
fi
fi
echov "Running makepkg -si"
makepkg -si
echov "Coming back to $LOC"
cd $LOC
}
update-all() {
PACKAGES=$(pacman -Qm)
for PAK in $PACKAGES; do
update $PAK
done
}
uninstall() {
if [ ! "$PACKAGE" = "pacman -Qm $PACKAGE" ]; then
echo "$PACKAGE is not installed!"
else
sudo pacman -Rns $PACKAGE
fi
echov "Removing package with pacman -Rns $PACKAGE"
if [ $KEEP_CACHE -eq 0 ]; then
echov "Deleting cache - $AUR_INSTALL_HOME/$PACKAGE"
if [ -d "$AUR_INSTALL_HOME/$PACKAGE" ]; then
rm -r "$AUR_INSTALL_HOME/$PACKAGE"
fi
fi
}
if [ -z "$PACKAGE" ] && [ "$COMMAND" != "update-all" ]; then
echo "Missing package name!"
exit 1
fi
if ! type pacman > /dev/null 2>&1
then
echo "Pacman is not installed. This tool should only be used on Arch Linux!"
exit 1
fi
case $COMMAND in
install)
install
;;
update)
update
;;
update-all)
update-all
;;
uninstall)
uninstall
;;
*)
usage $COMMAND; exit 1 ;;
esac