This repository has been archived on 2024-09-01. You can view files and clone it, but cannot push or open issues or pull requests.
al-skel/home/bin/baph
2018-09-15 21:19:32 -07:00

135 lines
3.6 KiB
Bash
Executable File

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