#!/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 [[ " ${FEATURES} " == *" force-prefix "* ]] || \ case "$EAPI" in 0|1|2) export ED="${D}" ;; esac 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 "${0##*/} used with \${D} or \${ED}" 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 ${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 "!!! ${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