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" 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'" 41 42cd "$vroot_dir" 43test $? -ne 0 && error "failed to change into '$vroot_dir'" 44 45git checkout $HEAD 46test $? -ne 0 && error "failed to checkout $HEAD revision" 47 48for sm in $submodules; do 49 git submodule update --init $sm 50 test $? -ne 0 && error "failed to init submodule $sm" 51done 52 53if test -n "$submodules"; then 54 { 55 git ls-files || error "git ls-files failed" 56 for sm in $submodules; do 57 (cd $sm; git ls-files) | sed "s:^:$sm/:" 58 if test "${PIPESTATUS[*]}" != "0 0"; then 59 error "git ls-files in submodule $sm failed" 60 fi 61 done 62 } | grep -x -v $(for sm in $submodules; do echo "-e $sm"; done) > "$list_file" 63else 64 git ls-files > "$list_file" 65fi 66 67if test $? -ne 0; then 68 error "failed to generate list file" 69fi 70 71tar -cf "$tar_file" -T "$list_file" || error "failed to create tar file" 72 73exit 0 74