#!/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
			suffix=$(ls 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
