#!/bin/sh
#
# 2011-2012 Nico Schottelius (nico-cdist at schottelius.org)
#
# This file is part of cdist.
#
# cdist 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, either version 3 of the License, or
# (at your option) any later version.
#
# cdist is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with cdist. If not, see <http://www.gnu.org/licenses/>.
#
#
# Push a directory to a target, both sides have the same name (i.e. explorers)
# or
# Pull a directory from a target, both sides have the same name (i.e. explorers)
#

# exit on any error
#set -e

basedir=${0%/*}
version=$(cd "$basedir" && git describe)

# Manpage and HTML
A2XM="a2x -f manpage --no-xmllint -a encoding=UTF-8"
A2XH="a2x -f xhtml --no-xmllint -a encoding=UTF-8"

# Developer webbase
WEBDIR=$HOME/www.nico.schottelius.org
WEBBLOG=$WEBDIR/blog
WEBTOPDIR=$WEBDIR/software
WEBBASE=$WEBTOPDIR/cdist
WEBMAN=$WEBBASE/man/$version
WEBPAGE=${WEBBASE}.mdwn

# Documentation
MANDIR=docs/man
MAN1DSTDIR=${MANDIR}/man1
MAN7DSTDIR=${MANDIR}/man7
SPEECHESDIR=docs/speeches

# Change to checkout directory
cd "$basedir"

case "$1" in
    man)
        set -e
        "$0" mangen
        "$0" mantype
        "$0" manbuild
    ;;

    manbuild)
        trap abort INT
        abort() {
            kill 0
        }
        for section in 1 7; do
            for src in ${MANDIR}/man${section}/*.text; do
                manpage="${src%.text}.$section"
                if [ ! -f "$manpage" -o "$manpage" -ot "$src" ]; then
                    echo "Compiling man page for $src"
                    $A2XM "$src"
                fi
                htmlpage="${src%.text}.html"
                if [ ! -f "$htmlpage" -o "$htmlpage" -ot "$src" ]; then
                    echo "Compiling html page for $src"
                    $A2XH "$src"
                fi
            done
        done
    ;;

    mantype)
        for mansrc in cdist/conf/type/*/man.text; do
            dst="$(echo $mansrc | sed -e 's;cdist/conf/;cdist-;'  -e 's;/;;' -e 's;/man;;' -e 's;^;docs/man/man7/;')"
            ln -sf "../../../$mansrc" "$dst"
        done
    ;;

    mangen)
        ${MANDIR}/cdist-reference.text.sh
    ;;

    man-pub)
        $0 man

        version=$($0 changelog-version)

        rm -rf "${WEBMAN}"
        mkdir -p "${WEBMAN}/man1" "${WEBMAN}/man7"
        cp ${MAN1DSTDIR}/*.html ${MAN1DSTDIR}/*.css ${WEBMAN}/man1 
        cp ${MAN7DSTDIR}/*.html ${MAN7DSTDIR}/*.css ${WEBMAN}/man7
        cd ${WEBMAN} && git add . && git commit -m "Cdist Manpage update: $version"
    ;;

    dist)
        set -e
        # Do the checks
        $0 dist-check

        # Git changes - everything depends on this
        $0 dist-tag
        $0 dist-branch-merge

        # Pypi first - is the base for others
        $0 dist-pypi
        
        # Archlinux depends on successful pypi ;-)
        $0 dist-archlinux

        # Update website (includes documentation)
        $0 web

        # Update manpages on website
        $0 man-pub

        # update git repos
        $0 pub

        $0 dist-blog
        $0 dist-freecode
        $0 dist-ml
        $0 dist-manual
    ;;

    changelog-changes)
        awk -F: 'BEGIN { start=0 } { if ($0 ~ /^[[:digit:]]/) { if(start == 0) {start = 1 } else { exit } } else { if(start==1) {print $0 }}  }' "$basedir/docs/changelog"
    ;;

    changelog-version)
        # get version from changelog and ensure it's not already present
        grep '^[[:digit:]]' "$basedir/docs/changelog" | head -n1 | sed 's/:.*//'
    ;;

    dist-check)
        set -e
        echo "Verifying documentation building works ..."
        $0 clean 
        $0 man

        changelog_version=$($0 changelog-version)
        echo "Target version from changelog: $changelog_version"

        if git show --quiet $changelog_version >/dev/null 2>&1; then
            echo "Version $changelog_version already exists, aborting."
            exit 1
        fi

        # verify date in changelog
        date_today="$(date +%Y-%m-%d)"
        date_changelog=$(grep '^[[:digit:]]' "$basedir/docs/changelog" | head -n1 | sed 's/.*: //')

        if [ "$date_today" != "$date_changelog" ]; then
            echo "Date in changelog is not today"
            echo "Changelog: $date_changelog"
            exit 1
        fi

    ;;

    blog)
        version=$($0 changelog-version)
        blogfile=$WEBBLOG/cdist-${version}-released.mdwn
        cat << eof > "$blogfile"
[[!meta title="Cdist $version released"]]

Here's a short overview about the changes found in this release:

eof

        $0 changelog-changes >> "$blogfile"

        cat << eof >> "$blogfile"
For more information visit the [[cdist homepage|software/cdist]].

