1#!/bin/bash 2# 3# Author: Fam Zheng <famz@redhat.com> 4# 5# Archive source tree, including submodules. This is created for test code to 6# export the source files, in order to be built in a different environment, 7# such as in a docker instance or VM. 8# 9# This code is licensed under the GPL version 2 or later. See 10# the COPYING file in the top-level directory. 11 12error() { 13 printf %s\\n "$*" >&2 14 exit 1 15} 16 17if test $# -lt 1; then 18 error "Usage: $0 <output tarball>" 19fi 20 21tar_file=$(realpath "$1") 22sub_tdir=$(mktemp -d "${tar_file%.tar}.sub.XXXXXXXX") 23sub_file="${sub_tdir}/submodule.tar" 24 25# We want a predictable list of submodules for builds, that is 26# independent of what the developer currently has initialized 27# in their checkout, because the build environment is completely 28# different to the host OS. 29submodules="dtc slirp ui/keycodemapdb tests/fp/berkeley-softfloat-3 tests/fp/berkeley-testfloat-3" 30sub_deinit="" 31 32function cleanup() { 33 local status=$? 34 rm -rf "$sub_tdir" 35 if test "$sub_deinit" != ""; then 36 git submodule deinit $sub_deinit 37 fi 38 exit $status 39} 40trap "cleanup" 0 1 2 3 15 41 42function tree_ish() { 43 local retval='HEAD' 44 if ! git diff-index --quiet --ignore-submodules=all HEAD -- &>/dev/null 45 then 46 retval=$(git stash create) 47 fi 48 echo "$retval" 49} 50 51git archive --format tar "$(tree_ish)" > "$tar_file" 52test $? -ne 0 && error "failed to archive qemu" 53for sm in $submodules; do 54 status="$(git submodule status "$sm")" 55 smhash="${status#[ +-]}" 56 smhash="${smhash%% *}" 57 case "$status" in 58 -*) 59 sub_deinit="$sub_deinit $sm" 60 git submodule update --init "$sm" 61 test $? -ne 0 && error "failed to update submodule $sm" 62 ;; 63 +*) 64 echo "WARNING: submodule $sm is out of sync" 65 ;; 66 esac 67 (cd $sm; git archive --format tar --prefix "$sm/" $(tree_ish)) > "$sub_file" 68 test $? -ne 0 && error "failed to archive submodule $sm ($smhash)" 69 tar --concatenate --file "$tar_file" "$sub_file" 70 test $? -ne 0 && error "failed append submodule $sm to $tar_file" 71done 72exit 0 73