nimbus-eth2/scripts/process_lfs.sh

74 lines
2.3 KiB
Bash
Executable File

#!/bin/bash
set -e
ARCHIVE_NAME="json_tests.tar.xz"
TMP_CACHE_DIR="tmpcache"
SUBREPO_DIR="tests/official/fixtures"
LFS_DIR="json_tests"
CACHE_DIR="$1" # optional parameter pointing to a CI cache dir. Without it, we just download the LFS files for a local `make test`.
[[ -d "${SUBREPO_DIR}" ]] || { echo "This script should be run from the \"nim-beacon-chain\" repo top dir."; exit 1; }
# macOS quirks
if uname | grep -qi "darwin"; then
ON_MACOS=1
STAT_FORMAT="-f %m"
else
ON_MACOS=0
STAT_FORMAT="-c %Y"
fi
# to and from stdout
DECOMPRESS_XZ="false"
COMPRESS_XZ="false"
which 7z &>/dev/null && { DECOMPRESS_XZ="7z e -txz -bd -so"; COMPRESS_XZ="7z a -txz -an -bd -si -so"; }
which xz &>/dev/null && { DECOMPRESS_XZ="xz -d -c -T 0"; COMPRESS_XZ="xz -c -T 0"; }
download_lfs_files() {
echo "Downloading LFS files."
pushd "${SUBREPO_DIR}"
git lfs install # redundant after running it once per repo, but fast enough not to worry about detecting whether it ran before
git lfs pull -I "${LFS_DIR}" # we just care about test fixtures converted from YAML to JSON
popd
}
UPDATE_CACHE=0
if [[ -n "${CACHE_DIR}" ]]; then
if [[ -e "${CACHE_DIR}/${ARCHIVE_NAME}" ]]; then
# compare the archive's mtime to the date of the last commit
if [[ $(stat ${STAT_FORMAT} "${CACHE_DIR}/${ARCHIVE_NAME}") -gt $(cd "${SUBREPO_DIR}"; git log --pretty=format:%cd -n 1 --date=unix "${LFS_DIR}") ]]; then
# the cache is valid
echo "Copying cached files into ${SUBREPO_DIR}/${LFS_DIR}/"
mkdir -p "${TMP_CACHE_DIR}"
${DECOMPRESS_XZ} "${CACHE_DIR}/${ARCHIVE_NAME}" | tar -x -C "${TMP_CACHE_DIR}" -f -
cp -a "${TMP_CACHE_DIR}/${LFS_DIR}"/* "${SUBREPO_DIR}/${LFS_DIR}/"
rm -rf "${TMP_CACHE_DIR}"
else
# old cache
echo "Invalidating cache."
UPDATE_CACHE=1
fi
else
# creating the archive for the first time
mkdir -p "${CACHE_DIR}"
UPDATE_CACHE=1
fi
if [[ "${UPDATE_CACHE}" == "1" ]]; then
if [[ "${ON_MACOS}" == "1" ]]; then
brew install git-lfs # this takes almost 5 minutes on Travis, so only run it if needed
fi
download_lfs_files
echo "Updating the cache."
pushd "${SUBREPO_DIR}"
# the archive will contain ${LFS_DIR} as its top dir
git archive --format=tar HEAD "${LFS_DIR}" | ${COMPRESS_XZ} > "${ARCHIVE_NAME}"
popd
mv "${SUBREPO_DIR}/${ARCHIVE_NAME}" "${CACHE_DIR}/"
fi
else
# no caching
download_lfs_files
fi