From 50e15262b29933a353de25cc60c91dbbeb469324 Mon Sep 17 00:00:00 2001 From: Jia Yuan Lo Date: Sat, 6 Aug 2022 15:25:53 +0800 Subject: [PATCH] enhance(scripts/generate-bootstraps.sh): add caching support --- scripts/generate-bootstraps.sh | 57 ++++++++++++++++++++++++++++++---- 1 file changed, 51 insertions(+), 6 deletions(-) diff --git a/scripts/generate-bootstraps.sh b/scripts/generate-bootstraps.sh index 1d85d5243415bef..4ba129d02883610 100755 --- a/scripts/generate-bootstraps.sh +++ b/scripts/generate-bootstraps.sh @@ -13,6 +13,11 @@ trap 'rm -rf $BOOTSTRAP_TMPDIR' EXIT # and <10. BOOTSTRAP_ANDROID10_COMPATIBLE=false +# Optional caching of downloaded packages in output directory +# Apt only for now +TERMUX_PACKAGE_DOWNLOAD_CACHE=false +TERMUX_PACKAGE_DOWNLOAD_CACHE_DIR="$PWD/output" + # By default, bootstrap archives will be built for all architectures # supported by Termux application. # Override with option '--architectures'. @@ -119,8 +124,9 @@ pull_package() { mkdir -p "$package_tmpdir" if [ ${TERMUX_PACKAGE_MANAGER} = "apt" ]; then - local package_url + local package_url package_file package_url="$REPO_BASE_URL/$(echo "${PACKAGE_METADATA[${package_name}]}" | grep -i "^Filename:" | awk '{ print $2 }')" + package_file="$(echo "$package_url" | sed -e 's|\(.*\)\/\(.*\).deb$|\2.deb|')" if [ "${package_url}" = "$REPO_BASE_URL" ] || [ "${package_url}" = "${REPO_BASE_URL}/" ]; then echo "[!] Failed to determine URL for package '$package_name'." exit 1 @@ -144,10 +150,28 @@ pull_package() { unset dep fi + if [ "$TERMUX_PACKAGE_DOWNLOAD_CACHE" = true ]; then + # since each generate-bootstraps.sh run will have different package_tmpdir + # we dont have to check existence of both files and even so prioritise the cached copy + # also use symbolic link to save space and I/O + echo "[*] Checking '$TERMUX_PACKAGE_DOWNLOAD_CACHE_DIR' for cached copy of '$package_name' package file..." + if [ -e "$TERMUX_PACKAGE_DOWNLOAD_CACHE_DIR/$package_file" ]; then + echo "[*] Symlinking cached '$package_file' to '$package_tmpdir'..." + ln -fsT "$TERMUX_PACKAGE_DOWNLOAD_CACHE_DIR/$package_file" "$package_tmpdir/package.deb" + else + echo "[*] Cached copy of '$package_file' not found. Skipping..." + fi + fi + if [ ! -e "$package_tmpdir/package.deb" ]; then echo "[*] Downloading '$package_name'..." curl --fail --location --output "$package_tmpdir/package.deb" "$package_url" + if [ "$TERMUX_PACKAGE_DOWNLOAD_CACHE" = true ]; then + echo "[*] Caching '$package_name' package.deb to '$TERMUX_PACKAGE_DOWNLOAD_CACHE_DIR/$package_file'..." + cp -f "$package_tmpdir/package.deb" "$TERMUX_PACKAGE_DOWNLOAD_CACHE_DIR/$package_file" + fi + echo "[*] Extracting '$package_name'..." (cd "$package_tmpdir" ar x package.deb @@ -295,6 +319,11 @@ show_usage() { echo " Multiple packages should be passed as" echo " comma-separated list." echo + echo " -c, --cache [DIR] Enable caching. Downloaded package files will be" + echo " stored at output directory unless specified another" + echo " path. The files can be reused at later runs." + echo " This option is disabled by default and for apt only." + echo echo " --pm MANAGER Set up a package manager in bootstrap." echo " It can only be pacman or apt (the default is apt)." echo @@ -311,7 +340,7 @@ show_usage() { echo "Architectures: ${TERMUX_ARCHITECTURES[*]}" echo "Repository Base Url: ${REPO_BASE_URL}" echo "Prefix: ${TERMUX_PREFIX}" - echo "Package manager: ${TERMUX_PACKAGE_MANAGER}" + echo "Package manager: ${TERMUX_PACKAGE_MANAGER}" echo } @@ -343,7 +372,7 @@ while (($# > 0)); do REPO_BASE_URL="${REPO_BASE_URLS[${TERMUX_PACKAGE_MANAGER}]}" shift 1 else - echo "[!] Option '--pm' requires an argument." 1>&2 + echo "[!] Option '--pm' requires an argument." >&2 show_usage exit 1 fi @@ -372,6 +401,13 @@ while (($# > 0)); do exit 1 fi ;; + -c|--cache) + if [ $# -gt 1 ] && [ -n "$2" ] && [[ $2 != -* ]]; then + TERMUX_PACKAGE_DOWNLOAD_CACHE_DIR="$2" + shift 1 + fi + TERMUX_PACKAGE_DOWNLOAD_CACHE=true + ;; *) echo "[!] Got unknown option '$1'" show_usage @@ -382,16 +418,25 @@ while (($# > 0)); do done if [[ "$TERMUX_PACKAGE_MANAGER" == *" "* ]] || [[ " ${TERMUX_PACKAGE_MANAGERS[*]} " != *" $TERMUX_PACKAGE_MANAGER "* ]]; then - echo "[!] Invalid package manager '$TERMUX_PACKAGE_MANAGER'" 1>&2 - echo "Supported package managers: '${TERMUX_PACKAGE_MANAGERS[*]}'" 1>&2 + echo "[!] Invalid package manager '$TERMUX_PACKAGE_MANAGER'" >&2 + echo "Supported package managers: '${TERMUX_PACKAGE_MANAGERS[*]}'" >&2 exit 1 fi if [ -z "$REPO_BASE_URL" ]; then - echo "[!] The repository base url is not set." 1>&2 + echo "[!] The repository base url is not set." >&2 exit 1 fi +if [ "$TERMUX_PACKAGE_DOWNLOAD_CACHE" = true ]; then + if [ "$TERMUX_PACKAGE_MANAGER" != apt ]; then + echo "[!] Option '--cache' does not support '$TERMUX_PACKAGE_MANAGER' yet." >&2 + exit 1 + fi + echo "[*] Caching enabled. Cached packages will be stored at '$TERMUX_PACKAGE_DOWNLOAD_CACHE_DIR'." + mkdir -p "$TERMUX_PACKAGE_DOWNLOAD_CACHE_DIR" +fi + for package_arch in "${TERMUX_ARCHITECTURES[@]}"; do BOOTSTRAP_ROOTFS="$BOOTSTRAP_TMPDIR/rootfs-${package_arch}" BOOTSTRAP_PKGDIR="$BOOTSTRAP_TMPDIR/packages-${package_arch}"