File xen-4.5-export.sh of Package xen
#!/bin/bash
set -e
unset LANG
unset ${!LC_*}
export TZ=UTC
#
xen_git_url=git://xenbits.xen.org/xen.git
xen_tag=staging-4.5
#
xz_opts="--compress --force --verbose -9 --extreme --threads=0"
commit_msg=.osc_xen_unstable_commit_msg.txt
td=`mktemp --directory --tmpdir=/dev/shm`
xf=${td}/xf
_x() {
rm -rf "${td}"
}
trap _x EXIT
if test -z "${td}" ; then exit 1 ; fi
giturl_to_directory() {
local url=$1
local git_dir
case "${url}" in
git://xenbits.xen.org/xen.git)
git_dir=~/work/src/xen.org/xen.git
;;
git://xenbits.xen.org/qemu-xen-traditional.git)
git_dir=~/work/src/xen.org/qemu-xen-traditional.git
;;
git://xenbits.xen.org/qemu-xen.git)
git_dir=~/work/src/xen.org/qemu-xen.git
;;
git://xenbits.xen.org/qemu-xen-4.5-testing.git)
git_dir=~/work/src/xen.org/qemu-xen-traditional.git
;;
git://xenbits.xen.org/qemu-upstream-4.5-testing.git)
git_dir=~/work/src/xen.org/qemu-xen.git
;;
git://xenbits.xen.org/seabios.git)
git_dir=~/work/src/xen.org/seabios.git
;;
git://git.ipxe.org/ipxe.git)
git_dir=~/work/src/xen.org/ipxe.git
;;
*)
echo "${url} not known" >&2
exit 1
;;
esac
ls -d "${git_dir}/.git"
}
git_descr_2_hash() {
local git_dir=$1
local git_remote=$2
local git_tag=$3
local hash
local err1=${td}/log.tag
local err2=${td}/log.remote
rm -f "${err1}" "${err2}"
hash="`git --git-dir="${git_dir}" log --max-count=1 --pretty=format:%H ${git_tag} 2>${err1}`"
if test -z "${hash}"
then
hash="${git_remote}/${git_tag}"
fi
hash="`git --git-dir="${git_dir}" log --max-count=1 --pretty=format:%H ${hash} 2>${err2}`"
if test -z "${hash}"
then
echo "no hash for ${git_dir} ${git_remote} ${git_tag}"
cat "${err1}"
cat "${err2}"
exit 1
fi
echo "${hash}"
}
git_commit_date() {
local git_dir=$1
local git_remote=$2
local git_tag=$3
local hash
hash=`git_descr_2_hash ${git_dir} ${git_remote} ${git_tag}`
git --git-dir="${git_dir}" log --max-count=1 --pretty=format:%ct "${hash}"
}
git_find_remote() {
local git_dir=$1
local git_url=$2
local remote
local url
for remote in `git --git-dir="${git_dir}" remote`
do
url=`git --git-dir="${git_dir}" remote show -n ${remote} | sed -n '/Fetch URL:/s@^.*Fetch URL:[[:blank:]]\+@@p'`
if test "${url}" = "${git_url}"
then
echo "$remote"
return
fi
done
echo "${git_dir} does not contain URL ${git_url}"
}
git_commit_abbrev() {
local git_dir=$1
local git_remote=$2
local git_tag=$3
local hash
hash=`git_descr_2_hash ${git_dir} ${git_remote} ${git_tag}`
git --git-dir="${git_dir}" log --max-count=1 --pretty=format:%h "${hash}"
}
get_xen_file() {
local file=$1
local git_dir=${xen_git_dir}
local git_remote=${xen_git_remote}
local git_tag=${xen_tag}
git --git-dir="${git_dir}" show "${git_remote}/${git_tag}:${file}" > "${xf}"
}
unix_date_2_rpm_version() {
local unix=$1
date -u --date="@${unix}" +%Y%m%dT%H%M%S
}
tar_up_git() {
local git_dir=$1
local extract_dir=$2
local git_hash=$3
local suffix=.$4
local out_dir=$PWD
local time_stamp
local rev=./files.txt
time_stamp=`git --git-dir="${git_dir}" log --max-count=1 --pretty=format:%ct "${git_hash}" `
if test -f "${extract_dir}.tar${suffix}"
then
existing=`date -r "${extract_dir}.tar${suffix}" +%s`
if test "${time_stamp}" = "${existing}"
then
echo "${extract_dir}.tar${suffix} has expected timestamp '`date -d @${time_stamp}`'"
return
fi
echo "${extract_dir}.tar${suffix} timestamp differs:"
echo "expected: `date -d @${time_stamp}`"
echo "actually: `date -d @${existing}`"
fi
if pushd "${td}" >/dev/null
then
rm -rf ${extract_dir} ${extract_dir}.tar ${extract_dir}.tar.* ${rev}
git --git-dir="${git_dir}" archive --format=tar --prefix=${extract_dir}/ ${git_hash} | tar xf -
find ${extract_dir} -type f | sort > ${rev}
touch -d "`date -u -d \"@${time_stamp}\"`" ${rev}
tar \
--create \
--numeric-owner \
--owner=0 \
--group=0 \
--format=ustar \
--full-time \
--mtime=${rev} \
--file=${extract_dir}.tar \
--files-from=${rev}
touch -r ${rev} ${extract_dir}.tar
case "${suffix}" in
.xz)
xz ${xz_opts} ${extract_dir}.tar
;;
.bz2)
bzip2 -fv9 ${extract_dir}.tar
;;
.gz)
gzip -fv9 ${extract_dir}.tar
;;
*)
;;
esac
mv -fvt "$out_dir" "${extract_dir}.tar${suffix}"
popd > /dev/null
fi
}
#
##
###
##
#
xen_git_dir="`giturl_to_directory ${xen_git_url}`"
xen_git_remote=`git_find_remote ${xen_git_dir} ${xen_git_url}`
xen_git_hash=`git_descr_2_hash ${xen_git_dir} ${xen_git_remote} ${xen_tag}`
xen_commit_abbrev=`git_commit_abbrev ${xen_git_dir} ${xen_git_remote} ${xen_tag}`
xen_commit_unix_date="`git_commit_date ${xen_git_dir} ${xen_git_remote} ${xen_tag}`"
xen_extract_dir=xen-${xen_tag}
get_xen_file xen/Makefile
xen_version=`awk '/[[:blank:]]XEN_VERSION[[:blank:]]+=/ { print $4 }' ${xf}`.`awk '/[[:blank:]]XEN_SUBVERSION[[:blank:]]+=/ { print $4 }' ${xf}`
case "${xen_version}" in
*.|.*) exit 1 ;;
*) : good ;;
esac
xen_commit_rpm_date=`unix_date_2_rpm_version ${xen_commit_unix_date}`
git_changeset="`git --git-dir="${xen_git_dir}" log --max-count=1 '--pretty=format:%ci git:%h' ${xen_git_hash}`"
get_xen_file Config.mk
qemu_xen_traditional_git_url=` sed -n '/^QEMU_TRADITIONAL_URL.*git:\/\//{s@^.* @@;p;q}' ${xf} `
qemu_xen_traditional_git_dir="`giturl_to_directory ${qemu_xen_traditional_git_url}`"
qemu_xen_traditional_git_remote=`git_find_remote ${qemu_xen_traditional_git_dir} ${qemu_xen_traditional_git_url}`
qemu_xen_traditional_tag=` sed -n '/^QEMU_TRADITIONAL_REVISION/{/QEMU_TAG/d;s@^.* @@;p;q}' ${xf} `
qemu_xen_traditional_git_hash=`git_descr_2_hash ${qemu_xen_traditional_git_dir} ${qemu_xen_traditional_git_remote} ${qemu_xen_traditional_tag}`
qemu_xen_traditional_unix_date="`git_commit_date ${qemu_xen_traditional_git_dir} ${qemu_xen_traditional_git_remote} ${qemu_xen_traditional_tag}`"
qemu_xen_traditional_extract_dir=qemu-xen-traditional-dir-remote
#
qemu_xen_upstream_git_url=`sed -n '/^QEMU_UPSTREAM_URL.*git:\/\//{s@^.* @@;p;q}' ${xf}`
qemu_xen_upstream_git_dir="`giturl_to_directory ${qemu_xen_upstream_git_url}`"
qemu_xen_upstream_git_remote=`git_find_remote ${qemu_xen_upstream_git_dir} ${qemu_xen_upstream_git_url}`
qemu_xen_upstream_tag=`sed -n '/^QEMU_UPSTREAM_REVISION/{s@^.* @@;p;q}' ${xf}`
qemu_xen_upstream_git_hash="`git_descr_2_hash ${qemu_xen_upstream_git_dir} ${qemu_xen_upstream_git_remote} ${qemu_xen_upstream_tag}`"
qemu_xen_upstream_unix_date="`git_commit_date ${qemu_xen_upstream_git_dir} ${qemu_xen_upstream_git_remote} ${qemu_xen_upstream_tag}`"
qemu_xen_upstream_extract_dir=qemu-xen-dir-remote
#
seabios_git_url=`sed -n '/^SEABIOS_UPSTREAM_URL.*git:\/\//{;s@^.* @@;p;q}' ${xf}`
seabios_git_dir="`giturl_to_directory ${seabios_git_url}`"
seabios_git_remote=`git_find_remote ${seabios_git_dir} ${seabios_git_url}`
seabios_tag=`sed -n '/^SEABIOS_UPSTREAM_REVISION/{/SEABIOS_UPSTREAM_TAG/d;s@^.* @@;p;q}' ${xf}`
seabios_git_hash="`git_descr_2_hash ${seabios_git_dir} ${seabios_git_remote} ${seabios_tag}`"
seabios_unix_date="`git_commit_date ${seabios_git_dir} ${seabios_git_remote} ${seabios_tag}`"
seabios_extract_dir=seabios-dir-remote
#
get_xen_file tools/firmware/etherboot/Makefile
ipxe_git_url=`sed -n '/^IPXE_GIT_URL.*git:\/\//{s@^.* @@;p;q}' ${xf} `
ipxe_git_dir="`giturl_to_directory ${ipxe_git_url}`"
ipxe_git_remote=`git_find_remote ${ipxe_git_dir} ${ipxe_git_url}`
ipxe_tag=`sed -n '/^IPXE_GIT_TAG/{s@^.* @@;p;q}' ${xf} `
ipxe_git_hash="`git_descr_2_hash ${ipxe_git_dir} ${ipxe_git_remote} ${ipxe_tag}`"
ipxe_unix_date="`git_commit_date ${ipxe_git_dir} ${ipxe_git_remote} ${ipxe_tag}`"
ipxe_extract_dir=ipxe
#
spec_version="${xen_version}.${xen_commit_rpm_date}.${xen_commit_abbrev}"
#
time tar_up_git "${xen_git_dir}" "${xen_extract_dir}" "${xen_git_hash}" xz
#
time tar_up_git "${qemu_xen_traditional_git_dir}" "${qemu_xen_traditional_extract_dir}" "${qemu_xen_traditional_git_hash}" xz
#
time tar_up_git "${qemu_xen_upstream_git_dir}" "${qemu_xen_upstream_extract_dir}" "${qemu_xen_upstream_git_hash}" xz
#
time tar_up_git "${seabios_git_dir}" "${seabios_extract_dir}" "${seabios_git_hash}" xz
#
time tar_up_git "${ipxe_git_dir}" "${ipxe_extract_dir}" "${ipxe_git_hash}" xz
sed -i~ "
/^%define git_changeset /s@^.*@%define git_changeset ${git_changeset}@
/^%define xen_build_dir /s@^.*@%define xen_build_dir ${xen_extract_dir}@
/^Version:/s@^.*@Version: ${spec_version}@
" xen.spec
rm -fv ${commit_msg}
cat > ${commit_msg} <<EOF
xen_commit ${xen_git_hash} ` env LC_ALL=C.UTF-8 date -u -d @${xen_commit_unix_date} `
seabios_tag ${seabios_git_hash} ` env LC_ALL=C.UTF-8 date -u -d @${seabios_unix_date} `
ipxe_tag ${ipxe_git_hash} ` env LC_ALL=C.UTF-8 date -u -d @${ipxe_unix_date} `
qemu_xen_traditional_tag ${qemu_xen_traditional_git_hash} ` env LC_ALL=C.UTF-8 date -u -d @${qemu_xen_traditional_unix_date} `
qemu_xen_upstream_tag ${qemu_xen_upstream_git_hash} ` env LC_ALL=C.UTF-8 date -u -d @${qemu_xen_upstream_unix_date} `
EOF
cat ${commit_msg}