#!/bin/bash
#
# autodist-tool
# Copyright (c) 2008-2026 by Silvan Calarco <silvan.calarco@mambasoft.it>
#
. /etc/autodist/config
. /usr/share/autodist/VERSION
me=(${0##*/} $VERSION)

DATE_NOW=`date +%s`

if [ "$LOCAL_REPS_BASE_DIR" == "" ]; then
   LOCAL_REPS_BASE_DIR=/var/autodist
   LOCAL_REPS_FETCH=1
   . /var/autodist/.autospec
   for idx in `seq 0 ${#ftp_alias[*]}`; do
      if [ "${ftp_alias[$idx]}" == "${AUTODIST_REPOSITORY}" ]; then
          REMOTE_RW_USER="${ftp_rw_user[$idx]}"
          REMOTE_RW_PASSWD="${ftp_rw_passwd[$idx]}"
          break
      fi
   done
fi

AUTOUPDATEDIR=${LOCAL_REPS_BASE_DIR}/${AUTODIST_REPOSITORY}/autoupdate/
BUILDDEPSFILE=${LOCAL_REPS_BASE_DIR}/distromatic/${AUTODIST_REPOSITORY}/builddeps-i586
SOURCESDIR=${AUTOUPDATEDIR}/sources/
SUCCESSLISTDIR=${AUTOUPDATEDIR}
SKIPPEDLISTDIR=${AUTOUPDATEDIR}

eval `autospec -q --eval="spec_dir"`

function usage() {
   echo "\
${me[0]} ${me[1]}
"$"Copyright (C) 2008-2025 Silvan Calarco <silvan.calarco@mambasoft.it>""
"$"Released under the terms of the GNU GPL v3 license"
   echo "
"$"Usage"":
   $me makepatch package [auto|build|update|remove]
   $me schedule job_regexp..
   $me unschedule job_regexp..
   $me skip job_regexp..
"

}

[ $# -gt 0 ] || { usage ; exit 1; }

unset OPERATION COMMAND PKG

for ((i=1; i<=$#; i++)); do
   case ${!i} in
      -h|--help) usage; exit 1 ;;
      *) if [ ! "$COMMAND" ]; then
            COMMAND=${!i}
         elif [ ! "$JOB" ]; then
            JOB=${!i}
         else
            OPERATION=${!i}
         fi
         ;;
   esac
done

[ "${JOB/*\#}" != "${JOB}" ] && {
   JOBVER="+${JOB/*\#}" 
   JOB="${JOB/\#*}"
} || JOBVER="+0"

if [ "$COMMAND" = "makepatch" ]; then
   [ "$JOB" ] || {
      echo "Error: package non specified."
      exit 1
   }

   if [ ! "$OPERATION" ]; then
     [ -e $AUTOUPDATEDIR/spec-patches-update/$JOB.spec.patch ] && {
         echo "== update patch =="
         cat $AUTOUPDATEDIR/spec-patches-update/$JOB.spec.patch
      }
      [ -e $AUTOUPDATEDIR/spec-patches-build/$JOB.spec.patch ] && {
         echo "== build patch =="
         cat $AUTOUPDATEDIR/spec-patches-build/$JOB.spec.patch
      }
      exit 0
   elif [ "$OPERATION" = "remove" ]; then
      echo -n "== Removing patches for $JOB package"
      rm -f $AUTOUPDATEDIR/spec-patches-update/$JOB.spec.patch
      rm -f $AUTOUPDATEDIR/spec-patches-build/$JOB.spec.patch
      # Remove patches in remote repository
      if [ "${REMOTE_RW_USER}" != "" ]; then
         curl -s -o /dev/null -u ${REMOTE_RW_USER}:${REMOTE_RW_PASSWD} -X DELETE \
            ${REPS_BASE_URL}/${AUTODIST_REPOSITORY}/autoupdate/spec-patches-update/${JOB}.spec.patch
         curl -s -o /dev/null -u ${REMOTE_RW_USER}:${REMOTE_RW_PASSWD} -X DELETE \
            ${REPS_BASE_URL}/${AUTODIST_REPOSITORY}/autoupdate/spec-patches-build/${JOB}.spec.patch
      fi
      echo
      exit 0
   elif [ "$OPERATION" = "auto" ]; then
      if [ -e $spec_dir/.$JOB.spec.autodist.prebuild ]; then
         if [ -e $AUTOUPDATEDIR/spec-patches-update/$JOB.spec.patch ]; then
            echo "WARNING: update patch exists while attempting to create a build patch"
            OPERATION=update
         else
            OPERATION=build
         fi
      elif [ -e $spec_dir/.$JOB.spec.autodist.preupdate ]; then
         if [ -e $AUTOUPDATEDIR/spec-patches-build/$JOB.spec.patch ]; then
            echo "ERROR: build patch exists while attempting to create an update patch"
            exit 1
         fi
         OPERATION=update
      else
         echo "ERROR: no prebuild nor preupdate specfile status found; cannot make patch"
         exit 1
      fi
   fi

   if [ ! -e $spec_dir/.$JOB.spec.autodist.pre$OPERATION ]; then
      echo "Error: pre$OPERATION specfile missing; make sure you prepare and update the package using autodist."
      exit 1
   fi

   if [ "$OPERATION" = "build" -a -e $AUTOUPDATEDIR/spec-patches-update/$JOB.spec.patch ]; then
      echo "Error: trying to make a build patch when an update patch already exists! Remove or create a update patch instead."
      exit 1
   elif [ "$OPERATION" = "update" -a -e $AUTOUPDATEDIR/spec-patches-build/$JOB.spec.patch ]; then
      echo "Error: trying to make an update patch when a build patch already exists! Remove or create a build patch instead."
      exit 1
   fi

   diff $spec_dir/.$JOB.spec.autodist.pre$OPERATION $spec_dir/$JOB.spec > \
      $AUTOUPDATEDIR/spec-patches-$OPERATION/$JOB.spec.patch
   RET=$?

   if [ $RET -eq 1 ]; then
      echo "Created $OPERATION patch for $JOB:"
      cat $AUTOUPDATEDIR/spec-patches-$OPERATION/$JOB.spec.patch
      # Send created patch to remote repository
      if [ "${REMOTE_RW_USER}" != "" ]; then
         curl -s -u ${REMOTE_RW_USER}:${REMOTE_RW_PASSWD} \
            -T ${AUTOUPDATEDIR}/spec-patches-${OPERATION}/${JOB}.spec.patch \
            ${REPS_BASE_URL}/${AUTODIST_REPOSITORY}/autoupdate/spec-patches-${OPERATION}/${JOB}.spec.patch 2>&1
      fi
      exit 0
   elif [ $RET -eq 0 ]; then
      echo "Info: files are identical."
      rm $AUTOUPDATEDIR/spec-patches-$OPERATION/$JOB.spec.patch
      exit 0
   else
      echo "Error: diff returned $RET while creating the patch."
      exit 1
   fi


elif [ "$COMMAND" = "schedule" ]; then
   [ "$JOB" ] || {
      echo "Scheduled jobs:"
      cat $AUTOUPDATEDIR/manual.in
      exit 0
   }
#   cat $BUILDDEPSFILE | sort -k2 -n |
#   while read line; do
#      set -- $line
#      if [ "`echo \" $1 \" | grep \" $JOB \"`" ]; then
   if [ "`autodist-distroquery repository-srclist $AUTODIST_REPOSITORY $JOB`" -o "`autodist --list-jobs | grep ^$JOB$`" ]; then
     sed -i "/^$JOB .*/d" $AUTOUPDATEDIR/manual.in
     echo "$JOB $JOBVER 0" >> $AUTOUPDATEDIR/manual.in || exit 1
     echo "Job $JOB scheduled for automatic update or rebuild"
     # Sync manual.in to remote repository
     if [ "${REMOTE_RW_USER}" != "" ]; then
        curl -s -u ${REMOTE_RW_USER}:${REMOTE_RW_PASSWD} \
           -T ${AUTOUPDATEDIR}/manual.in \
           ${REPS_BASE_URL}/${AUTODIST_REPOSITORY}/autoupdate/manual.in 2>&1
     fi
   else
      echo "Unknown job $JOB."
   fi
#   done
elif [ "$COMMAND" = "unschedule" ]; then
   [ "$JOB" ] || {
      echo "Scheduled jobs:"
      cat $AUTOUPDATEDIR/manual.in
      exit 0
   }
#   cat $AUTOUPDATEDIR/manual.in | sort -k2 -n |
#   while read line; do
#      set -- $line
#      if [ "`echo \" $1 \" | grep \" $JOB \"`" ]; then
   if [ "`grep \"^$JOB \" $AUTOUPDATEDIR/manual.in`" ]; then
      sed -i "/^$JOB .*/d" $AUTOUPDATEDIR/manual.in
      echo "Job $JOB removed from schedule"
      # Sync manual.in to remote repository
      if [ "${REMOTE_RW_USER}" != "" ]; then
         curl -s -u ${REMOTE_RW_USER}:${REMOTE_RW_PASSWD} \
            -T ${AUTOUPDATEDIR}/manual.in \
            ${REPS_BASE_URL}/${AUTODIST_REPOSITORY}/autoupdate/manual.in 2>&1
      fi
    fi
#   done
elif [ "$COMMAND" = "skip" ]; then
   [ "$JOB" ] || {
      echo "Error: package non specified."
      exit 1
   }
   SKIPPEDLINE=`awk '{ print $1" "$2 }' $SKIPPEDLISTDIR/*.skip | grep -m1 "^$JOB "`
   if [ "$SKIPPEDLINE" ]; then
      sed -i "/^$PKGNAME /d" $SKIPPEDLISTDIR/*.skip
   fi
   if [ "`autodist-distroquery repository-srclist $AUTODIST_REPOSITORY $JOB`" -o "`autodist --list-jobs | grep ^$JOB$`" ]; then
      echo "$JOB $DATE_NOW 101" >> $SKIPPEDLISTDIR/auto.skip
      echo "Job $JOB skipped from automatic builds"
      # Sync auto.skip to remote repository
      if [ "${REMOTE_RW_USER}" != "" ]; then
         curl -s -u ${REMOTE_RW_USER}:${REMOTE_RW_PASSWD} \
            -T ${AUTOUPDATEDIR}/auto.skip \
            ${REPS_BASE_URL}/${AUTODIST_REPOSITORY}/autoupdate/auto.skip 2>&1
      fi
   else
      echo "Unknown job $JOB."
   fi
else
   echo "Error: invalid command $COMMAND"
fi
