From c8b1c009cf24145c0ae6521dfb466931839cd181 Mon Sep 17 00:00:00 2001
From: Daniil-Gusev <[email protected]>
Date: Thu, 30 Jul 2026 19:25:39 +0300
Subject: [PATCH] contrib: Cleanup downloaded archives in
 download_prerequisites

By default, download_prerequisites left downloaded .tar archives in the
destination directory after extraction. Clean them up after successful
extraction, restoring the behavior of earlier script versions.

Add --save-archives (and --no-save-archives) options to preserve downloaded
archives when explicitly requested.

Avoid re-downloading, verifying, and extracting archives if target component
directories already exist and are not empty.

contrib/ChangeLog:

        * download_prerequisites (dir_has_content): New function.
        (save_archives): New variable.
        Document and handle --save-archives and --no-save-archives options.
        Skip download, verify, and extract steps if the target directory
        already has content. Delete downloaded archives at the end unless
        save_archives is set.
---
 contrib/download_prerequisites | 40 +++++++++++++++++++++++++++++-----
 1 file changed, 35 insertions(+), 5 deletions(-)

diff --git a/contrib/download_prerequisites b/contrib/download_prerequisites
index 2e6693a2a..738018689 100755
--- a/contrib/download_prerequisites
+++ b/contrib/download_prerequisites
@@ -44,10 +44,16 @@ echo_archives() {
     if [ ${graphite} -gt 0 ]; then echo "${isl}"; fi
 }
 
+# 1 if the directory is empty or not exists
+dir_has_content() {
+    [ -d "$1" ] && [ -n "$(ls "$1" 2>/dev/null)" ]
+}
+
 graphite=1
 verify=1
 force=0
 only_gettext=false
+save_archives=0
 OS=$(uname)
 
 die() {
@@ -84,6 +90,8 @@ The following options are available:
  --sha512         use SHA512 checksum to verify package integrity (default)
  --md5            use MD5 checksum to verify package integrity
  --only-gettext   inhibit downloading any package but gettext
+ --save-archives  do not delete downloaded archive files after extraction
+ --no-save-archives delete downloaded archive files after extraction (default)
  --help           show this text and exit
  --version        show version information and exit
 "
@@ -167,6 +175,12 @@ do
             --only-gettext)
                 only_gettext=true
                 ;;
+           --save-archives)
+               save_archives=1
+               ;;
+           --no-save-archives)
+               save_archives=0
+               ;;
             -*)
                 die "unknown option: ${arg}"
                 ;;
@@ -231,12 +245,15 @@ esac
 
 for ar in $(echo_archives)
 do
-    if [ ${force} -gt 0 ]; then rm -f "${directory}/${ar}"; fi
+    dir_has_content "${directory:?}/${ar%.tar*}"; hascontent=$?
+    if [ ${force} -gt 0 ]; then
+       rm -f "${directory:?}/${ar}"
+     elif [ ${hascontent} -eq 0 ]; then continue; fi
     [ -e "${directory}/${ar}" ]                                               \
         || ( cd "${directory}" && ${fetch} --no-verbose "${base_url}${ar}" )  \
         || die "Cannot download ${ar} from ${base_url}"
 done
-unset ar
+unset ar hascontent
 
 if [ ${verify} -gt 0 ]
 then
@@ -244,18 +261,23 @@ then
     [ -r "${chksumfile}" ] || die "No checksums available"
     for ar in $(echo_archives)
     do
+       dir_has_content "${directory:?}/${ar%.tar*}"; hascontent=$?
+       if [ ${hascontent} -eq 0 ]; then continue; fi
         grep "${ar}" "${chksumfile}"                                          \
             | ( cd "${directory}" && ${chksum} )                              \
             || die "Cannot verify integrity of possibly corrupted file ${ar}"
     done
     unset chksumfile
 fi
-unset ar
+unset ar hascontent
 
 for ar in $(echo_archives)
 do
     package="${ar%.tar*}"
-    if [ ${force} -gt 0 ]; then rm -rf "${directory}/${package}"; fi
+    dir_has_content "${directory:?}/${package}"; hascontent=$?
+    if [ ${force} -gt 0 ] || [ ${hascontent} -gt 0 ]; then
+       rm -rf "${directory:?}/${package}"
+    elif [ ${hascontent} -eq 0 ]; then continue; fi
     case $ar in
     *.gz)
        uncompress='gzip -d'
@@ -272,7 +294,7 @@ do
         || die "Cannot extract package from ${ar}"
     unset package
 done
-unset ar
+unset ar hascontent
 
 for ar in $(echo_archives)
 do
@@ -286,4 +308,12 @@ do
 done
 unset ar
 
+for ar in $(echo_archives)
+do
+    if [ ${save_archives} -eq 0 ]; then
+       rm -f "${directory:?}/${ar}"
+    fi
+done
+unset ar
+
 echo "All prerequisites downloaded successfully."
-- 
2.55.0

Reply via email to