#!/usr/bin/env bash
set -e

archive() {
    export TARBALL_NAME=$1
    export TARBALL_OUTDIR=$2

    # archive this repo
    cd "$(git rev-parse --show-toplevel)"
    git archive HEAD --format=tar --prefix="${TARBALL_NAME}/" \
        -o "${TARBALL_OUTDIR}/${TARBALL_NAME}.tar"
    # archive submodules
    git submodule update --init
    git submodule foreach --quiet 'git archive HEAD --format=tar \
            --prefix="${TARBALL_NAME}/${path}/" \
            -o "${TARBALL_OUTDIR}/${TARBALL_NAME}-submodule-${path}-${sha1}.tar"
        tar -n --concatenate --file="${TARBALL_OUTDIR}/${TARBALL_NAME}.tar" \
            "${TARBALL_OUTDIR}/${TARBALL_NAME}-submodule-${path}-${sha1}.tar"'
    gzip -c "${TARBALL_OUTDIR}/${TARBALL_NAME}.tar" > "${TARBALL_OUTDIR}/${TARBALL_NAME}.tar.gz"

    # clean-up
    git submodule foreach --quiet 'rm ${TARBALL_OUTDIR}/${TARBALL_NAME}-submodule-${path}-${sha1}.tar'
    rm "${TARBALL_OUTDIR}/${TARBALL_NAME}.tar"
}

TARGET_TARBALL_NAME=shadowsocks-libev
TARGET_TARBALL_DIR=$(git rev-parse --show-toplevel)

while getopts "n:o:" opt
do
    case ${opt} in
        o)
            TARGET_TARBALL_DIR=$(readlink -f -- $OPTARG)
            ;;
        n)
            TARGET_TARBALL_NAME=$OPTARG
            ;;
        \?)
            exit 1
            ;;
    esac
done

archive "${TARGET_TARBALL_NAME}" "${TARGET_TARBALL_DIR}"