[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[PATCH] Add bsdtar support



This allows debootstrap to work on non-debian-based live boot instances that
don't have binutils installed.

Example: Arch Linux LiveCD
---
 functions | 37 +++++++++++++++++++++++++++++++++++--
 1 file changed, 35 insertions(+), 2 deletions(-)

diff --git a/functions b/functions
index 4e3955a..bbb1d41 100644
--- a/functions
+++ b/functions
@@ -785,7 +785,7 @@ get_debs () {
 
 ################################################################ extraction
 
-EXTRACTORS_SUPPORTED="dpkg-deb ar"
+EXTRACTORS_SUPPORTED="dpkg-deb ar bsdtar"
 
 # Native dpkg-deb based extractors
 extract_dpkg_deb_field () {
@@ -829,6 +829,33 @@ extract_ar_deb_data () {
 	fi
 }
 
+extract_bsdtar_deb_field () {
+	local pkg="$1"
+	local field="$2"
+
+	bsdtar -O -xf "$pkg" control.tar.gz | zcat |
+	    bsdtar -O -xf - control ./control 2>/dev/null |
+	    grep -i "^$field:" | sed -e 's/[^:]*: *//' | head -n 1
+}
+
+extract_bsdtar_deb_data () {
+	local pkg="$1"
+	local tarball=$(bsdtar tf "$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
+		bsdtar -O -xf "$pkg" "$tarball" | $cat_cmd | bsdtar -xf -
+	else
+		error 1 UNPACKCMDUNVL "Extracting %s requires the %s command, which is not available" "$pkg" "$cat_cmd"
+	fi
+}
+
 valid_extractor () {
 	local extractor="$1"
 
@@ -848,8 +875,10 @@ choose_extractor () {
 		extractor="$EXTRACTOR_OVERRIDE"
 	elif type dpkg-deb >/dev/null 2>&1; then
 		extractor="dpkg-deb"
-	else
+	elif type ar >/dev/null 2>&1; then
 		extractor="ar"
+	else
+		extractor="bsdtar"
 	fi
 
 	info CHOSENEXTRACTOR "Chosen extractor for .deb packages: %s" "$extractor"
@@ -862,6 +891,10 @@ choose_extractor () {
 		extract_deb_field () { extract_ar_deb_field "$@"; }
 		extract_deb_data () { extract_ar_deb_data "$@"; }
 		;;
+	bsdtar)
+		extract_deb_field () { extract_bsdtar_deb_field "$@"; }
+		extract_deb_data () { extract_bsdtar_deb_data "$@"; }
+		;;
 	esac
 }
 
-- 
1.9.2


Reply to: