#!/bin/sh
#
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#
#

# Dependencies of libraries
subr="subr"
auth_gnome_keyring="auth_gnome_keyring $subr"
auth_kwallet="auth_kwallet $subr"
delta="delta $subr"
diff="diff $subr"
fs_util="fs_util $subr"
fs_base="fs_base $delta $fs_util $subr"
fs_fs="fs_fs $delta $fs_util $subr"
fs="fs $fs_base $fs_fs $fs_util $subr"
repos="repos $delta $fs $fs_util $subr"
ra_local="ra_local $delta $fs $fs_util $repos $subr"
ra_neon="ra_neon $delta $subr"
ra_serf="ra_serf $delta $subr"
ra_svn="ra_svn $delta $subr"
ra="ra $delta $ra_local $ra_neon $ra_serf $ra_svn $subr"
wc="wc $delta $diff $subr"
client="client $delta $diff $ra $subr $wc"

# Variable 'libraries' containing names of variables corresponding to libraries
libraries="auth_gnome_keyring auth_kwallet client delta diff fs fs_base fs_fs fs_util ra ra_local ra_neon ra_serf ra_svn repos subr wc"

for library in $libraries; do
  # Delete duplicates in dependencies of libraries
  library_dependencies="$(echo -n $(for x in $(eval echo "\$$library"); do echo $x; done | sort -u))"
  eval "$library=\$library_dependencies"
done

# Dependencies of executables
svn="$auth_gnome_keyring $auth_kwallet $client $delta $diff $ra $subr $wc"
svnadmin="$delta $fs $repos $subr"
svndumpfilter="$delta $fs $repos $subr"
svnlook="$delta $diff $fs $repos $subr"
svnserve="$delta $fs $ra_svn $repos $subr"
svnsync="$auth_gnome_keyring $auth_kwallet $delta $ra $subr"
svnversion="$subr $wc"
entries_dump="$subr $wc"

# Variable 'executables' containing names of variables corresponding to executables
executables="svn svnadmin svndumpfilter svnlook svnserve svnsync svnversion entries_dump"

for executable in $executables; do
  # Set variables containing paths of executables
  if [ "$executable" != entries_dump ]; then
    eval "${executable}_path=subversion/$executable/$executable"
  else
    eval "${executable}_path=subversion/tests/cmdline/entries-dump"
  fi
  # Delete duplicates in dependencies of executables
  executable_dependencies="$(echo -n $(for x in $(eval echo "\$$executable"); do echo $x; done | sort -u))"
  eval "$executable=\$executable_dependencies"
done

test_paths="$(find subversion/tests -mindepth 2 -maxdepth 2 -name '*-test' ! -path '*/.libs/*' | sort)"
for test in $test_paths; do
  test_path="$test"
  # Dependencies of tests are based on names of directories containing tests
  test_library="$(echo $test | sed -e 's:^subversion/tests/libsvn_\([^/]*\)/.*:\1:')"
  test_dependencies="$(eval echo "\$$test_library")"
  # Set variables corresponding to tests and containing dependencies of tests
  test="$(echo $test | sed -e 's:^subversion/tests/libsvn_[^/]*/\(.*\):\1:' -e 's/-/_/g')"
  eval "$test=\$test_dependencies"
  # Set variables containing paths of tests
  eval "${test}_path=\$test_path"
  # Set variable 'tests' containing names of variables corresponding to tests
  tests="$tests $test"
done

# auth-test dynamically loads libsvn_auth_gnome_keyring and libsvn_auth_kwallet libraries
auth_test="auth_gnome_keyring auth_kwallet $auth_test"

# Usage: sed_append LINE_NUMBER TEXT FILE
sed_append()
{
  sed -e "$1a\\
$2" "$3" > "$3.new"
  mv -f "$3.new" "$3"
}

current_directory="$(pwd)"
for libtool_script in $executables $tests; do
  eval "libtool_script_path=\$${libtool_script}_path"
  if [ -f "$libtool_script_path" ]; then
    if { grep LD_LIBRARY_PATH "$libtool_script_path" && ! grep LD_PRELOAD "$libtool_script_path"; } > /dev/null; then
      echo "Transforming $libtool_script_path"
      libtool_script_dependencies="$(eval echo "\$$libtool_script")"
      for libtool_script_dependency in $libtool_script_dependencies; do
        libtool_script_library="$current_directory/subversion/libsvn_$libtool_script_dependency/.libs/libsvn_$libtool_script_dependency-1.so"
        [ -f "$libtool_script_library" ] && libtool_script_libraries="$libtool_script_libraries $libtool_script_library"
      done
      libtool_script_libraries="${libtool_script_libraries# *}"
      # Append definitions of LD_PRELOAD to libtool scripts
      sed_append 4 "LD_PRELOAD=\"$libtool_script_libraries\"" "$libtool_script_path"
      sed_append 5 "export LD_PRELOAD" "$libtool_script_path"
      chmod +x "$libtool_script_path"
    fi
  fi
done