[[!tag cdist config unix]]
eof
    ;;

    dist-blog)
        $0 blog
        version=$($0 changelog-version)
        file=cdist-${version}-released.mdwn
        cd "$WEBBLOG"
        git add "$file"
        git commit -m "New cdist version (blogentry): $version" "$file"
        git push
    ;;

    dist-ml)
        $0 blog
        version=$($0 changelog-version)
        to_a=cdist
        to_d=l.schottelius.org
        to=${to_a}@${to_d}

        from_a=nico-cdist
        from_d=schottelius.org
        from=${from_a}@${from_d}

        ( 
        cat << eof
From: Nico -telmich- Schottelius <$from>
To: cdist mailing list <$to>
Subject: cdist $version released

Hello .*,

cdist $version has been released with the following changes:

eof

        "$0" changelog-changes
        cat << eof

Cheers,

Nico

-- 
Automatisation at its best level. With cdist.
eof
        ) | /usr/sbin/sendmail -f "$from" "$to"
    ;;


    dist-manual)
        cat << notes

    To be done manually...
    
        - linkedin entry
notes

    ;;

    dist-tag)
        version=$($0 changelog-version)
        # add tag
        printf "Enter tag description for %s> " "$version"
        read tagmessage
        git tag "$version" -m "$tagmessage"
    ;;

    dist-branch-merge)
        version=$($0 changelog-version)
        target_branch=${version%\.*}
        current_branch=$(git rev-parse --abbrev-ref HEAD)

        if [ "$target_branch" = "$current_branch" ]; then
            echo "Skipping merge, already on destination branch"
        else
            printf "Press enter to git merge $current_branch into \"$target_branch\" > "
            read prompt
            git checkout "$target_branch"
            git merge "$current_branch"
            git checkout "$current_branch"
        fi
   ;;

    dist-archlinux)
        $0 dist-archlinux-makepkg
        $0 dist-archlinux-aur-upload
    ;;

    dist-archlinux-makepkg)
        ./PKGBUILD.in
        makepkg -c --source
    ;;

    dist-archlinux-aur-upload)
        version=$($0 changelog-version)
        tar=cdist-${version}-1.src.tar.gz
        burp -c system "$tar"
    ;;

    dist-freecode)
        version=$($0 changelog-version)
        api_token=$(awk '/machine freecode login/ { print $8 }' ~/.netrc)

        printf "Enter tag list for freecode release %s> " "$version"
        read taglist

        printf "Enter changelog for freecode release %s> " "$version"
        read changelog

        echo "Submit preview"
        cat << eof
tag_list = $taglist
changelog = $changelog
version = $version
eof
        printf "Press enter to submit to freecode> "
        read dummy

        cat << eof | cfreecode-api release-add cdist
        {
            "auth_code": "$api_token",
            "release": {
                "tag_list": "$taglist",
                "version": "$version",
                "changelog": "$changelog",
                "hidden_from_frontpage": false
            }
        }
eof

    ;;

    dist-pypi)
        $0 man
        $0 version
        python3 setup.py sdist upload
    ;;

    speeches)
        cd "$SPEECHESDIR"
        for speech in *tex; do
            pdflatex "$speech"
            pdflatex "$speech"
            pdflatex "$speech"
        done
    ;;
        
    web-doc)
        rsync -av "${basedir}/docs/web/" "${WEBTOPDIR}"

        cd "${WEBDIR}" && git add "${WEBBASE}"
        cd "${WEBDIR}" && git commit -m "cdist update" "${WEBBASE}" "${WEBPAGE}"
        cd "${WEBDIR}" && make pub
    ;;

    web)
        set -e
        $0 web-doc
        # Fix ikiwiki, which does not like symlinks for pseudo security
        ssh tee.schottelius.org \
          "cd /home/services/www/nico/www.nico.schottelius.org/www/software/cdist/man &&
                rm -f latest && ln -sf "$version" latest"
    ;;

     p|pu|pub)
          for remote in "" github sf ethz; do
                echo "Pushing to $remote"
                git push --mirror $remote
          done
    ;;

    clean)
        rm -f ${MAN7DSTDIR}/cdist-reference.text

        find "${MANDIR}" -mindepth 2 -type l \
            -o -name "*.1" \
            -o -name "*.7" \
            -o -name "*.html" \
            -o -name "*.xml" \
        | xargs rm -f

        find * -name __pycache__  | xargs rm -rf
    ;;
    clean-dist)
        rm -f cdist/version.py MANIFEST PKGBUILD
        rm -rf cache/ dist/

        # Archlinux
        rm -f cdist-*.pkg.tar.xz cdist-*.tar.gz
        rm -rf pkg/ src/
    ;;

    very-clean)
        $0 clean
        $0 clean-dist
    ;;

    test)
        shift # skip t
        export PYTHONPATH="$(pwd -P)"

        if [ $# -lt 1 ]; then
            python3 -m cdist.test
        else
            python3 -m unittest "$@"
        fi
    ;;

    version)
        echo "VERSION=\"$version\"" > cdist/version.py
    ;;

    *)
        echo ''
        echo 'Welcome to cdist!'
        echo ''
        echo 'Here are the possible targets:'
        echo ''
        echo '    clean: Remove build stuff'
        echo '    man: Build manpages (requires Asciidoc)'
        echo '    test: Run tests'
        echo ''
        echo ''
        echo "Unknown target, \"$1\"" >&2
        exit 1
    ;;

esac
