#!/usr/bin/python -O # # Copyright 2005 Sven Wegener # Distributed under the terms of the GNU General Public License v2 # # $Id: checkstablemarkings 187 2005-07-13 01:13:04Z sven $ # # 28 days in ~arch is enough TIME_TO_STABLE = 60 * 60 * 24 * 28 DBFILE = "./checkstablemarkings.anydbm" import portage, anydbm, cPickle, time, sys dbapi = portage.db["/"]["porttree"].dbapi archlist = portage.grabfile(portage.settings["PORTDIR"] + "/profiles/arch.list") newtime = time.time() # use --init to force database initialization initdb = "--init" in sys.argv or "-i" in sys.argv # use --verbose to print the stable time for every ebuild verbose = "--verbose" in sys.argv or "-v" in sys.argv # create/open our database try: if initdb: kwdb = anydbm.open(DBFILE, "n", 0600) else: kwdb = anydbm.open(DBFILE, "c", 0600) except anydbm.error: print "Failed to create/open our database" sys.exit(1) # loop over every package for cp in dbapi.cp_all(): newpackage = {} # load old package entry from database try: oldpackage = cPickle.loads(kwdb[cp]) except KeyError: oldpackage = {} # load KEYWORDS for all ebuilds from portage kwdict = dict([[cpv, dbapi.aux_get(cpv, ["KEYWORDS"])[0].split()] for cpv in dbapi.cp_list(cp)]) # loop over every arch/keyword for arch in archlist: newpackage[arch] = {} newpackage["~" + arch] = {} # get list of arch and ~arch ebuilds stable = [cpv for cpv, keywords in kwdict.iteritems() if arch in keywords] unstable = [cpv for cpv, keywords in kwdict.iteritems() if "~" + arch in keywords] # loop over every arch ebuild for cpv in stable: if oldpackage.has_key(arch) and oldpackage[arch].has_key(cpv): # already stable on last run, good newpackage[arch][cpv] = oldpackage[arch][cpv] elif oldpackage.has_key("~" + arch) and oldpackage["~" + arch].has_key(cpv): # keyworded ~arch on last run, check time oldtime = oldpackage["~" + arch][cpv] if oldtime > newtime - TIME_TO_STABLE or verbose: print "%s stable for %s after %.2f days" % (cpv, arch, (newtime - oldtime) / (60 * 60 * 24)) newpackage[arch][cpv] = oldtime else: # directly to stable, very bad, but on db initialization this happens if initdb: # initdb, backdate newpackage[arch][cpv] = newtime - TIME_TO_STABLE else: print "%s directly to stable for %s" % (cpv, arch) newpackage[arch][cpv] = newtime # loop over every ~arch ebuild for cpv in unstable: if oldpackage.has_key("~" + arch) and oldpackage["~" + arch].has_key(cpv): # keyworded ~arch on last run, good newpackage["~" + arch][cpv] = oldpackage["~" + arch][cpv] elif initdb: # initdb, backdate newpackage["~" + arch][cpv] = newtime - TIME_TO_STABLE else: # fresh ebuild in ~arch newpackage["~" + arch][cpv] = newtime # make the database more compact for keyword in newpackage.keys(): if len(newpackage[keyword]) == 0: del newpackage[keyword] # save package entry kwdb[cp] = cPickle.dumps(newpackage, cPickle.HIGHEST_PROTOCOL) # close database kwdb.close()