#!/usr/bin/env bash

# **build_docs.sh** - Build the gh-pages docs for DevStack
#
# - Install shocco if not found on PATH and INSTALL_SHOCCO is set
# - Clone MASTER_REPO branch MASTER_BRANCH
# - Re-creates ``docs/html`` directory from existing repo + new generated script docs

# Usage:
## build_docs.sh [-o <out-dir>] [-g] [master|<repo> [<branch>]]
## <repo>           The DevStack repository to clone (default is DevStack github repo)
##                  If a repo is not supplied use the current directory
##                  (assumed to be a DevStack checkout) as the source.
## <branch>         The DevStack branch to check out (default is master; ignored if
##                  repo is not specified)
## .                Use the current repo and branch (do not use with -p to
##                  prevent stray files in the workspace being added tot he docs)
## -o <out-dir>     Write the static HTML output to <out-dir>
##                  (Note that <out-dir> will be deleted and re-created to ensure it is clean)
## -g               Update the old gh-pages repo  (set PUSH=1 to actualy push up to RCB)

# Defaults
# --------

# Source repo/branch for DevStack
MASTER_REPO=${MASTER_REPO:-git://git.openstack.org/openstack-dev/devstack}
MASTER_BRANCH=${MASTER_BRANCH:-master}

# http://devstack.org is a GitHub gh-pages site in the https://github.com/cloudbuilders/devtack.git repo
GH_PAGES_REPO=git@github.com:cloudbuilders/devstack.git

DOCS_SOURCE=docs/source
HTML_BUILD=docs/html

# Keep track of the devstack directory
TOP_DIR=$(cd $(dirname "$0")/.. && pwd)

# Uses this shocco branch: https://github.com/dtroyer/shocco/tree/rst_support
SHOCCO=${SHOCCO:-shocco}
if ! which shocco; then
    if [[ ! -x $TOP_DIR/shocco/shocco ]]; then
        if [[ -z "$INSTALL_SHOCCO" ]]; then
            echo "shocco not found in \$PATH, please set environment variable SHOCCO"
            exit 1
        fi
        echo "Installing local copy of shocco"
        if ! which pygmentize; then
            sudo pip install Pygments
        fi
        if ! which rst2html.py; then
            sudo pip install docutils
        fi
        git clone -b rst_support https://github.com/dtroyer/shocco shocco
        cd shocco
        ./configure
        make || exit
        cd ..
    fi
    SHOCCO=$TOP_DIR/shocco/shocco
fi

# Process command-line args
while getopts go: c; do
    case $c in
        g)  GH_UPDATE=1
            ;;
        o)  HTML_BUILD=$OPTARG
            ;;
    esac
done
shift `expr $OPTIND - 1`


if [[ -n "$1" ]]; then
    master="master"
    if [[ "${master/#$1}" != "master" ]]; then
        # Partial match on "master"
        REPO=$MASTER_REPO
    else
        REPO=$1
    fi
    REPO_BRANCH=${2:-$MASTER_BRANCH}
fi

# Check out a specific DevStack branch
if [[ -n $REPO ]]; then
    # Make a workspace
    TMP_ROOT=$(mktemp -d work-docs-XXXX)
    echo "Building docs in $TMP_ROOT"
    cd $TMP_ROOT

    # Get the master branch
    git clone $REPO devstack
    cd devstack
    if [[ -n "$REPO_BRANCH" ]]; then
        git checkout $REPO_BRANCH
    fi
fi

# Assumption is we are now in the DevStack workspace to be processed

# Processing
# ----------

# Clean up build dir
rm -rf $HTML_BUILD
mkdir -p $HTML_BUILD

# Get fully qualified dirs
FQ_DOCS_SOURCE=$(cd $DOCS_SOURCE && pwd)
FQ_HTML_BUILD=$(cd $HTML_BUILD && pwd)

# Get repo static
cp -pr $FQ_DOCS_SOURCE/* $FQ_HTML_BUILD

# Insert automated bits
GLOG=$(mktemp gitlogXXXX)
git log \
    --pretty=format:'            <li>%s - <em>Commit <a href="https://review.openstack.org/#q,%h,n,z">%h</a> %cd</em></li>' \
    --date=short \
    --since '6 months ago' | grep -v Merge >$GLOG
sed -e $"/%GIT_LOG%/r $GLOG" $FQ_DOCS_SOURCE/changes.html >$FQ_HTML_BUILD/changes.html
rm -f $GLOG

# Build list of scripts to process
FILES=""
for f in $(find . -name .git -prune -o \( -type f -name \*.sh -not -path \*shocco/\* -print \)); do
    echo $f
    FILES+="$f "
    mkdir -p $FQ_HTML_BUILD/`dirname $f`;
    $SHOCCO $f > $FQ_HTML_BUILD/$f.html
done
for f in $(find functions functions-common lib samples -type f -name \*); do
    echo $f
    FILES+="$f "
    mkdir -p $FQ_HTML_BUILD/`dirname $f`;
    $SHOCCO $f > $FQ_HTML_BUILD/$f.html
done
echo "$FILES" >docs/files

if [[ -n $GH_UPDATE ]]; then
    GH_ROOT=$(mktemp -d work-gh-XXXX)
    cd $GH_ROOT

    # Pull the latest docs branch from devstack.org repo
    git clone -b gh-pages $GH_PAGES_REPO gh-docs

    # Get the generated files
    cp -pr $FQ_HTML_BUILD/* gh-docs

    # Collect the new generated pages
    (cd gh-docs; find . -name \*.html -print0 | xargs -0 git add)

    # Push our changes back up to the docs branch
    if ! git diff-index HEAD --quiet; then
        git commit -a -m "Update script docs"
        if [[ -n $PUSH ]]; then
            git push
        fi
    fi
fi

# Clean up or report the temp workspace
if [[ -n REPO && -n $PUSH_REPO ]]; then
    echo rm -rf $TMP_ROOT
else
    if [[ -z "$TMP_ROOT" ]]; then
        TMP_ROOT="$(pwd)"
    fi
    echo "Built docs in $HTML_BUILD"
fi
