| #!/bin/bash |
| # Copyright 1999-2010 Gentoo Foundation |
| # Distributed under the terms of the GNU General Public License v2 |
| |
| source "${PORTAGE_BIN_PATH:-/usr/lib/portage/bin}"/isolated-functions.sh |
| |
| if [[ -z $1 ]] ; then |
| __helpers_die "${0##*/}: at least one argument needed" |
| exit 1 |
| fi |
| |
| # setup compression stuff |
| PORTAGE_COMPRESS=${PORTAGE_COMPRESS-bzip2} |
| [[ -z ${PORTAGE_COMPRESS} ]] && exit 0 |
| |
| if [[ ${PORTAGE_COMPRESS_FLAGS+set} != "set" ]] ; then |
| case ${PORTAGE_COMPRESS} in |
| bzip2|gzip) PORTAGE_COMPRESS_FLAGS="-9";; |
| esac |
| fi |
| |
| # decompress_args(suffix, binary) |
| # - suffix: the compression suffix to work with |
| # - binary: the program to execute that'll compress/decompress |
| # new_args: global array used to return revised arguments |
| decompress_args() { |
| local suffix=$1 binary=$2 |
| shift 2 |
| |
| # Initialize the global new_args array. |
| new_args=() |
| declare -a decompress_args=() |
| local x i=0 decompress_count=0 |
| for x in "$@" ; do |
| if [[ ${x%$suffix} = $x ]] ; then |
| new_args[$i]=$x |
| else |
| new_args[$i]=${x%$suffix} |
| decompress_args[$decompress_count]=$x |
| ((decompress_count++)) |
| fi |
| ((i++)) |
| done |
| |
| if [ $decompress_count -gt 0 ] ; then |
| ${binary} "${decompress_args[@]}" |
| if [ $? -ne 0 ] ; then |
| # Apparently decompression failed for one or more files, so |
| # drop those since we don't want to compress them twice. |
| new_args=() |
| local x i=0 |
| for x in "$@" ; do |
| if [[ ${x%$suffix} = $x ]] ; then |
| new_args[$i]=$x |
| ((i++)) |
| elif [[ -f ${x%$suffix} ]] ; then |
| new_args[$i]=${x%$suffix} |
| ((i++)) |
| else |
| # Apparently decompression failed for this one, so drop |
| # it since we don't want to compress it twice. |
| true |
| fi |
| done |
| fi |
| fi |
| } |
| |
| case $1 in |
| --suffix) |
| [[ -n $2 ]] && __vecho "${0##*/}: --suffix takes no additional arguments" 1>&2 |
| |
| if [[ ! -e ${T}/.ecompress.suffix ]] ; then |
| set -e |
| tmpdir="${T}"/.ecompress$$.${RANDOM} |
| mkdir "${tmpdir}" |
| cd "${tmpdir}" |
| # we have to fill the file enough so that there is something |
| # to compress as some programs will refuse to do compression |
| # if it cannot actually compress the file |
| echo {0..1000} > compressme |
| ${PORTAGE_COMPRESS} ${PORTAGE_COMPRESS_FLAGS} compressme > /dev/null |
| # If PORTAGE_COMPRESS_FLAGS contains -k then we need to avoid |
| # having our glob match the uncompressed file here. |
| suffix=$(echo compressme.*) |
| [[ -z $suffix || "$suffix" == "compressme.*" ]] && \ |
| suffix=$(echo compressme*) |
| suffix=${suffix#compressme} |
| cd / |
| rm -rf "${tmpdir}" |
| echo "${suffix}" > "${T}/.ecompress.suffix" |
| fi |
| cat "${T}/.ecompress.suffix" |
| ;; |
| --bin) |
| [[ -n $2 ]] && __vecho "${0##*/}: --bin takes no additional arguments" 1>&2 |
| |
| echo "${PORTAGE_COMPRESS} ${PORTAGE_COMPRESS_FLAGS}" |
| ;; |
| --queue) |
| shift |
| ret=0 |
| for x in "${@/%/.ecompress.file}" ; do |
| >> "$x" |
| ((ret|=$?)) |
| done |
| [[ $ret -ne 0 ]] && __helpers_die "${0##*/} failed" |
| exit $ret |
| ;; |
| --dequeue) |
| [[ -n $2 ]] && __vecho "${0##*/}: --dequeue takes no additional arguments" 1>&2 |
| find "${D}" -name '*.ecompress.file' -print0 \ |
| | sed -e 's:\.ecompress\.file::g' \ |
| | ${XARGS} -0 ecompress |
| find "${D}" -name '*.ecompress.file' -print0 | ${XARGS} -0 rm -f |
| ;; |
| --*) |
| __helpers_die "${0##*/}: unknown arguments '$*'" |
| exit 1 |
| ;; |
| *) |
| # Since dodoc calls ecompress on files that are already compressed, |
| # perform decompression here (similar to ecompressdir behavior). |
| decompress_args ".Z" "gunzip -f" "$@" |
| set -- "${new_args[@]}" |
| decompress_args ".gz" "gunzip -f" "$@" |
| set -- "${new_args[@]}" |
| decompress_args ".bz2" "bunzip2 -f" "$@" |
| set -- "${new_args[@]}" |
| |
| mask_ext_re="" |
| set -f |
| for x in $PORTAGE_COMPRESS_EXCLUDE_SUFFIXES ; do |
| mask_ext_re+="|$x" |
| done |
| set +f |
| mask_ext_re="^(${mask_ext_re:1})\$" |
| declare -a filtered_args=() |
| i=0 |
| for x in "$@" ; do |
| [[ ${x##*.} =~ $mask_ext_re ]] && continue |
| [[ -s ${x} ]] || continue |
| filtered_args[$i]=$x |
| ((i++)) |
| done |
| [ $i -eq 0 ] && exit 0 |
| set -- "${filtered_args[@]}" |
| |
| # If a compressed version of the file already exists, simply |
| # delete it so that the compressor doesn't whine (bzip2 will |
| # complain and skip, gzip will prompt for input) |
| suffix=$(ecompress --suffix) |
| [[ -n ${suffix} ]] && echo -n "${@/%/${suffix}$'\001'}" | \ |
| tr '\001' '\000' | ${XARGS} -0 rm -f |
| # Finally, let's actually do some real work |
| "${PORTAGE_COMPRESS}" ${PORTAGE_COMPRESS_FLAGS} "$@" |
| ret=$? |
| [[ $ret -ne 0 ]] && __helpers_die "${0##*/} failed" |
| exit $ret |
| ;; |
| esac |