| #!/bin/bash |
| |
| # Glue to keep unpack_makeself() unchanged |
| source /etc/init.d/functions.sh |
| find_unpackable_file() { echo "$@"; } |
| debug-print() { :; } |
| emktemp() { mktemp "$@"; } |
| die() { eerror "$*"; exit 1; } |
| assert() { _pipestatus="${PIPESTATUS[*]}"; [[ "${_pipestatus// /}" -eq 0 ]] || die; } |
| |
| # Straight copied from unpacker.eclass ... should be kept in sync |
| |
| unpack_banner() { |
| echo ">>> Unpacking ${1##*/} to ${PWD}" |
| } |
| |
| unpack_makeself() { |
| local src_input=${1:-${A}} |
| local src=$(find_unpackable_file "${src_input}") |
| local skip=$2 |
| local exe=$3 |
| |
| [[ -z ${src} ]] && die "Could not locate source for '${src_input}'" |
| |
| unpack_banner "${src}" |
| |
| if [[ -z ${skip} ]] ; then |
| local ver=$(grep -m1 -a '#.*Makeself' "${src}" | awk '{print $NF}') |
| local skip=0 |
| exe=tail |
| case ${ver} in |
| 1.5.*|1.6.0-nv*) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same |
| skip=$(grep -a ^skip= "${src}" | cut -d= -f2) |
| ;; |
| 2.0|2.0.1) |
| skip=$(grep -a ^$'\t'tail "${src}" | awk '{print $2}' | cut -b2-) |
| ;; |
| 2.1.1) |
| skip=$(grep -a ^offset= "${src}" | awk '{print $2}' | cut -b2-) |
| (( skip++ )) |
| ;; |
| 2.1.2) |
| skip=$(grep -a ^offset= "${src}" | awk '{print $3}' | head -n 1) |
| (( skip++ )) |
| ;; |
| 2.1.3) |
| skip=`grep -a ^offset= "${src}" | awk '{print $3}'` |
| (( skip++ )) |
| ;; |
| 2.1.4|2.1.5|2.1.6|2.2.0) |
| skip=$(grep -a offset=.*head.*wc "${src}" | awk '{print $3}' | head -n 1) |
| skip=$(head -n ${skip} "${src}" | wc -c) |
| exe="dd" |
| ;; |
| *) |
| eerror "I'm sorry, but I was unable to support the Makeself file." |
| eerror "The version I detected was '${ver}'." |
| eerror "Please file a bug about the file ${src##*/} at" |
| eerror "http://bugs.gentoo.org/ so that support can be added." |
| die "makeself version '${ver}' not supported" |
| ;; |
| esac |
| debug-print "Detected Makeself version ${ver} ... using ${skip} as offset" |
| fi |
| case ${exe} in |
| tail) exe="tail -n +${skip} '${src}'";; |
| dd) exe="dd ibs=${skip} skip=1 if='${src}'";; |
| *) die "makeself cant handle exe '${exe}'" |
| esac |
| |
| # lets grab the first few bytes of the file to figure out what kind of archive it is |
| local filetype tmpfile=$(emktemp) |
| 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})" |
| rm "${tmpfile}" |
| } |
| |
| for x; do unpack_makeself "$x" ; done |