You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
2.0 KiB
108 lines
2.0 KiB
#!/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/$/\)/' | |
|
sed -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=$(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
|
|
|