#!/bin/zsh

# This file is maintained at http://git.mdcc.cx/draai

# copyright:
COPYRIGHT='Copyright (C) 2007, 2008, 2009, 2010 Joost van Baal'

# This program is freely distributable per the following license:
LICENSE="
This file is part of draai.

Draai is free software; you can redistribute it and/or modify it under the
terms of the GNU General Public License, as published by the Free Software
Foundation on http://www.gnu.org/licenses/gpl.html.  You should have received
a copy of the GNU General Public License along with draai.

There is NO warranty."

PACKAGE=draai
prefix=/usr/local

typeset -a docfiles dist_docfiles man1files dist_man1files scriptfiles \
 dist_scriptfiles libexecfiles dist_libexecfiles zshfiles dist_zshfiles \
 dist_files

docfiles=(COPYING ChangeLog NEWS README)
dist_docfiles=($docfiles TODO INSTALL)

man1files=(man/draai.1 man/dr_cdrip.1 man/dr_permutate.1 man/dr_symlinks.1 \
  man/dr_unsort.1 man/dr_watch.1)
dist_man1files=($man1files man/include.zmm.in man/*.azm)

scriptfiles=(script/dr_cdrip script/draai script/dr_permutate \
  script/dr_watch script/dr_symlinks script/dr_unsort)
dist_scriptfiles=($scriptfiles script/draai.in)

libexecfiles=(script/dr_mount script/dr_push script/dr_file2tag \
  script/oggsymlinks script/draai123)
dist_libexecfiles=($libexecfiles)

zshfiles=(zsh/_draai)
dist_zshfiles=($zshfiles)

dist_helpfiles=(help/{command,option,shortoption}/*)

dist_files=($dist_docfiles $dist_man1files $dist_scriptfiles \
  $dist_libexecfiles $dist_zshfiles $dist_helpfiles VERSION \
  setup man/Makefile)

dist_subdirs=(man script zsh help/{command,option,shortoption})

prog=`basename $0`

usage()
{
cat <<EOT
Usage: $prog [--prefix=PREFIX] [--libexecdir=LIBEXECDIR] install|uninstall
Install draai.

Helper scripts are by default installed in LIBEXECDIR/PACKAGE, which is
PREFIX/libexec/draai, which is /usr/local/libexec/draai by default.

(Don't run as
 $prog dist|publish|configure|changelog
unless you really know what you are doing.)
EOT
}

init()
{
    if test -f VERSION
    then
        echo reusing version $version from file VERSION
        version=$(cat VERSION)
    else
        version=$(date +%Y%m%d)
        echo creating file VERSION
        echo $version >VERSION
    fi

    { cat <<EOT
year Y
month b
day d
EOT
} | while read p o
    do
        f=stamp.$p
        if test -f $f
        then
            echo reusing file $f
        else
            echo creating file $f
            date +%$o >$f
        fi
    done

    distdir=$PACKAGE-$version
    tgz=$distdir.tar.gz
}

buildhelp()
{
    cd help/command
    for f in *
    do
        # yes, we want a literal \n in the output: sed should be able to grok it 
        echo -n "$f:\\\n"
        while read l; do echo -n "   $l\\\n"; done < $f
        echo -n "\\\n"
    done
    cd -
}

build_cmds()
{
    cd help/command
    # create output like:
    #    draai:"play music (now or later)"
    #    init:"start a bunch of x terminals setting up some draai jobs"
    for f in *
    do
        echo -n "    $f:"'"'
        while read l; do echo -n "$l "; done < $f
        echo -n '"'"\\\n"
    done
    cd -
}

configure()
{
    buildhelp >help.txt
    build_cmds >cmds.txt

    for f in script/draai.in man/include.zmm.in zsh/_draai.in
    do
       sed "s/@VERSION@/$version/; s|@top_srcdir@|`pwd`|;
         s/@HELPTEXT@/`cat help.txt`/; s/@CMDSTEXT@/`cat cmds.txt`/" $f > ${f%.in}
       echo generated ${f%.in} from $f
    done
    # rm help.txt cmds.txt
}

changelog()
{
    # we want no unprotected emailadresses in the cl
    git log --pretty --numstat --summary | sed 's/<[^>][^>]*>//g' | git2cl >ChangeLog
}

all()
{
    ( cd man && make )
}


OPTS=$(getopt -o h,l,p: --long help,license,prefix:,libexecdir: -- "$@")
eval set -- "$OPTS"

while true; do
    case "$1" in
      -h|--help)
        usage
        exit 0
        ;;
      -p|--prefix)
        prefix="$2"
        shift 2
        ;;
      --libexecdir)
        libexecdir="$2"
        shift 2
        ;;
      -l|--license)
        echo $COPYRIGHT
        echo $LICENSE
        exit 0
        ;;
      --)
        shift
        break
        ;;
      *)
        usage
        exit 1
        ;;
    esac
done

shift $(($OPTIND - 1))

command=$1
shift

exec_prefix=${prefix}

bindir=${exec_prefix}/bin
mandir=${prefix}/man
man1dir=$mandir/man1

datarootdir=${prefix}/share
datadir=${datarootdir}
docdir=${datadir}/doc/$PACKAGE

: ${libexecdir:=${exec_prefix}/libexec}
libexecpdir=${libexecdir}/$PACKAGE

zshdir=${datadir}/zsh/site-functions

case $command in
  install)

    for d in $DESTDIR$bindir $DESTDIR$man1dir $DESTDIR$docdir $DESTDIR$libexecpdir $DESTDIR$zshdir
    do
        test -d "$d" || { mkdir -p "$d" && echo created $d }
    done
    for p in $scriptfiles
    do
        if test -f $p
        then
            install -c "$p" "${DESTDIR}${bindir}/$(basename $p)" && \
              echo installed ${DESTDIR}${bindir}/$(basename $p)
        fi
    done
    for p in $man1files
    do
        if test -f $p
        then
            install -c -m 644 "$p" "${DESTDIR}${man1dir}/$(basename $p)" && \
              echo installed ${DESTDIR}${man1dir}/$(basename $p)
        fi
    done
    for p in $docfiles
    do
        if test -f $p
        then
            install -c -m 644 "$p" "${DESTDIR}${docdir}/$(basename $p)" && \
              echo installed ${DESTDIR}${docdir}/$(basename $p)
        fi
    done
    for p in $libexecfiles
    do
        if test -f $p
        then
            install -c "$p" "${DESTDIR}${libexecpdir}/$(basename $p)" && \
              echo installed ${DESTDIR}${libexecpdir}/$(basename $p)
        fi
    done
    for p in $zshfiles
    do
        if test -f $p
        then
            install -c -m 644 "$p" "${DESTDIR}${zshdir}/$(basename $p)" && \
              echo installed ${DESTDIR}${zshdir}/$(basename $p)
        fi
    done

    ;;
  uninstall)
    # FIXME
    echo not yet implemented
    ;;
  dist)

    cp /usr/share/common-licenses/GPL COPYING

    init
    echo $version > VERSION

    configure
    changelog
    all

    if head NEWS | grep -q $version
    then
        :
    else
        echo error: NEWS does not mention release $version
        exit 1
    fi

    rm -rf $distdir
    mkdir $distdir
    for dir in $dist_subdirs
    do
        mkdir -p $distdir/$dir
    done

    for file in $dist_files
    do
        dir=$(echo "$file" | sed -e 's,/[^/]*$,,')
        cp -pR $file $distdir/$dir
    done

    tar chof - $distdir | gzip -c >$distdir.tar.gz

    ls -l $distdir.tar.gz
    ;;
  publish)
    init
    scp $tgz opal:www/mdcc.cx/pub/draai/
    ;;
  configure)
    # not for users, merely convenience for developers
    init
    configure
    ;;
  changelog)
    changelog
    ;;
  *)
    usage
    exit 1
    ;;
esac

