On Monday 17 June 2013 01:55:09 Mike Frysinger wrote:
> i wish we could merge with the file detection in unpack_makeself somehow

this patch should unify that aspect
-mike

--- unpacker.eclass     10 Apr 2013 14:47:49 -0000      1.13
+++ unpacker.eclass     22 Jun 2013 17:54:09 -0000
@@ -22,7 +22,14 @@ ___ECLASS_ONCE_UNPACKER="recur -_+^+_- s
 # @DEFAULT_UNSET
 # @DESCRIPTION:
 # Utility to use to decompress bzip2 files.  Will dynamically pick between
-# `pbzip2` and `bzip2`.  Make sure your choice accepts the "-c" option.
+# `pbzip2` and `bzip2`.  Make sure your choice accepts the "-dc" options.
+# Note: this is meant for users to set, not ebuilds.
+
+# @ECLASS-VARIABLE: UNPACKER_GZIP
+# @DEFAULT_UNSET
+# @DESCRIPTION:
+# Utility to use to decompress gzip files.  Will dynamically pick between
+# `gzip` and `pigz`.  Make sure your choice accepts the "-dc" options.
 # Note: this is meant for users to set, not ebuilds.
 
 # for internal use only (unpack_pdv and unpack_makeself)
@@ -74,9 +81,9 @@ unpack_banner() {
 # parameter.  Here is an example:
 #
 # @CODE
-#      vapier@vapier 0 pdv_unpack # strings hldsupdatetool.bin | grep lseek
+#      $ strings hldsupdatetool.bin | grep lseek
 #      lseek
-#      vapier@vapier 0 pdv_unpack # strace -elseek ./hldsupdatetool.bin
+#      $ strace -elseek ./hldsupdatetool.bin
 #      lseek(3, -4, SEEK_END)                                  = 2981250
 # @CODE
 #
@@ -105,19 +112,17 @@ unpack_pdv() {
        local tmpfile="${T}/${FUNCNAME}"
        tail -c +$((${tailskip}+1)) ${src} 2>/dev/null | head -c 512 > 
"${tmpfile}"
 
-       local iscompressed=$(file -b "${tmpfile}")
-       if [[ ${iscompressed:0:8} == "compress" ]] ; then
-               iscompressed=1
+       local comp=$(decompress_prog "${tmpfile}")
+       if [[ -n ${comp} ]] ; then
+               comp="| ${comp}"
                mv "${tmpfile}"{,.Z}
                gunzip "${tmpfile}"
-       else
-               iscompressed=0
        fi
-       local istar=$(file -b "${tmpfile}")
-       if [[ ${istar:0:9} == "POSIX tar" ]] ; then
-               istar=1
+       local istar filetype=$(file -b "${tmpfile}")
+       if [[ ${filetype} == "POSIX tar"* ]] ; then
+               istar=true
        else
-               istar=0
+               istar=false
        fi
 
        #for some reason gzip dies with this ... dd cant provide buffer fast 
enough ?
@@ -125,29 +130,18 @@ unpack_pdv() {
        #       | dd ibs=${tailskip} skip=1 \
        #       | gzip -dc \
        #       > ${datafile}
-       if [ ${iscompressed} -eq 1 ] ; then
-               if [ ${istar} -eq 1 ] ; then
-                       tail -c +$((${tailskip}+1)) "${src}" 2>/dev/null \
-                               | head -c $((${metaskip}-${tailskip})) \
-                               | tar -xzf -
-               else
-                       tail -c +$((${tailskip}+1)) "${src}" 2>/dev/null \
-                               | head -c $((${metaskip}-${tailskip})) \
-                               | gzip -dc \
-                               > ${datafile}
-               fi
+       (
+       th() {
+               tail -c +$(( tailskip + 1 )) "${src}" 2>/dev/null | \
+                       head -c $(( metaskip - tailskip ))
+       }
+       if ${istar} ; then
+               eval th ${comp} | tar --no-same-owner -xf -
        else
-               if [ ${istar} -eq 1 ] ; then
-                       tail -c +$((${tailskip}+1)) "${src}" 2>/dev/null \
-                               | head -c $((${metaskip}-${tailskip})) \
-                               | tar --no-same-owner -xf -
-               else
-                       tail -c +$((${tailskip}+1)) "${src}" 2>/dev/null \
-                               | head -c $((${metaskip}-${tailskip})) \
-                               > ${datafile}
-               fi
+               eval th ${comp} > "${datafile}"
        fi
-       true
+       exit 0
+       )
        #[ -s "${datafile}" ] || die "failure unpacking pdv ('${metaskip}' 
'${tailskip}' '${datafile}')"
        #assert "failure unpacking pdv ('${metaskip}' '${tailskip}' 
'${datafile}')"
 }
