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: +# @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} " + + 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: # @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=""