#!/usr/bin/env bash

cd $(dirname "$0")

PARENTDIR=$(dirname "$PWD")
ALGENCAN=$(basename "$PWD")
THISFILE=$(basename "$0")

# Files where the version number is to be updated
VERSIONED="./README \
           ./sources/algencan/fparam.f \
           ./sources/interfaces/cuter/runalgencan \
           ./VERSION"

if [ "$#" = 0 ]; then
  eval tar -C "$PARENTDIR" -czf "$PARENTDIR/$ALGENCAN".tgz --no-recursion \
       $(sed '/^### \+\./!d;s/^### \+\./"$ALGENCAN"/' "$THISFILE") && \
  echo "$ALGENCAN.tgz successfully created in $PARENTDIR"
elif [ "$1" = "-all" ]; then
  eval tar -C "$PARENTDIR" -czf "$PARENTDIR/$ALGENCAN"-all.tgz --no-recursion \
       $(sed '/^###\? \+\./!d;s/^###\? \+\./"$ALGENCAN"/' "$THISFILE") && \
  echo "$ALGENCAN-all.tgz successfully created in $PARENTDIR"
elif [ "$1" = "-pocket" ]; then
  "$PWD"/sources/hsl/fix-ma57.sh "$PWD"/sources/hsl/ma57ad.f
  gfortran -xf77-cpp-input -P -E \
           -I"$PWD"/sources/hsl -I"$PWD"/sources/problems \
           "$PWD"/sources/algencan/algencan-pocket.f > algencan-pocket.f && \
  echo "algencan-pocket.f successfully created in $PWD"
elif [ "$1" = "-new" -a "$#" = 2 ]; then
  TEMPFILE=$(tempfile -s .tgz)
  VERSION=$(cat VERSION)
  NEWDIST="algencan-$2"

  mkdir "$PARENTDIR/$NEWDIST" &> /dev/null
  if [ "$?" != 0 ]; then
    echo "$THISFILE: cannot create directory $PARENTDIR/$NEWDIST"
    exit 1
  fi

  eval tar -czf "$TEMPFILE" --no-recursion \
       $(sed '/^###\? \+\./!d;s/^###\? \+\././' "$THISFILE")
  tar -C "$PARENTDIR/$NEWDIST" -xzf "$TEMPFILE"

  for FILE in $VERSIONED; do
    eval sed 's/"$VERSION"/"$2"/g' "$FILE" > "$PARENTDIR/$NEWDIST/$FILE" && \
    touch -r "$FILE" "$PARENTDIR/$NEWDIST/$FILE"
  done

  rm -f "$TEMPFILE"
  echo "$NEWDIST successfully created in $PARENTDIR"
else
  echo "Usage: $THISFILE [ -all | -pocket | -new VERSION ]"
  exit 2
fi

exit 0

# Paths prepended with two hashes are to be included only when the -all option
# is specified, whereas those prepended with three hashes are always included.

