|  | #!/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 |