#!/bin/bash
#
# Make the SWI-Prolog source archives by running this script. Before
# you start:
#
#	* Update VERSION
#	* Run ./newversion, which creates a GIT tag VN.N.N
#	* Run ./make-src-tape
#
# This script requires GNU-tar!

if [ -x /opt/local/bin/gnutar ]; then
  tar=/opt/local/bin/gnutar
else
  tar=tar
fi

COREMODULES="bench packages/chr packages/clpqr packages/inclpr packages/jpl"
COREMODULES+=" packages/xpce packages/odbc packages/protobufs packages/windows"
COREMODULES+=" packages/sgml packages/clib packages/http packages/plunit"
COREMODULES+=" packages/pldoc packages/RDF packages/semweb packages/ssl"
COREMODULES+=" packages/zlib packages/tipc packages/table packages/ltx2htm"
COREMODULES+=" packages/nlp packages/cpp packages/PDT packages/utf8proc"
COREMODULES+=" packages/archive packages/pengines packages/json"
COREMODULES+=" packages/cql packages/bdb packages/libedit"
COREMODULES+=" packages/pcre packages/yaml packages/paxos packages/redis"
COREMODULES+=" packages/stomp packages/mqi packages/sweep packages/swipy"
SUBSUBMODULES="packages/libedit/libedit"

if [ -r modules ]; then
  SUBMODULES="`cat modules`"
else
  SUBMODULES="$COREMODULES"
fi

name=swipl
namesep=-
version=`cat VERSION`
compress=gzip
me=`basename $PWD`
quiet=false

TAG="V$version"

usage()
{ cat << _EOM_
Usage: $(basename $0) [option ...]
Options:
  --tag=Tag
    Create archive for the given version
  --version=Version
    Create archive for the given version
  --name=Name [default $name]
    Create archive for the given version
  --sep=Sep [default $namesep]
    Separator between name and version
  --submodule=Module
    Add an additional module (can be repeated)
  --quiet
    Work silently
  --help
    Print this message
_EOM_
}

while [ x"$1" != x"" ]; do
  case "$1" in
      --tag=*)
	  TAG=`echo $1 | sed 's/--[^=]*=//'`
	  shift
	  ;;
      --submodule=*)
	  SUBMODULES+=" $(echo $1 | sed 's/--[^=]*=//')"
	  shift
	  ;;
      --name=*)
	  name=`echo $1 | sed 's/--[^=]*=//'`
	  shift
	  ;;
      --sep=*)
	  namesep=`echo $1 | sed 's/--[^=]*=//'`
	  shift
	  ;;
      --version=*)
	  version=`echo $1 | sed 's/--[^=]*=//'`
	  shift
	  ;;
      --quiet)
	  quiet=true
	  shift
	  ;;
      --help)
	  usage
	  exit 0
	  ;;
      --*)
	  usage
	  exit 1
	  ;;
      *)
  esac
done

if ! git diff --quiet; then
    echo "Fatal: directory is dirty"
    exit 1
fi

prefix=$name$namesep$version
out=$prefix.tar

# core SWI-Prolog snapshot from GIT
git archive --format=tar --prefix=$prefix/ "$TAG" > ../$out

# add the submodules
for sm in `git submodule status $SUBMODULES | awk '{printf "%s:%s\n", $1, $2}'`; do
    sha1=`echo $sm | awk -F: '{print $1}'`
    path=`echo $sm | awk -F: '{print $2}'`
    [ $quiet = true ] || echo -n "adding module $path at $sha1 ... "
    git --git-dir $path/.git archive --format=tar --prefix=$prefix/$path/ $sha1 > tmp.tar
    $tar -Af ../$out tmp.tar
    rm tmp.tar
    [ $quiet = true ] || echo ok
done

# add submodules of the packages. Assumes the submodule is a direct
# sibling of the package directory.
for ssm in $SUBSUBMODULES; do
  super=$(dirname $ssm)
  module=$(basename $ssm)
  for sm in `git -C $super submodule status $module | awk '{printf "%s:%s\n", $1, $2}'`; do
    sha1=`echo $sm | awk -F: '{print $1}'`
    path=$super/`echo $sm | awk -F: '{print $2}'`
    [ $quiet = true ] || echo -n "adding module $path at $sha1 ... "
    git --git-dir $path/.git archive --format=tar --prefix=$prefix/$path/ $sha1 > tmp.tar
    $tar -Af ../$out tmp.tar
    rm tmp.tar
    [ $quiet = true ] || echo ok
  done
done


cd ..
ln -s $me $prefix

# cleanup
rm $prefix

# compress the result
rm -f $out.gz
$compress $out

