blob: 800e6206ef886bccbd629bce6e75617cf8789cc0 [file]
#!/usr/bin/env bash
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
set -euo pipefail
# Pin the archive so compatibility tests always use an immutable snapshot set.
readonly TCK_REVISION="d363b12d293b395d90abb42677f9ea63178dbc0d"
readonly TCK_ARCHIVE_URL="https://api.github.com/repos/apache/datasketches-tck/tarball/${TCK_REVISION}"
readonly SCRIPT_DIRECTORY="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
readonly REPOSITORY_ROOT="$(cd "${SCRIPT_DIRECTORY}/.." && pwd)"
readonly SERIALIZATION_DATA="${REPOSITORY_ROOT}/serialization_test_data"
usage() {
echo "Usage: $0 [cpp] [go]"
echo "Download C++ and/or Go serialization snapshots (both by default)."
}
if [[ $# -eq 0 ]]; then
set -- cpp go
fi
languages=()
for language in "$@"; do
case "${language}" in
cpp | go)
;;
-h | --help)
usage
exit 0
;;
*)
echo "Unsupported language: ${language}" >&2
usage >&2
exit 2
;;
esac
case " ${languages[*]-} " in
*" ${language} "*)
;;
*)
languages+=("${language}")
;;
esac
done
for command in curl tar mktemp; do
if ! command -v "${command}" >/dev/null 2>&1; then
echo "Required command not found: ${command}" >&2
exit 1
fi
done
mkdir -p "${SERIALIZATION_DATA}"
temporary_directory="$(mktemp -d "${TMPDIR:-/tmp}/datasketches-tck.XXXXXX")"
staging_directory=""
cleanup() {
rm -rf "${temporary_directory}"
if [[ -n "${staging_directory}" && -d "${staging_directory}" ]]; then
rm -rf "${staging_directory}"
fi
}
trap cleanup EXIT
archive_path="${temporary_directory}/datasketches-tck.tar.gz"
echo "Downloading serialization snapshots from ${TCK_ARCHIVE_URL}"
curl \
--fail \
--location \
--silent \
--show-error \
--connect-timeout 60 \
--max-time 120 \
--header "Accept: application/vnd.github+json" \
--header "User-Agent: apache-datasketches-java" \
--header "X-GitHub-Api-Version: 2022-11-28" \
--output "${archive_path}" \
"${TCK_ARCHIVE_URL}"
for language in "${languages[@]}"; do
staging_directory="$(
mktemp -d "${SERIALIZATION_DATA}/.${language}_generated_files.XXXXXX"
)"
members=()
names=()
while IFS= read -r member; do
case "${member}" in
*/serialization/"${language}"/snapshots/*.sk)
name="${member##*/}"
for existing_name in "${names[@]-}"; do
if [[ "${name}" == "${existing_name}" ]]; then
echo "Duplicate snapshot in archive: ${name}" >&2
exit 1
fi
done
members+=("${member}")
names+=("${name}")
;;
esac
done < <(tar -tzf "${archive_path}")
count=${#members[@]}
if [[ ${count} -eq 0 ]]; then
echo "No ${language} snapshots found in the TCK archive" >&2
exit 1
fi
tar \
-xzf "${archive_path}" \
-C "${staging_directory}" \
--strip-components=4 \
"${members[@]}"
for name in "${names[@]}"; do
if [[ ! -f "${staging_directory}/${name}" ]]; then
echo "Failed to extract snapshot: ${name}" >&2
exit 1
fi
done
destination="${SERIALIZATION_DATA}/${language}_generated_files"
if [[ -L "${destination}" ]]; then
echo "Snapshot output path cannot be a symbolic link: ${destination}" >&2
exit 1
fi
if [[ -e "${destination}" && ! -d "${destination}" ]]; then
echo "Snapshot output path is not a directory: ${destination}" >&2
exit 1
fi
if [[ -d "${destination}" ]]; then
rm -rf "${destination}"
fi
mv "${staging_directory}" "${destination}"
staging_directory=""
echo "Extracted ${count} ${language} snapshots into ${destination}"
done