|
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
|