#!/bin/sh
# generic git post-receive hook.
# change the config options below and call this script in your post-receive
# hook or symlink it.
#
# NOTE, things to do manually (once) before running this script:
# - modify the categories in the for loop with your own.
#
# usage: sh example_post-receive.sh [reponame]
#
# if reponame is not set the basename of the current directory is used,
# this is the directory of the repo when called from the post-receive script.

# NOTE: needs to be set for correct locale (expects UTF-8) otherwise the
#       default is LC_CTYPE="POSIX".
export LC_CTYPE="en_US.UTF-8"

# paths must be absolute
reposdir="/srv/git"
webdir="/srv/git/html"
cachefile=".stagit-build-cache"

is_public_and_listed() {
    if [ ! -f "$1/git-daemon-export-ok" ] || [ ! -f "$1/category" ]; then
        return 1
    fi
    return 0
}

is_forced_update() {
    while read -r old new ref; do
        test "$old" = "0000000000000000000000000000000000000000" && continue
        test "$new" = "0000000000000000000000000000000000000000" && continue

        hasrevs="$(git rev-list "$old" "^$new" | sed 1q)"
        if test -n "$hasrevs"; then
            return 0
        fi
    done
    return 1
}

make_repo_web() {
    reponame="$(basename "$1" ".git")"
    printf "[%s] stagit HTML pages... " "$reponame"

    # if forced update, remove directory and cache file
    is_forced_update && printf "forced update... " && rm -rf "$webdir/$reponame"

    mkdir -p "$webdir/$reponame"
    cd "$webdir/$reponame" || return 1

    # make pages
    stagit -c "$cachefile" -u "https://git.hwc.io/$reponame/" "$1"

    # symlinks
    [ -f "about.html" ] \
        && ln -sf "about.html" "index.html" \
        || ln -sf "log.html" "index.html"

    echo "done"
}

make_stagit_index() {
    printf "Generating stagit index... "

    # generate index arguments
    args=""
    for category in "Projects" "Personal setup" "Miscellanea"; do
        args="$args -c \"$category\""
        for repo in "$reposdir/"*.git/; do
            repo="${repo%/}"
            is_public_and_listed "$repo" || continue
            [ "$(cat "$repo/category")" = "$category" ] && args="$args $repo"
        done
    done

    # make index
    echo "$args" | xargs stagit-index > "$webdir/index.html"

    echo "done"
}

if [ "$1" = "" ]; then
    repo="$(pwd)"
else
    repo="$reposdir/$1"
fi

cd "$repo" || exit 1
is_public_and_listed "$repo" || exit 0

make_repo_web "$repo"
make_stagit_index
