#!/usr/bin/python -O # Copyright 1999-2006 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Id$ import os,sys os.environ["FEATURES"]="mirror cvs" try: import portage except ImportError: from os import path as osp sys.path.insert(0, osp.join(osp.dirname(osp.dirname(osp.realpath(__file__))), "pym")) import portage import portage.util def cstrip(mystr,mychars): newstr = "" for x in mystr: if x not in mychars: newstr += x return newstr md5_list = {} bn_list = [] col_list = [] hugelist = [] for mycp in portage.db["/"]["porttree"].dbapi.cp_all(): hugelist += portage.db["/"]["porttree"].dbapi.cp_list(mycp) hugelist.sort() for mycpv in hugelist: pv = mycpv.split("/")[-1] newuri = portage.db["/"]["porttree"].dbapi.aux_get(mycpv,["SRC_URI"])[0] newuri = newuri.split() digestpath = portage.db["/"]["porttree"].dbapi.findname(mycpv) digestpath = os.path.dirname(digestpath)+"/files/digest-"+pv md5sums = portage.digestParseFile(digestpath) if md5sums == None: portage.writemsg("Missing digest: %s\n" % mycpv) md5sums = {} for x in md5sums.keys(): if x[0] == '/': del md5sums[x] #portage.writemsg("\n\ndigestpath: %s\n" % digestpath) #portage.writemsg("md5sums: %s\n" % md5sums) #portage.writemsg("newuri: %s\n" % newuri) bn_list = [] for x in newuri: if not x: continue if (x in [")","(",":","||"]) or (x[-1] == "?"): # ignore it. :) continue x = cstrip(x,"()|?") if not x: continue mybn = os.path.basename(x) if mybn not in bn_list: bn_list += [mybn] else: continue if mybn not in md5sums: portage.util.writemsg("Missing md5sum: %s in %s\n" % (mybn, mycpv)) else: if mybn in md5_list: if (md5_list[mybn]["MD5"] != md5sums[mybn]["MD5"]) or \ (md5_list[mybn]["size"] != md5sums[mybn]["size"]): # This associates the md5 with each file. [md5/size] md5joins = md5_list[mybn][2].split(",") md5joins = (" ["+md5_list[mybn][0]+"/"+md5_list[mybn][1]+"],").join(md5joins) md5joins += " ["+md5_list[mybn][0]+"/"+md5_list[mybn][1]+"]" portage.writemsg("Colliding md5: %s of %s [%s/%s] and %s\n" % (mybn,mycpv,md5sums[mybn][0],md5sums[mybn][1],md5joins)) col_list += [mybn] else: md5_list[mybn][2] += ","+mycpv else: md5_list[mybn] = md5sums[mybn]+[mycpv] del md5sums[mybn] #portage.writemsg(str(bn_list)+"\n") for x in md5sums: if x not in bn_list: portage.writemsg("Extra md5sum: %s in %s\n" % (x, mycpv)) print col_list print print str(len(md5_list))+" unique distfile md5s." print str(len(bn_list))+" unique distfile names."