blob: 71287b4b07f1c82b03ba9508f981946d74859d4c [file] [log] [blame]
#!/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