#!/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] \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] \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] \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