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

source "${PORTAGE_BIN_PATH:-/usr/lib/portage/bin}"/isolated-functions.sh

if [[ -z $1 ]] ; then
	vecho "${0##*/}: at least one argument needed" 1>&2
	exit 1
fi

case $1 in
	--ignore)
		shift
		for skip in "$@" ; do
			[[ -d ${D}${skip} ]] && touch "${D}${skip}.ecompress.skip"
		done
		exit 0
		;;
	--queue)
		shift
		set -- "${@/%/.ecompress.dir}"
		set -- "${@/#/${D}}"
		exec touch "$@"
		;;
	--dequeue)
		[[ -n $2 ]] && vecho "${0##*/}: --dequeue takes no additional arguments" 1>&2
		find "${D}" -name '*.ecompress.dir' -print0 \
			| sed -e 's:\.ecompress\.dir::g' -e "s:${D}:/:g" \
			| ${XARGS} -0 ecompressdir
		find "${D}" -name '*.ecompress.skip' -print0 | ${XARGS} -0 rm -f
		exit 0
		;;
	--*)
		vecho "${0##*/}: unknown arguments '$*'"
		exit 1
		;;
esac

# figure out the new suffix
suffix=$(ecompress --suffix)

# funk_up_dir(action, suffix, binary)
#	- action: compress or decompress
#	- suffix: the compression suffix to work with
#	- binary: the program to execute that'll compress/decompress
# The directory we act on is implied in the ${dir} variable
funk_up_dir() {
	local act=$1 suffix=$2 binary=$3

	local negate=""
	[[ ${act} == "compress" ]] && negate="!"

	# first we act on all the files
	find "${dir}" -type f ${negate} -iname '*'${suffix} -print0 | ${XARGS} -0 ${binary}
	((ret|=$?))

	find "${dir}" -type l -print0 | \
	while read -d $'\0' brokenlink ; do
		[[ -e ${brokenlink} ]] && continue
		olddest=$(readlink "${brokenlink}")
		[[ ${act} == "compress" ]] \
			&& newdest="${olddest}${suffix}" \
			|| newdest="${olddest%${suffix}}"
		rm -f "${brokenlink}"
		[[ ${act} == "compress" ]] \
			&& ln -snf "${newdest}" "${brokenlink}${suffix}" \
			|| ln -snf "${newdest}" "${brokenlink%${suffix}}"
		((ret|=$?))
	done
}

# _relocate_skip_dirs(srctree, dsttree)
# Move all the directories we want to skip running compression
# on from srctree to dsttree.
_relocate_skip_dirs() {
	local srctree="$1" dsttree="$2"

	[[ -d ${srctree} ]] || return 0

	find "${srctree}" -name '*.ecompress.skip' -print0 | \
	while read -d $'\0' src ; do
		src=${src%.ecompress.skip}
		dst="${dsttree}${src#${srctree}}"
		parent=${dst%/*}
		mkdir -p "${parent}"
		mv "${src}" "${dst}"
		mv "${src}.ecompress.skip" "${dst}.ecompress.skip"
	done
}
hide_skip_dirs()    { _relocate_skip_dirs "${D}" "${T}"/ecompress-skip/ ; }
restore_skip_dirs() { _relocate_skip_dirs "${T}"/ecompress-skip/ "${D}" ; }

ret=0

rm -rf "${T}"/ecompress-skip

for dir in "$@" ; do
	dir=${dir#/}
	dir="${D}${dir}"
	if [[ ! -d ${dir} ]] ; then
		vecho "${0##*/}: /${dir#${D}} does not exist!"
		continue
	fi
	cd "${dir}"
	actual_dir=${dir}
	dir=. # use relative path to avoid 'Argument list too long' errors

	# hide all the stuff we want to skip
	hide_skip_dirs "${dir}"

	# since we've been requested to compress the whole dir,
	# delete any individual queued requests
	rm -f "${actual_dir}.ecompress.dir"
	find "${dir}" -type f -name '*.ecompress.file' -print0 | ${XARGS} -0 rm -f

	# not uncommon for packages to compress doc files themselves
	funk_up_dir "decompress" ".Z" "gunzip -f"
	funk_up_dir "decompress" ".gz" "gunzip -f"
	funk_up_dir "decompress" ".bz2" "bunzip2 -f"

	# forcibly break all hard links as some compressors whine about it
	find "${dir}" -type f -links +1 -exec env file="{}" sh -c \
		'cp -p "${file}" "${file}.ecompress.break" ; mv -f "${file}.ecompress.break" "${file}"' \;

	# now lets do our work
	[[ -z ${suffix} ]] && continue
	vecho "${0##*/}: $(ecompress --bin) /${actual_dir#${D}}"
	funk_up_dir "compress" "${suffix}" "ecompress"

	# finally, restore the skipped stuff
	restore_skip_dirs
done

exit ${ret}
