#!/bin/bash
#
# Run Valgrind, condensing logged reports into an exit code.
#
# Copyright (C) 2014 Red Hat
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
set -o nounset -o pipefail -o errexit
shopt -s extglob
function usage()
{
cat <&2
usage >&2
exit 1
fi
declare error_exitcode="$1"; shift
declare -a path_pattern_list=()
declare arg
declare got_dash_dash
declare program_path
declare path_pattern
declare match
declare program_name
declare status=0
# Extract path patterns
while [[ $# != 0 ]]; do
arg="$1"
shift
if [[ "$arg" == "--" ]]; then
break
else
path_pattern_list+=("$arg")
fi
done
# Find program path argument
got_dash_dash=false
for arg in "$@"; do
if [[ "$arg" == "--" ]]; then
got_dash_dash=true
elif "$got_dash_dash" || [[ "$arg" != -* ]]; then
program_path="$arg"
break
fi
done
if [[ -z "${program_path+set}" ]]; then
echo "Program path not specified." >&2
usage >&2
exit 1
fi
# Match against path patterns, if any
if [[ ${#path_pattern_list[@]} != 0 ]]; then
match=false
for path_pattern in "${path_pattern_list[@]}"; do
if [[ "$program_path" == $path_pattern ]]; then
match=true
fi
done
if ! $match; then
exit 0
fi
fi
# Generate original path from libtool path
program_path=`sed -e 's/^\(.*\/\)\?\.libs\/lt-\([^\/]\+\)$/\1\2/' \
<<<"$program_path"`
program_name=`basename "$program_path"`
rm -f "$program_name".*.valgrind.log
valgrind --log-file="$program_name.%p.valgrind.log" "$@" || status=$?
if grep -q '^==[0-9]\+== *ERROR SUMMARY: *[1-9]' \
"$program_name".*.valgrind.log; then
exit "$error_exitcode"
else
exit "$status"
fi