#!/bin/bash
# Copyright 1999-2018 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

source "${PORTAGE_BIN_PATH}"/isolated-functions.sh || exit 1

compress_file() {
	mask_ext_re=""
	set -f
	local x
	for x in $PORTAGE_COMPRESS_EXCLUDE_SUFFIXES ; do
		mask_ext_re+="|$x"
	done
	set +f
	mask_ext_re="^(${mask_ext_re:1})\$"
	local filtered_args=()
	for x in "$@" ; do
		[[ ${x##*.} =~ $mask_ext_re ]] && continue
		[[ -s ${x} ]] || continue

		# handle precompressed files
		case ${x} in
			*.gz|*.Z)
				gunzip -f "${x}" || __helpers_die "gunzip failed"
				x=${x%.*};;
			*.bz2)
				bunzip2 -f "${x}" || __helpers_die "bunzip2 failed"
				x=${x%.bz2};;
			*.lzma|*.xz)
				unxz -f "${x}" || __helpers_die "unxz failed"
				x=${x%.*};;
			*.lz)
				lzip -df "${x}" || __helpers_die "lzip -d failed"
				x=${x%.lz};;
		esac

		filtered_args+=( "$x" )
	done
	[[ ${#filtered_args[@]} -eq 0 ]] && return 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)
	[[ -n ${PORTAGE_COMPRESS_SUFFIX} ]] && echo -n "${@/%/${PORTAGE_COMPRESS_SUFFIX}$'\001'}" | \
		tr '\001' '\000' | ${XARGS} -0 rm -f

	# forcibly break all hard links as some compressors whine about it
	while IFS= read -d '' -r x ; do
		cp -p "${x}" "${x}.ecompress.break" || die
		mv -f "${x}.ecompress.break" "${x}" || die
	done < <(find "${@}" -type f -links +1 -print0)

	# Finally, let's actually do some real work
	"${PORTAGE_COMPRESS}" ${PORTAGE_COMPRESS_FLAGS} "$@"
	ret=$?
	[[ $ret -ne 0 ]] && __helpers_die "${0##*/} failed"
	return ${ret}
}

compress_file "${@%.ecompress}"
