Blame src/libraries.sh

Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
#
Packit bbb0ff
#   Name: libraries.sh - part of the BeakerLib project
Packit bbb0ff
#   Description: Functions for importing separate libraries
Packit bbb0ff
#
Packit bbb0ff
#   Author: Petr Muller <muller@redhat.com>
Packit bbb0ff
#
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
#
Packit bbb0ff
#   Copyright (c) 2012 Red Hat, Inc. All rights reserved.
Packit bbb0ff
#
Packit bbb0ff
#   This copyrighted material is made available to anyone wishing
Packit bbb0ff
#   to use, modify, copy, or redistribute it subject to the terms
Packit bbb0ff
#   and conditions of the GNU General Public License version 2.
Packit bbb0ff
#
Packit bbb0ff
#   This program is distributed in the hope that it will be
Packit bbb0ff
#   useful, but WITHOUT ANY WARRANTY; without even the implied
Packit bbb0ff
#   warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit bbb0ff
#   PURPOSE. See the GNU General Public License for more details.
Packit bbb0ff
#
Packit bbb0ff
#   You should have received a copy of the GNU General Public
Packit bbb0ff
#   License along with this program; if not, write to the Free
Packit bbb0ff
#   Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Packit bbb0ff
#   Boston, MA 02110-1301, USA.
Packit bbb0ff
#
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
Packit bbb0ff
: <<'=cut'
Packit bbb0ff
=pod
Packit bbb0ff
Packit bbb0ff
=head1 NAME
Packit bbb0ff
Packit bbb0ff
BeakerLib - libraries - mechanism for loading shared test code from libraries
Packit bbb0ff
Packit bbb0ff
=head1 DESCRIPTION
Packit bbb0ff
Packit bbb0ff
This file contains functions for bringing external code into the test
Packit bbb0ff
namespace.
Packit bbb0ff
Packit bbb0ff
=head1 FUNCTIONS
Packit bbb0ff
Packit bbb0ff
=cut
Packit bbb0ff
Packit bbb0ff
# Extract a list of required libraries from a Makefile
Packit bbb0ff
# Takes a directory where the library is placed
Packit bbb0ff
Packit bbb0ff
__INTERNAL_extractRequires(){
Packit bbb0ff
  local MAKEFILE="$1/Makefile"
Packit bbb0ff
Packit bbb0ff
  if [ -f "$MAKEFILE" ]
Packit bbb0ff
  then
Packit bbb0ff
    # 1) extract RhtsRequires lines, where RhtsRequires is not commented out
Packit bbb0ff
    # 2) extract test(/Foo/Bar/Library/Baz) patterns
Packit bbb0ff
    # 3) extract Bar/Baz from the patterns
Packit bbb0ff
    # 4) make a single line of space-separated library IDs
Packit bbb0ff
    __INTERNAL_LIBRARY_DEPS="$(grep -E '^[^#]*RhtsRequires' $MAKEFILE \
Packit bbb0ff
     | grep -E -o -e 'test\(/[^/)]+/[^/)]+/Library/[^/)]+\)' -e '[Ll]ibrary\([^)]*\)' \
Packit bbb0ff
     | sed -e 's|test(/[^/)]*/\([^/)]*\)/Library/\([^/)]*\))|\1/\2|g' -e 's|[Ll]ibrary(\(.*\))|\1|' \
Packit bbb0ff
     | tr '\n' ' ')"
Packit bbb0ff
  else
Packit bbb0ff
    __INTERNAL_LIBRARY_DEPS=""
Packit bbb0ff
  fi
