Commit | Line | Data |
---|---|---|
1a00f590 RK |
1 | #! /usr/bin/env python |
2 | # | |
3 | # This file is part of DisOrder. | |
4 | # Copyright (C) 2007 Richard Kettlewell | |
5 | # | |
6 | # This program is free software; you can redistribute it and/or modify | |
7 | # it under the terms of the GNU General Public License as published by | |
8 | # the Free Software Foundation; either version 2 of the License, or | |
9 | # (at your option) any later version. | |
10 | # | |
11 | # This program is distributed in the hope that it will be useful, but | |
12 | # WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 | # General Public License for more details. | |
15 | # | |
16 | # You should have received a copy of the GNU General Public License | |
17 | # along with this program; if not, write to the Free Software | |
18 | # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 | |
19 | # USA | |
20 | # | |
21 | import re,sys,os,string | |
22 | ||
23 | def fatal(msg): | |
24 | sys.stderr.write("%s\n" % msg) | |
25 | sys.exit(1) | |
26 | ||
27 | def sgmlquotechar(c): | |
28 | if c == '&' or c == '<' or ord(c) < 32 or ord(c) > 126: | |
29 | return "&#%d;" % ord(c) | |
30 | else: | |
31 | return c | |
32 | ||
33 | def sgmlquote(s): | |
34 | return string.join(map(sgmlquotechar, s),'') | |
35 | ||
36 | percent = {} | |
37 | total_lines = 0 | |
38 | covered_lines = 0 | |
39 | args = sys.argv[1:] | |
40 | htmldir = None | |
41 | while len(args) > 0: | |
42 | if args[0] == "--html": | |
43 | htmldir = args[1] | |
44 | args = args[2:] | |
45 | else: | |
46 | fatal("unknown option '%s'" % args[0]) | |
47 | ||
48 | name = None | |
49 | for line in sys.stdin: | |
50 | line = line[:-1] | |
51 | r = re.match("File ['`](?:.*/)?([^/]+.c)'", line) | |
52 | if r: | |
53 | name = r.group(1) | |
54 | r = re.match("Lines executed:([0-9\\.]+)% of ([0-9]+)", line) | |
55 | if r: | |
56 | if name: | |
57 | this_pc = float(r.group(1)) | |
58 | this_lines = int(r.group(2)) | |
59 | percent[name] = this_pc | |
60 | total_lines += this_lines | |
61 | covered_lines += this_lines * this_pc / 100.0 | |
62 | name = None | |
63 | ||
64 | def cmp(a,b): | |
65 | if percent[a] < percent[b]: return -1 | |
66 | elif percent[a] > percent[b]: return 1 | |
67 | else: return 0 | |
68 | ||
69 | keys = percent.keys() | |
70 | keys.sort(cmp) | |
71 | ||
72 | if len(keys): | |
73 | for k in keys: | |
74 | print "%20s: %d%%" % (k, percent[k]) | |
75 | print "Total coverage: %d%%" % (100 * (covered_lines / total_lines)) | |
76 | ||
77 | if htmldir is not None and len(keys): | |
78 | index = open(os.path.join(htmldir, "index.html"), "w") | |
79 | index.write("<html><head><title>gcov report</title>\n") | |
80 | index.write("<body><h1>gcov report</h1>\n") | |
81 | index.write("<table><tr><th>File</th><th>Coverage</th></tr>\n") | |
82 | for k in keys: | |
83 | index.write("<tr><td><a href=\"%s.html\">%s</a><td>%d%%\n" % | |
84 | (sgmlquote(k), sgmlquote(k), percent[k])) | |
85 | index.write("</table>\n") | |
86 | index.write("<p>Total coverage: %d%%</p>\n" % (100 * (covered_lines / total_lines))) | |
87 | for k in keys: | |
88 | html = open(os.path.join(htmldir, "%s.html" % k), "w") | |
89 | html.write("<html><head><title>%s</title>\n" % sgmlquote(k)) | |
90 | html.write("<body><h1>%s</h1>\n" % sgmlquote(k)) | |
91 | html.write("<pre>") | |
92 | r = re.compile("^ *#####:.*") | |
93 | for line in open("%s.gcov" % k, "r"): | |
94 | if len(line) > 0 and line[-1] == '\n': | |
95 | line = line[:-1] | |
96 | if r.match(line): | |
97 | html.write("<span style='background-color:#ffff00'>%s</span>\n" % sgmlquote(line)) | |
98 | else: | |
99 | html.write("%s\n" % sgmlquote(line)) | |
100 | html.write("</pre>\n") |