Hi,

 Please look at attached patch to improve debootstrap speed via
 using pre-downloaded .deb files. If you have any comments, please
 send it to Bug #844118
 

>From e8250df72852f1a3af35ad356925ee3df6af458e Mon Sep 17 00:00:00 2001
From: Hideki Yamane <henr...@debian.org>
Date: Sun, 1 Apr 2018 19:43:31 +0900
Subject: [PATCH] Add cachedir feature

Save deb files under cachedir, it reduce fetch time and improve installation
time. Closes #551838 and #844118
---
 debootstrap   | 20 ++++++++++++++++++++
 debootstrap.8 |  3 +++
 functions     | 16 +++++++++++++---
 3 files changed, 36 insertions(+), 3 deletions(-)

diff --git a/debootstrap b/debootstrap
index 9b547ad..14b031c 100755
--- a/debootstrap
+++ b/debootstrap
@@ -45,6 +45,7 @@ VERBOSE=""
 CERTIFICATE=""
 CHECKCERTIF=""
 PRIVATEKEY=""
+CACHE_DIR=""
 
 DEF_MIRROR="http://deb.debian.org/debian";;
 DEF_HTTPS_MIRROR="https://deb.debian.org/debian";;
@@ -109,6 +110,8 @@ usage()
                              of a missing keyring), aborting otherwise
       --no-resolve-deps      don't try to resolve dependencies automatically
 
+      --cachedir=DIR         Use DIR as package cache directory
+
       --unpack-tarball=T     acquire .debs from a tarball instead of http
       --make-tarball=T       download .debs and create a tarball (tgz format)
       --second-stage-target=DIR
@@ -238,6 +241,23 @@ if [ $# != 0 ] ; then
                        error 1 BADEXTRACTOR "%s: unknown extractor" 
"$EXTRACTOR_OVERRIDE"
                fi
                ;;
+           --cachedir|--cachedir=?*)
+               if [ "$1" = "--cachedir" ] && [ -n "$2" ] ; then
+                       CACHE_DIR="$2"
+                       shift 2
+               elif [ "$1" != "${1#--cachedir=}" ]; then
+                       CACHE_DIR="${1#--cachedir=}"
+                       shift
+               else
+                       error 1 NEEDARG "option requires an argument %s" "$1"
+               fi
+               if [ ! -d "$CACHE_DIR" ] ; then
+                       error 1 NOCACHEDIR "%s: No such directory" "$CACHE_DIR"
+               fi
+               if [ ! -z ${CACHE_DIR##/*} ]; then
+                       error 1 NOTABSOLUTEPATH "cachedir should be specified 
as absolute path"
+               fi
+               ;;
            --unpack-tarball|--unpack-tarball=?*)
                if [ "$1" = "--unpack-tarball" -a -n "$2" ] ; then
                        UNPACK_TARBALL="$2"
diff --git a/debootstrap.8 b/debootstrap.8
index e802003..fe65d85 100644
--- a/debootstrap.8
+++ b/debootstrap.8
@@ -136,6 +136,9 @@ a foreign chroot) (requires \-\-second\-stage)
 Don't delete the /debootstrap directory in the target after completing the
 installation.
 .IP
+.IP "\fB\-\-cachedir=DIR\fP"
+Cache .deb files under directory. It should be absolute path.
+.IP
 .IP "\fB\-\-unpack\-tarball=FILE\fP"
 Acquire .debs from tarball FILE instead of downloading via http.
 .IP
diff --git a/functions b/functions
index b780488..309399b 100644
--- a/functions
+++ b/functions
@@ -337,7 +337,9 @@ get () {
                    *)   from="$1"; dest="$2" ;;
                esac
 
-               if [ "${dest#/}" = "$dest" ]; then
+               if [ ! -z "$CACHE_DIR" ]; then
+                       dest="${dest%%*/}"
+               elif [ "${dest#/}" = "$dest" ]; then
                        dest="./$dest"
                fi
                local dest2="$dest"
@@ -347,7 +349,9 @@ get () {
 
                while [ "$iters" -lt 10 ]; do
                        info RETRIEVING "Retrieving %s %s" "$displayname" 
"$versionname"
-                       if ! just_get "$from" "$dest2"; then continue 2; fi
+                       if [ ! -e "$dest2" ]; then
+                               if ! just_get "$from" "$dest2"; then continue 
2; fi
+                       fi
                        if [ "$checksum" != "" ]; then
                                info VALIDATING "Validating %s %s" 
"$displayname" "$versionname"
                                if verify_checksum "$dest2" "$checksum" "$siz"; 
then
@@ -717,10 +721,16 @@ download_debs () {
                        else
                                progress_next "$(($dloaddebs + $size))"
                                local debdest="$($DLDEST deb "$p" "$ver" "$arc" 
"$m" "$fil")"
-                               if get "$m/$fil" "$TARGET/$debdest" "$checksum" 
"$size"; then
+                               local debcache="$(echo "$p"_"$ver"_"$arc".deb | 
sed 's/:/%3a/')"
+                               if [ -z "$CACHE_DIR" ] && get "$m/$fil" 
"$TARGET/$debdest" "$checksum" "$size"; then
+                                       dloaddebs="$(($dloaddebs + $size))"
+                                       echo >>$TARGET/debootstrap/deburis "$p 
$ver $m/$fil"
+                                       echo >>$TARGET/debootstrap/debpaths "$p 
$debdest"
+                               elif [ -d "$CACHE_DIR" ] && get "$m/$fil" 
"$CACHE_DIR/$debcache" "$checksum" "$size"; then
                                        dloaddebs="$(($dloaddebs + $size))"
                                        echo >>$TARGET/debootstrap/deburis "$p 
$ver $m/$fil"
                                        echo >>$TARGET/debootstrap/debpaths "$p 
$debdest"
+                                       cp "$CACHE_DIR/$debcache" 
"$TARGET/$debdest"
                                else
                                        warning COULDNTDL "Couldn't download 
package %s (ver %s arch %s)" "$p" "$ver" "$arc"
                                        leftover="$leftover $p"
-- 
2.16.3

Reply via email to