mirror of
https://gitlab.alpinelinux.org/alpine/abuild.git
synced 2024-12-24 16:02:23 +00:00
7a447caf05
Otherwise we might end up purging more packages than expected if an APKBUILD has syntax errors
201 lines
4.2 KiB
Bash
Executable File
201 lines
4.2 KiB
Bash
Executable File
#!/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 " -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=
|
|
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=
|
|
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"
|
|
# 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
|
|
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: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
|
|
do_build $1 >$logprefix.$1.log 2>&1 || exit 1
|
|
else
|
|
do_build $1 || exit 1
|
|
fi
|
|
deprepo="$deprepo $1"
|
|
shift
|
|
done
|
|
|