#!/usr/bin/env bash

#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#

#
# Builds the HTrace server code.
#
# ./gobuild.sh                Builds the code.
# ./gobuild.sh test           Builds and runs all unit tests.
# ./gobuild.sh bench          Builds and runs all benchmarks
#

die() {
    echo $@
    exit 1
}

set_rpath() {
    WHAT=$1
    which patchelf &> /dev/null
    if [ $? -ne 0 ]; then
        echo "You must install the patchelf command to set RPATH."
    else
        if ! patchelf --set-rpath '$ORIGIN/' "${WHAT}"; then
            echo "patchelf failed for ${WHAT}"
        fi
    fi
}

ACTION=install
if [ $# -gt 0 ]; then
    ACTION="${1}"
    shift
fi
RELEASE_VERSION=${RELEASE_VERSION:-unknown}

# Set up directories.  The build/ directory is where build dependencies and
# build binaries should go.
SCRIPT_DIR="$(cd "$( dirname $0 )" && pwd)"
export GOBIN="${SCRIPT_DIR}/build"
mkdir -p "${GOBIN}" || die "failed to mkdir -p ${GOBIN}"
cd "${GOBIN}" || die "failed to cd to ${SCRIPT_DIR}"
export GOPATH="${GOBIN}:${SCRIPT_DIR}"

# Use the unsafe package when possible to get greater speed.  For example,
# go-codec can bypass the overhead of converting between []byte and string in
# some cases when using unsafe.
TAGS="-tags unsafe"

# Check for go
which go &> /dev/null
if [ $? -ne 0 ]; then
    cat <<EOF
You must install the Golang programming language.

If you are using Debian, try "apt-get install golang".
For Red Hat, try "yum install go".
For other distributions and operating systems use your packaging tool.
EOF
exit 1
fi

# Check for libleveldb.so
if [ -n "$LEVELDB_PREFIX" ]; then
    echo "using LEVELDB_PREFIX=$LEVELDB_PREFIX"
    export CGO_CFLAGS="-I${LEVELDB_PREFIX} -I${LEVELDB_PREFIX}/include"
    export CGO_LDFLAGS="-L${LEVELDB_PREFIX} -L${LEVELDB_PREFIX}/lib"
else
    if [ -x "/sbin/ldconfig" ]; then
        # Suse requires ldconfig to be run via the absolute path
        ldconfig=/sbin/ldconfig
    else
        which ldconfig &> /dev/null
        [ $? -eq 0 ] && ldconfig=ldconfig
    fi
    if [ -n "${ldconfig}" ]; then
        if "${ldconfig}" -p | grep -q libleveldb; then
            :
        else
            echo "You must install the leveldb-devel package (or distro-specific equivalent.)"
            exit 1
        fi
    fi
fi

case $ACTION in
    # Add any directory you want to clean up into the pom too. We cannot run
    # this gobuild clean from mvn.
clean)
    rm -rf -- "${GOBIN}" ${SCRIPT_DIR}/pkg
    ;;
install)
    # Ensure that we have the godep program.
    PATH="${PATH}:${GOBIN}"
    which godep &> /dev/null
    if [ $? -ne 0 ]; then
        echo "Installing godep..."
        go get github.com/tools/godep || die "failed to get godep"
    fi

    # Download dependencies into the build directory.
    echo "godep restore..."
    godep restore || die "failed to set up dependencies"

    # Discover the git version
    GIT_VERSION=$(git rev-parse HEAD)
    [ $? -eq 0 ] || GIT_VERSION="unknown"

    # Inject the release and git version into the htraced ldflags.
    FLAGS="-X main.RELEASE_VERSION ${RELEASE_VERSION} -X main.GIT_VERSION ${GIT_VERSION}"
    go install ${TAGS} -ldflags "${FLAGS}" -v org/apache/htrace/... "$@" \
        || die "go install failed."
    # Make a symlink to web src dir so can do development in-situ out
    # of build dir. This is ugly but blame go build.
    ln -fs "../../htrace-webapp/src/main/webapp" "${GOBIN}/../web"
    # Set the RPATH to make bundling leveldb and snappy easier.
    set_rpath "${GOBIN}/htraced"
    ;;
bench)
    go test org/apache/htrace/... ${TAGS} -test.bench=. "$@"
    ;;
*)
    go ${ACTION} org/apache/htrace/... ${TAGS} "$@"
    ;;
esac
