Changed script to use CSV formatted input, rather than TSV.
This means that the script can directly process the CSV downloaded from Bugzilla, without any need to use Excel to convert it.
# 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 <mattd@symbian.org>
#
# 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']