2006-12-08 17:32:21 +00:00
|
|
|
class symbols(dict):
|
2006-05-26 12:06:07 +00:00
|
|
|
def __init__(self, filename = None):
|
2006-12-08 17:32:21 +00:00
|
|
|
self.modules = {}
|
2006-05-26 12:06:07 +00:00
|
|
|
if filename is not None:
|
|
|
|
self.read(file(filename))
|
|
|
|
|
|
|
|
def cmp(self, new):
|
2006-12-08 17:32:21 +00:00
|
|
|
symbols_ref = set(self.keys())
|
|
|
|
symbols_new = set(new.keys())
|
2006-05-26 12:06:07 +00:00
|
|
|
|
|
|
|
symbols_add = {}
|
|
|
|
symbols_remove = {}
|
|
|
|
|
|
|
|
symbols_change = {}
|
|
|
|
|
|
|
|
for symbol in symbols_new - symbols_ref:
|
2006-12-08 17:32:21 +00:00
|
|
|
symbols_add[symbol] = new[symbol]
|
2006-05-26 12:06:07 +00:00
|
|
|
|
|
|
|
for symbol in symbols_ref.intersection(symbols_new):
|
2006-12-08 17:32:21 +00:00
|
|
|
symbol_ref = self[symbol]
|
|
|
|
symbol_new = new[symbol]
|
|
|
|
|
|
|
|
ent = {'ref': symbol_ref, 'new': symbol_new, 'changes': {}}
|
|
|
|
for i in ('module', 'version', 'export'):
|
|
|
|
if symbol_ref[i] != symbol_new[i]:
|
|
|
|
ent['changes'][i] = {'ref': symbol_ref, 'new': symbol_new}
|
|
|
|
if ent['changes']:
|
2006-05-26 12:06:07 +00:00
|
|
|
symbols_change[symbol] = ent
|
|
|
|
|
|
|
|
for symbol in symbols_ref - symbols_new:
|
2006-12-08 17:32:21 +00:00
|
|
|
symbols_remove[symbol] = self[symbol]
|
2006-05-26 12:06:07 +00:00
|
|
|
|
|
|
|
return symbols_add, symbols_change, symbols_remove
|
|
|
|
|
|
|
|
def read(self, file):
|
|
|
|
for line in file.readlines():
|
2006-08-29 15:23:09 +00:00
|
|
|
version, symbol, module, export = line.strip().split()
|
2006-05-26 12:06:07 +00:00
|
|
|
|
2006-12-08 17:32:21 +00:00
|
|
|
if self.has_key(symbol):
|
2006-05-26 12:06:07 +00:00
|
|
|
pass
|
2006-12-08 17:32:21 +00:00
|
|
|
symbols = self.modules.get(module, set())
|
|
|
|
symbols.add(symbol)
|
|
|
|
self.modules[module] = symbols
|
|
|
|
self[symbol] = {'symbol': symbol, 'module': module, 'version': version, 'export': export}
|
2006-05-26 12:06:07 +00:00
|
|
|
|
|
|
|
def write(self, file):
|
2006-12-08 17:32:21 +00:00
|
|
|
symbols = self.items()
|
2006-05-26 12:06:07 +00:00
|
|
|
symbols.sort()
|
2006-12-08 17:32:21 +00:00
|
|
|
for symbol, info in symbols:
|
|
|
|
file.write("%(version)s %(symbol)s %(module)s %(export)s\n" % info)
|
2006-05-26 12:06:07 +00:00
|
|
|
|