From 0e138de8646fa2fc25c81e038f32a62d3b675bb0 Mon Sep 17 00:00:00 2001 From: "Vadim A. Misbakh-Soloviov" <mva@mva.name> Date: Mon, 23 Jun 2014 04:41:15 +0700 Subject: [games-arcade/metalslug3] Added Signed-off-by: Vadim A. Misbakh-Soloviov <mva@mva.name> --- eclass/unpacker.eclass | 524 +++++++++++++++++++++ .../worms-reloaded/worms-reloaded-20131016.ebuild | 71 --- 2 files changed, 524 insertions(+), 71 deletions(-) create mode 100644 eclass/unpacker.eclass delete mode 100644 games-strategy/worms-reloaded/worms-reloaded-20131016.ebuild diff --git a/eclass/unpacker.eclass b/eclass/unpacker.eclass new file mode 100644 index 0000000..b377ae7 --- /dev/null +++ b/eclass/unpacker.eclass @@ -0,0 +1,524 @@ +# Copyright 1999-2014 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/eclass/unpacker.eclass,v 1.17 2014/05/01 19:27:14 ottxor Exp $ + +# @ECLASS: unpacker.eclass +# @MAINTAINER: +# base-system@gentoo.org +# @BLURB: helpers for extraneous file formats and consistent behavior across EAPIs +# @DESCRIPTION: +# Some extraneous file formats are not part of PMS, or are only in certain +# EAPIs. Rather than worrying about that, support the crazy cruft here +# and for all EAPI versions. + +# Possible todos: +# - merge rpm unpacking +# - support partial unpacks? + +if [[ ${___ECLASS_ONCE_UNPACKER} != "recur -_+^+_- spank" ]] ; then +___ECLASS_ONCE_UNPACKER="recur -_+^+_- spank" + +# @ECLASS-VARIABLE: UNPACKER_BZ2 +# @DEFAULT_UNSET +# @DESCRIPTION: +# Utility to use to decompress bzip2 files. Will dynamically pick between +# `pbzip2` and `bzip2`. Make sure your choice accepts the "-dc" options. +# Note: this is meant for users to set, not ebuilds. + +# @ECLASS-VARIABLE: UNPACKER_LZIP +# @DEFAULT_UNSET +# @DESCRIPTION: +# Utility to use to decompress lzip files. Will dynamically pick between +# `plzip`, `pdlzip` and `lzip`. 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) +find_unpackable_file() { + local src=$1 + if [[ -z ${src} ]] ; then + src=${DISTDIR}/${A} + else + if [[ ${src} == ./* ]] ; then + : # already what we want + elif [[ -e ${DISTDIR}/${src} ]] ; then + src=${DISTDIR}/${src} + elif [[ -e ${PWD}/${src} ]] ; then + src=${PWD}/${src} + elif [[ -e ${src} ]] ; then + src=${src} + fi + fi + [[ ! -e ${src} ]] && return 1 + echo "${src}" +} + +unpack_banner() { + echo ">>> Unpacking ${1##*/} to ${PWD}" +} + +# @FUNCTION: unpack_pdv +# @USAGE: <file to unpack> <size of off_t> +# @DESCRIPTION: +# Unpack those pesky pdv generated files ... +# They're self-unpacking programs with the binary package stuffed in +# the middle of the archive. Valve seems to use it a lot ... too bad +# it seems to like to segfault a lot :(. So lets take it apart ourselves. +# +# You have to specify the off_t size ... I have no idea how to extract that +# information out of the binary executable myself. Basically you pass in +# the size of the off_t type (in bytes) on the machine that built the pdv +# archive. +# +# One way to determine this is by running the following commands: +# +# @CODE +# strings <pdv archive> | grep lseek +# strace -elseek <pdv archive> +# @CODE +# +# Basically look for the first lseek command (we do the strings/grep because +# sometimes the function call is _llseek or something) and steal the 2nd +# parameter. Here is an example: +# +# @CODE +# $ strings hldsupdatetool.bin | grep lseek +# lseek +# $ strace -elseek ./hldsupdatetool.bin +# lseek(3, -4, SEEK_END) = 2981250 +# @CODE +# +# Thus we would pass in the value of '4' as the second parameter. +unpack_pdv() { + local src=$(find_unpackable_file "$1") + local sizeoff_t=$2 + + [[ -z ${src} ]] && die "Could not locate source for '$1'" + [[ -z ${sizeoff_t} ]] && die "No idea what off_t size was used for this pdv :(" + + unpack_banner "${src}" + + local metaskip=$(tail -c ${sizeoff_t} "${src}" | hexdump -e \"%i\") + local tailskip=$(tail -c $((${sizeoff_t}*2)) "${src}" | head -c ${sizeoff_t} | hexdump -e \"%i\") + + # grab metadata for debug reasons + local metafile="${T}/${FUNCNAME}.meta" + tail -c +$((${metaskip}+1)) "${src}" > "${metafile}" + + # rip out the final file name from the metadata + local datafile=$(tail -c +$((${metaskip}+1)) "${src}" | strings | head -n 1) + datafile=$(basename "${datafile}") + + # now lets uncompress/untar the file if need be + 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 + mv "${tmpfile}"{,.Z} + gunzip "${tmpfile}" + else + iscompressed=0 + fi + local istar=$(file -b "${tmpfile}") + if [[ ${istar:0:9} == "POSIX tar" ]] ; then + istar=1 + else + istar=0 + fi + + #for some reason gzip dies with this ... dd cant provide buffer fast enough ? + #dd if=${src} ibs=${metaskip} count=1 \ + # | 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 + 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 + fi + true + #[ -s "${datafile}" ] || die "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')" + #assert "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')" +} + +# @FUNCTION: unpack_makeself +# @USAGE: [file to unpack] [offset] [tail|dd] +# @DESCRIPTION: +# Unpack those pesky makeself generated files ... +# They're shell scripts with the binary package tagged onto +# the end of the archive. Loki utilized the format as does +# many other game companies. +# +# If the file is not specified, then ${A} is used. If the +# offset is not specified then we will attempt to extract +# the proper offset from the script itself. +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="${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})" +} + +# @FUNCTION: unpack_nixstaller +# @USAGE: [installer files to unpack] +# @DESCRIPTION: +# Unpack those pesky makeself+Nixstaller generated files ... +# They're shell scripts with the binary package tagged onto +# the end of the archive. +# +# If the file is not specified, then ${A} is used. If the +# offset is not specified then we will attempt to extract +# the proper offset from the script itself. + +unpack_nixstaller() { + local src=$(find_unpackable_file "${1}") + + mkdir tmp; + cd tmp; + + unpack_makeself ${src} + + for f in $NIXSTALLER_TARGETS ; do + unpack_banner "$f" + local unp=$(find_unpackable_file "${f}") + # Make sure that file exists + [[ -f "${unp}" ]] && ( + local type=$(file -b ${unp}) + case ${type} in + data|LZMA*) + tar -xJf "${unp}" -C .. + ;; + gzip*) + tar -xzf "${unp}" -C .. + ;; + esac + ) || die "Failed to unpack ${f}" + done + cd ..; +} + +# @FUNCTION: unpack_mojosetup +# @USAGE: [file to unpack] +# @DESCRIPTION: +# Unpack those pesky makeself+mojosetup generated files ... +# They're shell scripts with the binary package tagged onto +# the end of the archive. +# +# (!!!) +# Fortunately, currently, unpack_zip can handle it fine. +# +# If the file is not specified, then ${A} is used. If the +# offset is not specified then we will attempt to extract +# the proper offset from the script itself. + +unpack_mojosetup() { + local src=$(find_unpackable_file "${1}") + unpack_zip ${src} +} + + +# @FUNCTION: unpack_deb +# @USAGE: <one deb to unpack> +# @DESCRIPTION: +# Unpack a Debian .deb archive in style. +unpack_deb() { + [[ $# -eq 1 ]] || die "Usage: ${FUNCNAME} <file>" + + local deb=$(find_unpackable_file "$1") + + unpack_banner "${deb}" + + # on AIX ar doesn't work out as their ar used a different format + # from what GNU ar (and thus what .deb files) produce + if [[ -n ${EPREFIX} ]] ; then + { + read # global header + [[ ${REPLY} = "!<arch>" ]] || die "${deb} does not seem to be a deb archive" + local f timestamp uid gid mode size magic + while read f timestamp uid gid mode size magic ; do + [[ -n ${f} && -n ${size} ]] || continue # ignore empty lines + if [[ ${f} = "data.tar"* ]] ; then + head -c "${size}" > "${f}" + else + head -c "${size}" > /dev/null # trash it + fi + done + } < "${deb}" + else + ar x "${deb}" + fi + + unpacker ./data.tar* + + # Clean things up #458658. No one seems to actually care about + # these, so wait until someone requests to do something else ... + rm -f debian-binary {control,data}.tar* +} + +# @FUNCTION: unpack_cpio +# @USAGE: <one cpio to unpack> +# @DESCRIPTION: +# Unpack a cpio archive, file "-" means stdin. +unpack_cpio() { + [[ $# -eq 1 ]] || die "Usage: ${FUNCNAME} <file>" + + # needed as cpio always reads from stdin + local cpio_cmd=( cpio --make-directories --extract --preserve-modification-time ) + if [[ $1 == "-" ]] ; then + unpack_banner "stdin" + "${cpio_cmd[@]}" + else + local cpio=$(find_unpackable_file "$1") + unpack_banner "${cpio}" + "${cpio_cmd[@]}" <"${cpio}" + fi +} + +# @FUNCTION: unpack_zip +# @USAGE: <zip file> +# @DESCRIPTION: +# Unpack zip archives. +# This function ignores all non-fatal errors (i.e. warnings). +# That is useful for zip archives with extra crap attached +# (e.g. self-extracting archives). +unpack_zip() { + [[ $# -eq 1 ]] || die "Usage: ${FUNCNAME} <file>" + + local zip=$(find_unpackable_file "$1") + unpack_banner "${zip}" + unzip -qo "${zip}" + + [[ $? -le 1 ]] || die "unpacking ${zip} failed (arch=unpack_zip)" +} + +# @FUNCTION: _unpacker +# @USAGE: <one archive to unpack> +# @INTERNAL +# @DESCRIPTION: +# Unpack the specified archive. We only operate on one archive here +# to keep down on the looping logic (that is handled by `unpacker`). +_unpacker() { + [[ $# -eq 1 ]] || die "Usage: ${FUNCNAME} <file>" + + local a=$1 + local m=$(echo "${a}" | tr '[:upper:]' '[:lower:]') + 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" ;; + *.lz) + : ${UNPACKER_LZIP:=$(type -P plzip || type -P pdlzip || type -P lzip)} + comp="${UNPACKER_LZIP} -dc" ;; + *) comp="" ;; + esac + + # then figure out if there are any archiving aspects + arch="" + case ${m} in + *.tgz|*.tbz|*.tbz2|*.txz|*.tar.*|*.tar) + arch="tar --no-same-owner -xof" ;; + *.cpio.*|*.cpio) + arch="unpack_cpio" ;; + *.deb) + arch="unpack_deb" ;; + *.run) + arch="unpack_makeself" ;; + *.sh) + if head -n 5 "${a}" | grep -qs '#.*Nixstaller' ; then + arch="unpack_nixstaller" + elif head -n 5 "${a}" | grep -qs '#.*mojosetup' ; then + arch="unpack_mojosetup" + elif head -n 30 "${a}" | grep -qs '#.*Makeself' ; then + arch="unpack_makeself" + fi + # Not all shell scripts are makeself + ;; + *.bin) + # Makeself archives can be annoyingly named + if head -c 100 "${a}" | grep -qs '#.*Makeself' ; then + arch="unpack_makeself" + fi + ;; + *.zip) + arch="unpack_zip" ;; + esac + + # finally do the unpack + if [[ -z ${arch}${comp} ]] ; then + unpack "$1" + return $? + fi + + [[ ${arch} != unpack_* ]] && unpack_banner "${a}" + + if [[ -z ${arch} ]] ; then + # Need to decompress the file into $PWD #408801 + local _a=${a%.*} + ${comp} "${a}" > "${_a##*/}" + elif [[ -z ${comp} ]] ; then + ${arch} "${a}" + else + ${comp} "${a}" | ${arch} - + fi + + assert "unpacking ${a} failed (comp=${comp} arch=${arch})" +} + +# @FUNCTION: unpacker +# @USAGE: [archives to unpack] +# @DESCRIPTION: +# This works in the same way that `unpack` does. If you don't specify +# any files, it will default to ${A}. +unpacker() { + local a + [[ $# -eq 0 ]] && set -- ${A} + for a ; do _unpacker "${a}" ; done +} + +# @FUNCTION: unpacker_src_unpack +# @DESCRIPTION: +# Run `unpacker` to unpack all our stuff. +unpacker_src_unpack() { + unpacker +} + +# @FUNCTION: unpacker_src_uri_depends +# @USAGE: [archives that we will unpack] +# @RETURN: Dependencies needed to unpack all the archives +# @DESCRIPTION: +# Walk all the specified files (defaults to $SRC_URI) and figure out the +# dependencies that are needed to unpack things. +# +# Note: USE flags are not yet handled. +unpacker_src_uri_depends() { + local uri deps d + + [[ $# -eq 0 ]] && set -- ${SRC_URI} + + for uri in "$@" ; do + case ${uri} in + *.cpio.*|*.cpio) + d="app-arch/cpio" ;; + *.rar|*.RAR) + d="app-arch/unrar" ;; + *.7z) + d="app-arch/p7zip" ;; + *.xz) + d="app-arch/xz-utils" ;; + *.zip) + d="app-arch/unzip" ;; + *.lz) + d="|| ( app-arch/plzip app-arch/pdlzip app-arch/lzip )" ;; + esac + deps+=" ${d}" + done + + echo "${deps}" +} + +EXPORT_FUNCTIONS src_unpack + +fi diff --git a/games-strategy/worms-reloaded/worms-reloaded-20131016.ebuild b/games-strategy/worms-reloaded/worms-reloaded-20131016.ebuild deleted file mode 100644 index 8d59026..0000000 --- a/games-strategy/worms-reloaded/worms-reloaded-20131016.ebuild +++ /dev/null @@ -1,71 +0,0 @@ -# Copyright 1999-2012 Gentoo Foundation -# Distributed under the terms of the GNU General Public License v2 -# $Header: $ - -EAPI="5" - -inherit eutils games unpacker - -TS="1381858841" - -DESCRIPTION="Legendary Worms™ Game. SinglePlayer-only." -HOMEPAGE="http://www.team17.com/games/worms/worms-reloaded/" -SRC_URI="WormsReloaded_Linux_${TS}.sh" - -RESTRICT="fetch strip" -LICENSE="as-is" - -SLOT="0" -KEYWORDS="amd64 x86" -IUSE="" - -DEPEND="" -RDEPEND=" - amd64? ( - app-emulation/emul-linux-x86-baselibs - app-emulation/emul-linux-x86-sdl - ) - x86? ( - media-libs/openal - sys-libs/zlib - ) -" - -S="${WORKDIR}/data" - -GAMEDIR="${GAMES_PREFIX_OPT}/${PN}" - -pkg_nofetch() { - einfo "" - einfo "Please buy and download \"${SRC_URI}\" from" - einfo "HumbleIndieBundle or ${HOMEPAGE}" - einfo "and move/link it to \"${DISTDIR}\"" - einfo "" -} - -src_unpack() { - unpack_zip "${A}"; -} - -src_prepare() { - rm -r "${S}/x86/lib/libopenal.so.1" -} - -src_install() { - # Install documentation - dodoc noarch/README.linux - rm noarch/README.linux - - # Install data - insinto "${GAMEDIR}" - doins -r noarch/* x86/lib - exeinto "${GAMEDIR}" - doexe x86/WormsReloaded.bin.x86 - - # Install icon and desktop file - newicon "x86/WormsReloaded.png" "${PN}.png" - make_desktop_entry "${PN}" "Worms Reloaded" "${PN}" - - # Setting permissions. - prepgamesdirs -} \ No newline at end of file -- cgit v1.2.3-65-gdbad