### .
### ./bin
### ./bin/ampl
### ./bin/c
### ./bin/cuter
### ./bin/fortran
### ./bin/java
### ./bin/matlab
### ./bin/octave
### ./bin/py
### ./bin/r
### ./bin/tcl
### ./license.txt
##  ./make-dist
### ./Makefile
### ./README
### ./sources
### ./sources/algencan
### ./sources/algencan/algconst.par
##  ./sources/algencan/algencan-pocket.f
### ./sources/algencan/algencan.f
### ./sources/algencan/algencanma.f
### ./sources/algencan/algparam.com
### ./sources/algencan/auglag.f
### ./sources/algencan/backtrack.f
### ./sources/algencan/betra.f
### ./sources/algencan/calc.f
### ./sources/algencan/cgm.f
### ./sources/algencan/checkder.f
### ./sources/algencan/counters.com
### ./sources/algencan/dim.par
### ./sources/algencan/dogleg.f
### ./sources/algencan/drand.f
### ./sources/algencan/evalal.f
### ./sources/algencan/extrap.f
### ./sources/algencan/fixvar.com
### ./sources/algencan/fparam.f
### ./sources/algencan/gencan.f
### ./sources/algencan/graddat.com
### ./sources/algencan/happdat.com
### ./sources/algencan/happrox.f
### ./sources/algencan/hessdat.com
### ./sources/algencan/hpredat.com
### ./sources/algencan/itetyp.com
### ./sources/algencan/lss.f
### ./sources/algencan/lssma27.f
### ./sources/algencan/lssma57.f
### ./sources/algencan/ma27dat.com
### ./sources/algencan/ma57dat.com
### ./sources/algencan/machconst.com
### ./sources/algencan/Makefile
### ./sources/algencan/mc30dat.com
### ./sources/algencan/mc77dat.com
### ./sources/algencan/moresor.f
### ./sources/algencan/newtd.f
### ./sources/algencan/newtonkkt.f
### ./sources/algencan/outtyp.com
### ./sources/algencan/rspace.com
### ./sources/algencan/scaling.com
### ./sources/algencan/scl.f
### ./sources/algencan/sclmc30.f
### ./sources/algencan/sclmc77.f
### ./sources/algencan/setpoint.f
### ./sources/algencan/sevalus.f
### ./sources/algencan/slacks.com
### ./sources/algencan/spgls.f
### ./sources/algencan/sydat.com
### ./sources/algencan/tevalus.f
### ./sources/algencan/tnls.f
### ./sources/algencan/uevalus.f
### ./sources/algencan/vevalus.f
### ./sources/hsl
### ./sources/hsl/fix-ma27.sh
### ./sources/hsl/fix-ma57.sh
##  ./sources/hsl/ma27ad.f
##  ./sources/hsl/ma57ad.f
##  ./sources/hsl/mc30ad.f
##  ./sources/hsl/mc77ad.f
### ./sources/interfaces
### ./sources/interfaces/ampl
### ./sources/interfaces/ampl/algencan.run
### ./sources/interfaces/ampl/amplwrapper.c
### ./sources/interfaces/ampl/amplwrapper.h
### ./sources/interfaces/ampl/Makefile
### ./sources/interfaces/ampl/toyprob.mod
### ./sources/interfaces/c
### ./sources/interfaces/c/algencanma.c
### ./sources/interfaces/c/algencanma.h
### ./sources/interfaces/c/cfortran.h
### ./sources/interfaces/c/cwrapper.c
### ./sources/interfaces/c/cwrapper.h
### ./sources/interfaces/c/Makefile
### ./sources/interfaces/c/toyprob.c
### ./sources/interfaces/cuter
### ./sources/interfaces/cuter/call_sifdec
### ./sources/interfaces/cuter/cuter.com
### ./sources/interfaces/cuter/cuterwrapper.f
### ./sources/interfaces/cuter/Makefile
##  ./sources/interfaces/cuter/null-tabline.out
##  ./sources/interfaces/cuter/runalgencan
### ./sources/interfaces/matlab
### ./sources/interfaces/java
### ./sources/interfaces/java/ToyProbObjFunc.java
### ./sources/interfaces/java/ToyProbConstr.java
### ./sources/interfaces/java/tango
### ./sources/interfaces/java/tango/algencan
### ./sources/interfaces/java/tango/algencan/util
### ./sources/interfaces/java/tango/algencan/util/GJAC.java
### ./sources/interfaces/java/tango/algencan/util/SparseStructure.java
### ./sources/interfaces/java/tango/algencan/util/ALGENCANJacobian.java
### ./sources/interfaces/java/tango/algencan/util/HP.java
### ./sources/interfaces/java/tango/algencan/util/ALGENCANHessian.java
### ./sources/interfaces/java/tango/algencan/util/FC.java
### ./sources/interfaces/java/tango/algencan/base
### ./sources/interfaces/java/tango/algencan/base/Hessian.java
### ./sources/interfaces/java/tango/algencan/base/Combined.java
### ./sources/interfaces/java/tango/algencan/base/NotImplementedException.java
### ./sources/interfaces/java/tango/algencan/base/HLTimesVector.java
### ./sources/interfaces/java/tango/algencan/base/ObjectiveFunction.java
### ./sources/interfaces/java/tango/algencan/base/Constraints.java
### ./sources/interfaces/java/tango/algencan/base/Characteristics.java
### ./sources/interfaces/java/tango/algencan/base/Jacobian.java
### ./sources/interfaces/java/tango/algencan/base/ALGENCANException.java
### ./sources/interfaces/java/tango/algencan/base/Status.java
### ./sources/interfaces/java/tango/algencan/base/GradientAndJacobian.java
### ./sources/interfaces/java/tango/algencan/base/ObjectiveAndConstraints.java
### ./sources/interfaces/java/tango/algencan/base/ALGENCANProblem.java
### ./sources/interfaces/java/ToyProbCombined.java
### ./sources/interfaces/java/javawrapper.c
### ./sources/interfaces/java/ToyProbCharacteristics.java
### ./sources/interfaces/java/Algencanma.java
### ./sources/interfaces/java/Makefile
### ./sources/interfaces/java/javawrapper.h
### ./sources/interfaces/java/Manifest.txt
### ./sources/interfaces/matlab/algencanma.m
### ./sources/interfaces/matlab/checkderm32.f
### ./sources/interfaces/matlab/checkderm64.f
### ./sources/interfaces/matlab/endp.m
### ./sources/interfaces/matlab/evalco.m
### ./sources/interfaces/matlab/evalf.m
### ./sources/interfaces/matlab/evalfco.m
### ./sources/interfaces/matlab/evalg.m
### ./sources/interfaces/matlab/evalgjac.m
### ./sources/interfaces/matlab/evalh.m
### ./sources/interfaces/matlab/evalhc.m
### ./sources/interfaces/matlab/evalhl.m
### ./sources/interfaces/matlab/evalhlp.m
### ./sources/interfaces/matlab/evaljac.m
### ./sources/interfaces/matlab/fparamm32.f
### ./sources/interfaces/matlab/fparamm64.f
### ./sources/interfaces/matlab/inip.m
### ./sources/interfaces/matlab/Makefile
### ./sources/interfaces/matlab/matlabwrapper32.f
### ./sources/interfaces/matlab/matlabwrapper64.f
### ./sources/interfaces/matlab/mexopts.sh
### ./sources/interfaces/matlab/param.m
### ./sources/interfaces/octave
### ./sources/interfaces/octave/algencanma.m
### ./sources/interfaces/octave/cfortran.h
### ./sources/interfaces/octave/Makefile
### ./sources/interfaces/octave/octavewrapper.c
### ./sources/interfaces/octave/octavewrapper.h
### ./sources/interfaces/octave/toyprob.m
### ./sources/interfaces/py
### ./sources/interfaces/py/algencan.py
### ./sources/interfaces/py/Makefile
### ./sources/interfaces/py/pywrapper.c
### ./sources/interfaces/py/pywrapper.h
### ./sources/interfaces/py/runalgencan.py
### ./sources/interfaces/py/toyprob.py
### ./sources/interfaces/r
### ./sources/interfaces/r/algencanma.r
### ./sources/interfaces/r/cfortran.h
### ./sources/interfaces/r/Makefile
### ./sources/interfaces/r/rwrapper.c
### ./sources/interfaces/r/rwrapper.h
### ./sources/interfaces/r/toyprob.r
### ./sources/interfaces/tcl
### ./sources/interfaces/tcl/algencanma.tcl
### ./sources/interfaces/tcl/Makefile
### ./sources/interfaces/tcl/tclwrapper.c
### ./sources/interfaces/tcl/tclwrapper.h
### ./sources/interfaces/tcl/toyprob.tcl
### ./sources/problems
### ./sources/problems/america.f
### ./sources/problems/balls.f
### ./sources/problems/bratu3Db-full.f
### ./sources/problems/bratu3Db.f
### ./sources/problems/cache.dat
### ./sources/problems/cache.f
### ./sources/problems/condor.f
### ./sources/problems/contor.f
### ./sources/problems/contor2.f
### ./sources/problems/ellipsoid.dat
### ./sources/problems/ellipsoid.f
### ./sources/problems/genpack-cc-mina.f
### ./sources/problems/genpack-csq-mina.f
### ./sources/problems/hardcube.f
### ./sources/problems/hardspheres.f
### ./sources/problems/kissing.f
### ./sources/problems/kissing2.f
### ./sources/problems/location.f
### ./sources/problems/Makefile
### ./sources/problems/mountain1.f
### ./sources/problems/mountain2.f
### ./sources/problems/packccmn-feas.f
### ./sources/problems/packccmn.f
### ./sources/problems/pedazos4.f
### ./sources/problems/piecefit.f
### ./sources/problems/simfock.f
### ./sources/problems/simfock2.f
### ./sources/problems/toyprob.f
### ./sources/problems/toyprob2.f
### ./sources/problems/vi8EA.f
##  ./CHANGES
##  ./VERSION
### ./WHATSNEW
