aboutsummaryrefslogtreecommitdiff
path: root/contrib/cov-blame
blob: 601f211952dac2bfd835c7a1edcab6824449e4dd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/usr/bin/python

import os
import re
import subprocess
import sys

def handle_file(source_fname, cov_fname):
   
   lines_blm = subprocess.Popen(["git", "blame", source_fname], stdout=subprocess.PIPE).stdout.readlines()
   lines_cov = open(cov_fname).readlines()

   # XXXX expensive!
   while re.match(r'\s*-:\s*0:', lines_cov[0]):
      del lines_cov[0]

   if len(lines_blm) != len(lines_cov):
      print >>sys.stderr, "MISMATCH IN NUMBER OF LINES in",source_fname

   for b,c in zip(lines_blm, lines_cov):
      m = re.match(r'\s*([^\s:]+):', c)
      if not m:
         print >>sys.stderr, "CONFUSING LINE %r"% c
         cov = 'X'
      elif m.group(1) == '-':
         cov = '-'
      elif m.group(1)[0] == '#':
         cov = '#'
      elif m.group(1)[0].isdigit():
         cov = '1'
      else:
         print >>sys.stderr, "CONFUSING LINE %r"% c
         cov = 'X'

      print cov, b,

COV_DIR = sys.argv[1]
SOURCES = sys.argv[2:]

for fn in SOURCES:
   _, base = os.path.split(fn)
   cfn = os.path.join(COV_DIR, base)
   cfn += ".gcov"
   if os.path.exists(cfn):
      handle_file(fn, cfn)
   else:
      print >>sys.stderr, "NO FILE EXISTS CALLED ",cfn