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