@@ -218,31 +212,11 @@ unpack_makeself() {
        esac
 
        # lets grab the first few bytes of the file to figure out what kind of 
archive it is
-       local filetype tmpfile="${T}/${FUNCNAME}"
+       local tmpfile="${T}/${FUNCNAME}"
        eval ${exe} 2>/dev/null | head -c 512 > "${tmpfile}"
-       filetype=$(file -b "${tmpfile}") || die
-       case ${filetype} in
-               *tar\ archive*)
-                       eval ${exe} | tar --no-same-owner -xf -
-                       ;;
-               bzip2*)
-                       eval ${exe} | bzip2 -dc | tar --no-same-owner -xf -
-                       ;;
-               gzip*)
-                       eval ${exe} | tar --no-same-owner -xzf -
-                       ;;
-               compress*)
-                       eval ${exe} | gunzip | tar --no-same-owner -xf -
-                       ;;
-               XZ*)
-                       eval ${exe} | unxz | tar --no-same-owner -xf -
-                       ;;
-               *)
-                       eerror "Unknown filetype \"${filetype}\" ?"
-                       false
-                       ;;
-       esac
-       assert "failure unpacking (${filetype}) makeself ${src##*/} ('${ver}' 
+${skip})"
+       local comp=$(decompress_prog "${tmpfile}")
+       eval ${exe} | eval "${comp:+${comp} |}" tar --no-same-owner -xf -
+       assert "failure unpacking makeself ${src##*/} ('${ver}' +${skip})"
 }
 
 # @FUNCTION: unpack_deb
@@ -319,6 +293,54 @@ unpack_zip() {
        [[ $? -le 1 ]] || die "unpacking ${zip} failed (arch=unpack_zip)"
 }
 
+# @FUNCTION: decompress_prog
+# @USAGE: <mime|format|filename>
+# @DESCRIPTION:
+# Get the program name (and args) needed to decompress things.
+# You can give this a mime type, or a format name (bz2/gz/xz/etc...),
+# or you can give it a filename.  If the type can be detected based on
+# the suffix alone, we'll use that, otherwise we'll rely on `file` to
+# probe the type.
+decompress_prog() {
+       [[ $# -eq 1 ]] || die "Usage: ${FUNCNAME} <mime|format|filename>"
+
+       local comp
+
+       case $1 in
+       application/x-bzip2\;*|\
+       bzip2|bz2|\
+       *.bz2|*.tbz|*.tbz2)
+               local bzcmd=${PORTAGE_BZIP2_COMMAND:-$(type -P pbzip2 || type 
-P bzip2)}
+               local bzuncmd=${PORTAGE_BUNZIP2_COMMAND:-${bzcmd} -d}
+               : ${UNPACKER_BZ2:=${bzuncmd}}
+               comp="${UNPACKER_BZ2} -dc"
+               ;;
+
+       application/x-gzip\;*|\
+       application/x-compress\;*|\
+       gzip|gz|\
+       *.z|*.gz|*.tgz)
+               : ${UNPACKER_GZIP:=$(type -P pigz || type -P gzip)}
+               comp="${UNPACKER_GZIP} -dc"
+               ;;
+
+       application/x-xz\;*|\
+       lzma|xz|\
+       *.lzma|*.xz|*.txz)
+               comp="xz -dc"
+               ;;
+       esac
+
+       if [[ -n ${comp} ]] ; then
+               echo "${comp}"
+               return 0
+       fi
+
+       if [[ -s $1 ]] ; then
+               decompress_prog "$(file -ib "$1")"
+       fi
+}
+
 # @FUNCTION: _unpacker
 # @USAGE: <one archive to unpack>
 # @INTERNAL
@@ -333,19 +355,7 @@ _unpacker() {
        a=$(find_unpackable_file "${a}")
 
        # first figure out the decompression method
-       case ${m} in
-       *.bz2|*.tbz|*.tbz2)
-               local bzcmd=${PORTAGE_BZIP2_COMMAND:-$(type -P pbzip2 || type 
-P bzip2)}
-               local bzuncmd=${PORTAGE_BUNZIP2_COMMAND:-${bzcmd} -d}
-               : ${UNPACKER_BZ2:=${bzuncmd}}
-               comp="${UNPACKER_BZ2} -c"
-               ;;
-       *.z|*.gz|*.tgz)
-               comp="gzip -dc" ;;
-       *.lzma|*.xz|*.txz)
-               comp="xz -dc" ;;
-       *)      comp="" ;;
-       esac
+       comp=$(decompress_prog "${n}")
 
        # then figure out if there are any archiving aspects
        arch=""

Attachment: signature.asc
Description: This is a digitally signed message part.

Reply via email to