#!/bin/bash
# Copyright 1999-2011 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 [[ ${0##*/} == dodoc ]] ; then
	if [ $# -eq 0 ] ; then
		# default_src_install may call dodoc with no arguments
		# when DOC is defined but empty, so simply return
		# sucessfully in this case.
		exit 0
	fi
	export INSOPTIONS=-m0644
	export INSDESTTREE=usr/share/doc/${PF}/${_E_DOCDESTTREE_}
fi

if [ $# -lt 1 ] ; then
	helpers_die "${0##*/}: at least one argument needed"
	exit 1
fi

if [[ "$1" == "-r" ]] ; then
	DOINSRECUR=y
	shift
else
	DOINSRECUR=n
fi

if [[ ${INSDESTTREE#${D}} != "${INSDESTTREE}" ]]; then
	vecho "-------------------------------------------------------" 1>&2
	vecho "You should not use \${D} with helpers." 1>&2
	vecho "  --> ${INSDESTTREE}" 1>&2
	vecho "-------------------------------------------------------" 1>&2
	helpers_die "${0##*/} used with \${D}"
	exit 1
fi

case "$EAPI" in
	0|1|2|3|3_pre2)
		PRESERVE_SYMLINKS=n
		;;
	*)
		PRESERVE_SYMLINKS=y
		;;
esac

export TMP=$T/.doins_tmp
# Use separate directories to avoid potential name collisions.
mkdir -p "$TMP"/{1,2}

[[ ! -d ${D}${INSDESTTREE} ]] && dodir "${INSDESTTREE}"

_doins() {
	local mysrc="$1" mydir="$2" cleanup="" rval

	if [ -L "$mysrc" ] ; then
		# Our fake $DISTDIR contains symlinks that should
		# not be reproduced inside $D. In order to ensure
		# that things like dodoc "$DISTDIR"/foo.pdf work
		# as expected, we dereference symlinked files that
		# refer to absolute paths inside
		# $PORTAGE_ACTUAL_DISTDIR/.
		if [ $PRESERVE_SYMLINKS = y ] && \
			! [[ $(readlink "$mysrc") == "$PORTAGE_ACTUAL_DISTDIR"/* ]] ; then
			rm -rf "$D$INSDESTTREE/$mydir/${mysrc##*/}" || return $?
			cp -P "$mysrc" "$D$INSDESTTREE/$mydir/${mysrc##*/}"
			return $?
		else
			cp "$mysrc" "$TMP/2/${mysrc##*/}" || return $?
			mysrc="$TMP/2/${mysrc##*/}"
			cleanup=$mysrc
		fi
	fi

	install ${INSOPTIONS} "${mysrc}" "${D}${INSDESTTREE}/${mydir}"
	rval=$?
	[[ -n ${cleanup} ]] && rm -f "${cleanup}"
	[ $rval -ne 0 ] && echo "!!! ${0##*/}: $mysrc does not exist" 1>&2
	return $rval
}

_xdoins() {
	local -i failed=0
	while read -r -d $'\0' x ; do
		_doins "$x" "${x%/*}"
		((failed|=$?))
	done
	return $failed
}

success=0
failed=0

for x in "$@" ; do
	if [[ $PRESERVE_SYMLINKS = n && -d $x ]] || \
		[[ $PRESERVE_SYMLINKS = y && -d $x && ! -L $x ]] ; then
		if [ "${DOINSRECUR}" == "n" ] ; then
			if [[ ${0##*/} == dodoc ]] ; then
				echo "!!! ${0##*/}: $x is a directory" 1>&2
				((failed|=1))
			fi
			continue
		fi

		while [ "$x" != "${x%/}" ] ; do
			x=${x%/}
		done
		if [ "$x" = "${x%/*}" ] ; then
			pushd "$PWD" >/dev/null
		else
			pushd "${x%/*}" >/dev/null
		fi
		x=${x##*/}
		x_orig=$x
		# Follow any symlinks recursively until we've got
		# a normal directory for 'find' to traverse. The
		# name of the symlink will be used for the name
		# of the installed directory, as discussed in
		# bug #239529.
		while [ -L "$x" ] ; do
			pushd "$(readlink "$x")" >/dev/null
			x=${PWD##*/}
			pushd "${PWD%/*}" >/dev/null
		done
		if [[ $x != $x_orig ]] ; then
			mv "$x" "$TMP/1/$x_orig"
			pushd "$TMP/1" >/dev/null
		fi
		find "$x_orig" -type d -exec dodir "${INSDESTTREE}/{}" \;
		find "$x_orig" \( -type f -or -type l \) -print0 | _xdoins
		if [[ ${PIPESTATUS[1]} -eq 0 ]] ; then
			# NOTE: Even if only an empty directory is installed here, it
			# still counts as success, since an empty directory given as
			# an argument to doins -r should not trigger failure.
			((success|=1))
		else
			((failed|=1))
		fi
		if [[ $x != $x_orig ]] ; then
			popd >/dev/null
			mv "$TMP/1/$x_orig" "$x"
		fi
		while popd >/dev/null 2>&1 ; do true ; done
	else
		_doins "${x}"
		if [[ $? -eq 0 ]] ; then
			((success|=1))
		else
			((failed|=1))
		fi
	fi
done
rm -rf "$TMP"
[[ $failed -ne 0 || $success -eq 0 ]] && { helpers_die "${0##*/} failed"; exit 1; } || exit 0
