]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/blob - misc/figleaf2el.py
c32f3782e3fb59648f47e99618453cf68ee15bbb
[tahoe-lafs/tahoe-lafs.git] / misc / figleaf2el.py
1 #! /usr/bin/python
2
3 import os, sys, pickle
4
5 def longest_common_prefix(elements):
6     if not elements:
7         return ""
8     prefix = elements[0]
9     for e in elements:
10         prefix = longest_common_prefix_2(prefix, e)
11     return prefix
12 def longest_common_prefix_2(a, b):
13     maxlen = min(len(a), len(b))
14     for i in range(maxlen, 0, -1):
15         if a[:i] == b[:i]:
16             return a[:i]
17     return ""
18
19 ## def write_el(r2):
20 ##     filenames = sorted(r2.keys())
21 ##     out = open(".figleaf.el", "w")
22 ##     out.write("(setq figleaf-results '(\n")
23 ##     for f in filenames:
24 ##         linenumbers = r2[f]
25 ##         out.write(' ("%s" (%s))\n' % (f, " ".join([str(ln)
26 ##                                                    for ln in linenumbers])))
27 ##     out.write(" ))\n")
28 ##     out.close()
29
30 def write_el(r2, source):
31     filenames = sorted(r2.keys())
32     out = open(".figleaf.el", "w")
33     out.write("""
34 ;; This is an elisp-readable form of the figleaf coverage data. It defines a
35 ;; single top-level hash table in which the load-path-relative filename (like
36 ;; allmydata/download.py) is the key, and the value is a three-element list.
37 ;; The first element of this list is a list of line numbers that represent
38 ;; actual code. The second is a list of line numbers for lines which got used
39 ;; during the unit test. The third is a list of line numbers for code lines
40 ;; that were not covered (since 'code' and 'covered' start as sets, this last
41 ;; list is equal to 'code - covered').
42
43 """)
44     out.write("(let ((results (make-hash-table :test 'equal)))\n")
45     for f in filenames:
46         covered_linenumbers = r2[f]
47         code_linenumbers = source[f]
48         uncovered_code = code_linenumbers - covered_linenumbers
49         out.write(" (puthash \"%s\" '((%s) (%s) (%s)) results)\n"
50                   % (f,
51                      " ".join([str(ln) for ln in sorted(code_linenumbers)]),
52                      " ".join([str(ln) for ln in sorted(covered_linenumbers)]),
53                      " ".join([str(ln) for ln in sorted(uncovered_code)]),
54                      ))
55     out.write(" results)\n")
56     out.close()
57
58 #import figleaf
59 from allmydata.util import figleaf
60
61 def examine_source(filename):
62     f = open(filename, "r")
63     lines = figleaf.get_lines(f)
64     f.close()
65     return lines
66
67 def main():
68     results = pickle.load(open(sys.argv[1], "rb"))
69     import_prefix = os.path.abspath(sys.argv[2])
70     if not import_prefix.endswith("/"):
71         import_prefix = import_prefix + "/"
72     plen = len(import_prefix)
73
74     r2 = {}
75     source = {}
76     filenames = sorted(results.keys())
77     here = os.getcwd()
78     for f in filenames:
79         if f.startswith(import_prefix):
80             short = f[plen:]
81             r2[short] = results[f]
82             source[short] = examine_source(f)
83     write_el(r2, source)
84
85 if __name__ == '__main__':
86     main()
87
88