#!/bin/sh # Get TEST_OUTPUT_DIRECTORY from GIT-BUILD-OPTIONS if it's there... source "$(dirname "$0")/../../GIT-BUILD-OPTIONS" # ... otherwise set it to the default value. : ${TEST_OUTPUT_DIRECTORY=$(dirname "$0")/..} setvar output = '' setvar count = '0' setvar total_count = '0' setvar missing_message = '' setvar new_line = '' '' # start outputting the current valgrind error in $out_prefix.++$count, # and the test case which failed in the corresponding .message file proc start_output { test -z $output || return # progress setvar total_count = $(($total_count+1)) test -t 2 && printf "\rFound %d errors" $total_count >&2 setvar count = $(($count+1)) setvar output = "$out_prefix.$count" : > $output echo "*** $1 ***" > $output.message } proc finish_output { test ! -z $output || return setvar output = '' # if a test case has more than one valgrind error, we need to # copy the last .message file to the previous errors test -z $missing_message || do { while test $missing_message -lt $count { cp $out_prefix.$count.message \ $out_prefix.$missing_message.message setvar missing_message = $(($missing_message+1)) } setvar missing_message = '' } } # group the valgrind errors by backtrace proc output_all { setvar last_line = '' setvar j = '0' setvar i = '1' while test $i -le $count { # output echo "$i $(tr '\n' ' ' < $out_prefix.$i)" setvar i = $(($i+1)) } | sort -t ' ' -k 2 | # order by while read number line { # find duplicates, do not output backtrace twice if test $line != $last_line { setvar last_line = "$line" setvar j = $(($j+1)) printf "\nValgrind error $j:\n\n" cat $out_prefix.$number printf "\nfound in:\n" } # print the test case where this came from printf "\n" cat $out_prefix.$number.message } } proc handle_one { setvar OLDIFS = "$IFS" setvar IFS = "$new_line" while read line { case (line) { # backtrace, possibly a new one ==[0-9]* { # Does the current valgrind error have a message yet? case (output) { *.message { test -z $missing_message && setvar missing_message = "$count" setvar output = '' } } start_output $(basename $1) echo $line | sed 's/==[0-9]*==/==valgrind==/' >> $output } # end of backtrace '}' { test -z $output || do { echo $line >> $output test $output = ${output%.message} && setvar output = "$output.message" } } # end of test case '' { finish_output } # normal line; if $output is set, print the line * { test -z $output || echo $line >> $output } } } < $1 setvar IFS = "$OLDIFS" # just to be safe finish_output } for test_script in "$TEST_OUTPUT_DIRECTORY"/test-results/*.out { handle_one $test_script } output_all