| 
									
										
										
										
											2017-09-05 10:11:52 +08:00
										 |  |  | #!/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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-15 17:17:34 +08:00
										 |  |  | tar_file=$(realpath "$1") | 
					
						
							| 
									
										
										
										
											2019-05-20 14:47:03 +02:00
										 |  |  | sub_tdir=$(mktemp -d "${tar_file%.tar}.sub.XXXXXXXX") | 
					
						
							|  |  |  | sub_file="${sub_tdir}/submodule.tar" | 
					
						
							| 
									
										
										
										
											2017-09-05 10:11:52 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-29 11:11:57 +01:00
										 |  |  | # 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. | 
					
						
							| 
									
										
										
										
											2019-08-21 11:21:16 +04:00
										 |  |  | submodules="dtc slirp meson ui/keycodemapdb" | 
					
						
							|  |  |  | submodules="$submodules tests/fp/berkeley-softfloat-3 tests/fp/berkeley-testfloat-3" | 
					
						
							| 
									
										
										
										
											2019-05-20 14:47:03 +02:00
										 |  |  | sub_deinit="" | 
					
						
							| 
									
										
										
										
											2017-09-29 11:11:57 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-20 14:47:03 +02:00
										 |  |  | 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 | 
					
						
							| 
									
										
										
										
											2017-09-29 11:11:57 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-09 00:02:49 +04:00
										 |  |  | 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" | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-09-05 10:11:52 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-09 00:02:49 +04:00
										 |  |  | git archive --format tar "$(tree_ish)" > "$tar_file" | 
					
						
							| 
									
										
										
										
											2019-05-20 14:47:03 +02:00
										 |  |  | test $? -ne 0 && error "failed to archive qemu" | 
					
						
							| 
									
										
										
										
											2017-09-29 11:11:57 +01:00
										 |  |  | for sm in $submodules; do | 
					
						
							| 
									
										
										
										
											2019-05-20 14:47:03 +02:00
										 |  |  |     status="$(git submodule status "$sm")" | 
					
						
							|  |  |  |     smhash="${status#[ +-]}" | 
					
						
							|  |  |  |     smhash="${smhash%% *}" | 
					
						
							|  |  |  |     case "$status" in | 
					
						
							|  |  |  |         -*) | 
					
						
							|  |  |  |             sub_deinit="$sub_deinit $sm" | 
					
						
							|  |  |  |             git submodule update --init "$sm" | 
					
						
							|  |  |  |             test $? -ne 0 && error "failed to update submodule $sm" | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  |         +*) | 
					
						
							|  |  |  |             echo "WARNING: submodule $sm is out of sync" | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  |     esac | 
					
						
							| 
									
										
										
										
											2019-07-09 00:02:49 +04:00
										 |  |  |     (cd $sm; git archive --format tar --prefix "$sm/" $(tree_ish)) > "$sub_file" | 
					
						
							| 
									
										
										
										
											2019-05-20 14:47:03 +02:00
										 |  |  |     test $? -ne 0 && error "failed to archive submodule $sm ($smhash)" | 
					
						
							|  |  |  |     tar --concatenate --file "$tar_file" "$sub_file" | 
					
						
							|  |  |  |     test $? -ne 0 && error "failed append submodule $sm to $tar_file" | 
					
						
							| 
									
										
										
										
											2017-09-29 11:11:57 +01:00
										 |  |  | done | 
					
						
							| 
									
										
										
										
											2017-09-05 10:11:52 +08:00
										 |  |  | exit 0 |