108 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
#!/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
 |