#!/bin/bash

if [ $# -ne 2 ]; then
	echo "usage: $(basename $0) <reponame> <arch>"
	exit 1
fi

reponame=$1
arch=$2

##### Arch specific stuff. TODO make this configurable #####
ftppath="/srv/ftp/$reponame/os/$arch/"
ftppath_base="/srv/ftp/$reponame/os"
############################################################

if [ ! -d "$ftppath" ]; then
    echo "FTP path '$ftppath' does not exist"
    exit 1
fi

if [ ! -f /etc/makepkg.conf ]; then
    echo "/etc/makepkg.conf not found! Aborting"
    exit 1
fi

. /etc/makepkg.conf

getpkgname() {
	local tmp

	tmp=${1##*/}
	tmp=${tmp%$PKGEXT}
	tmp=${tmp%-$arch}
	echo ${tmp%-*-*}
}

getpkgname_ver() {
	local tmp

	tmp=${1##*/}
	tmp=${tmp%$PKGEXT}
	echo ${tmp%-$arch}
}

MISSINGFILES=""
DELETEFILES=""
EXTRAFILES=""

TMPDIR=$(mktemp -d /tmp/cleanup.XXXXXX) || exit 1

cd "${TMPDIR}"
/bin/tar xzf "$ftppath/$reponame.db.tar.$DB_COMPRESSION"

for pkg in *; do
  filename=$(grep -A1 '^%FILENAME%$' "${pkg}/desc" | tail -n1)
  [ -z "${filename}" ] && filename="${pkg}.pkg.tar.gz"

  if [ ! -f "${ftppath}/${filename}" ]; then
    MISSINGFILES="${MISSINGFILES} ${filename}"
  else
    pkgname="$(getpkgname ${filename})"
    for otherfile in ${ftppath}/${pkgname}-*; do
      otherfile="$(basename ${otherfile})"
      if [ "${otherfile}" != "${filename}" -a "${pkgname}" = "$(getpkgname ${otherfile})" ]; then
        DELETEFILES="${DELETEFILES} ${otherfile}"
      fi
    done
  fi
done

cd "$ftppath"
for pkg in *$PKGEXT; do
    pkgname="$(getpkgname $pkg)"
    for p in ${TMPDIR}/${pkgname}-*; do
        if [ -d "${p}" -a "$(getpkgname $(basename ${p}))" = "${pkgname}" ]; then
            continue 2
        fi
    done
    EXTRAFILES="$EXTRAFILES $pkg"
done 

cd "$ftppath_base/any"
for pkg in *$PKGEXT; do
	if [ ! -h $ftppath_base/i686/$pkg && ! -h $ftppath_base/x86_64/$pkg ]; then
		ARCHINDEPFILES="$ARCHINDEPFILES $pkg"
	fi
done

cd "$ftppath"
rm -rf ${TMPDIR}

#Make sure we've done *something* before outputting anything
if [ -z "$DELETEFILES$MISSINGFILES$EXTRAFILES$ARCHINDEPFILES" ]; then
    exit 0
fi

echo "Scan complete for $reponame ($arch) at ${ftppath}"

if [ -n "$DELETEFILES" ]; then
    echo "    The following files are out of date"
    echo "    They will be moved to /srv/package-cleanup"
    for f in $DELETEFILES; do
        echo "        $f"
    done
    echo ""
fi

if [ -n "$MISSINGFILES" ]; then
    echo "    The following files are missing in the repo"
    for f in $MISSINGFILES; do
        echo "        $f"
    done
    echo ""
fi

if [ -n "$EXTRAFILES" ]; then
    echo "    The following files are in the repo but not the db"
    echo "    They will be moved to /srv/package-cleanup"
    for f in $EXTRAFILES; do
        echo "        $f"
    done
fi

if [ -n "$ARCHINDEPFILES" ]; then
	echo "    The following architecture independent packages"
	echo "    are not symlinked in the architecture repositories."
	echo "    They will be moved to /srv/package/cleanup"
    for f in $ARCHINDEPFILES; do
        echo "        $f"
    done
fi

if [ -n "${DELETEFILES}" ]; then
    mv ${DELETEFILES} /srv/package-cleanup/
    echo ""
fi

if [ -n "${EXTRAFILES}" ]; then
    mv ${EXTRAFILES} /srv/package-cleanup/
    echo ""
fi

cd "$ftppath_base/any"
if [ -n "${ARCHINDEPFILES}" ]; then
    mv ${ARCHINDEPFILES} /srv/package-cleanup/
    echo ""
fi