diff options
author | Zac Medico <zmedico@gentoo.org> | 2008-03-19 10:24:26 +0000 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2008-03-19 10:24:26 +0000 |
commit | fcdf806858f9dd8fd7a111cca26853820eac562c (patch) | |
tree | 2aa42d19e1990f00fd25e2ec3c197890b14ce247 | |
parent | 631119ccba71614cd3a7e1ae1ff9a333c9c4e6db (diff) | |
download | portage-fcdf806858f9dd8fd7a111cca26853820eac562c.tar.gz portage-fcdf806858f9dd8fd7a111cca26853820eac562c.tar.bz2 portage-fcdf806858f9dd8fd7a111cca26853820eac562c.zip |
Bug #210575 - Optimize doins -r so that it doesn't call itself recursively,
since it's faster to handle the recursion internally. Thanks to Benedikt
Böhm <hollow@gentoo.org> for the initial patch.
svn path=/main/trunk/; revision=9485
-rwxr-xr-x | bin/doins | 45 |
1 files changed, 27 insertions, 18 deletions
@@ -16,11 +16,6 @@ if [[ "$1" == "-r" ]] ; then else DOINSRECUR=n fi -[[ -z ${INSDEPTH} ]] && declare -i INSDEPTH=0 -if [[ ${INSDEPTH} -gt 30 ]] ; then - echo "${0##*/}: sanity check ... 30 directories is too much :(" 2>&1 - exit 1 -fi if [[ ${INSDESTTREE#${D}} != "${INSDESTTREE}" ]]; then vecho "-------------------------------------------------------" 1>&2 @@ -32,24 +27,38 @@ fi [[ ! -d ${D}${INSDESTTREE} ]] && dodir "${INSDESTTREE}" +_doins() { + local mysrc="$1" mydir="$2" + + if [ -L "$mysrc" ] ; then + cp "$mysrc" "${T}" + mysrc="${T}/${mysrc##*/}" + fi + + install ${INSOPTIONS} "${mysrc}" "${D}${INSDESTTREE}/${mydir}" +} + +_xdoins() { + while read -d $'\0' x ; do + _doins "$x" "${x%/*}" + done +} + for x in "$@" ; do - if [ -L "$x" ] ; then - cp "$x" "${T}" - mysrc="${T}/$(/usr/bin/basename "${x}")" - elif [ -d "$x" ] ; then + if [ -d "$x" ] ; then if [ "${DOINSRECUR}" == "n" ] ; then continue fi - mydir="${INSDESTTREE}/$(basename "${x}")" - find "${x}" -mindepth 1 -maxdepth 1 -exec \ - env \ - INSDESTTREE="${mydir}" \ - INSDEPTH=$((INSDEPTH+1)) \ - doins -r {} \; - continue + if [ $x = "${x%/*}" ] ; then + pushd "$PWD" >/dev/null + else + pushd "${x%/*}" >/dev/null + fi + find "${x##*/}" -type d -exec dodir "${INSDESTTREE}/{}" \; + find "${x##*/}" \( -type f -or -type l \) -print0 | _xdoins + popd >/dev/null else - mysrc="${x}" + _doins "${x}" fi - install ${INSOPTIONS} "${mysrc}" "${D}${INSDESTTREE}" done |