#!/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 $(<$BUILD_ROOT/.reorder/.list); do
        test -e $BUILD_ROOT/.reorder/$PKG || continue
        REORDER_HAVE="$REORDER_HAVE $(<$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 -e $BUILD_ROOT/skipped-install-cross && {
    echo 'skipping removal of rpms, install was skipped'
    rm -f $BUILD_ROOT/skipped-install-cross
    exit 0
}

# 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" | LC_ALL=C sort`)

# essential deps that are needed by the build script to finish
ESSENTIAL_PKG_TO_KEEP=" $(chroot $BUILD_ROOT rpm --qf '%{NAME}\n' -qf /usr/bin/{date,cat,rm,chown,find,su,gzip,cpio,sh,mount,umount} /sbin/{swapon,swapoff} $(readlink -f /usr/bin/{date,cat,rm,chown,find,su,gzip,cpio,sh})|sort -u|xargs) "

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 essential packages
    case "$ESSENTIAL_PKG_TO_KEEP" in
    *" $PKG "*)
        ;;
    *)
        # Do not remove libgcc/libstdc++/libgomp variants or rpm/rpm-build/rpm-ndb
        case ${PKG} in
        libgcc*|libgomp*|libstdc++*)
            ;;
        bash-legacybin*|glibc-usrmerge-bootstrap-helper)
            ;;
        pam_unix*)
            ;;
        rpm|rpm-build|rpm-ndb)
            ;;
        *)
            RPM_ERASE_LIST="$RPM_ERASE_LIST $PKG"
            ;;
        esac
    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

