diff -r 6d3c3db11e72 -r eab8a264a833 dbrtools/dbr/dbrbaseline.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dbrtools/dbr/dbrbaseline.py Wed Mar 03 17:22:06 2010 +0000 @@ -0,0 +1,122 @@ +# Copyright (c) 2009 Symbian Foundation Ltd +# This component and the accompanying materials are made available +# under the terms of the License "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Symbian Foundation Ltd - initial contribution. +# +# Contributors: +# mattd +# +# Description: +# DBRbaseline - module for handling vanilla baselines +# + + +import re +import os +import string +from os.path import join, isfile, stat +from stat import * +import dbrutils + + + +def readdb(dbfile): + db = dict() + if(isfile(dbfile)): + file = open(dbfile,'r') +# regex = re.compile('(\S+)\s+(\S+)\s+(\S+)\s+(.+)\n') + for line in file: + #file structure 'timestamp size hash filename' avoids the problems of spaces in names, etc... + results = re.split(':|\n',line) + if(len(results) > 3): + entry = dict() + entry['time'] = results[0] + entry['size'] = results[1] + entry['md5'] = results[2] + if(results[4]): + entry['archive'] = results[4] + print entry['archive'] + db[results[3]] = entry +# db[results[3]] = [results[0],results[1],results[2]] +# bits = regex.match(line) +# if(bits): +# db[bits.group(3)] = [bits.group(0), bits.group(1), bits.group(2)] + file.close() + return db + +def writedb(db, dbfile): +# print 'Writing db to', dbfile + file = open(dbfile,'w') + for filename in sorted(db): + if (len(db[filename]) < 3): + db[filename].append('') + str = "%s:%s:%s:%s" %( db[filename]['time'],db[filename]['size'],db[filename]['md5'], filename) + if('archive' in db[filename]): + str = "%s:%s" %(str,db[filename]['archive']) +# if(db[filename]['md5'] == 'xxx'): +# print 'Warning: no MD5 for %s' % filename +# str = "%s:%s:%s:%s\n" %( db[filename][0],db[filename][1],db[filename][2], filename) + file.write('%s\n' % str) + file.close() + +def md5test(db, md5testset): + changed = set() + md5s = dbrutils.generateMD5s(md5testset) + for file in md5testset: + if(db[file]['md5'] != md5s[file]['md5']): + changed.add(file) + return changed + + +def updatedb(db1, db2): + compareupdatedb(db1, db2, 1) + +def comparedb(db1, db2): + compareupdatedb(db1, db2, 0) + +def compareupdatedb(db1, db2, update): + print "compareupdatedb() is deprecated" + db1files = set(db1.keys()) + db2files = set(db2.keys()) + removed = db1files - db2files + added = db2files - db1files + common = db1files & db2files + + touched = set() + for file in common: + if(db1[file]['time'] != db2[file]['time']): + touched.add(file) + + sizechanged = set() + for file in common: + if(db1[file]['size'] != db2[file]['size']): + sizechanged.add(file) + + #pobably won't bother with size changed... we know they're different... +# md5testset = touched - sizechanged + md5testset = touched + + changed = md5test(db1,md5testset) + + #remove the ones we know are changed + touched = touched - changed + + print 'Comparing dbs/n' + for file in sorted(added): + print 'added:', file + for file in sorted(removed): + print 'removed:', file + for file in sorted(touched): + print 'touched:', file + for file in sorted(changed): + print 'changed:', file + + #update the touched... + if(update): + for file in sorted(touched): + print 'Updating timestamp for: ',file + db1[file]['time'] = db2[file]['time']