blob: c60e057894b5ac3624a0dede9ee73ac3f0a850c3 [file] [log] [blame]
#!/bin/bash
# Copyright 1999-2012 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
source "${PORTAGE_BIN_PATH:-/usr/lib/portage/bin}"/isolated-functions.sh
helper=${__PORTAGE_HELPER:-${0##*/}}
if [[ ${helper} == 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.
eqawarn "QA Notice: dodoc called with no arguments"
exit 0
fi
export INSOPTIONS=-m0644
export INSDESTTREE=usr/share/doc/${PF}/${_E_DOCDESTTREE_}
fi
if [ $# -lt 1 ] ; then
__helpers_die "${helper}: at least one argument needed"
exit 1
fi
if [[ "$1" == "-r" ]] ; then
DOINSRECUR=y
shift
else
DOINSRECUR=n
fi
if ! ___eapi_has_prefix_variables; then
export ED="${D}"
fi
if [[ ${INSDESTTREE#${ED}} != "${INSDESTTREE}" ]]; then
__vecho "-------------------------------------------------------" 1>&2
__vecho "You should not use \${D} or \${ED} with helpers." 1>&2
__vecho " --> ${INSDESTTREE}" 1>&2
__vecho "-------------------------------------------------------" 1>&2
__helpers_die "${helper} used with \${D} or \${ED}"
exit 1
fi
if ___eapi_doins_and_newins_preserve_symlinks; then
PRESERVE_SYMLINKS=y
else
PRESERVE_SYMLINKS=n
fi
export TMP=$(mktemp -d "${T}/.doins_tmp_XXXXXX")
# Use separate directories to avoid potential name collisions.
mkdir -p "$TMP"/{1,2}
[[ ! -d ${ED}${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 "${ED}$INSDESTTREE/$mydir/${mysrc##*/}" || return $?
cp -P "$mysrc" "${ED}$INSDESTTREE/$mydir/${mysrc##*/}"
return $?
else
cp "$mysrc" "$TMP/2/${mysrc##*/}" || return $?
mysrc="$TMP/2/${mysrc##*/}"
cleanup=$mysrc
fi
fi
install ${INSOPTIONS} "${mysrc}" "${ED}${INSDESTTREE}/${mydir}"
rval=$?
[[ -n ${cleanup} ]] && rm -f "${cleanup}"
[ $rval -ne 0 ] && echo "!!! ${helper}: $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 [[ ${helper} == dodoc ]] ; then
echo "!!! ${helper}: $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 "${helper} failed"; exit 1; } || exit 0