#!/bin/bash


base=`dirname $0`
if [[ "$base" = "" || "$base" = "." ]]
then
  base=`pwd`
fi

DEFNJ="$NUMJOBS"

commondir=`readlink $(readlink $pc) | sed 's|.*/commonpkgs|../../../commonpkgs|'`

if [[ "$2" != "" ]]
then
  cat "$1" | perl -e '
$skip=shift;
if($skip=~m/^-/) {
  # only packages to be build
  $onlybuild=1;
  $skip=~s/^-//;
}
if($skip=~m/\+/) {
  ($addskip)=($skip=~m/\+(\d+)/);
  $skip=~s/\+(\d+)//;
}
while(<>)
{
  if($onlybuild && !m/^-/) { next; }
  if(m/$skip/) {
    if($addskip>0) {
      chop;
      print STDERR "Skipping $_...\n";
      $addskip--;
    }
    else {
      print;
    }
    last;
  }
}
while($addskip>0) {
  $_=<>;
  if(length($_)==0) { last; }
  if(!m/^-/) { next; }
  chop;
  print STDERR "Skipping $_...\n";
  $addskip--;
}
while(<>)
{
  print;
}
' -- "$2" > /tmp/i.txt
else
  \cp "$1" /tmp/i.txt
fi
cat /tmp/i.txt |  grep '^-' | while read xx
do   
  xxclean=`echo "$xx" | cut -c 3- | sed 's/\[.*//' | sed 's/(.*//' | sed 's/#.*//'`
  i=`echo "$xxclean" | awk '{print $1}'`
  i2=`echo "$xxclean" | awk '{print $2}'`
  i3=`echo "$xxclean" | awk '{print $3}'`
  i4=`echo "$xxclean" | awk '{print $4}'`
  pack=`echo "$xxclean" | awk '{print $2}' | sed 's/\//_/g' `
  if [[ $i = "PAUSE" ]]
  then
    if [[ ! -f $HOME/batch/$pack ]]
    then
      echo "***** PAUSING ... $xx ... PRESS ENTER TO RESUME *******"
      read  < /dev/tty
      touch $HOME/batch/$pack
    fi
  else
    if [[ "$i" = "PAUSEDIFF" ]]
    then
	pdiff=1
	i="$i2"
	i2="$i3"
	i3="$i4"
    elif [[ "$i" = "PAUSEDIFFBATCH" ]]
    then
    	if [[ ! -f $HOME/batch/$pack ]]
	then
		pdiff=2
	else
		pdiff=0
	fi
	i="$i2"
	i2="$i3"
	i3="$i4"
    else
      pdiff=0
    fi
    echo "Checking $i $i2 $i3..."
    cd $HOME/source/$i
    pkg=`basename $i`
    ddd=`dirname $i`
    rebuild=`echo "$xx" | grep -c rebuild`
    if [[ $rebuild -eq 0 ]]
    then
      rebuild=`grep -c "^- $pkg" $base/rebuild.txt 2>/dev/null`
    fi
    pack=`echo "$i" | sed 's/\//_/g' `
    nj=`cat $base/nj.txt 2>/dev/null| grep "^${pack}: " | sed "s/^${pack}: //"`
    if [[ "$nj" = "" ]]
    then
      nj=`cat $base/nj.txt 2>/dev/null | grep "^ALL: " | sed "s/^ALL: //"`
    fi
    if [[ "$nj" = "" ]]
    then
      nj="$DEFNJ"
    fi
    export NUMJOBS="$nj"
    if [[ $rebuild -gt 0 && ! -f $HOME/batch/$pack ]]
    then
      touch $HOME/batch/$pack
      rebuild=3
    else
      checkout=$TMP/checkver_$$.txt
      if [[ `echo "$xxclean" | grep -c 'ARCH=""'` -gt 0 ]]
      then
        OLDARCH=$ARCH
        unset ARCH
        checkver.pl $pkg.SlackBuild $i2 2>$checkout
        err=$?
        export ARCH=$OLDARCH
      else
        checkver.pl $pkg.SlackBuild $i2 2>$checkout
        err=$?
      fi
      if [[ $err -ne 0 ]]
      then
	# Sleep a bit to allow break
	sleep 5
      fi
      if [[ $err -eq 100 ]]
      then
	# Package found in architecture packages dir, install it.
        upgradepkg --install-new `cat $checkout`
        if [[ $? -ne 0 ]]
	then
	  echo "ERROR INSTALLING common PACKAGE $i (`cat $checkout`). Aborting."
	  exit 3
	fi
        rebuild=0
      elif [[ $err -eq 99 ]]
      then
	# Package found in common packages dir. Install it and then make link.
        upgradepkg --install-new `cat $checkout`
        if [[ $? -ne 0 ]]
	then
	  echo "ERROR INSTALLING common PACKAGE $i (`cat $checkout`). Aborting."
	  exit 4
	fi
	# Get the commonpkgs dir name
	pfile=`cat $checkout|sed "s|$pc/||"`
        echo "LINK ln -s $commondir/$pfile $p/$pfile"
        ln -s $commondir/$pfile $p/$pfile
	if [[ ! -z "$PACKUSER" ]]; then
	  chown -h $PACKUSER $p/$pfile 2>/dev/null
	fi
        rebuild=0
      elif [[ $err -ne 0 ]]
      then
        rebuild=2
      else
        rebuild=0
      fi
      \rm $checkout
    fi
    if [[ $rebuild -ne 0 ]]
    then
      if [[ $pdiff -gt 0 ]]
      then
        echo "***** PAUSING ... $xx ... PRESS ENTER TO RESUME *******"
        read  < /dev/tty
        if [[ $pdiff -ge 2 ]]
	then
          touch $HOME/batch/$pack
        fi
      fi
      # Package version is different, build it
      if [[ "$i2" = "*" ]]
      then
	cmd=`perl -e '$_=shift;s/.*?\* //;print;' "$xxclean"`
	(eval $cmd)
      else
	if [[ "$i2" = "NOINST" ]]
	then
          ./$pkg.SlackBuild < /dev/null
	else
          ./$pkg.SlackBuild $i2 $i3 < /dev/null
	fi
      fi
      if [[ $? -ne 0 ]]
      then
	echo "ERROR COMPILING/CREATING PACKAGE $i. Aborting."
	exit 2
      fi
      reinstall=""
      if [[ $rebuild -ge 3 ]]
      then
        reinstall="--reinstall"
      fi
      
      if [[ "$i2" != "NOINST" ]]
      then
	pkgs=`eval echo $TMP/${pkg}-*.txz /tmp/${pkg}-*.txz`
	if [[ "$pkgs" != "" ]]
	then
          upgradepkg --install-new $reinstall $pkgs
	fi
      fi
      # Move packages that could be built but are not named like the package:
      for mpkg in ap/vim n/alpine a/aaa_glibc-solibs l/ncurses
      do
	mddd=`echo $mpkg| awk -F/ '{print $1}'`
	mpkg=`echo $mpkg| awk -F/ '{print $2}'`
	mpkg=`cd $TMP;\ls -d ${mpkg}-*txz 2>/dev/null |grep -v gvim-`
	if [[ "$mpkg" != "" ]]
	then
	  if [[ -f $p/$mddd/$mpkg || `echo $mpkg | grep -c alpine-2.21` -gt 0 ]]
	  then
	    # Package already built, remove it
	    \rm $TMP/$mpkg
	  else
            if [[ "$i2" != "NOINST" ]]
            then
	      upgradepkg --install-new $TMP/$mpkg
	    fi
	    if [[ ! -z "$PACKUSER" ]]; then
	      chown -h $PACKUSER  $TMP/$mpkg* 2>/dev/null
	    fi
	    mv -v $TMP/$mpkg $p/$mddd/
	  fi	
	fi
      done
      if [[ "$ddd" != "" ]]
      then
	pd=$p
	if [ $err -eq 10 ]; then
	  pd=$pc
	fi
	mkdir -p "$p/$ddd"
	mkdir -p "$pd/$ddd"
	if [[ ! -z "$PACKUSER" ]]; then
	  chown -h $PACKUSER "$pd/$ddd"
	  chown -h $PACKUSER "$p/$ddd"
	  chown -h $PACKUSER  `eval echo $TMP/*-*-*-*.txz` `eval echo /tmp/*-*-*-*.txz` 2>/dev/null
	fi
	#mv `eval echo $TMP/${pkg}-*txz` $pd/$ddd
	#mv `eval echo /tmp/${pkg}-*txz` $pd/$ddd
	if [[ "$pkg" = "kde" || "$pkg" = "x11" ]]; then
	  # Move to common dir "noarch" files (should already be done in kde/x11 build scripts)
	  for pfile in `eval echo $TMP/*-*-noarch-*.txz` `eval echo /tmp/*-*-noarch-*.txz`
	  do
	    if [[ -f "$pfile" ]]
	    then
	      mv -v "$pfile" $pc/$ddd
	      pfile=`basename $pfile`
              echo "LINK ln -s $commondir/$ddd/$pfile $p/$ddd/$pfile"
	      ln -s $commondir/$ddd/$pfile $p/$ddd/$pfile
	      if [[ ! -z "$PACKUSER" ]]; then
		chown -h $PACKUSER $p/$ddd/$pfile 2>/dev/null
	      fi
	    fi
	  done
	fi
	for pfile in `eval echo $TMP/*-*-*-*.txz` `eval echo /tmp/*-*-*-*.txz`
	do
	  if [[ -f "$pfile" ]]
	  then
	    mv -v "$pfile" $pd/$ddd
	    if [[ $err -eq 10 ]]
	    then
	      pfile=`basename $pfile`
	      echo "LINK ln -s $commondir/$ddd/$pfile $p/$ddd/$pfile"
	      ln -s $commondir/$ddd/$pfile $p/$ddd/$pfile
	      if [[ ! -z "$PACKUSER" ]]; then
		chown -h $PACKUSER $p/$ddd/$pfile 2>/dev/null
	      fi
	    fi
	  fi
	done
      fi
      sleep 2
    else
      if [[ $rebuild -gt 0 && ! -f $HOME/batch/$pack ]]
      then
	echo "***** PAUSING for rebuilding $i... PRESS ENTER TO RESUME *******"
	read  < /dev/tty
	touch $HOME/batch/$pack
      fi
    fi
    cd $HOME/source/
  fi
done

