#!/bin/bash

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

reponame=$1

############################################################

. "$(dirname $0)/../db-functions"
. "$(dirname $0)/../config"

cleanup() {
  trap '' 2 15
  for arch in ${ARCHES[@]}; do
    repo_unlock $reponame $arch
  done
  exit 1
}

trap cleanup 2
trap cleanup 15

${CLEANUP_DRYRUN} && echo 'dry run mode is active'

ftppath_base="$FTP_BASE/$reponame/os"

for arch in ${ARCHES[@]}; do

  repo_lock $reponame $arch $LOCK_TIMEOUT || continue

  CLEANUP_TMPDIR=$(mktemp -d ${TMPDIR}/cleanup-XXXXXX) || exit 1
  ftppath="$ftppath_base/$arch"
  MISSINGFILES=""
  DELETEFILES=""
  DELETESYMLINKS=""
  EXTRAFILES=""

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

  if ! cd "${CLEANUP_TMPDIR}" ; then
      echo "Failed to cd to ${CLEANUP_TMPDIR}"
      exit 1
  fi

  if [ ! -f "$ftppath/$reponame$DBEXT" ]; then
    echo ""
    echo "ERROR: The file \"$ftppath/$reponame$DBEXT\" could not be found, aborting."
    echo ""
    exit 1
  fi

  if ! bsdtar xf "$ftppath/$reponame$DBEXT"; then
    echo ""
    echo "ERROR: Command failed: bsdtar xf \"$ftppath/$reponame$DBEXT\""
    exit 1
  fi

  cd "$ftppath"

  for pkg in $CLEANUP_TMPDIR/*; do
    [ -f "${pkg}" ] || continue
    filename=$(grep -A1 '^%FILENAME%$' "${pkg}/desc" | tail -n1)

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

  for pkg in *$PKGEXT; do
      if [ ! -e "$pkg" ]; then
          continue
      fi
      pkgname="$(getpkgname $pkg)"
      for p in ${CLEANUP_TMPDIR}/${pkgname}-*; do
          [ ! -d "${p}" ] || continue 2
          dbpkgname=$(grep -A1 '^%FILENAME%$' "${p}/desc" 2>/dev/null| tail -n1)
          if [ "${dbpkgname}" = "${pkgname}" ]; then
              continue 2
          fi
      done
      EXTRAFILES="$EXTRAFILES $pkg"
  done

  rm -rf ${CLEANUP_TMPDIR}

  # Do a quick check to see if a missing ARCHINDEPFILE is in the any dir
  # If it is, and the file is MISSING, restore it
  missfiles="$MISSINGFILES"
  MISSINGFILES=""
  for mf in $missfiles; do
      if [ -e "${ftppath_base}/any/${mf}" ]; then
          echo "Restoring missing 'any' symlink: ${mf}"
          ${CLEANUP_DRYRUN} || ln -s "../any/${mf}" "${ftppath}"
      else
          MISSINGFILES="${MISSINGFILES} ${mf}"
      fi
  done

  repo_unlock $reponame $arch

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

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

  if [ -n "$DELETEFILES" ]; then
      echo "    The following files are out of date"
      for f in $DELETEFILES; do
          echo "        $f"
      done
      echo ""
  fi

  if [ -n "$DELETESYMLINKS" ]; then
      echo "    The following symlinks are out of date"
      echo "    They will be deleted"
      for f in $DELETESYMLINKS; 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"
      for f in $EXTRAFILES; do
          echo "        $f"
      done
  fi

  if [ -n "${DELETEFILES}" ]; then
      ${CLEANUP_DRYRUN} || rm -f ${DELETEFILES}
      echo ""
  fi

  if [ -n "${DELETESYMLINKS}" ]; then
      ${CLEANUP_DRYRUN} || rm -f ${DELETESYMLINKS}
      echo ""
  fi

  if [ -n "${EXTRAFILES}" ]; then
      ${CLEANUP_DRYRUN} || rm -f ${EXTRAFILES}
      echo ""
  fi

done

ARCHINDEPFILES=""

if [ -d "$ftppath_base/any" ]; then
    cd "$ftppath_base/any"
    for pkg in *$PKGEXT; do
        [ -f "$pkg" ] || continue # in case we get a file named "*.pkg.tar.gz"
        found=0
        #check for any existing symlinks
        for arch in ${ARCHES[@]}; do
            if [ -h "$ftppath_base/$arch/$pkg" ]; then
                found=1
                break
            fi
        done
        if [ $found -eq 0 ]; then
            # We found no symlinks to this, delete it
            ARCHINDEPFILES="$ARCHINDEPFILES $pkg"
        fi
    done
fi

if [ -n "$ARCHINDEPFILES" ]; then
  echo "    The following architecture independent packages"
  echo "    are not symlinked in the architecture repositories."
    for f in $ARCHINDEPFILES; do
        echo "        $f"
    done
fi

if [ -d "$ftppath_base/any" -a -n "${ARCHINDEPFILES}" ]; then
  cd "$ftppath_base/any"
  ${CLEANUP_DRYRUN} || rm -f ${ARCHINDEPFILES}
  echo ""
fi