blob: ecdeddba1f2c9b468cc4b946f24fc8d28ab67f7d [file] [log] [blame] [edit]
#!/usr/bin/env bash
#
# Cached wrapper around `make fetch` for CI source tarball generation.
#
# Instead of `rm -rf $TARFILE_LOCATION/* && make fetch` (which re-downloads
# ~500MB every time), this script uses a persistent cache directory to avoid
# redundant downloads and then prunes stale tarballs.
#
# Usage:
# bin/cached-fetch.sh [CACHE_DIR]
#
# CACHE_DIR defaults to $HOME/.cache/lo-tarballs.
# TARFILE_LOCATION is read from config_host.mk (or defaults to external/tarballs).
set -euo pipefail
SRCDIR=$(cd "$(dirname "$0")/.." && pwd)
CACHE_DIR="${1:-${HOME}/.cache/lo-tarballs}"
# Get TARFILE_LOCATION from build config
if [ -f "$SRCDIR/config_host.mk" ]; then
TARFILE_LOCATION=$(sed -n 's/^export TARFILE_LOCATION=//p' "$SRCDIR/config_host.mk")
fi
TARFILE_LOCATION="${TARFILE_LOCATION:-$SRCDIR/external/tarballs}"
echo "Cache dir: $CACHE_DIR"
echo "Tarfile location: $TARFILE_LOCATION"
mkdir -p "$CACHE_DIR" "$TARFILE_LOCATION/tmp"
# Ask make for the list of needed tarball filenames
NEEDED=$(make -C "$SRCDIR" fetch-names)
# Clean target dir and pre-populate needed files from cache
rm -rf "$TARFILE_LOCATION"/*
mkdir -p "$TARFILE_LOCATION/tmp"
cached=0
for f in $NEEDED; do
if [ -f "$CACHE_DIR/$f" ]; then
# Hardlink from cache (fast, no extra disk).
# Fall back to copy if on a different filesystem.
ln "$CACHE_DIR/$f" "$TARFILE_LOCATION/$f" 2>/dev/null ||
cp "$CACHE_DIR/$f" "$TARFILE_LOCATION/$f"
cached=$((cached + 1))
fi
done
echo "Restored from cache: $cached"
# Fetch anything not already present (new/updated tarballs only)
make -C "$SRCDIR" fetch
# Update cache with any newly downloaded tarballs
new=0
for f in $NEEDED; do
if [ -f "$TARFILE_LOCATION/$f" ] && [ ! -f "$CACHE_DIR/$f" ]; then
cp "$TARFILE_LOCATION/$f" "$CACHE_DIR/$f"
new=$((new + 1))
fi
done
[ "$new" -gt 0 ] && echo "Added to cache: $new new tarballs"
# Handle cargo cache for y-crdt (Rust crates)
if [ -d "$CACHE_DIR/cargo" ] && [ ! -d "$TARFILE_LOCATION/cargo/registry" ]; then
cp -a "$CACHE_DIR/cargo" "$TARFILE_LOCATION/"
fi
if [ -d "$TARFILE_LOCATION/cargo" ]; then
cp -a "$TARFILE_LOCATION/cargo" "$CACHE_DIR/"
fi
echo "Done. $TARFILE_LOCATION is ready for source tarball packaging."