#!/bin/bash
#
# Author: Fam Zheng <famz@redhat.com>
#
# Archive source tree, including submodules. This is created for test code to
# export the source files, in order to be built in a different environment,
# such as in a docker instance or VM.
#
# This code is licensed under the GPL version 2 or later.  See
# the COPYING file in the top-level directory.

error() {
    printf %s\\n "$*" >&2
    exit 1
}

if test $# -lt 1; then
    error "Usage: $0 <output tarball>"
fi

tar_file=$(realpath "$1")
sub_tdir=$(mktemp -d "${tar_file%.tar}.sub.XXXXXXXX")
sub_file="${sub_tdir}/submodule.tar"

# We want a predictable list of submodules for builds, that is
# independent of what the developer currently has initialized
# in their checkout, because the build environment is completely
# different to the host OS.
subprojects=(
  anyhow-1-rs
  arbitrary-int-1-rs
  attrs-0.2-rs
  berkeley-softfloat-3
  berkeley-testfloat-3
  bilge-0.2-rs
  bilge-impl-0.2-rs
  either-1-rs
  foreign-0.3-rs
  glib-sys-0.21-rs
  itertools-0.11-rs
  keycodemapdb
  libc-0.2-rs
  libvfio-user
  proc-macro-error-1-rs
  proc-macro-error-attr-1-rs
  proc-macro2-1-rs
  quote-1-rs
  syn-2-rs
  unicode-ident-1-rs
)
sub_deinit=""

function cleanup() {
    local status=$?
    rm -rf "$sub_tdir"
    if test "$sub_deinit" != ""; then
        git submodule deinit $sub_deinit
    fi
    exit $status
}
trap "cleanup" 0 1 2 3 15

function tree_ish() {
    local retval='HEAD'
    if ! git diff-index --quiet --ignore-submodules=all HEAD -- &>/dev/null
    then
        retval=$(git stash create)
    fi
    echo "$retval"
}

function subproject_dir() {
    if test ! -f "subprojects/$1.wrap"; then
      error "scripts/archive-source.sh should only process wrap subprojects"
    fi

    # Print the directory key of the wrap file, defaulting to the
    # subproject name.  The wrap file is in ini format and should
    # have a single section only.  There should be only one section
    # named "[wrap-*]", which helps keeping the script simple.
    local dir
    dir=$(sed -n \
      -e '/^\[wrap-[a-z][a-z]*\]$/,/^\[/{' \
      -e    '/^directory *= */!b' \
      -e    's///p' \
      -e    'q' \
      -e '}' \
      "subprojects/$1.wrap")

    echo "${dir:-$1}"
}

git archive --format tar "$(tree_ish)" > "$tar_file"
test $? -ne 0 && error "failed to archive qemu"

meson subprojects download ${subprojects[@]} >/dev/null
test $? -ne 0 && error "failed to download subprojects $subprojects"

for sp in "${subprojects[@]}"; do
    tar --append --file "$tar_file" --exclude=.git subprojects/"$(subproject_dir $sp)"
    test $? -ne 0 && error "failed to append subproject $sp to $tar_file"
done
exit 0
