#!/bin/sh # Usage: Run 'contrib/coverage-diff.sh ' from source-root # after running # # make coverage-test # make coverage-report # # while checked out at . This script combines the *.gcov files # generated by the 'make' commands above with 'git diff ' # to report new lines that are not covered by the test suite. V1=$1 V2=$2 diff_lines () { perl -e ' my $line_num; while (<>) { # Hunk header? Grab the beginning in postimage. if (/^@@ -\d+(?:,\d+)? \+(\d+)(?:,\d+)? @@/) { $line_num = $1; next; } # Have we seen a hunk? Ignore "diff --git" etc. next unless defined $line_num; # Deleted line? Ignore. if (/^-/) { next; } # Show only the line number of added lines. if (/^\+/) { print "$line_num\n"; } # Either common context or added line appear in # the postimage. Count it. $line_num++; } ' } files=$(git diff --name-only "$V1" "$V2" -- \*.c) # create empty file >coverage-data.txt for file in $files do git diff "$V1" "$V2" -- "$file" | diff_lines | sort >new_lines.txt if ! test -s new_lines.txt then continue fi hash_file=$(echo $file | sed "s/\//\#/") if ! test -s "$hash_file.gcov" then continue fi sed -ne '/#####:/{ s/ #####:// s/:.*// s/ //g p }' "$hash_file.gcov" | sort >uncovered_lines.txt comm -12 uncovered_lines.txt new_lines.txt | sed -e 's/$/\)/' | sed -e 's/^/ /' >uncovered_new_lines.txt grep -q '[^[:space:]]' >coverage-data.txt && git blame -s "$V2" -- "$file" | sed 's/\t//g' | grep -f uncovered_new_lines.txt >>coverage-data.txt && echo >>coverage-data.txt rm -f new_lines.txt uncovered_lines.txt uncovered_new_lines.txt done cat coverage-data.txt echo "Commits introducing uncovered code:" commit_list=$(cat coverage-data.txt | grep -E '^[0-9a-f]{7,} ' | awk '{print $1;}' | sort | uniq) ( for commit in $commit_list do git log --no-decorate --pretty=format:'%an %h: %s' -1 $commit echo done ) | sort rm coverage-data.txt