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") 22list_file="${tar_file}.list" 23vroot_dir="${tar_file}.vroot" 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 ui/keycodemapdb tests/fp/berkeley-softfloat-3 tests/fp/berkeley-testfloat-3" 30 31trap "status=$?; rm -rf \"$list_file\" \"$vroot_dir\"; exit \$status" 0 1 2 3 15 32 33if git diff-index --quiet HEAD -- &>/dev/null 34then 35 HEAD=HEAD 36else 37 HEAD=$(git stash create) 38fi 39git clone --shared . "$vroot_dir" 40test $? -ne 0 && error "failed to clone into '$vroot_dir'" 41for sm in $submodules; do 42 if test -d "$sm/.git" 43 then 44 git clone --shared "$sm" "$vroot_dir/$sm" 45 test $? -ne 0 && error "failed to clone submodule $sm" 46 fi 47done 48 49cd "$vroot_dir" 50test $? -ne 0 && error "failed to change into '$vroot_dir'" 51 52git checkout $HEAD 53test $? -ne 0 && error "failed to checkout $HEAD revision" 54 55for sm in $submodules; do 56 git submodule update --init $sm 57 test $? -ne 0 && error "failed to init submodule $sm" 58done 59 60if test -n "$submodules"; then 61 { 62 git ls-files || error "git ls-files failed" 63 for sm in $submodules; do 64 (cd $sm; git ls-files) | sed "s:^:$sm/:" 65 if test "${PIPESTATUS[*]}" != "0 0"; then 66 error "git ls-files in submodule $sm failed" 67 fi 68 done 69 } | grep -x -v $(for sm in $submodules; do echo "-e $sm"; done) > "$list_file" 70else 71 git ls-files > "$list_file" 72fi 73 74if test $? -ne 0; then 75 error "failed to generate list file" 76fi 77 78tar -cf "$tar_file" -T "$list_file" || error "failed to create tar file" 79 80exit 0 81