From 15fde92d60f629beca40d89c413e1b870900e54e Mon Sep 17 00:00:00 2001 From: natemaia Date: Sat, 15 Sep 2018 21:19:32 -0700 Subject: [PATCH] Add AUR package helper to ~/bin --- home/bin/baph | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100755 home/bin/baph diff --git a/home/bin/baph b/home/bin/baph new file mode 100755 index 00000000..e5053f05 --- /dev/null +++ b/home/bin/baph @@ -0,0 +1,134 @@ +#!/bin/bash + +# Simple tool to update and install AUR packages for Arch Linux +# +# Written by Nathaniel Maia, September 2018 +# +# This software is provided free of charge and WITHOUT warranty + + +declare -g PKGS=() # array of AUR packages +declare -g NOVIEW=0 # view the PKGBUILD of each AUR package +declare -g NOCONF=0 # no confirmation after viewing the PKGBUILD +declare -g BDIR="$HOME/.cache/aur_builds" # AUR build directory +declare -g AUR="https://aur.archlinux.org" # AUR address + +readonly SCRIPT="$(readlink -f $0)" +readonly BASENAME="${0#*/}" + +usage() { + cat <<- EOF +B.A.P.H - Basic AUR Package Helper + +A simple and short script that allows installing and updating packages + +USAGE: $NAME [OPTIONS] [PACKAGE] + +OPTIONS: + --help,-h Display this message + --update,-u Update all AUR packages on the system + --noview,-n Skip viewing the PKGBUILD for AUR packages + --noconfirm Skip confirmation after viewing the PKGBUILD +EOF + exit 0 +} + +die() { + echo "$1" && exit ${2:-0} +} + +comp() { + old="$(pacman -Qs "^$1$" | awk 'NR==1 {print $2}')" + new="$(curl --silent $AUR/packages/$1 | awk '/Details:/ {sub(/<\/h.?>/, ""); print $4}')" + [[ "$old" == "$new" ]] && return 0 || return 1 +} + +buildp() { + local p="$1" + # evaluating the PKGBUILD could be dangerous but is short + # the user has either viewed and confirmed it or doesn't care and passed --noconfirm + eval "$(cat "$BDIR/$p/PKGBUILD")" + for d in ${depends[@]}; do + pacman -Ssq "^$d$" >/dev/null 2>&1 || $SCRIPT --noview --noconfirm "$d" + done + makepkg -sicr +} + +update() { + sudo pacman -Syyu + local installed + installed="$(pacman -Qqm 2>/dev/null)" + if [[ $installed ]]; then + echo "Info: Updating AUR packages" + for p in $(echo $installed); do + comp "$p" && echo "$p -> up to date" || $SCRIPT --noview --noconfirm "$p" + done + else + echo "Info: No AUR packages installed..." + fi + exit 0 +} + +install() { + local p="$1" + + if pacman -Qsq "^$p$" >/dev/null 2>&1; then + comp "$p" && echo "Warning: $p already installed and up to date" + fi + + rm -rf "$BDIR/$p" >/dev/null 2>&1 + mkdir -p "$BDIR/$p" + + if ! git clone $AUR/$p.git $BDIR/$p; then + die "Error: Git clone failed" 1 + elif [[ ! -e $BDIR/$p/PKGBUILD ]]; then + die "Error: $BDIR/$p is missing a PKGBUILD" 1 + else + cd "$BDIR/$p" + + if [[ $NOVIEW -eq 0 ]]; then + less -P " -- Viewing PKGBUILD for $p -- (press q to exit)" PKGBUILD + fi + + if [[ $NOCONF -eq 0 ]]; then + printf "\n\nDo you want to continue installing $p? [Y/n]: " && read -r conf + fi + + if [[ $NOCONF -eq 1 || $conf =~ [yY] ]]; then + buildp "$p" + else + echo "Info: Exiting $p build process early" + fi + + cd $HOME && rm -rf "$BDIR/$p" >/dev/null 2>&1 + fi +} + +if ! hash git curl >/dev/null 2>&1; then + die "Error: This requires git and curl installed" 1 +fi + +# command line arguments +for arg in $@; do case $arg in + --help|-h) usage ;; + --update|-u) update ;; + --noview|-n) NOVIEW=1 ;; + --noconfirm) NOCONF=1 ;; + *) PKGS+=($arg) +esac done + +if [[ ${#PKGS[@]} -eq 0 ]]; then + die "Error: Requires at least one package to install" 2 +else + for pkg in ${PKGS[@]}; do + if pacman -Ssq "^$pkg$" >/dev/null 2>&1; then + sudo pacman -S "$pkg" + elif curl --silent --head $AUR/packages/$pkg | head -n 1 | grep -q '200'; then + install "$pkg" + else + die "Error: Failed response from $AUR/packages/$pkg" 1 + fi + done +fi + +exit 0