scripts/python/compare_baselines/compare_baselines.py
changeset 13 32a0da1099d8
equal deleted inserted replaced
12:d2f4d301e581 13:32a0da1099d8
       
     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)