+ # Ignore lines not containing the trigger word.
+ comment=$(fgrep "${trigger}" <<< "${GERRIT_EVENT_COMMENT_TEXT}" || true)
+ # The vpp-csit triggers trail stuff we are not interested in.
+ # Removing them and trigger word: https://unix.stackexchange.com/a/13472
+ # (except relying on \s whitespace, \S non-whitespace and . both).
+ # The last string is concatenated, only the middle part is expanded.
+ cmd=("grep" "-oP" '\S*'"${trigger}"'\S*\s\K.+$') || die "Unset trigger?"
+ # On parsing error, TEST_TAG_STRING probably stays empty.
+ TEST_TAG_STRING=$("${cmd[@]}" <<< "${comment}" || true)
+ if [[ -z "${TEST_TAG_STRING-}" ]]; then
+ # Probably we got a base64 encoded comment.
+ comment="${GERRIT_EVENT_COMMENT_TEXT}"
+ comment=$(base64 --decode <<< "${comment}" || true)
+ comment=$(fgrep "${trigger}" <<< "${comment}" || true)
+ TEST_TAG_STRING=$("${cmd[@]}" <<< "${comment}" || true)
+ fi
+ if [[ -n "${TEST_TAG_STRING-}" ]]; then
+ test_tag_array=(${TEST_TAG_STRING})
+ if [[ "${test_tag_array[0]}" == "icl" ]]; then
+ export GRAPH_NODE_VARIANT="icl"
+ TEST_TAG_STRING="${test_tag_array[@]:1}" || true
+ elif [[ "${test_tag_array[0]}" == "skx" ]]; then
+ export GRAPH_NODE_VARIANT="skx"
+ TEST_TAG_STRING="${test_tag_array[@]:1}" || true
+ fi
+ fi
+ fi
+}
+
+
+function installed () {
+
+ # Check if the given utility is installed. Fail if not installed.
+ #
+ # Duplicate of common.sh function, as this file is also used standalone.
+ #
+ # Arguments:
+ # - ${1} - Utility to check.
+ # Returns:
+ # - 0 - If command is installed.
+ # - 1 - If command is not installed.
+
+ set -exuo pipefail
+
+ command -v "${1}"
+}
+
+
+function move_archives () {
+
+ # Move archive directory to top of workspace, if not already there.
+ #
+ # ARCHIVE_DIR is positioned relative to CSIT_DIR,
+ # but in some jobs CSIT_DIR is not same as WORKSPACE
+ # (e.g. under VPP_DIR). To simplify ci-management settings,
+ # we want to move the data to the top. We do not want simple copy,
+ # as ci-management is eager with recursive search.
+ #
+ # As some scripts may call this function multiple times,
+ # the actual implementation use copying and deletion,
+ # so the workspace gets "union" of contents (except overwrites on conflict).
+ # The consequence is empty ARCHIVE_DIR remaining after this call.
+ #
+ # As the source directory is emptied,
+ # the check for dirs being different is essential.
+ #
+ # Variables read:
+ # - WORKSPACE - Jenkins workspace, move only if the value is not empty.
+ # Can be unset, then it speeds up manual testing.
+ # - ARCHIVE_DIR - Path to directory with content to be moved.
+ # Directories updated:
+ # - ${WORKSPACE}/archives/ - Created if does not exist.
+ # Content of ${ARCHIVE_DIR}/ is moved.
+ # Functions called:
+ # - die - Print to stderr and exit.
+
+ set -exuo pipefail
+
+ if [[ -n "${WORKSPACE-}" ]]; then
+ target=$(readlink -f "${WORKSPACE}/archives")
+ if [[ "${target}" != "${ARCHIVE_DIR}" ]]; then
+ mkdir -p "${target}" || die "Archives dir create failed."
+ cp -rf "${ARCHIVE_DIR}"/* "${target}" || die "Copy failed."
+ rm -rf "${ARCHIVE_DIR}"/* || die "Delete failed."
+ fi