#!/bin/bash
#
# Description:
# This script resolves dependencies of the given beakerlib libraries installed
# in BEAKER_LIBRARY_PATH. Dependencies are resolved from Makefiles which contains
# Requires and RhtsRequires fields specifying RPM dependencies.
#
# RhtsRequires are mandatory RPM requirements that need to be installed before
# running the test.
#
# Requires are optional RPM requirements that the harness should try to install
# on the system-under-test (SUT), but they are not mandatory.
#
# Return value:
# After the script finishes, it prints two lines, with space delimited list
# of components from RhtsRequires and Requires.
#
# BEAKERLIB_LIBRARY_PATH - path with the libraries
#
# Authors:
#  Jakub Heger <jheger@redhat.com>
#  Martin Kyral <mkyral@redhat.com>
#  Miroslav Vadkerti <mvadkert@redhat.com>
#

[ -z "$BEAKERLIB_LIBRARY_PATH" ] && BEAKERLIB_LIBRARY_PATH="/mnt/libraries"

# options
OPTS="h"

#
# helpers
#

function print_info() {
    printf ":: %s\n" "$@"
}

function print_error() {
    printf "Error: %s\n" "$@"
}

function exit_error() {
    print_error "$@"
    exit 1
}

function help() {
cat <<EOF
    usage: $(basename $0) [-h] TEST_PATH


    Authors:
      Jakub Heger <jheger AT redhat.com>
      Martin Kyral <mkyral AT redhat.com>
      Miroslav Vadkerti <mvadkert AT redhat.com>

    Options:
      -h         Print this help.
EOF
}

#
# Main
#

while getopts $OPTS OPTION
do
  case $OPTION in
    h)
        help
        exit
        ;;
  esac
done

TEST=$1
[ -z "$TEST" ] && exit_error "No test specified"
[ -f "$TEST/Makefile" ] || exit_error "Makefile not found @ $TEST/Makefile"

REQUIRES_DEPS=
RHTSREQUIRES_DEPS=
PROCESSED_LIBS=

#
# Process a beakerlib library and recursively resolve it's dependencies.
#
# Params:
# $1 - library name - e.g. httpd/http
#
function process_library() {
  # skip already processed beakerlib libraries
  grep -wq "$1" <<< "$PROCESSED_LIBS" && return
  PROCESSED_LIBS="$PROCESSED_LIBS $1"

   local COMPONENT=${1///*}
   local LIBRARY=${1##*/}

   # check if library exists
   if [ ! -d "${BEAKERLIB_LIBRARY_PATH}/$COMPONENT/Library/$LIBRARY" ]; then
     print_error "Could not find library '$1' in '$BEAKERLIB_LIBRARY_PATH'"
     return
   fi

   resolve_deps "${BEAKERLIB_LIBRARY_PATH}/$COMPONENT/Library/$LIBRARY"
}

#
# Recursively resolves test dependencies of beakerlib test specified with a path.
#
# Params:
# $1 - path to a beakerlib test
#
function resolve_deps() {
  local REQUIRES=$(sed -n 's/.*\"Requires:[[:space:]]*\(.*\)".*/\1/p' "$1/Makefile")
  local RHTSREQUIRES=$(sed -n 's/.*RhtsRequires:[[:space:]]*\(.*\)".*/\1/p' "$1/Makefile")
  # sed -n 's/.*Requires:[[:space:]]*\(.*\)".*/\1/p' $1/Makefile

  for REQ in $REQUIRES; do
    if egrep -qv '^\$\(' <<< "$REQ"; then
      REQUIRES_DEPS="$REQUIRES_DEPS $REQ"
    fi
  done

  for RHTSREQ in $RHTSREQUIRES; do
    if egrep -q "^library\(" <<< "$RHTSREQ"; then
      process_library $(sed 's/library(\(.*\))/\1/' <<< "$RHTSREQ")
    elif egrep -qv '^\$\(' <<< "$RHTSREQ"; then
      RHTSREQUIRES_DEPS="$RHTSREQUIRES_DEPS $RHTSREQ"
    fi
  done
}

resolve_deps "$TEST"

echo "$RHTSREQUIRES_DEPS" | xargs -n1 | sort | uniq | tr '\n' ' '
echo
echo "$REQUIRES_DEPS" | xargs -n1 | sort | uniq | tr '\n' ' '
echo

# vim: ts=2 sw=2 sts=2 ft=sh et ai:
