diff --git a/symlinks/bin/aurfetch b/symlinks/bin/aurfetch index 2f49bb9..5f935e7 100755 --- a/symlinks/bin/aurfetch +++ b/symlinks/bin/aurfetch @@ -1,32 +1,223 @@ -#!/bin/bash +#!/usr/bin/env bash -# Quick install flag set -e -quick= +. ~/.config/sh-utils/echo.sh -while getopts q name -do - case $name in - q) quick=1;; - ?) echo "Usage: aurfetch [-q] packagename\n" - exit 2;; - esac +usage () { + case $1 in + install) + usage_install; exit 0 ;; + uninstall) + usage_uninstall; exit 0 ;; + update) + usage_update; 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 " 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 "" +} + +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 -# Move away from options -shift $(($OPTIND - 1)) +COMMAND="${POSITIONAL[0]}" -if [ -z "$1" ]; then - echo "Missing package name!" -else - LOC=$PWD - PKG_NAME=$1 - git clone https://aur.archlinux.org/$PKG_NAME.git $AUR_INSTALL_HOME/$PKG_NAME - cd $AUR_INSTALL_HOME/$PKG_NAME - if [ -z "$quick" ]; then - vim PKGBUILD - fi - makepkg -si - cd $LOC +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 +} + +uninstall() { + if [ ! "$PACKAGE" = "pacman -Qm $PACKAGE" ]; then + echo "$PACKAGE is not installed!" + exit 1 + fi + echov "Removing package with pacman -Rns $PACKAGE" + sudo 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" ]; 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 + ;; + uninstall) + uninstall + ;; + *) + usage $COMMAND; exit 1 ;; +esac diff --git a/symlinks/bin/clone-installation-from-directory b/symlinks/bin/clone-installation-from-directory index cc2c9b3..fd306c3 100755 --- a/symlinks/bin/clone-installation-from-directory +++ b/symlinks/bin/clone-installation-from-directory @@ -10,7 +10,7 @@ then echo "Installing packages from AUR using aurfetch..." while read p; do - aurfetch -q $p + aurfetch install -q $p done <$SELECTED_INSTALL_DIR/AUR fi diff --git a/symlinks/bin/lsp b/symlinks/bin/lsp index 82725e9..318e496 100755 --- a/symlinks/bin/lsp +++ b/symlinks/bin/lsp @@ -2,11 +2,7 @@ set -e -echov () { - if [ $VERBOSE -eq 1 ]; then - echo "$@" - fi -} +. ~/.config/sh-utils/echo.sh usage () { case $1 in @@ -101,7 +97,8 @@ usage_status () { echo " -v --verbose - enables verbose logging" echov "" echov "Examples:" - echov " > lsp status java " + echov " > lsp status java +" echov " Language java:" echov " Server google-java-format (UNKNOWN):" echov " Installed: true" @@ -109,7 +106,8 @@ usage_status () { echov " Location: /Users/ensar.sarajcic/lsp/java/google-java-format" echov " On path: false" echov "" - echov " > lsp status java --all " + echov " > lsp status java --all +" echov " Language java:" echov " Server google-java-format (UNKNOWN):" echov " Installed: true" diff --git a/symlinks/config/fish/completions/aurfetch.fish b/symlinks/config/fish/completions/aurfetch.fish index d27334d..b50fce8 100644 --- a/symlinks/config/fish/completions/aurfetch.fish +++ b/symlinks/config/fish/completions/aurfetch.fish @@ -1,6 +1,26 @@ -function __fish-aurfetch-list-plugins +function __fish-aurfetch-list-installable set -l search_string (commandline -t) aursearch $search_string end -complete -c aurfetch -x -a '(__fish-aurfetch-list-plugins)' +function __fish-aurfetch-list-installed + pacman -Qm +end + +complete -c aurfetch -x -l help -s h -d "print usage help" +complete -c aurfetch -x -l verbose -s v -d "verbose output" +complete -c aurfetch -x -n "__fish_use_subcommand" -a update -d "update an installed package" +complete -c aurfetch -x -n "__fish_use_subcommand" -a install -d "install a new package" +complete -c aurfetch -x -n "__fish_use_subcommand" -a uninstall -d "uninstall an installed package" + +# Install +complete -c aurfetch -x -n "__fish_seen_subcommand_from install" -l quick -s q -d "install without checking PKGBUILD" +complete -c aurfetch -x -n "__fish_seen_subcommand_from install" -a '(__fish-aurfetch-list-installable)' + +# Update +complete -c aurfetch -x -n "__fish_seen_subcommand_from update" -l quick -s q -d "update without checking diff" +complete -c aurfetch -x -n "__fish_seen_subcommand_from update" -a '(__fish-lsp-installed-servers)' + +# Uninstall +complete -c aurfetch -x -n "__fish_seen_subcommand_from uninstall" -l keep-cache -s k -d "keep AUR cache for quicker reinstall" +complete -c aurfetch -x -n "__fish_seen_subcommand_from uninstall" -a '(__fish-lsp-installed-servers)' diff --git a/symlinks/config/fish/completions/lsp.fish b/symlinks/config/fish/completions/lsp.fish index 3b49616..03feed0 100644 --- a/symlinks/config/fish/completions/lsp.fish +++ b/symlinks/config/fish/completions/lsp.fish @@ -1,5 +1,3 @@ -set -l commands status link install uninstall - function __fish-lsp-available-servers lsp status --all | grep 'Server.*:' | awk '{print $2}' | sed 's/[:,]//g' | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" end