|
1 # compare_baselines.py takes two lists of baselines produced by find_public_apis.pl |
|
2 # and compares them for added, removed and moved headers as well as api class change |
|
3 # |
|
4 # outputs report as csv |
|
5 # |
|
6 # usage: python compare_baselines.py <baseline1> <baseline2> |
|
7 |
|
8 import sys |
|
9 |
|
10 # parse a baseline file produced by find_public_apis.pl into a map |
|
11 def parse_baseline(filename): |
|
12 file = open(filename) |
|
13 count = 0 |
|
14 db = {} |
|
15 |
|
16 for line in file: |
|
17 if count > 0: |
|
18 tokens = line.split() |
|
19 pathname = tokens[0].strip().lower() # watch out for lowecasing here! |
|
20 apiclass = tokens[1].strip() |
|
21 apiclassreason = tokens[2].strip() |
|
22 |
|
23 dbentry = {'pathname': pathname, 'class': apiclass, 'reason': apiclassreason, 'duplicate':''} |
|
24 |
|
25 filename = strip_path(pathname) |
|
26 |
|
27 if db.has_key(filename): |
|
28 db[filename]['duplicate'] = pathname |
|
29 # print >> sys.stderr, 'duplicate filename at paths %s and %s' % (pathname, db[filename]['pathname']) |
|
30 else: |
|
31 db[filename] = dbentry |
|
32 |
|
33 count = count + 1 |
|
34 |
|
35 return db |
|
36 |
|
37 # strip pathnames from filenames |
|
38 def strip_path(pathname): |
|
39 while pathname.find('/') != -1: |
|
40 x=pathname.find('/') |
|
41 pathname = pathname[x+1:] |
|
42 |
|
43 return pathname.lower() |
|
44 |
|
45 def compare_dbs(db1, db2): |
|
46 print 'apiname,status,classchange,class1,class2,pathname1,pathname2,duplicate1,duplicate2' |
|
47 |
|
48 for key in db1.keys(): |
|
49 db1entry = db1[key] |
|
50 status = 'ok' |
|
51 if db2.has_key(key): |
|
52 db2entry = db2[key] |
|
53 |
|
54 # filename exists, does path match? |
|
55 if db1entry['pathname'] != db2entry['pathname']: |
|
56 status = 'moved' |
|
57 |
|
58 # does class match? |
|
59 if db1entry['class'] != db2entry['class']: |
|
60 classchange = 'yes' |
|
61 else: |
|
62 classchange = 'no' |
|
63 |
|
64 print '%s,%s,%s,%s,%s,%s,%s,%s,%s' % (key, status, classchange,db1entry['class'],db2entry['class'],db1entry['pathname'], db2entry['pathname'],db1entry['duplicate'],db2entry['duplicate']) |
|
65 else: |
|
66 status = 'removed' |
|
67 print '%s,%s,%s,%s,%s,%s,%s,%s,%s' % (key, status, 'no',db1entry['class'],'',db1entry['pathname'], '',db1entry['duplicate'],'') |
|
68 |
|
69 |
|
70 for key in db2.keys(): |
|
71 if not db1.has_key(key): |
|
72 db2entry = db2[key] |
|
73 status = 'added' |
|
74 print '%s,%s,%s,%s,%s,%s,%s,%s,%s' % (key, status, 'no','',db2entry['class'],'',db2entry['pathname'], '',db2entry['duplicate']) |
|
75 |
|
76 |
|
77 # handle duplicates |
|
78 |
|
79 |
|
80 |
|
81 # read the list of published filenames |
|
82 bl1name = sys.argv[1] |
|
83 bl2name = sys.argv[2] |
|
84 |
|
85 db1 = parse_baseline(bl1name) |
|
86 db2 = parse_baseline(bl2name) |
|
87 |
|
88 compare_dbs(db1, db2) |