]>
Commit | Line | Data |
---|---|---|
783faedd DS |
1 | #!/bin/sh |
2 | ||
3 | # Usage: Run 'contrib/coverage-diff.sh <version1> <version2>' from source-root | |
4 | # after running | |
5 | # | |
6 | # make coverage-test | |
7 | # make coverage-report | |
8 | # | |
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. | |
12 | ||
13 | V1=$1 | |
14 | V2=$2 | |
15 | ||
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; | |
24 | } | |
25 | ||
26 | # Have we seen a hunk? Ignore "diff --git" etc. | |
27 | next unless defined $line_num; | |
28 | ||
29 | # Deleted line? Ignore. | |
30 | if (/^-/) { | |
31 | next; | |
32 | } | |
33 | ||
34 | # Show only the line number of added lines. | |
35 | if (/^\+/) { | |
36 | print "$line_num\n"; | |
37 | } | |
38 | # Either common context or added line appear in | |
39 | # the postimage. Count it. | |
40 | $line_num++; | |
41 | } | |
42 | ' | |
43 | } | |
44 | ||
45 | files=$(git diff --name-only "$V1" "$V2" -- \*.c) | |
46 | ||
47 | # create empty file | |
48 | >coverage-data.txt | |
49 | ||
50 | for file in $files | |
51 | do | |
52 | git diff "$V1" "$V2" -- "$file" | | |
53 | diff_lines | | |
54 | sort >new_lines.txt | |
55 | ||
56 | if ! test -s new_lines.txt | |
57 | then | |
58 | continue | |
59 | fi | |
60 | ||
61 | hash_file=$(echo $file | sed "s/\//\#/") | |
62 | ||
63 | if ! test -s "$hash_file.gcov" | |
64 | then | |
65 | continue | |
66 | fi | |
67 | ||
68 | sed -ne '/#####:/{ | |
69 | s/ #####:// | |
70 | s/:.*// | |
71 | s/ //g | |
72 | p | |
73 | }' "$hash_file.gcov" | | |
74 | sort >uncovered_lines.txt | |
75 | ||
76 | comm -12 uncovered_lines.txt new_lines.txt | | |
f70bc702 | 77 | sed -e 's/$/\)/' -e 's/^/ /' >uncovered_new_lines.txt |
783faedd DS |
78 | |
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 | |
85 | ||
86 | rm -f new_lines.txt uncovered_lines.txt uncovered_new_lines.txt | |
87 | done | |
88 | ||
89 | cat coverage-data.txt | |
90 | ||
91 | echo "Commits introducing uncovered code:" | |
92 | ||
f70bc702 | 93 | commit_list=$(awk '/^[0-9a-f]{7,}/ { print $1 }' coverage-data.txt | sort -u) |
783faedd DS |
94 | |
95 | ( | |
96 | for commit in $commit_list | |
97 | do | |
98 | git log --no-decorate --pretty=format:'%an %h: %s' -1 $commit | |
99 | echo | |
100 | done | |
101 | ) | sort | |
102 | ||
103 | rm coverage-data.txt |