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