Sync with 'maint'
[git/gitster.git] / contrib / coverage-diff.sh
blob6ce9603568ef7d4b41d7eed9247e8512a2f45a74
1 #!/bin/sh
3 # Usage: Run 'contrib/coverage-diff.sh <version1> <version2>' from source-root
4 # after running
6 # make coverage-test
7 # make coverage-report
9 # while checked out at <version2>. This script combines the *.gcov files
10 # generated by the 'make' commands above with 'git diff <version1> <version2>'
11 # to report new lines that are not covered by the test suite.
13 V1=$1
14 V2=$2
16 diff_lines () {
17 perl -e '
18 my $line_num;
19 while (<>) {
20 # Hunk header? Grab the beginning in postimage.
21 if (/^@@ -\d+(?:,\d+)? \+(\d+)(?:,\d+)? @@/) {
22 $line_num = $1;
23 next;
26 # Have we seen a hunk? Ignore "diff --git" etc.
27 next unless defined $line_num;
29 # Deleted line? Ignore.
30 if (/^-/) {
31 next;
34 # Show only the line number of added lines.
35 if (/^\+/) {
36 print "$line_num\n";
38 # Either common context or added line appear in
39 # the postimage. Count it.
40 $line_num++;
45 files=$(git diff --name-only "$V1" "$V2" -- \*.c)
47 # create empty file
48 >coverage-data.txt
50 for file in $files
52 git diff "$V1" "$V2" -- "$file" |
53 diff_lines |
54 sort >new_lines.txt
56 if ! test -s new_lines.txt
57 then
58 continue
61 hash_file=$(echo $file | sed "s/\//\#/")
63 if ! test -s "$hash_file.gcov"
64 then
65 continue
68 sed -ne '/#####:/{
69 s/ #####://
70 s/:.*//
71 s/ //g
73 }' "$hash_file.gcov" |
74 sort >uncovered_lines.txt
76 comm -12 uncovered_lines.txt new_lines.txt |
77 sed -e 's/$/\)/' -e 's/^/ /' >uncovered_new_lines.txt
79 grep -q '[^[:space:]]' <uncovered_new_lines.txt &&
80 echo $file >>coverage-data.txt &&
81 git blame -s "$V2" -- "$file" |
82 sed 's/\t//g' |
83 grep -f uncovered_new_lines.txt >>coverage-data.txt &&
84 echo >>coverage-data.txt
86 rm -f new_lines.txt uncovered_lines.txt uncovered_new_lines.txt
87 done
89 cat coverage-data.txt
91 echo "Commits introducing uncovered code:"
93 commit_list=$(awk '/^[0-9a-f]{7,}/ { print $1 }' coverage-data.txt | sort -u)
96 for commit in $commit_list
98 git log --no-decorate --pretty=format:'%an %h: %s' -1 $commit
99 echo
100 done
101 ) | sort
103 rm coverage-data.txt