| #!/bin/sh | |
| # Usage: Run 'contrib/coverage-diff.sh <version1> <version2>' from source-root | |
| # after running | |
| # | |
| # make coverage-test | |
| # make coverage-report | |
| # | |
| # while checked out at <version2>. This script combines the *.gcov files | |
| # generated by the 'make' commands above with 'git diff <version1> <version2>' | |
| # 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/$/\)/' -e 's/^/ /' >uncovered_new_lines.txt | |
| grep -q '[^[:space:]]' <uncovered_new_lines.txt && | |
| echo $file >>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=$(awk '/^[0-9a-f]{7,}/ { print $1 }' coverage-data.txt | sort -u) | |
| ( | |
| for commit in $commit_list | |
| do | |
| git log --no-decorate --pretty=format:'%an %h: %s' -1 $commit | |
| echo | |
| done | |
| ) | sort | |
| rm coverage-data.txt |