mirror of
https://github.com/git/git
synced 2024-10-30 14:03:28 +00:00
109 lines
2 KiB
Bash
109 lines
2 KiB
Bash
|
#!/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
|