Add delete_builds.pl - a utility for making space quickly on build machines
This Perl script deletes some directories known to contain very large files first, before
deleting the rest of the build which contains millions of small files. Given multiple
builds, it will do this breadth first, so that lost of space is released quickly.
# 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']