#!/bin/sh program=${0##*/} aportsdir=${APORTSDIR:-$HOME/aports} repodir=${REPODIR:-$HOME/packages} if [ -f /etc/abuild.conf ]; then . /etc/abuild.conf fi if [ -z "$CARCH" ]; then machine=$(uname -m) case $machine in i[3-9]86) CARCH=x86;; *) CARCH=$machine;; esac fi usage() { echo "usage: $program [-a APORTSDIR] [-d REPODIR] [-hp] [-l LOGPREFIX ]" echo " [-r DEPREPO] REPOSITORY..." echo "options:" echo " -a Set the aports base dir to APORTSDIR instead of $aportsdir" echo " -d Set destination repository base dir to REPODIR instead of $repodir" echo " -h Show this help and exit" echo " -l Send build to logfile, prefixed by LOGPREFIX" echo " -k Keep going, even if packages fails" echo " -p Purge obsolete packages from REPODIR after build" echo " -r Dependencies are found in DEPREPO" exit 1 } is_in() { local needle="$1" arg= shift for arg; do [ "$needle" = "$arg" ] && return 0 done return 1 } check_arch() { [ "$1" = "all" ] || [ "$1" = "noarch" ] || is_in "$CARCH" $@ } listpackages() { local repo="$1" i= pkgname= pkgver= pkgrel= subpackage= arch= subpkg= linguas= local lang= suffix= cd "$aportsdir/$repo" for i in */APKBUILD; do cd "$aportsdir/$repo"/${i%/*} || return 1 pkgname= pkgver= pkgrel=0 subpackages= arch= linguas= . ./APKBUILD suffix="$pkgver-r$pkgrel.apk" if ! check_arch $arch; then continue fi for subpkg in $pkgname $subpackages; do echo ${subpkg%:*}-$suffix done for lang in $linguas; do echo $pkgname-lang-$lang-$suffix done done } all_exist() { while [ $# -gt 0 ]; do [ -e "$1" ] || return 1 shift 1 done return 0 } list_needbuild() { local repo="$1" i= cd "$aportsdir/$repo" || return 0 # first we try copy everything possible and find out which we need # to rebuild. By doing this we might save us for rebuilding # needed when running 'abuild -R' for apkbuild in */APKBUILD; do [ -f "$aportsdir/$repo/$apkbuild" ] || continue export REPODEST="$repodir" cd "$aportsdir/$repo"/${apkbuild%/*} || return 1 pkgname= pkgver= pkgrel=0 subpackages= arch= . ./APKBUILD if ! check_arch $arch; then continue fi pkgs= for subpkg in $pkgname $subpackages; do pkgfile=${subpkg%:*}-$pkgver-r$pkgrel.apk if ! [ -f "$REPODEST/$repo/$CARCH/$pkgfile" ]; then pkgs="$pkgs $pkgfile" fi done if [ -z "$pkgs" ]; then continue fi # try link or copy the files if they are in the ports dir if all_exist $pkgs; then echo ">>> Copying " $pkgs >&2 cp -p -l $pkgs "$repodir/$repo/$CARCH"/ 2>/dev/null \ || cp -p $pkgs "$repodir/$repo/$CARCH"/ \ || echo "$apkbuild" else echo "$apkbuild" fi done } do_build() { local repo="$1" i= cd "$aportsdir/$repo" || return 0 local needbuild="$(list_needbuild $repo)" export REPODEST="$repodir" export ABUILD_BLACKLIST # build the postponed packages if any if [ -n "$needbuild" ]; then for i in $needbuild; do cd "$aportsdir/$repo"/${i%/*} || return 1 if ! abuild -k -R; then [ -n "$keep_going" ] || return 1 ABUILD_BLACKLIST="$ABUILD_BLACKLIST $i" fi done fi # kill old packages in repo if [ -n "$dopurge" ]; then echo ">>> Removing old packages from $repo..." local tmp=$(mktemp /tmp/$program-XXXXXX) local purgefiles cd "$repodir/$repo/$CARCH" || return 1 trap 'rm -f "$tmp"; exit 1' INT ( listpackages "$1") >$tmp || return 1 purge=$(ls *.apk 2>/dev/null | grep -v -w -f $tmp) if [ -n "$purge" ]; then rm -f $purge fi rm -f "$tmp" fi # generate the repository index echo ">>> Generating Index for $repo..." cd "$repodir/$repo/$CARCH" local deps for i in $deprepo; do deps="--repo $repodir/$i" done oldindex= if [ -f APKINDEX.tar.gz ]; then oldindex="--index APKINDEX.tar.gz" fi tmpindex=$(mktemp).tar.gz apk index --rewrite-arch $CARCH $oldindex -o $tmpindex \ --description "$repo $(cd $aportsdir && git describe)" \ -- *.apk abuild-sign $tmpindex && mv $tmpindex APKINDEX.tar.gz chmod 644 APKINDEX.tar.gz rm -f tmp.* } while getopts "a:d:hkl:pr:" opt; do case "$opt" in a) aportsdir=$OPTARG;; d) repodir=$OPTARG;; h) usage >&2;; k) keep_going=1;; l) logprefix=$OPTARG;; p) dopurge=1;; r) deprepo="$deprepo $OPTARG";; esac done shift $(($OPTIND - 1)) [ $# -eq 0 ] && usage >&2 while [ $# -gt 0 ]; do if [ -n "$logprefix" ]; then do_build $1 >$logprefix.$1.log 2>&1 || exit 1 else do_build $1 || exit 1 fi deprepo="$deprepo $1" shift done