Packit bbb0ff
Packit bbb0ff
  echo $__INTERNAL_LIBRARY_DEPS
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
# Extract a location of an original sourcing script from $0
Packit bbb0ff
__INTERNAL_extractOrigin(){
Packit bbb0ff
  local SOURCE
Packit bbb0ff
Packit bbb0ff
  if [ ! -e "$0" ]
Packit bbb0ff
  then
Packit bbb0ff
    SOURCE="$( readlink -f . )"
Packit bbb0ff
  else
Packit bbb0ff
    SOURCE="$( readlink -f $0 )"
Packit bbb0ff
  fi
Packit bbb0ff
Packit bbb0ff
  local DIR="$( dirname "$SOURCE" )"
Packit bbb0ff
  while [ -h "$SOURCE" ]
Packit bbb0ff
  do
Packit bbb0ff
      SOURCE="$(readlink -f "$SOURCE")"
Packit bbb0ff
      [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE"
Packit bbb0ff
      DIR="$( cd -P "$( dirname "$SOURCE"  )" && pwd )"
Packit bbb0ff
  done
Packit bbb0ff
  DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
Packit bbb0ff
Packit bbb0ff
  echo "$DIR"
Packit bbb0ff
}
Packit bbb0ff
__INTERNAL_TraverseRoot="$(__INTERNAL_extractOrigin)"
Packit bbb0ff
Packit bbb0ff
# Traverse directories upwards and search for the matching path
Packit bbb0ff
__INTERNAL_rlLibraryTraverseUpwards() {
Packit bbb0ff
  local DIRECTORY="$1"
Packit bbb0ff
  local COMPONENT="$2"
Packit bbb0ff
  local LIBRARY="$3"
Packit bbb0ff
Packit bbb0ff
  while [ "$DIRECTORY" != "/" ]
Packit bbb0ff
  do
Packit bbb0ff
    DIRECTORY="$( dirname $DIRECTORY )"
Packit bbb0ff
    if [ -d "$DIRECTORY/$COMPONENT" ]
Packit bbb0ff
    then
Packit bbb0ff
Packit bbb0ff
      local CANDIDATE="$DIRECTORY/$COMPONENT/Library/$LIBRARY/lib.sh"
Packit bbb0ff
      if [ -f "$CANDIDATE" ]
Packit bbb0ff
      then
Packit bbb0ff
        LIBFILE="$CANDIDATE"
Packit bbb0ff
        break
Packit bbb0ff
      fi
Packit bbb0ff
Packit bbb0ff
      local CANDIDATE="$( echo $DIRECTORY/*/$COMPONENT/Library/$LIBRARY/lib.sh )"
Packit bbb0ff
      if [ -f "$CANDIDATE" ]
Packit bbb0ff
      then
Packit bbb0ff
        LIBFILE="$CANDIDATE"
Packit bbb0ff
        break
Packit bbb0ff
      fi
Packit bbb0ff
    fi
Packit bbb0ff
  done
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
__INTERNAL_rlLibrarySearchInRoot(){
Packit bbb0ff
  local COMPONENT="$1"
Packit bbb0ff
  local LIBRARY="$2"
Packit bbb0ff
  local BEAKERLIB_LIBRARY_PATH="${3:-/mnt/tests}"
Packit bbb0ff
Packit bbb0ff
  rlLogDebug "rlImport: Trying root: [$BEAKERLIB_LIBRARY_PATH]"
Packit bbb0ff
Packit bbb0ff
  local CANDIDATE="$BEAKERLIB_LIBRARY_PATH/$COMPONENT/Library/$LIBRARY/lib.sh"
Packit bbb0ff
  if [ -f "$CANDIDATE" ]
Packit bbb0ff
  then
Packit bbb0ff
    LIBFILE="$CANDIDATE"
Packit bbb0ff
    return
Packit bbb0ff
  fi
Packit bbb0ff
Packit bbb0ff
  local CANDIDATE="$( echo $BEAKERLIB_LIBRARY_PATH/*/$COMPONENT/Library/$LIBRARY/lib.sh )"
Packit bbb0ff
  if [ -f "$CANDIDATE" ]
Packit bbb0ff
  then
Packit bbb0ff
    LIBFILE="$CANDIDATE"
Packit bbb0ff
    return
Packit bbb0ff
  fi
Packit bbb0ff
Packit bbb0ff
  rlLogDebug "rlImport: Library not found in $BEAKERLIB_LIBRARY_PATH"
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
__INTERNAL_rlLibrarySearch() {
Packit bbb0ff
Packit bbb0ff
  local COMPONENT="$1"
Packit bbb0ff
  local LIBRARY="$2"
Packit bbb0ff
Packit bbb0ff
  rlLogDebug "rlImport: Looking if we got BEAKERLIB_LIBRARY_PATH"
Packit bbb0ff
Packit bbb0ff
  if [ -n "$BEAKERLIB_LIBRARY_PATH" ]
Packit bbb0ff
  then
Packit bbb0ff
    rlLogDebug "rlImport: BEAKERLIB_LIBRARY_PATH is set: trying to search in it"
Packit bbb0ff
Packit bbb0ff
    __INTERNAL_rlLibrarySearchInRoot "$COMPONENT" "$LIBRARY" "$BEAKERLIB_LIBRARY_PATH"
Packit bbb0ff
    if [ -n "$LIBFILE" ]
Packit bbb0ff
    then
Packit bbb0ff
      local VERSION="$(__INTERNAL_extractLibraryVersion "$LIBFILE" "$COMPONENT/$LIBRARY")"
Packit bbb0ff
      VERSION=${VERSION:+", version '$VERSION'"}
Packit bbb0ff
      rlLogInfo "rlImport: Found '$COMPONENT/$LIBRARY'$VERSION in BEAKERLIB_LIBRARY_PATH"
Packit bbb0ff
      return
Packit bbb0ff
    fi
Packit bbb0ff
  else
Packit bbb0ff
    rlLogDebug "rlImport: No BEAKERLIB_LIBRARY_PATH set: trying default"
Packit bbb0ff
  fi
Packit bbb0ff
Packit bbb0ff
  __INTERNAL_rlLibrarySearchInRoot "$COMPONENT" "$LIBRARY"
Packit bbb0ff
  if [ -n "$LIBFILE" ]
Packit bbb0ff
  then
Packit bbb0ff
    local VERSION="$(__INTERNAL_extractLibraryVersion "$LIBFILE" "$COMPONENT/$LIBRARY")"
Packit bbb0ff
      VERSION=${VERSION:+", version '$VERSION'"}
Packit bbb0ff
    rlLogInfo "rlImport: Found '$COMPONENT/$LIBRARY'$VERSION in /mnt/tests"
Packit bbb0ff
    return
Packit bbb0ff
  fi
Packit bbb0ff
Packit bbb0ff
  __INTERNAL_rlLibrarySearchInRoot "$COMPONENT" "$LIBRARY" "/usr/share/beakerlib-libraries"
Packit bbb0ff
  if [ -n "$LIBFILE" ]
Packit bbb0ff
  then
Packit bbb0ff
    local VERSION="$(__INTERNAL_extractLibraryVersion "$LIBFILE" "$COMPONENT/$LIBRARY")"
Packit bbb0ff
      VERSION=${VERSION:+", version '$VERSION'"}
Packit bbb0ff
    rlLogInfo "rlImport: Found '$COMPONENT/$LIBRARY'$VERSION in /usr/share/beakerlib-libraries"
Packit bbb0ff
    return
Packit bbb0ff
  fi
Packit bbb0ff
Packit bbb0ff
  if [ -n "$__INTERNAL_TraverseRoot" ]
Packit bbb0ff
  then
Packit bbb0ff
    rlLogDebug "rlImport: Trying to find the library in directories above test"
Packit bbb0ff
    rlLogDebug "rlImport: Starting search at: $__INTERNAL_TraverseRoot"
Packit bbb0ff
    __INTERNAL_rlLibraryTraverseUpwards "$__INTERNAL_TraverseRoot" "$COMPONENT" "$LIBRARY"
Packit bbb0ff
Packit bbb0ff
    if [ -n "$LIBFILE" ]
Packit bbb0ff
    then
Packit bbb0ff
      local VERSION="$(__INTERNAL_extractLibraryVersion "$LIBFILE" "$COMPONENT/$LIBRARY")"
Packit bbb0ff
      VERSION=${VERSION:+", version '$VERSION'"}
Packit bbb0ff
      rlLogInfo "rlImport: Found '$COMPONENT/$LIBRARY'$VERSION during upwards traversal"
Packit bbb0ff
      return
Packit bbb0ff
    fi
Packit bbb0ff
  fi
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# rlImport
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
: <<'=cut'
Packit bbb0ff
=pod
Packit bbb0ff
Packit bbb0ff
=head3 rlImport
Packit bbb0ff
Packit bbb0ff
Imports code provided by one or more libraries into the test namespace.
Packit bbb0ff
The library search mechanism is based on Beaker test hierarchy system, i.e.:
Packit bbb0ff
Packit bbb0ff
/component/type/test-name/test-file
Packit bbb0ff
Packit bbb0ff
When test-file calls rlImport with 'foo/bar' parameter, the directory path
Packit bbb0ff
is traversed upwards, and a check for presence of the test /foo/Library/bar/
Packit bbb0ff
will be performed. This means this function needs to be called from
Packit bbb0ff
the test hierarchy, not e.g. the /tmp directory.
Packit bbb0ff
Packit bbb0ff
Once library is found, it is sourced and a verifier function is called.
Packit bbb0ff
The verifier function is cunstructed by composing the library prefix and
Packit bbb0ff
LibraryLoaded. Library prefix can be defined in the library itself.
Packit bbb0ff
If the verifier passes the library is ready to use. Also variable
Packit bbb0ff
B<E<lt>PREFIXE<gt>LibraryDir> is created and it points to the library folder.
Packit bbb0ff
Packit bbb0ff
Usage:
Packit bbb0ff
Packit bbb0ff
    rlImport --all
Packit bbb0ff
    rlImport LIBRARY [LIBRARY2...]
Packit bbb0ff
Packit bbb0ff
=over
Packit bbb0ff
Packit bbb0ff
=item --all
Packit bbb0ff
Packit bbb0ff
Read Makefile in current/original directory, pick library requirements up and
Packit bbb0ff
import them all.
Packit bbb0ff
Packit bbb0ff
=item LIBRARY
Packit bbb0ff
Packit bbb0ff
Must have 'component/library' format. Identifies the library to import.
Packit bbb0ff
Packit bbb0ff
=back
Packit bbb0ff
Packit bbb0ff
Returns 0 if the import of all libraries was successful. Returns non-zero
Packit bbb0ff
if one or more library failed to import.
Packit bbb0ff
Packit bbb0ff
=cut
Packit bbb0ff
Packit bbb0ff
__INTERNAL_first(){
Packit bbb0ff
  echo $1
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
__INTERNAL_tail(){
Packit bbb0ff
  shift
Packit bbb0ff
  echo $*
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
__INTERNAL_envdebugget() {
Packit bbb0ff
  local tmp="$(set | sed -r '/^.*\S+ \(\).$/,$d;/^(_|BASH_.*|FUNCNAME|LINENO|PWD|__INTERNAL_LIBRARY_IMPORTS_.*|__INTERNAL_envdebug.*)=/d')"
Packit bbb0ff
  if [[ -z "$1" ]]; then
Packit bbb0ff
    __INTERNAL_envdebugvariables="$tmp"
Packit bbb0ff
    __INTERNAL_envdebugfunctions="$(declare -f)"
Packit bbb0ff
  else
Packit bbb0ff
    echo "$tmp"
Packit bbb0ff
  fi
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
__INTERNAL_envdebugdiff() {
Packit bbb0ff
  rlLogDebug "rlImport: library $1 changes following environment; changed functions are marked with asterisk (*)"
Packit bbb0ff
  diff -U0 <(echo "$__INTERNAL_envdebugvariables") <(__INTERNAL_envdebugget 1) | tail -n +3 | grep -E -v '^@@'
Packit Service e5f175
  local line fn print='' print2 LF="
Packit Service e5f175
"
Packit Service e5f175
  while IFS= read line; do
Packit bbb0ff
    [[ "$line" =~ ^(.)([^[:space:]]+)[[:space:]]\(\) ]] && {
Packit bbb0ff
      [[ -n "$print" ]] && {
Packit bbb0ff
        echo "$fn"
Packit bbb0ff
        print=''
Packit bbb0ff
      }
Packit bbb0ff
      print2=''
Packit bbb0ff
      local tmp="${BASH_REMATCH[1]}"
Packit bbb0ff
      [[ "$tmp" == " " ]] && {
Packit bbb0ff
        print2=1
Packit bbb0ff
        tmp='*'
Packit bbb0ff
      }
Packit bbb0ff
      fn="$tmp${BASH_REMATCH[2]}()"
Packit bbb0ff
      continue
Packit bbb0ff
    }
Packit bbb0ff
    [[ "${line:0:1}" != " " ]] && print=1
Packit bbb0ff
    [[ "$DEBUG" =~ ^[0-9]+$ ]] && [[ -n "$print2" &&  $DEBUG -ge 2 || $DEBUG -ge 3 ]] && fn="$fn$LF$line"
Packit bbb0ff
  done < <(diff -U100000 <(echo "$__INTERNAL_envdebugfunctions") <(declare -f) | tail -n +3 | grep -E -v '^@@'; echo " _ ()")
Packit bbb0ff
  unset __INTERNAL_envdebugfunctions __INTERNAL_envdebugvariables
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
__INTERNAL_extractLibraryVersion() {
Packit bbb0ff
  local LIBFILE=$1
Packit bbb0ff
  local LIBNAME=$2
Packit bbb0ff
  local VERSION=""
Packit bbb0ff
  local RESULT=""
Packit bbb0ff
Packit bbb0ff
  # Search in lib.sh
Packit bbb0ff
  VERSION="${VERSION:+"$VERSION, "}$( grep -E '^#\s*library-version = \S*' $LIBFILE | sed 's|.*library-version = \(\S*\).*|\1|')"
Packit bbb0ff
Packit bbb0ff
  # Search lib in rpms and get version
Packit bbb0ff
  if RESULT=( $(rpm -q --queryformat "%{NAME} %{VERSION}-%{RELEASE}\n" --whatprovides "library($LIBNAME)") ); then
Packit bbb0ff
    # Found library-version, set $VERSION
Packit bbb0ff
    while [[ -n "$RESULT" ]]; do
Packit bbb0ff
      rljRpmLog $RESULT
Packit bbb0ff
      RESULT=( "${RESULT[@]:1}" )
Packit bbb0ff
      VERSION="${VERSION:+"$VERSION, "}$RESULT"
Packit bbb0ff
      RESULT=( "${RESULT[@]:1}" )
Packit bbb0ff
    done
Packit bbb0ff
  fi
Packit bbb0ff
Packit bbb0ff
  echo "$VERSION"
Packit bbb0ff
  return 0
Packit bbb0ff
} #end __INTERNAL_extractLibraryVersion
Packit bbb0ff
Packit bbb0ff
rlImport() {
Packit bbb0ff
  local RESULT=0
Packit bbb0ff
Packit bbb0ff
  if [ -z "$1" ]
Packit bbb0ff
  then
Packit bbb0ff
    rlLogError "rlImport: At least one argument needs to be provided"
Packit bbb0ff
    return 1
Packit bbb0ff
  fi
Packit bbb0ff
Packit bbb0ff
  local WORKLIST="$*"
Packit bbb0ff
  if [ "$1" == '--all' ]; then
Packit bbb0ff
    rlLogDebug "Try to import all libraries specified in Makefile"
Packit bbb0ff
    WORKLIST=$(__INTERNAL_extractRequires "${__INTERNAL_TraverseRoot}")
Packit bbb0ff
Packit bbb0ff
    if [ -z "$WORKLIST" ]
Packit bbb0ff
    then
Packit bbb0ff
      rlLogInfo "rlImport: No libraries found in Makefile"
Packit bbb0ff
      return 0
Packit bbb0ff
    fi
Packit bbb0ff
  fi
Packit bbb0ff
Packit bbb0ff
  local PROCESSING="x"
Packit bbb0ff
  local LIBS_TO_LOAD=''
Packit bbb0ff
Packit bbb0ff
  # Process all arguments
Packit bbb0ff
  while true
Packit bbb0ff
  do
Packit bbb0ff
    rlLogDebug "rlImport: WORKLIST [$WORKLIST]"
Packit bbb0ff
    # Pick one library  from the worklist
Packit bbb0ff
    PROCESSING="$(__INTERNAL_first $WORKLIST)"
Packit bbb0ff
    WORKLIST=$(__INTERNAL_tail $WORKLIST)
Packit bbb0ff
Packit bbb0ff
    if [ -z "$PROCESSING" ]
Packit bbb0ff
    then
Packit bbb0ff
      break
Packit bbb0ff
    fi
Packit bbb0ff
Packit bbb0ff
    LIBS_TO_LOAD="$PROCESSING $LIBS_TO_LOAD"
Packit bbb0ff
Packit bbb0ff
    # Extract two identifiers from an 'component/library' argument
Packit bbb0ff
    local COMPONENT=$( echo $PROCESSING | cut -d '/' -f 1 )
Packit bbb0ff
    local LIBRARY=$( echo $PROCESSING | cut -d '/' -f 2 )
Packit bbb0ff
Packit bbb0ff
    local COMPONENT_hash=$( rlHash --algorithm hex "$COMPONENT" )
Packit bbb0ff
    local LIBRARY_hash=$( rlHash --algorithm hex "$LIBRARY" )
Packit bbb0ff
    local LOCATIONS_varname="__INTERNAL_LIBRARY_LOCATIONS_C${COMPONENT_hash}_L${LIBRARY_hash}"
Packit bbb0ff
    local IMPORTS_varname="__INTERNAL_LIBRARY_IMPORTS_C${COMPONENT_hash}_L${LIBRARY_hash}"
Packit bbb0ff
Packit bbb0ff
    # If the lib was already processed, do nothing
Packit bbb0ff
    if [ -n "${!IMPORTS_varname}" ]
Packit bbb0ff
    then
Packit bbb0ff
      continue
Packit bbb0ff
    fi
Packit bbb0ff
Packit bbb0ff
    if [ -z "$COMPONENT" ] || [ -z "$LIBRARY" ] || [ "$COMPONENT/$LIBRARY" != "$PROCESSING" ]
Packit bbb0ff
    then
Packit bbb0ff
      rlLogError "rlImport: Malformed argument [$PROCESSING]"
Packit bbb0ff
      eval $IMPORTS_varname="FAIL"
Packit bbb0ff
      RESULT=1
Packit bbb0ff
      continue;
Packit bbb0ff
    fi
Packit bbb0ff
Packit bbb0ff
    rlLogDebug "rlImport: Searching for library $COMPONENT/$LIBRARY"
Packit bbb0ff
Packit bbb0ff
    # LIBFILE is set inside __INTERNAL_rlLibrarySearch if a suitable path is found
Packit bbb0ff
    local LIBFILE=""
Packit bbb0ff
    __INTERNAL_rlLibrarySearch $COMPONENT $LIBRARY
Packit bbb0ff
Packit bbb0ff
    if [ -z "$LIBFILE" ]
Packit bbb0ff
    then
Packit bbb0ff
      rlLogError "rlImport: Could not find library $PROCESSING"
Packit bbb0ff
      eval $IMPORTS_varname="FAIL"
Packit bbb0ff
      RESULT=1
Packit bbb0ff
      continue;
Packit bbb0ff
    else
Packit bbb0ff
      rlLogInfo "rlImport: Will try to import $COMPONENT/$LIBRARY from $LIBFILE"
Packit bbb0ff
    fi
Packit bbb0ff
Packit bbb0ff
    rlLogDebug "rlImport: Collecting dependencies for library $COMPONENT/$LIBRARY"
Packit bbb0ff
    local LIBDIR="$(dirname $LIBFILE)"
Packit bbb0ff
    if ! eval $LOCATIONS_varname='$LIBDIR'
Packit bbb0ff
    then
Packit bbb0ff
      rlLogError "rlImport: Error processing: $LOCATIONS_varname='$LIBDIR'"
Packit bbb0ff
      RESULT=1
Packit bbb0ff
      continue
Packit bbb0ff
    fi
Packit bbb0ff
    WORKLIST="$WORKLIST $(__INTERNAL_extractRequires $LIBDIR )"
Packit bbb0ff
    if ! eval $IMPORTS_varname="LOC"
Packit bbb0ff
    then
Packit bbb0ff
      rlLogError "rlImport: Error processing: $IMPORTS_varname='LOC'"
Packit bbb0ff
      RESULT=1
Packit bbb0ff
      continue
Packit bbb0ff
    fi
Packit bbb0ff
  done
Packit bbb0ff
Packit bbb0ff
  rlLogDebug "rlImport: LIBS_TO_LOAD='$LIBS_TO_LOAD'"
Packit bbb0ff
  local library
Packit bbb0ff
  for library in $LIBS_TO_LOAD
Packit bbb0ff
  do
Packit bbb0ff
    local COMPONENT=$( echo $library | cut -d '/' -f 1 )
Packit bbb0ff
    local LIBRARY=$( echo $library | cut -d '/' -f 2 )
Packit bbb0ff
    local COMPONENT_hash=$( rlHash --algorithm hex "$COMPONENT" )
Packit bbb0ff
    local LIBRARY_hash=$( rlHash --algorithm hex "$LIBRARY" )
Packit bbb0ff
    local LOCATIONS_varname="__INTERNAL_LIBRARY_LOCATIONS_C${COMPONENT_hash}_L${LIBRARY_hash}"
Packit bbb0ff
    local IMPORTS_varname="__INTERNAL_LIBRARY_IMPORTS_C${COMPONENT_hash}_L${LIBRARY_hash}"
Packit bbb0ff
    [ "${!IMPORTS_varname}" != "LOC" ] && {
Packit bbb0ff
      rlLogDebug "rlImport: skipping $library as it is already processed"
Packit bbb0ff
      continue
Packit bbb0ff
    }
Packit bbb0ff
    local LIBFILE="${!LOCATIONS_varname}/lib.sh"
Packit bbb0ff
Packit bbb0ff
    # Try to extract a prefix comment from the file found
Packit bbb0ff
    # Prefix comment looks like this:
Packit bbb0ff
    # library-prefix = wee
Packit bbb0ff
    local PREFIX="$( grep -E "library-prefix = [a-zA-Z_][a-zA-Z0-9_]*.*" $LIBFILE | sed 's|.*library-prefix = \([a-zA-Z_][a-zA-Z0-9_]*\).*|\1|')"
Packit bbb0ff
    if [ -z "$PREFIX" ]
Packit bbb0ff
    then
Packit bbb0ff
      rlLogError "rlImport: Could not extract prefix from library $library"
Packit bbb0ff
      RESULT=1
Packit bbb0ff
      continue;
Packit bbb0ff
    fi
Packit bbb0ff
Packit bbb0ff
    # Construct the validating function
Packit bbb0ff
    # Its supposed to be called 'prefixLibraryLoaded'
Packit bbb0ff
    local VERIFIER="${PREFIX}LibraryLoaded"
Packit bbb0ff
    rlLogDebug "rlImport: Constructed verifier function: $VERIFIER"
Packit bbb0ff
Packit bbb0ff
    local SOURCEDEBUG=''
Packit bbb0ff
    # Try to source the library
Packit bbb0ff
    bash -n $LIBFILE && {
Packit bbb0ff
      [[ -n "$DEBUG" ]] && {
Packit bbb0ff
        SOURCEDEBUG=1
Packit bbb0ff
        __INTERNAL_envdebugget
Packit bbb0ff
      }
Packit bbb0ff
      . $LIBFILE
Packit bbb0ff
    }
Packit bbb0ff
Packit bbb0ff
    # Call the validation callback of the function
Packit bbb0ff
    if ! eval $VERIFIER
Packit bbb0ff
    then
Packit bbb0ff
      rlLogError "rlImport: Import of library $library was not successful (callback failed)"
Packit bbb0ff
      RESULT=1
Packit bbb0ff
      eval $IMPORTS_varname='FAIL'
Packit bbb0ff
      [[ -n "$SOURCEDEBUG" ]] && {
Packit bbb0ff
        __INTERNAL_envdebugdiff "$library"
Packit bbb0ff
      }
Packit bbb0ff
      continue;
Packit bbb0ff
    fi
Packit bbb0ff
    eval ${PREFIX}LibraryDir="$(dirname $LIBFILE)"
Packit bbb0ff
    eval $IMPORTS_varname='PASS'
Packit bbb0ff
    [[ -n "$SOURCEDEBUG" ]] && {
Packit bbb0ff
      __INTERNAL_envdebugdiff "$library"
Packit bbb0ff
    }
Packit bbb0ff
  done
Packit bbb0ff
Packit bbb0ff
  return $RESULT
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# AUTHORS
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
: <<'=cut'
Packit bbb0ff
=pod
Packit bbb0ff
Packit bbb0ff
=head1 AUTHORS
Packit bbb0ff
Packit bbb0ff
=over
Packit bbb0ff
Packit bbb0ff
=item *
Packit bbb0ff
Packit bbb0ff
Petr Muller <muller@redhat.com>
Packit bbb0ff
Packit bbb0ff
=item *
Packit bbb0ff
Packit bbb0ff
Dalibor Pospisil <dapospis@redhat.com>
Packit bbb0ff
Packit bbb0ff
=back
Packit bbb0ff
Packit bbb0ff
=cut