#! /usr/bin/env python

import os, sys, pickle

def longest_common_prefix(elements):
    if not elements:
        return ""
    prefix = elements[0]
    for e in elements:
        prefix = longest_common_prefix_2(prefix, e)
    return prefix
def longest_common_prefix_2(a, b):
    maxlen = min(len(a), len(b))
    for i in range(maxlen, 0, -1):
        if a[:i] == b[:i]:
            return a[:i]
    return ""

## def write_el(r2):
##     filenames = sorted(r2.keys())
##     out = open(".figleaf.el", "w")
##     out.write("(setq figleaf-results '(\n")
##     for f in filenames:
##         linenumbers = r2[f]
##         out.write(' ("%s" (%s))\n' % (f, " ".join([str(ln)
##                                                    for ln in linenumbers])))
##     out.write(" ))\n")
##     out.close()

def write_el(r2, source):
    filenames = sorted(r2.keys())
    out = open(".figleaf.el", "w")
    out.write("""
;; This is an elisp-readable form of the figleaf coverage data. It defines a
;; single top-level hash table in which the load-path-relative filename (like
;; allmydata/download.py) is the key, and the value is a three-element list.
;; The first element of this list is a list of line numbers that represent
;; actual code. The second is a list of line numbers for lines which got used
;; during the unit test. The third is a list of line numbers for code lines
;; that were not covered (since 'code' and 'covered' start as sets, this last
;; list is equal to 'code - covered').

""")
    out.write("(let ((results (make-hash-table :test 'equal)))\n")
    for f in filenames:
        covered_linenumbers = r2[f]
        code_linenumbers = source[f]
        uncovered_code = code_linenumbers - covered_linenumbers
        out.write(" (puthash \"%s\" '((%s) (%s) (%s)) results)\n"
                  % (f,
                     " ".join([str(ln) for ln in sorted(code_linenumbers)]),
                     " ".join([str(ln) for ln in sorted(covered_linenumbers)]),
                     " ".join([str(ln) for ln in sorted(uncovered_code)]),
                     ))
    out.write(" results)\n")
    out.close()

#import figleaf
from allmydata.util import figleaf

def examine_source(filename):
    f = open(filename, "r")
    lines = figleaf.get_lines(f)
    f.close()
    return lines

def main():
    results = pickle.load(open(sys.argv[1], "rb"))
    import_prefix = os.path.abspath(sys.argv[2])
    if not import_prefix.endswith("/"):
        import_prefix = import_prefix + "/"
    plen = len(import_prefix)

    r2 = {}
    source = {}
    filenames = sorted(results.keys())
    here = os.getcwd()
    for f in filenames:
        if f.startswith(import_prefix):
            short = f[plen:]
            r2[short] = results[f]
            source[short] = examine_source(f)
    write_el(r2, source)

if __name__ == '__main__':
    main()