#!/bin/bash

TOPDIR=/usr/src/packages
test -d $BUILD_ROOT/.build.packages && TOPDIR=/.build.packages

function reorder {
    test -z "$*" && return
    rm -rf $BUILD_ROOT/.reorder
    mkdir -p $BUILD_ROOT/.reorder
    for RPM in "$@" ; do
        PKG=${RPM##*/}
        PKG=${PKG%-*-*.*.rpm}
        PKG=${PKG%.rpm}
        echo "$RPM" > $BUILD_ROOT/.reorder/$PKG
        REORDER_HAVE="$REORDER_HAVE ${RPM#$BUILD_ROOT}"
    done
    if test -x $BUILD_ROOT/usr/lib/rpm/rpmi ; then
        chroot $BUILD_ROOT bash -c "cd ${RPMCACHEDIR#$BUILD_ROOT} && rpm -Uvv --nosuggest --nodigest --nosignature --force --nodeps --test $REORDER_HAVE" 2>&1 | sed -n -e 's/-[^- ]*-[^- ]* / /' -e 's/^D:   install: \([^ ]*\) .*/\1/p' > $BUILD_ROOT/.reorder/.list
    else
        chroot $BUILD_ROOT bash -c "cd ${RPMCACHEDIR#$BUILD_ROOT} && rpm -Uvv --force --nodeps --test $REORDER_HAVE" 2>&1 | sed -n -e 's/-[^- ]*-[^- ]* / /' -e 's/^D: package: \([^ ]*\) .*/\1/p' > $BUILD_ROOT/.reorder/.list
    fi
    REORDER_HAVE=
    for PKG in `cat $BUILD_ROOT/.reorder/.list`; do
        test -e $BUILD_ROOT/.reorder/$PKG || continue
        REORDER_HAVE="$REORDER_HAVE `cat $BUILD_ROOT/.reorder/$PKG`"
        rm $BUILD_ROOT/.reorder/$PKG
    done
    for RPM in "$@" ; do
        PKG=${RPM##*/}
        PKG=${PKG%-*-*.*.rpm}
        PKG=${PKG%.rpm}
        test -e $BUILD_ROOT/.reorder/$PKG || continue
        REORDER_HAVE="$REORDER_HAVE $RPM"
        REORDER_MISSED="$REORDER_MISSED $PKG"
        rm $BUILD_ROOT/.reorder/$PKG
    done
    echo $REORDER_HAVE
} 

#make sure it is mounted
test -d $BUILD_ROOT/proc/sys || { echo "proc is not mounted"; exit 1; }

# test package removal
echo "... removing all built rpms"
export YAST_IS_RUNNING="instsys"
RPM_ERASE_LIST=
RPM_FILE_LIST=(`find $BUILD_ROOT$TOPDIR/RPMS -type f -name "*.rpm"`)

coreutils=`chroot $BUILD_ROOT rpm --qf '%{NAME}\n' -qf /usr/bin/{date,cat,rm,chown}|sort -u`
utillinux=`chroot $BUILD_ROOT rpm --qf '%{NAME}\n' -qf /usr/bin/su|sort -u`
findutils=`chroot $BUILD_ROOT rpm --qf '%{NAME}\n' -qf /usr/bin/find|sort -u`
gzip=`chroot $BUILD_ROOT rpm --qf '%{NAME}\n' -qf /usr/bin/gzip|sort -u`
cpio=`chroot $BUILD_ROOT rpm --qf '%{NAME}\n' -qf /usr/bin/cpio|sort -u`
shell=`chroot $BUILD_ROOT rpm --qf '%{NAME}\n' -qf /usr/bin/sh|sort -u`

for RPM in `reorder "${RPM_FILE_LIST[@]}"`; do
    PKG=${RPM##*/}
    PKG=${PKG%-*-*.*.rpm}
    PKG=${PKG%.rpm}
    # Do not remove installed packages
    test -e "$BUILD_ROOT/installed-pkg/$PKG" && continue
    # Do not remove packages that have a corresponding -mini installed (used to avoid cycles)
    test -e "$BUILD_ROOT/installed-pkg/$PKG-mini" && continue
    # Nor packages differing in the shlib version like libreadline5 vs.
    # libreadline6
    # libtool allows for version match like libbla-1_2-5 thus we should match
    # for it all possibilities and pass if the soname changed
    PKG1=${PKG//[0-9_-]/}[0-9]*
    if [[ `ls -1 $BUILD_ROOT/installed-pkg/$PKG1 2>/dev/null | wc -l ` -gt 0 ]]; then
        N=`ls -1 $BUILD_ROOT/installed-pkg/$PKG1 |head -n1`
	N=`basename $N`
	echo "(keeping $PKG because of $N)"
	continue
    fi
    # Do not remove libgcc/libstdc++/libgomp variants or rpm/rpm-build/rpm-ndb
    case ${PKG} in
    libgcc*|libgomp*|libstdc++*)
	;;
    $coreutils|$utillinux|$shell|$findutils|$gzip|$cpio)
	;;
    rpm|rpm-build|rpm-ndb)
	;;
    *)
	RPM_ERASE_LIST="$RPM_ERASE_LIST $PKG"
	;;
    esac
done
test -z "$REORDER_MISSED" || echo "    (reorder missed ${REORDER_MISSED% })"
if test -n "$RPM_ERASE_LIST" ; then
    echo "    (order: reverse$RPM_ERASE_LIST)"
    chroot $BUILD_ROOT rpm --noorder ${ADDITIONAL_PARAMS% --ignorearch} --nodeps -e $RPM_ERASE_LIST || {
	echo 'failed to remove rpms, aborting build'
	touch $BUILD_ROOT/not-ready
	exit 1
    }
fi

