Dotfiles
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

278 lines
7.5 KiB

10 years ago
#!/bin/zsh
9 years ago
# (c) 2014-2015 Taeyeon Mori
10 years ago
# vim: ft=sh:ts=2:sw=2:et
# Load libraries and configuraion
source "$DOTFILES/lib/libzsh-utils.zsh"
10 years ago
source "$DOTFILES/etc/aur.conf"
function throw {
err "$2"
exit $1
}
# ------------------------------------------------------------------------------
# Parse commandline: anything prefixed with - is a makepkg option, others are package names
9 years ago
packages=()
makepkg_args=()
aur_get=aur_get_aur4
9 years ago
DL_ONLY=false
ASK=false
AUR_HOST="https://aur.archlinux.org/"
ADD_UPDATES=false
RECURSE_DEPS=false
NEED_COWER=false
LIST_ONLY=false
add_makepkg_arg() {
makepkg_args=("${makepkg_args[@]}" "$1")
}
10 years ago
_proxy_args=0
_next_arg=
process_arg() {
local cx="$1"
if [ $_proxy_args -gt 0 ]; then
add_makepkg_arg "$cx"
_proxy_args=$[$_proxy_args - 1]
continue
fi
if [ -n "$_next_arg" ]; then
case "$_next_arg" in
--aur-host)
AUR_HOST="$cx";;
esac
_next_arg=
continue
fi
9 years ago
case "$cx" in
# aur.sh options
9 years ago
--old-aur)
warn "[AUR] Using old AUR methods (--old-aur)"
9 years ago
aur_get=aur_get_old;;
-X|--download-only)
warn "[AUR] Building was disabled (-X)"
DL_ONLY=true;;
--ask)
ASK=true;;
--aur-host) # need more args
_next_arg="$cx";;
-u|--update)
[ -n "$MODE" ] && throw 255 "Can only use one flag from the 'aur.sh command' category"
NEED_COWER=true
ADD_UPDATES=true;;
-S|--recurse-deps)
NEED_COWER=true
RECURSE_DEPS=true
add_makepkg_arg -is;;
-L|--list-only)
LIST_ONLY=true;;
9 years ago
-h|--help)
echo "Usage $0 [-h|-u] [-S] [-L|-X] [makepkg options] <packages>"
echo "Taeyeon's aur.sh (c) 2014-2015 Taeyeon Mori (not related to http://aur.sh)"
echo
echo "A simple AUR client realized in bash/zsh"
9 years ago
echo
echo "aur.sh options:"
echo " -h, --help Display this message"
echo " -u, --update Build all updated AUR packages [c]"
echo " -S, --recurse-deps"
echo " Recursively build & install all dependencies [c]"
echo " Implies -is"
echo " -L, --list-only"
echo " Only list all affected packages"
9 years ago
echo " -X, --download-only"
echo " Only download the PKGBUILDs from AUR, don't build."
echo " --aur-host <url>"
echo " Use a different AUR server. default: https://aur.archlinux.org/"
echo " --old-aur Use the old (non-git) AUR methods"
echo " --ask Ask before installing packages (removes --noconfirm)"
9 years ago
echo
echo "Useful makepkg options:"
echo " -i Install package after building it"
echo " -s Install dependencies from official repos"
echo " --pkg <list> Only build selected packages (when working with split packages)"
echo
echo "NOTE: options marked [c] require cower to be installed (\$ aur.sh -is cower)"
echo " However, certain cower-only features are automatically enabled when cower is found."
exit 0
9 years ago
;;
# Makepkg args
--pkg|--key|--config) # These take an additional value
_proxy_args=1
add_makepkg_arg "$cx";;
9 years ago
-*)
add_makepkg_arg "$cx";;
# Package names
9 years ago
*)
packages=("${packages[@]}" "$cx");;
esac
}
for cx in "$@"; do
case "$cx" in
--*)
process_arg "$cx";;
-*)
for c in `echo "${cx:1}" | grep -o .`; do
process_arg "-$c"
done;;
*)
process_arg "$cx";;
esac
9 years ago
done
if cower --version >/dev/null; then
NEED_COWER=true # Auto-enable cower support if installed.
elif $NEED_COWER; then
throw 31 "Options requiring cower have been selected but cower was not found."
else
warn "Could not detect cower on the system. Not all features are available without it."
warn "Specifically, split packages cannot be detected without cower."
fi
# -------------------------------------------------------------------------
9 years ago
# aur functions
aur_get_old() {
[ -d "$1/.git" ] && err "Local copy of $1 is a Git clone from AUR v4. Don't use --old-aur with it!" && return 32
curl "$AUR_HOST/packages/${1:0:2}/$1/$1.tar.gz" | tar xz
9 years ago
}
aur_get_aur4() {
if [ -d "$1/.git" ]; then (
cd "$1"
git pull
) else
if [ -e "$1" ]; then
warn "$1 PKGBUILD directory exists but is not a git clone."
ans=n
ask "Overwrite $1?" ans
[ "$ans" = "y" ] || [ "$ans" = "yes" ] || [ "$ans" = "Y" ] || return 32
rm -rf "$1"
9 years ago
fi
git clone "$AUR_HOST/$1.git" "$1"
9 years ago
fi
}
# ----------------------------------------------------------------------------
# Actual work starts here
# Print some info
10 years ago
msg "[AUR] AURDIR=$AURDIR; PKGDEST=$PKGDEST"
# Figure out build directory
if ! $DL_ONLY && ! $LIST_ONLY; then
tmpbuild=${TMPDIR-/tmp}/aur.sh.$$
build="${BUILDDIR:-$tmpbuild}"
test -d "$build" || mkdir -p "$build" || throw 1 "Couldn't create build directory"
test "$build" = "$PWD" || \
msg "[AUR] Working in $build."
msg "[AUR] Building packages: $packages"
if ! $ASK; then
msg "[AUR] Updating sudo timestamp"
sudo -v
add_makepkg_arg "--noconfirm"
fi
fi
if $ADD_UPDATES; then
[ -n "$packages" ] && throw 31 "You cannot specify package names when using --update"
OFS="$IFS"
IFS=$'\n'
for update in `cower -u`; do
packages=("${packages[@]}" "`echo $update | cut -d' ' -f1`")
done
IFS="$OFS"
fi
AFFECTED_PKGS=()
# Package processing
build_package() {
local p="$1" # package name
local COWER_INFO="$2"
if $NEED_COWER; then
[ -z "$COWER_INFO" ] && COWER_INFO=`cower -i $p`
info_grep() {
echo "$COWER_INFO" | grep "$@" | cut -d: -f2
}
local PACKBASE=`info_grep PackageBase | sed -e 's/^\s*//' -e 's/\s*$//'`
if [ -n "$PACKBASE" ]; then
color 35 echo "$p: Is a split package. Selecting base package '$PACKBASE' instead."
warn "Operations on specific sub-packages require the base package to be specified along with --pkg."
build_package "$PACKBASE" "`echo "$COWER_INFO" | grep -v PackageBase`"
return $?
fi
local DEPENDS=`info_grep -i depends`
if $RECURSE_DEPS; then
for dep in `echo $DEPENDS`; do
if ! pacman -Qi "$dep" >/dev/null 2>&1 && cower -i "$dep" >/dev/null 2>&1; then # Check if it's an (un-installed) aur package
color 35 echo "$p: Building AUR dependency '$dep'..."
build_package "$dep"
fi
done
fi
fi
AFFECTED_PKGS=("${AFFECTED_PKGS[@]}" "$p")
$LIST_ONLY && return
10 years ago
# First, download the PKGBUILD from AUR, to $AURDEST
cd "$AURDEST"
10 years ago
msg "[AUR] $p: Getting PKGBUILD"
{
test -d $p && \
test -f $p/PKGBUILD && \
grep -q "#CUSTOMPKG" $p/PKGBUILD && \
warn "[AUR] $p: Found #CUSTOMPKG; not updating PKGBUILD from AUR!" \
} || \
$aur_get "$p" || throw 2 "[AUR] $p: Couldn't download package"
10 years ago
$DL_ONLY && return
# Copy it to the build directory $build and change there
cp -Lr "$p" "$build"
cd "$build/$p"
10 years ago
# Update timestamp, but don't ask for pw if it expired
sudo -vn
# Run makepkg
10 years ago
msg "[AUR] $p: Building..."
makepkg "${makepkg_args[@]}" || \
10 years ago
throw 1 "[AUR] $p: Makepkg failed!"
msg "[AUR] $p: Done!"
}
# Process packages
for p in "${packages[@]}"; do
build_package "$p"
10 years ago
done
if $LIST_ONLY; then
echo "Affected Packages: `echo "${AFFECTED_PKGS[@]}" | sed 's/ /\n/g' | awk '!_[$0]++{printf "%s ",$0}'`"
else
msg "[AUR] All Done!"
fi
10 years ago
# Remove the builddir if we previously created it.
if ! $DL_ONLY && ! $LIST_ONLY; then
cd "$AURDEST"
[ "$build" = "$tmpbuild" ] && \
warn "[AUR] Removing temporary directory $tmpbuild" && \
rm -rf "$tmpbuild"
fi
10 years ago