From a39c3c4520ecea31cf85d31741275657268a8cc8 Mon Sep 17 00:00:00 2001 From: Andrew Cady Date: Wed, 30 Aug 2017 20:20:27 -0400 Subject: selfstrap: substantially improve performance --- multistrap/selfstrap | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/multistrap/selfstrap b/multistrap/selfstrap index 265049b..88dc07e 100755 --- a/multistrap/selfstrap +++ b/multistrap/selfstrap @@ -124,7 +124,7 @@ parse_apt_noact_line() return 1 } -extract_dpkg_info() +dpkg_extract_with_info() { local deb="$1" TARGET="$2" multiarch="$3" command PKG PKG=${deb##*/} @@ -137,9 +137,10 @@ f=$TARGET/var/lib/dpkg/info/$PKG.${TAR_FILENAME#./} cat > "$f" chmod $TAR_MODE "$f" ' - (export PKG TARGET - dpkg --ctrl-tarfile "$deb" | tar -x --to-command "$command") - dpkg --fsys-tarfile "$deb" | tar -t | sed 's?^\.??; s?^/$?/.?; s?/$??' > "$TARGET/var/lib/dpkg/info/$PKG.list" + (export PKG TARGET; dpkg --ctrl-tarfile "$deb" | tar -x --to-command "$command") + dpkg --fsys-tarfile "$deb" | + (cd "$TARGET" && tar -xv) | + sed 's?^\.??; s?^/$?/.?; s?/$??' > "$TARGET/var/lib/dpkg/info/$PKG.list" } @@ -148,11 +149,7 @@ apt_run_inst() apt_get -s -yqq install "$@" | while read line; do parse_apt_noact_line "$line" || die "unexpected output from apt-get: $line" export DPKG_MAINTSCRIPT_PACKAGE="$package" DPKG_MAINTSCRIPT_ARCH="$arch" - if is_multiarch_same "$package"; then - multiarch=":$arch" - else - multiarch= - fi + is_multiarch_same "$package" && multiarch=":$arch" || multiarch= case "$action" in Inst) export DPKG_MAINTSCRIPT_NAME=preinst @@ -189,11 +186,12 @@ apt_extract() case "$action" in Inst) printf 'Extracting %s\n' "${deb##*/}" >&2 - dpkg-deb --extract "$deb" "$rootfs" if [ "$EXTRACT_DPKG_INFO" ]; then is_multiarch_same "$package" && multiarch=":$arch" || multiarch= - extract_dpkg_info "$deb" "$rootfs" "$multiarch" + dpkg_extract_with_info "$deb" "$rootfs" "$multiarch" + else + dpkg-deb --extract "$deb" "$rootfs" fi ;; Conf) @@ -227,13 +225,19 @@ required_packages() "$(main_packages_file)" | sort -u } -multiarch_same_packages() +declare -A is_multiarch_same +multicheck() { - [ "$multiarch_same_packages" ] || multiarch_same_packages=$(multiarch_same_packages_) - echo "$multiarch_same_packages" + local m + if [ ! "$multichecked" ]; then + for m in $(multiarch_same_packages); do + is_multiarch_same[$m]=y + done + fi + multichecked=y } -multiarch_same_packages_() +multiarch_same_packages() { perl -00 -ne \ '/^Multi-Arch: same/mi || next; /^Package: (.*)$/m && print "$1\n"' \ @@ -242,11 +246,8 @@ multiarch_same_packages_() is_multiarch_same() { - local p - for p in $(multiarch_same_packages); do - [ "$1" = "$p" ] && return - done - return 1 + multicheck + [ "${is_multiarch_same[$1]}" ] } set -e -- cgit v1.2.3