#!/bin/bash
#
#  Copyright 2018 Bloomberg Finance LP
#
#  This program is free software; you can redistribute it and/or
#  modify it under the terms of the GNU Lesser General Public
#  License as published by the Free Software Foundation; either
#  version 2 of the License, or (at your option) any later version.
#
#  This library 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
#  Lesser General Public License for more details.
#
#  You should have received a copy of the GNU Lesser General Public
#  License along with this library. If not, see <http://www.gnu.org/licenses/>.
#
#  Authors:
#        Chandan Singh <csingh43@bloomberg.net>

# This is a helper script to generate Docker images using checkouts of
# BuildStream elements.

usage() {
    cat <<EOF

USAGE: $(basename "$0") [-c BST_CMD] [-m MESSAGE] [-t TAG] [-h] ELEMENT

Create a Docker image from bst checkout of an element.

OPTIONS:
    -c BST_CMD    Path to BuildStream command (default: bst).
    -m MESSAGE    Commit message for the imported image.
    -t TAG        Tag of the imported image.
    -h            Print this help text and exit.

EXAMPLES:

    # Import hello.bst as a Docker image with tag "bst-hello" and message "hello"
    $(basename "$0") -m hello -t bst-hello hello.bst

    # Import hello.bst as a Docker image with tag "bst-hello" using bst-here
    $(basename "$0") -c bst-here -t bst-hello hello.bst

EOF
    exit "$1"
}

die() {
    echo "FATAL: $1" >&2
    exit 1
}

bst_cmd=bst
docker_import_cmd=(docker import)
docker_image_tag=

while getopts c:m:t:h arg
do
    case $arg in
    c)
        bst_cmd="$OPTARG"
        ;;
    m)
        docker_import_cmd+=('-m' "$OPTARG")
        ;;
    t)
        docker_image_tag="$OPTARG"
        ;;
    h)
        usage 0
        ;;
    \?)
        usage 1
    esac
done

shift $((OPTIND-1))
if [[ "$#" != 1 ]]; then
    echo "$0: No element specified" >&2
    usage 1
fi
element="$1"

# Dump to a temporary file in the current directory.
# NOTE: We use current directory to try to ensure compatibility with scripts
# like bst-here, assuming that the current working directory is mounted
# inside the container.

checkout_tar="bst-checkout-$(basename "$element")-$RANDOM.tar"

echo "INFO: Checking out $element ..." >&2
$bst_cmd artifact checkout "$element" --tar "$checkout_tar" || die "Failed to checkout $element"
echo "INFO: Successfully checked out $element" >&2

echo "INFO: Importing Docker image ..." >&2
"${docker_import_cmd[@]}" "$checkout_tar" "$docker_image_tag" || die "Failed to import Docker image from tarball"
echo "INFO: Successfully import Docker image $docker_image_tag" >&2

echo "INFO: Cleaning up ..." >&2
rm "$checkout_tar" || die "Failed to remove $checkout_tar"
echo "INFO: Clean up finished" >&2
