#!/bin/sh
# This script is only used for developement. It is removed by the 
# distribution process. 

set -e

ECHO=${ECHO:="echo"}
SED=${SED:="sed"}
TR=${TR:="tr"}
GREP=${GREP:="grep"}
CD=${CD:="cd"}
RM=${RM:="rm"}
CP=${CP:="cp"}
MV=${MV:="mv"}
MKDIR=${MKDIR:="mkdir"}
TAR=${TAR:="tar"}
FIND=${FIND:="find"}
WEBGLUE=${WEBGLUE:="webglue"}

OCAMLBUILD=${OCAMLBUILD:="ocamlbuild -classic-display"}
OCAMLDOC=${OCAMLDOC:="ocamldoc -colorize-code -charset utf-8"}
OASIS=${OASIS:="oasis -quiet"}
OASISQ=${OASISQ:="$OASIS query"}

ocb () { $OCAMLBUILD "$@" ; }
action () 
{
  case $1 in
    module) ocb `$OASISQ Name`.cmx ;;
    doc)
      ocb -ocamldoc "$OCAMLDOC" -I src -no-links \
      doc/api.docdir/index.html
      $CP doc/style.css _build/doc/api.docdir/style.css ;;
    distrib) distrib ;;
    publish) publish ;;
    clean)
      ocb -clean
      $RM -f myocamlbuild.ml setup.ml setup.data setup.log src/META \
          src/`$OASISQ Name`.mllib
      ;;
    *) ocb $1;;
  esac;
} 

project_info ()
{
  NAME=`$OASISQ Name`
  MODNAME=`$OASISQ Library\("$NAME"\).Modules`
  VERSION=`$OASISQ Version`
  SYNOPSIS=`$OASISQ Synopsis`
  DESCRIPTION=`$OASISQ Description | $SED "s|$|\\\\\|"`
  HOMEPAGE=`$OASISQ Homepage`
  AUTHORS=`$OASISQ Authors`
  COPYRIGHT=`$OASISQ Copyrights`
  OCAMLVERSION=`$OASISQ OCamlVersion`
  DEPS=`$OASISQ "Library(\"$NAME\").BuildDepends"`
  if [ "$DEPS" ]; then
  PPDEPS=`$ECHO ", $DEPS"| $SED "s|,|,   |g" | $TR "," "\n" | $SED "s|$|\\\\\|"`
  fi;
}

distrib ()
{  
  project_info
  DIRNAME=$NAME-$VERSION
  ROOTDIR=/tmp/$DIRNAME

  $RM -R -f $ROOTDIR
  $MKDIR -p $ROOTDIR
  $CP -R . $ROOTDIR
  $CD $ROOTDIR

  # Remove dev artefacts
  $RM -R -f TODO .typerex .git .gitignore build _tags myocamlbuild.ml  
  action clean

  # Generate oasis artefacts
  $OASIS setup

  # Substitute a few things 
  $FIND $ROOTDIR \
    \( -name "*~" -o -name ".DS_Store" -o -name ".gdb_history" \) \
    -exec $RM {} ';'
  for file in `$FIND $ROOTDIR -type f -print`; do
      $SED "s|%%NAME%%|$NAME|g; \
            s|%%MODNAME%%|$MODNAME|g; \
            s|%%VERSION%%|$VERSION|g; \
            s|%%SYNOPSIS%%|$SYNOPSIS|g; \
            s|%%DESCRIPTION%%|$DESCRIPTION |g; \
            s|%%HOMEPAGE%%|$HOMEPAGE|g; \
            s|%%AUTHORS%%|$AUTHORS|g; \
            s|%%COPYRIGHT%%|$COPYRIGHT|g; \
            s|%%OCAMLVERSION%%|$OCAMLVERSION|g; \
            s|%%DEPS%%|$DEPS|g; \
            s|%%PPDEPS%%|$PPDEPS |g;" \
	$file > $file.tmp
    $MV -f $file.tmp $file
  done

  # Test oasis setup 
  ocaml setup.ml -configure
  ocaml setup.ml -build
  ocaml setup.ml -build test/tests.otarget

  # Generate static doc 
  action doc
  $CP _build/doc/api.docdir/*.html doc/
  
  # Clean and wrap up the project
  ocaml setup.ml -distclean

  $CD ..
  $TAR -cvjf $DIRNAME.tbz $DIRNAME
  $RM -R $DIRNAME
}

publish ()
{
    project_info
    DIRNAME=$NAME-$VERSION
    ARCHIVE=/tmp/$DIRNAME.tbz
    SITEGENROOT=~/sync/erratique
    PAGEROOT=$SITEGENROOT/maps/software/$NAME

    $CP $ARCHIVE $PAGEROOT/releases/
    $RM -R $PAGEROOT/doc
    $TAR -C $PAGEROOT --strip-components=1 -xvjf $ARCHIVE $DIRNAME/doc
    $CD $SITEGENROOT
    $ECHO "$VERSION" | $WEBGLUE set --replace $NAME s-last-version
    $ECHO "$DEPS" | $WEBGLUE set --replace $NAME s-deps
    $WEBGLUE get timestamp utc | $WEBGLUE set --replace $NAME s-updated
}

if [ $# -eq 0 ]; then action module ; else
  while [ $# -gt 0 ]; do action $1; shift ; done
fi