dbrtools/dbr/dbrbaseline.py
author Simon Howkins <simonh@symbian.org>
Thu, 13 May 2010 16:27:37 +0100
changeset 267 2251fde91223
parent 179 eab8a264a833
child 200 12422144aae1
permissions -rw-r--r--
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']