summaryrefslogtreecommitdiffstats
path: root/functions
diff options
context:
space:
mode:
authorOtavio Salvador <otavio@debian.org>2009-11-27 22:26:18 (GMT)
committerOtavio Salvador <otavio@debian.org>2009-11-27 22:26:18 (GMT)
commit8d4cf26cb02147374f7f668ad48f56da664c8f40 (patch)
tree1810394a14642441aa1bdcfbd88600db70b69b43 /functions
parentd48c8e453ae75ee19b7a1a4a14c899209eac083e (diff)
downloaddebootstrap-8d4cf26cb02147374f7f668ad48f56da664c8f40.zip
debootstrap-8d4cf26cb02147374f7f668ad48f56da664c8f40.tar.gz
debootstrap-8d4cf26cb02147374f7f668ad48f56da664c8f40.tar.bz2
* 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
Diffstat (limited to 'functions')
-rw-r--r--functions96
1 files changed, 82 insertions, 14 deletions
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
); }