#!/usr/bin/env python # Fix testing # Copyright (C) 2000, 2001 James Troup # $Id: hack.6,v 1.1 2001-06-05 22:31:33 troup Exp $ # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ################################################################################ # 'Too afraid to touch; too afraid you'll like too much' ################################################################################ import pg, sys, os, string import utils, db_access import apt_inst, apt_pkg; ################################################################################ Cnf = None; projectB = None; ################################################################################ def main (): global Cnf, projectB, db_files, waste, excluded; apt_pkg.init(); Cnf = apt_pkg.newConfiguration(); apt_pkg.ReadConfigFileISC(Cnf,utils.which_conf_file()); Arguments = [('d',"debug","Christina::Options::Debug", "IntVal"), ('h',"help","Christina::Options::Help"), ('v',"version","Christina::Options::Version")]; apt_pkg.ParseCommandLine(Cnf,Arguments,sys.argv); projectB = pg.connect(Cnf["DB::Name"], Cnf["DB::Host"], int(Cnf["DB::Port"])); christina = pg.connect('christina', Cnf["DB::Host"], int(Cnf["DB::Port"])); db_access.init(Cnf, projectB); total = 0; found = 0; morgue = Cnf["Dir::Morgue"] + '/' + Cnf["Rhona::MorgueSubDir"]; xxx = utils.open_file ("xxx", 'r'); for line in xxx.readlines(): (package, version, arch) = string.split(line); eversion = utils.re_no_epoch.sub('', version); total = total + 1; if arch != "source": #filename = "%s/%s_%s_%s.deb" % (morgue, package, eversion, arch); filename = "%s/%s_%s.deb" % (morgue, package, eversion); else: continue if os.access(filename, os.R_OK) == 0: continue; control = apt_pkg.ParseSection(apt_inst.debExtractControl(utils.open_file(filename,"r"))); deb_arch = control.Find("Architecture"); if arch != deb_arch: continue; arch_id = db_access.get_architecture_id (arch); q = christina.query("SELECT f.*, l.path, b.* FROM binaries b, files f, location l WHERE b.package = '%s' AND b.architecture = %s AND b.version = '%s' AND b.file = f.id AND l.id = f.location" % (package, arch_id, version)); ql = q.getresult(); if len(ql) != 1: print "YOU LOSE: "+package+"~"+version+"~"+arch+"~"+repr(ql) continue; ql = ql[0]; x = projectB.query("SELECT * FROM source WHERE id = %s" % (ql[11])); xl = x.getresult(); if len(xl) != 1: old_filename = filename; z = christina.query("SELECT f.*, l.path, s.*, df.* FROM source s, files f, location l, dsc_files df WHERE s.id = %s AND df.source = s.id AND df.file = f.id AND l.id = f.location" % (ql[11])); zl = z.getresult(); if len(zl) < 1: print old_filename print repr(ql); print "SELECT f.*, l.path, s.*, df.* FROM source s, files f, location l, dsc_files df WHERE s.id = %s AND df.source = s.id AND df.file = f.id AND l.id = f.location" % (ql[11]); print " ==> "+repr(zl); #sys.exit(3); else: projectB.query("BEGIN WORK"); gack = []; for i in zl: new_filename = i[6] + i[1]; filename = morgue + '/' + os.path.basename(new_filename); if os.access(filename, os.R_OK): print filename + " -> " + new_filename; if os.path.exists(new_filename): sys.exit(3); #utils.move(filename, new_filename); print "INSERT INTO files (id, filename, size, md5sum, location) VALUES (%s, '%s', %s, '%s', %s)" % (i[:5]); #projectB.query("INSERT INTO files (id, filename, size, md5sum, location) VALUES (%s, '%s', %s, '%s', %s)" % (i[:5])); gack.append("INSERT INTO dsc_files (id, source, file) VALUES (%s, %s, %s)" % (i[12:])); if new_filename[-4:] == ".dsc": print "INSERT INTO source (id, source, version, maintainer, file) VALUES (%s, '%s', '%s', %s, %s)" % (i[7:12]); #projectB.query("INSERT INTO source (id, source, version, maintainer, file) VALUES (%s, '%s', '%s', %s, %s)" % (i[7:12])); for i in gack: print i; #projectB.query(i); projectB.query("COMMIT WORK"); filename = old_filename; projectB.query("BEGIN WORK"); new_filename = ql[6] + ql[1]; print filename + " -> " + new_filename; if os.path.exists(new_filename): sys.exit(3); utils.move(filename, new_filename); print "INSERT INTO files (id, filename, size, md5sum, location) VALUES (%s, '%s', %s, '%s', %s)" % (ql[:5]); projectB.query("INSERT INTO files (id, filename, size, md5sum, location) VALUES (%s, '%s', %s, '%s', %s)" % (ql[:5])); if ql[11] == 0: print "INSERT INTO binaries (id, package, version, maintainer, architecture, file, type) VALUES (%s, '%s', '%s', %s, %s, %s, '%s')" % (ql[7], ql[8], ql[9], ql[10], ql[12], ql[13], ql[14]); projectB.query("INSERT INTO binaries (id, package, version, maintainer, architecture, file, type) VALUES (%s, '%s', '%s', %s, %s, %s, '%s')" % (ql[7], ql[8], ql[9], ql[10], ql[12], ql[13], ql[14])); else: print "INSERT INTO binaries (id, package, version, maintainer, source, architecture, file, type) VALUES (%s, '%s', '%s', %s, %s, %s, %s, '%s')" % (ql[7:]); projectB.query("INSERT INTO binaries (id, package, version, maintainer, source, architecture, file, type) VALUES (%s, '%s', '%s', %s, %s, %s, %s, '%s')" % (ql[7:])); print "INSERT INTO bin_associations (suite, bin) VALUES (%s, %s)" % (4, ql[7]); projectB.query("INSERT INTO bin_associations (suite, bin) VALUES (%s, %s)" % (4, ql[7])); projectB.query("COMMIT WORK"); ####################################################################################### if __name__ == '__main__': main() ####################################################################################### # xxx = utils.open_file ("xxx", 'r'); # for line in xxx.readlines(): # (package, version, arch) = string.split(line); # eversion = utils.re_no_epoch.sub('', version); # total = total + 1; # if arch == "source": # filename = "%s/%s_%s.dsc" % (morgue, package, eversion); # else: # continue # if os.access(filename, os.R_OK) == 0: # continue; # arch_id = db_access.get_architecture_id (arch); # q = christina.query("SELECT f.*, l.path, s.*, df.* FROM source s, files f, location l, dsc_files df WHERE s.source = '%s' AND s.version = '%s' AND df.source = s.id AND df.file = f.id AND l.id = f.location" % (package, version)); # ql = q.getresult(); # if len(ql) < 1: # print "YOU LOSE: "+package+"~"+version+"~"+arch+"~"+repr(ql) # continue; # projectB.query("BEGIN WORK"); # gack = []; # for i in ql: # new_filename = i[6] + i[1]; # filename = morgue + '/' + os.path.basename(new_filename); # if os.access(filename, os.R_OK) == 0: # continue; # print filename + " -> " + new_filename; # if os.path.exists(new_filename): # sys.exit(3); # utils.move(filename, new_filename); # print "INSERT INTO files (id, filename, size, md5sum, location) VALUES (%s, '%s', %s, '%s', %s)" % (i[:5]); # projectB.query("INSERT INTO files (id, filename, size, md5sum, location) VALUES (%s, '%s', %s, '%s', %s)" % (i[:5])); # gack.append("INSERT INTO dsc_files (id, source, file) VALUES (%s, %s, %s)" % (i[12:])); # if new_filename[-4:] == ".dsc": # print "INSERT INTO source (id, source, version, maintainer, file) VALUES (%s, '%s', '%s', %s, %s)" % (i[7:12]); # projectB.query("INSERT INTO source (id, source, version, maintainer, file) VALUES (%s, '%s', '%s', %s, %s)" % (i[7:12])); # print "INSERT INTO src_associations (suite, source) VALUES (%s, %s)" % (4, i[7]); # projectB.query("INSERT INTO src_associations (suite, source) VALUES (%s, %s)" % (4, i[7])); # #print repr(i) # for i in gack: # print i; # projectB.query(i); # projectB.query("COMMIT WORK"); ####################################################################################### ####################################################################################### # bad = {}; # xxx = utils.open_file ("xxx", 'r'); # for line in xxx.readlines(): # (package, version, arch) = string.split(line); # version = utils.re_no_epoch.sub('', version); # total = total + 1; # if arch != "source": # filename = "%s/%s_%s_%s.deb" % (morgue, package, version, arch); # else: # filename = "%s/%s_%s.dsc" % (morgue, package, version); # if os.access(filename, os.R_OK): # found = found + 1; # else: # if arch != "source": # filename = "%s/%s_%s.deb" % (morgue, package, version); # if os.access(filename, os.R_OK): # control = apt_pkg.ParseSection(apt_inst.debExtractControl(utils.open_file(filename,"r"))); # deb_arch = control.Find("Architecture"); # if arch == deb_arch: # found = found + 1; # continue; # if arch != "source": # xf = 0; # arch_id = db_access.get_architecture_id (arch); # q = projectB.query("SELECT version FROM binaries b, bin_associations ba WHERE b.package = '%s' AND b.architecture = %s AND ba.bin = b.id AND ba.suite = 5" % (package, arch_id)); # ql = q.getresult(); # if len(ql) != 1: # q = projectB.query("SELECT version FROM binaries b, bin_associations ba WHERE b.package = '%s' AND b.architecture = %s AND ba.bin = b.id AND ba.suite = 2" % (package, arch_id)); # ql = q.getresult(); # if len(ql) != 1: # #print "YOU LOSE: "+package+"~"+version+"~"+arch+"~"+repr(ql) # continue; # unstable_version = ql[0][0]; # print package+" "+unstable_version+" "+arch; # found = found + 1; # else: # q = projectB.query("SELECT version FROM source s, src_associations sa WHERE s.source = '%s' AND sa.source = s.id AND sa.suite = 5" % (package)); # ql = q.getresult(); # if len(ql) != 1: # q = projectB.query("SELECT version FROM source s, src_associations sa WHERE s.source = '%s' AND sa.source = s.id AND sa.suite = 2" % (package)); # ql = q.getresult(); # if len(ql) != 1: # #print "YOU LOSE: "+package+"~"+version+"~"+arch+"~"+repr(ql) # continue; # unstable_version = ql[0][0]; # print package+" "+unstable_version+" "+arch; # found = found + 1; # #print "Good: %d / %d (%.2f%%)" % (found, total, (float(found)/total*100)); # #not_found = total - found; # #print "Bad: %d / %d (%.2f%%)" % (not_found, total, (float(not_found)/total*100)); ####################################################################################### # Pretty print bad stuff code # key = package+'~'+version; # if not bad.has_key(key): # bad[key] = []; # bad[key].append(arch); # keys = bad.keys(); # keys.sort(); # for i in keys: # print i+": "+repr(bad[i]); # Check if is in DB code # arch_id = db_access.get_architecture_id (arch); # q = projectB.query("SELECT id FROM binaries WHERE package = '%s' AND version = '%s' AND architecture = %s" % (package, version, arch_id)); # ql = q.getresult(); # if ql != []: # found = found + 1; # q = projectB.query("SELECT id FROM source WHERE source = '%s' AND version = '%s'" % (package, version)); # ql = q.getresult(); # if ql != []: # found = found + 1;