From 8d4cf26cb02147374f7f668ad48f56da664c8f40 Mon Sep 17 00:00:00 2001 From: Otavio Salvador Date: Fri, 27 Nov 2009 22:26:18 +0000 Subject: * Refactor deb extractors into two new functions. * Use dpkg-deb if available instead of ar (closes: #557296). * Add an --extractor option to override the automatic extractor selection. r61537 --- debian/changelog | 6 +++ debian/control | 2 +- debootstrap | 22 ++++++++++ functions | 96 +++++++++++++++++++++++++++++++++++------ scripts/debian/potato | 6 +-- scripts/debian/sarge | 6 +-- scripts/debian/sarge.buildd | 6 +-- scripts/debian/sarge.fakechroot | 6 +-- scripts/debian/sid | 6 +-- scripts/debian/woody | 6 +-- scripts/debian/woody.buildd | 6 +-- scripts/ubuntu/breezy | 6 +-- scripts/ubuntu/dapper | 6 +-- scripts/ubuntu/edgy | 6 +-- scripts/ubuntu/feisty | 6 +-- scripts/ubuntu/gutsy | 6 +-- scripts/ubuntu/hoary | 6 +-- scripts/ubuntu/hoary.buildd | 6 +-- scripts/ubuntu/warty | 6 +-- scripts/ubuntu/warty.buildd | 6 +-- 20 files changed, 127 insertions(+), 95 deletions(-) diff --git a/debian/changelog b/debian/changelog index ca39c57..8e40b5a 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,8 +1,14 @@ debootstrap (1.0.21) UNRELEASED; urgency=low + [ Otavio Salvador ] * Apply patch from Clint Adams to add support for gz/bz2/xz data.tar (closes: #458663). + [ Guillem Jover ] + * Refactor deb extractors into two new functions. + * Use dpkg-deb if available instead of ar (closes: #557296). + * Add an --extractor option to override the automatic extractor selection. + -- Otavio Salvador Mon, 16 Nov 2009 15:20:09 -0200 debootstrap (1.0.20) unstable; urgency=low diff --git a/debian/control b/debian/control index 577b759..01e7d2d 100644 --- a/debian/control +++ b/debian/control @@ -9,7 +9,7 @@ Vcs-Svn: svn://svn.debian.org/d-i/trunk/packages/debootstrap Package: debootstrap Architecture: all -Depends: wget, binutils +Depends: wget Recommends: gnupg Description: Bootstrap a basic Debian system debootstrap is used to create a Debian base system from scratch, diff --git a/debootstrap b/debootstrap index ac821b8..171a5ef 100755 --- a/debootstrap +++ b/debootstrap @@ -90,6 +90,8 @@ usage() Run second stage in a subdirectory instead of root (can be used to create a foreign chroot) (requires --second-stage) + --extractor=TYPE override automatic .deb extractor selection + (supported: $EXTRACTORS_SUPPORTED) --boot-floppies used for internal purposes by boot-floppies --debian-installer used for internal purposes by debian-installer EOF @@ -201,6 +203,24 @@ if [ $# != 0 ] ; then error 1 NEEDARG "option requires an argument %s" "$1" fi ;; + --extractor|--extractor=?*) + if [ "$1" = "--extractor" -a -n "$2" ] ; then + EXTRACTOR_OVERRIDE="$2" + shift 2 + elif [ "$1" != "${1#--extractor=}" ]; then + EXTRACTOR_OVERRIDE="${1#--extractor=}" + shift + else + error 1 NEEDARG "option requires an argument %s" "$1" + fi + if valid_extractor "$EXTRACTOR_OVERRIDE"; then + if ! type "$EXTRACTOR_OVERRIDE" >/dev/null 2>&1; then + error 1 MISSINGEXTRACTOR "The selected extractor cannot be found: %s" "$EXTRACTOR_OVERRIDE" + fi + else + error 1 BADEXTRACTOR "%s: unknown extractor" "$EXTRACTOR_OVERRIDE" + fi + ;; --unpack-tarball|--unpack-tarball=?*) if [ "$1" = "--unpack-tarball" -a -n "$2" ] ; then UNPACK_TARBALL="$2" @@ -517,6 +537,8 @@ if am_doing_phase maketarball; then fi if am_doing_phase first_stage; then + choose_extractor + # first stage sets up the chroot -- no calls should be made to # "chroot $TARGET" here; but they should be possible by the time it's # finished diff --git a/functions b/functions index e832d70..33b5a46 100644 --- a/functions +++ b/functions @@ -717,27 +717,95 @@ get_debs () { ################################################################ extraction +EXTRACTORS_SUPPORTED="dpkg-deb ar" + +# Native dpkg-deb based extractors +extract_dpkg_deb_field () { + local pkg="$1" + local field="$2" + + dpkg-deb -f "$pkg" "$field" +} + +extract_dpkg_deb_data () { + local pkg="$1" + + dpkg-deb --fsys-tarfile "$pkg" | tar -xf - +} + +# Raw .deb extractors +extract_ar_deb_field () { + local pkg="$1" + local field="$2" + + ar -p "$pkg" control.tar.gz | zcat | + tar -O -xf - control ./control 2>/dev/null | + grep -i "^$field:" | sed -e 's/[^:]*: *//' | head -n 1 +} + +extract_ar_deb_data () { + local pkg="$1" + local tarball=$(ar -t "$pkg" | grep "^data.tar.[bgx]z") + + case "$tarball" in + data.tar.gz) cat_cmd=zcat ;; + data.tar.bz2) cat_cmd=bzcat ;; + data.tar.xz) cat_cmd=xzcat ;; + *) error 1 UNKNOWNDATACOMP "Unknown compression type for %s in %s" "$tarball" "$pkg" ;; + esac + + if type $cat_cmd >/dev/null 2>&1; then + ar -p "$pkg" data.tar.gz | $cat_cmd | tar -xf - + else + error 1 UNPACKCMDUNVL "The $cat_cmd is not available on the system" + fi +} + +valid_extractor () { + local extractor="$1" + + for E in $EXTRACTORS_SUPPORTED; do + if [ "$extractor" = "$E" ]; then + return 0 + fi + done + + return 1 +} + +choose_extractor () { + local extractor + + if [ -n "$EXTRACTOR_OVERRIDE" ]; then + extractor="$EXTRACTOR_OVERRIDE" + elif type dpkg-deb >/dev/null 2>&1; then + extractor="dpkg-deb" + else + extractor="ar" + fi + + info CHOSENEXTRACTOR "Chosen extractor for .deb packages: %s" "$extractor" + case "$extractor" in + dpkg-deb) + extract_deb_field () { extract_dpkg_deb_field "$@"; } + extract_deb_data () { extract_dpkg_deb_data "$@"; } + ;; + ar) + extract_deb_field () { extract_ar_deb_field "$@"; } + extract_deb_data () { extract_ar_deb_data "$@"; } + ;; + esac +} + extract () { ( cd "$TARGET" - local p=0 tarball cat_cmd + local p=0 cat_cmd for pkg in $(debfor "$@"); do p="$(($p + 1))" progress "$p" "$#" EXTRACTPKGS "Extracting packages" packagename="$(echo "$pkg" | sed 's,^.*/,,;s,_.*$,,')" info EXTRACTING "Extracting %s..." "$packagename" - tarball=$(ar -t "./$pkg" | grep "^data.tar.[bgx]z") - case "$tarball" in - data.tar.gz) cat_cmd=zcat ;; - data.tar.bz2) cat_cmd=bzcat ;; - data.tar.xz) cat_cmd=xzcat ;; - *) error 1 UNKNOWNDATACOMP "Unknown compression type for %s in %s" "$tarball" "$pkg" ;; - esac - - if type $cat_cmd >/dev/null 2>&1; then - ar -p "./$pkg" data.tar.gz | $cat_cmd | tar -xf - - else - error 1 UNPACKCMDUNVL "The $cat_cmd is not available on the system" - fi + extract_deb_data "./$pkg" done ); } diff --git a/scripts/debian/potato b/scripts/debian/potato index 3204c7d..304cbe0 100644 --- a/scripts/debian/potato +++ b/scripts/debian/potato @@ -43,11 +43,7 @@ first_stage_install () { x_feign_install () { local pkg=$1 local deb="$(debfor $pkg)" - local ver="$( - ar -p "$TARGET/$deb" control.tar.gz | zcat | - tar -O -xf - control ./control 2>/dev/null | - grep -i ^Version: | sed -e 's/[^:]*: *//' | head -n 1 - )" + local ver="$(extract_deb_field "$TARGET/$deb" Version)" mkdir -p "$TARGET/var/lib/dpkg/info" diff --git a/scripts/debian/sarge b/scripts/debian/sarge index e49a490..252e180 100644 --- a/scripts/debian/sarge +++ b/scripts/debian/sarge @@ -111,11 +111,7 @@ first_stage_install () { x_feign_install () { local pkg="$1" local deb="$(debfor $pkg)" - local ver="$( - ar -p "$TARGET/$deb" control.tar.gz | zcat | - tar -O -xf - control ./control 2>/dev/null | - grep -i ^Version: | sed -e 's/[^:]*: *//' | head -n 1 - )" + local ver="$(extract_deb_field "$TARGET/$deb" Version)" mkdir -p "$TARGET/var/lib/dpkg/info" diff --git a/scripts/debian/sarge.buildd b/scripts/debian/sarge.buildd index 0b9ad9a..249a035 100644 --- a/scripts/debian/sarge.buildd +++ b/scripts/debian/sarge.buildd @@ -72,11 +72,7 @@ first_stage_install () { x_feign_install () { local pkg="$1" local deb="$(debfor $pkg)" - local ver="$( - ar -p "$TARGET/$deb" control.tar.gz | zcat | - tar -O -xf - control ./control 2>/dev/null | - grep -i ^Version: | sed -e 's/[^:]*: *//' | head -n 1 - )" + local ver="$(extract_deb_field "$TARGET/$deb" Version)" mkdir -p "$TARGET/var/lib/dpkg/info" diff --git a/scripts/debian/sarge.fakechroot b/scripts/debian/sarge.fakechroot index 36234fa..2fe4a38 100644 --- a/scripts/debian/sarge.fakechroot +++ b/scripts/debian/sarge.fakechroot @@ -77,11 +77,7 @@ first_stage_install () { x_feign_install () { local pkg="$1" local deb="$(debfor $pkg)" - local ver="$( - ar -p "$TARGET/$deb" control.tar.gz | zcat | - tar -O -xf - control ./control 2>/dev/null | - grep -i ^Version: | sed -e 's/[^:]*: *//' | head -n 1 - )" + local ver="$(extract_deb_field "$TARGET/$deb" Version)" mkdir -p "$TARGET/var/lib/dpkg/info" diff --git a/scripts/debian/sid b/scripts/debian/sid index 59e70fd..50a9f50 100644 --- a/scripts/debian/sid +++ b/scripts/debian/sid @@ -59,11 +59,7 @@ first_stage_install () { x_feign_install () { local pkg="$1" local deb="$(debfor $pkg)" - local ver="$( - ar -p "$TARGET/$deb" control.tar.gz | zcat | - tar -O -xf - control ./control 2>/dev/null | - grep -i ^Version: | sed -e 's/[^:]*: *//' | head -n 1 - )" + local ver="$(extract_deb_field "$TARGET/$deb" Version)" mkdir -p "$TARGET/var/lib/dpkg/info" diff --git a/scripts/debian/woody b/scripts/debian/woody index 66a1261..d174be8 100644 --- a/scripts/debian/woody +++ b/scripts/debian/woody @@ -97,11 +97,7 @@ first_stage_install () { x_feign_install () { local pkg="$1" local deb="$(debfor $pkg)" - local ver="$( - ar -p "$TARGET/$deb" control.tar.gz | zcat | - tar -O -xf - control ./control 2>/dev/null | - grep -i ^Version: | sed -e 's/[^:]*: *//' | head -n 1 - )" + local ver="$(extract_deb_field "$TARGET/$deb" Version)" mkdir -p "$TARGET/var/lib/dpkg/info" diff --git a/scripts/debian/woody.buildd b/scripts/debian/woody.buildd index 8485135..06cb8e3 100644 --- a/scripts/debian/woody.buildd +++ b/scripts/debian/woody.buildd @@ -72,11 +72,7 @@ first_stage_install () { x_feign_install () { local pkg="$1" local deb="$(debfor $pkg)" - local ver="$( - ar -p "$TARGET/$deb" control.tar.gz | zcat | - tar -O -xf - control ./control 2>/dev/null | - grep -i ^Version: | sed -e 's/[^:]*: *//' | head -n 1 - )" + local ver="$(extract_deb_field "$TARGET/$deb" Version)" mkdir -p "$TARGET/var/lib/dpkg/info" diff --git a/scripts/ubuntu/breezy b/scripts/ubuntu/breezy index f445598..2646ca2 100644 --- a/scripts/ubuntu/breezy +++ b/scripts/ubuntu/breezy @@ -49,11 +49,7 @@ first_stage_install () { x_feign_install () { local pkg="$1" local deb="$(debfor $pkg)" - local ver="$( - ar -p "$TARGET/$deb" control.tar.gz | zcat | - tar -O -xf - control ./control 2>/dev/null | - grep -i ^Version: | sed -e 's/[^:]*: *//' | head -n 1 - )" + local ver="$(extract_deb_field "$TARGET/$deb" Version)" mkdir -p "$TARGET/var/lib/dpkg/info" diff --git a/scripts/ubuntu/dapper b/scripts/ubuntu/dapper index 7f88d55..e57680a 100644 --- a/scripts/ubuntu/dapper +++ b/scripts/ubuntu/dapper @@ -56,11 +56,7 @@ first_stage_install () { x_feign_install () { local pkg="$1" local deb="$(debfor $pkg)" - local ver="$( - ar -p "$TARGET/$deb" control.tar.gz | zcat | - tar -O -xf - control ./control 2>/dev/null | - grep -i ^Version: | sed -e 's/[^:]*: *//' | head -n 1 - )" + local ver="$(extract_deb_field "$TARGET/$deb" Version)" mkdir -p "$TARGET/var/lib/dpkg/info" diff --git a/scripts/ubuntu/edgy b/scripts/ubuntu/edgy index 0dbc5dc..483e992 100644 --- a/scripts/ubuntu/edgy +++ b/scripts/ubuntu/edgy @@ -66,11 +66,7 @@ first_stage_install () { x_feign_install () { local pkg="$1" local deb="$(debfor $pkg)" - local ver="$( - ar -p "$TARGET/$deb" control.tar.gz | zcat | - tar -O -xf - control ./control 2>/dev/null | - grep -i ^Version: | sed -e 's/[^:]*: *//' | head -n 1 - )" + local ver="$(extract_deb_field "$TARGET/$deb" Version)" mkdir -p "$TARGET/var/lib/dpkg/info" diff --git a/scripts/ubuntu/feisty b/scripts/ubuntu/feisty index 4036828..0b98170 100644 --- a/scripts/ubuntu/feisty +++ b/scripts/ubuntu/feisty @@ -66,11 +66,7 @@ first_stage_install () { x_feign_install () { local pkg="$1" local deb="$(debfor $pkg)" - local ver="$( - ar -p "$TARGET/$deb" control.tar.gz | zcat | - tar -O -xf - control ./control 2>/dev/null | - grep -i ^Version: | sed -e 's/[^:]*: *//' | head -n 1 - )" + local ver="$(extract_deb_field "$TARGET/$deb" Version)" mkdir -p "$TARGET/var/lib/dpkg/info" diff --git a/scripts/ubuntu/gutsy b/scripts/ubuntu/gutsy index 37d4b53..ba2a3f8 100644 --- a/scripts/ubuntu/gutsy +++ b/scripts/ubuntu/gutsy @@ -66,11 +66,7 @@ first_stage_install () { x_feign_install () { local pkg="$1" local deb="$(debfor $pkg)" - local ver="$( - ar -p "$TARGET/$deb" control.tar.gz | zcat | - tar -O -xf - control ./control 2>/dev/null | - grep -i ^Version: | sed -e 's/[^:]*: *//' | head -n 1 - )" + local ver="$(extract_deb_field "$TARGET/$deb" Version)" mkdir -p "$TARGET/var/lib/dpkg/info" diff --git a/scripts/ubuntu/hoary b/scripts/ubuntu/hoary index 7944999..e5fe9fc 100644 --- a/scripts/ubuntu/hoary +++ b/scripts/ubuntu/hoary @@ -70,11 +70,7 @@ first_stage_install () { x_feign_install () { local pkg="$1" local deb="$(debfor $pkg)" - local ver="$( - ar -p "$TARGET/$deb" control.tar.gz | zcat | - tar -O -xf - control ./control 2>/dev/null | - grep -i ^Version: | sed -e 's/[^:]*: *//' | head -n 1 - )" + local ver="$(extract_deb_field "$TARGET/$deb" Version)" mkdir -p "$TARGET/var/lib/dpkg/info" diff --git a/scripts/ubuntu/hoary.buildd b/scripts/ubuntu/hoary.buildd index 2596086..afb0904 100644 --- a/scripts/ubuntu/hoary.buildd +++ b/scripts/ubuntu/hoary.buildd @@ -66,11 +66,7 @@ first_stage_install () { x_feign_install () { local pkg="$1" local deb="$(debfor $pkg)" - local ver="$( - ar -p "$TARGET/$deb" control.tar.gz | zcat | - tar -O -xf - control ./control 2>/dev/null | - grep -i ^Version: | sed -e 's/[^:]*: *//' | head -n 1 - )" + local ver="$(extract_deb_field "$TARGET/$deb" Version)" mkdir -p "$TARGET/var/lib/dpkg/info" diff --git a/scripts/ubuntu/warty b/scripts/ubuntu/warty index 0e16a62..e21a6d8 100644 --- a/scripts/ubuntu/warty +++ b/scripts/ubuntu/warty @@ -58,11 +58,7 @@ first_stage_install () { x_feign_install () { local pkg="$1" local deb="$(debfor $pkg)" - local ver="$( - ar -p "$TARGET/$deb" control.tar.gz | zcat | - tar -O -xf - control ./control 2>/dev/null | - grep -i ^Version: | sed -e 's/[^:]*: *//' | head -n 1 - )" + local ver="$(extract_deb_field "$TARGET/$deb" Version)" mkdir -p "$TARGET/var/lib/dpkg/info" diff --git a/scripts/ubuntu/warty.buildd b/scripts/ubuntu/warty.buildd index b980e45..165377e 100644 --- a/scripts/ubuntu/warty.buildd +++ b/scripts/ubuntu/warty.buildd @@ -66,11 +66,7 @@ first_stage_install () { x_feign_install () { local pkg="$1" local deb="$(debfor $pkg)" - local ver="$( - ar -p "$TARGET/$deb" control.tar.gz | zcat | - tar -O -xf - control ./control 2>/dev/null | - grep -i ^Version: | sed -e 's/[^:]*: *//' | head -n 1 - )" + local ver="$(extract_deb_field "$TARGET/$deb" Version)" mkdir -p "$TARGET/var/lib/dpkg/info" -- cgit v0.12