 f70bc702e5
			
		
	
	f70bc702e5
	
	
	
		
			
			Merge multiple sed and "grep | awk" invocations, finally use "sort -u" instead of "sort | uniq". Signed-off-by: Beat Bolli <dev+git@drbeat.li> Acked-by: Taylor Blau <me@ttaylorr.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
		
			
				
	
	
		
			104 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			2.0 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/$/\)/' -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
 |