summaryrefslogtreecommitdiff
path: root/buildrepo.in
diff options
context:
space:
mode:
Diffstat (limited to 'buildrepo.in')
-rwxr-xr-xbuildrepo.in133
1 files changed, 133 insertions, 0 deletions
diff --git a/buildrepo.in b/buildrepo.in
new file mode 100755
index 0000000..5b4133d
--- /dev/null
+++ b/buildrepo.in
@@ -0,0 +1,133 @@
+#!/bin/sh
+
+program=${0##*/}
+
+aportsdir=${APORTSDIR:-$HOME/aports}
+repodir=${REPODIR:-$HOME/packages}
+
+
+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 " -p Purge obsolete packages from REPODIR after build"
+ echo " -r Dependencies are found in DEPREPO"
+ exit 1
+}
+
+
+listpackages() {
+ cd "$aportsdir/$1"
+ for i in */APKBUILD; do
+ APKBUILD=$i abuild listpkg
+ done
+}
+
+build() {
+ local repo="$1" i indexupdate needbuild
+
+ cd "$aportsdir/$repo" || return 1
+ mkdir -p "$repodir/$repo"
+ if ! [ -f "$repodir/$repo"/APK_INDEX.gz ]; then
+ indexupdate="APK_INDEX.gz"
+ fi
+
+ # 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 i in */APKBUILD; do
+ export REPODEST="$repodir"
+ cd "$aportsdir/$repo"/${i%/*} || return 1
+ if abuild -k -q up2date 2>/dev/null; then
+ continue
+ fi
+
+ # try link or copy the files if they are in the ports dir
+ pkgs=$(abuild listpkg)
+ if cp -p -l $pkgs "$repodir/$repo"/ 2>/dev/null \
+ || cp -p $pkgs "$repodir/$repo"/ 2>/dev/null; then
+ echo ">>> Copying " $pkgs
+ else
+ needbuild="$needbuild $i"
+ fi
+ indexupdate="$indexupdate $i"
+ done
+
+ # build the postponed packages if any
+ if [ -n "$needbuild" ]; then
+ for i in $needbuild; do
+ cd "$aportsdir/$repo"/${i%/*} || return 1
+ abuild -k -R || return 1
+ done
+ fi
+
+ # kill old packages in repo
+ if [ -n "$dopurge" ]; then
+ local tmp=$(mktemp /tmp/$program-XXXXXX)
+ local purgefiles
+ cd "$repodir/$1" || return 1
+ trap 'rm -f "$tmp"; exit 1' INT
+ ( listpackages "$1") >$tmp
+ purge=$(ls *.apk 2>/dev/null | grep -v -w -f $tmp)
+ if [ -n "$purge" ]; then
+ rm -f $purge
+ indexupdate="$indexupdate $purge"
+ fi
+ rm -f "$tmp"
+ fi
+
+ # check if we have any .apk newer than our index
+ cd "$repodir/$repo"
+ if [ -z "$indexupdate" ]; then
+ for i in *.apk; do
+ if [ $i -nt APK_INDEX.gz ]; then
+ indexupdate=1
+ break;
+ fi
+ done
+ fi
+
+ # generate the repository index if needed
+ if [ -z "$indexupdate" ]; then
+ echo ">>> Index for $repo is up-to-date"
+ else
+ echo ">>> Generating Index for $repo..."
+ if which apk >/dev/null; then
+ local deps
+ for i in $deprepo; do
+ deps="--repo $repodir/$i"
+ done
+ apk $deps index *.apk | gzip -9 > APK_INDEX.gz
+ fi
+ fi
+}
+
+while getopts "a:d:hl:pr:" opt; do
+ case "$opt" in
+ a) aportsdir=$OPTARG;;
+ d) repodir=$OPTARG;;
+ h) usage >&2;;
+ 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
+ build $1 >$logprefix.$1.log 2>&1 || exit 1
+ else
+ build $1 || exit 1
+ fi
+ deprepo="$deprepo $1"
+ shift
+done
+