X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=neve;h=a1f6c8cf2cc17c34086ed044de96f517c25712e9;hb=a29673e49824a6c0838df50ab64ac08cf32852d8;hp=05dd19f08f71cd514093c24e565b08e71e7a81b2;hpb=df9f126dcbc0c32dac2be8be356327d18831117c;p=dak.git diff --git a/neve b/neve index 05dd19f0..a1f6c8cf 100755 --- a/neve +++ b/neve @@ -1,8 +1,8 @@ #!/usr/bin/env python # Populate the DB -# Copyright (C) 2000, 2001, 2002 James Troup -# $Id: neve,v 1.15 2002-11-22 04:07:16 troup Exp $ +# Copyright (C) 2000, 2001, 2002, 2003 James Troup +# $Id: neve,v 1.18 2003-02-07 14:53:42 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 @@ -37,7 +37,7 @@ ############################################################################### -import commands, os, pg, re, select, tempfile, time; +import commands, os, pg, re, sys, tempfile, time; import apt_pkg; import db_access, utils; @@ -73,71 +73,17 @@ bin_associations_query_cache = None; source_cache_for_binaries = {}; reject_message = ""; -############################################################################### +################################################################################ -# Our very own version of commands.getouputstatus(), hacked to support -# gpgv's status fd. -def get_status_output(cmd, status_read, status_write): - cmd = ['/bin/sh', '-c', cmd]; - p2cread, p2cwrite = os.pipe(); - c2pread, c2pwrite = os.pipe(); - errout, errin = os.pipe(); - pid = os.fork(); - if pid == 0: - # Child - os.close(0); - os.close(1); - os.dup(p2cread); - os.dup(c2pwrite); - os.close(2); - os.dup(errin); - for i in range(3, 256): - if i != status_write: - try: - os.close(i); - except: - pass; - try: - os.execvp(cmd[0], cmd); - finally: - os._exit(1); - - # parent - os.close(p2cread) - os.dup2(c2pread, c2pwrite); - os.dup2(errout, errin); - - output = status = ""; - while 1: - i, o, e = select.select([c2pwrite, errin, status_read], [], []); - more_data = []; - for fd in i: - r = os.read(fd, 8196); - if len(r) > 0: - more_data.append(fd); - if fd == c2pwrite or fd == errin: - output += r; - elif fd == status_read: - status += r; - else: - utils.fubar("Unexpected file descriptor [%s] returned from select\n" % (fd)); - if not more_data: - pid, exit_status = os.waitpid(pid, 0) - try: - os.close(status_write); - os.close(status_read); - os.close(c2pwrite); - os.close(p2cwrite); - os.close(errin); - except: - pass; - break; - - return output, status, exit_status; +def usage(exit_code=0): + print """Usage: neve +Initializes a projectB database from an existing archive -############################################################################### + -a, --action actually perform the initalization + -h, --help show this help and exit.""" + sys.exit(exit_code) -def Dict(**dict): return dict +############################################################################### def reject (str, prefix="Rejected: "): global reject_message; @@ -154,7 +100,7 @@ def check_signature (filename): status_read, status_write = os.pipe(); cmd = "gpgv --status-fd %s --keyring %s --keyring %s %s" \ % (status_write, Cnf["Dinstall::PGPKeyring"], Cnf["Dinstall::GPGKeyring"], filename); - (output, status, exit_status) = get_status_output(cmd, status_read, status_write); + (output, status, exit_status) = utils.gpgv_get_status_output(cmd, status_read, status_write); # Process the status-fd output keywords = {}; @@ -173,7 +119,7 @@ def check_signature (filename): continue; args = split[2:]; if keywords.has_key(keyword) and keyword != "NODATA" and keyword != "SIGEXPIRED": - internal_error += "found duplicate status token ('%s')." % (keyword); + internal_error += "found duplicate status token ('%s').\n" % (keyword); continue; else: keywords[keyword] = args; @@ -245,9 +191,9 @@ def check_signature (filename): bad = 1; # Finally ensure there's not something we don't recognise - known_keywords = Dict(VALIDSIG="",SIG_ID="",GOODSIG="",BADSIG="",ERRSIG="", - SIGEXPIRED="",KEYREVOKED="",NO_PUBKEY="",BADARMOR="", - NODATA=""); + known_keywords = utils.Dict(VALIDSIG="",SIG_ID="",GOODSIG="",BADSIG="",ERRSIG="", + SIGEXPIRED="",KEYREVOKED="",NO_PUBKEY="",BADARMOR="", + NODATA=""); for keyword in keywords.keys(): if not known_keywords.has_key(keyword): @@ -259,7 +205,7 @@ def check_signature (filename): else: return fingerprint; -######################################################################################### +################################################################################ # Prepares a filename or directory (s) to be file.filename by stripping any part of the location (sub) from it. def poolify (s, sub): @@ -323,6 +269,25 @@ def update_priority(): for priority in Cnf.SubTree("Priority").List(): projectB.query("INSERT INTO priority (priority, level) VALUES ('%s', %s)" % (priority, Cnf["Priority::%s" % (priority)])); +def update_section(): + projectB.query("DELETE FROM section"); + for component in Cnf.SubTree("Component").List(): + if Cnf["Natalie::ComponentPosition"] == "prefix": + suffix = ""; + if component != 'main': + prefix = component + '/'; + else: + prefix = ""; + else: + prefix = ""; + component = component.replace("non-US/", ""); + if component != 'main': + suffix = '/' + component; + else: + suffix = ""; + for section in Cnf.ValueList("Section"): + projectB.query("INSERT INTO section (section) VALUES ('%s%s%s')" % (prefix, section, suffix)); + def get_location_path(directory): global location_path_cache; @@ -337,7 +302,7 @@ def get_location_path(directory): location_path_cache[directory] = path; return path; -############################################################################### +################################################################################ def get_or_set_files_id (filename, size, md5sum, location_id): global files_id_cache, files_id_serial, files_query_cache; @@ -368,6 +333,13 @@ def process_sources (filename, suite, component, archive): version = Scanner.Section["version"]; directory = Scanner.Section["directory"]; dsc_file = os.path.join(Cnf["Dir::Root"], directory, "%s_%s.dsc" % (package, utils.re_no_epoch.sub('', version))); + # Sometimes the Directory path is a lie; check in the pool + if not os.path.exists(dsc_file): + if directory.split('/')[0] == "dists": + directory = Cnf["Dir::PoolRoot"] + utils.poolify(package, component); + dsc_file = os.path.join(Cnf["Dir::Root"], directory, "%s_%s.dsc" % (package, utils.re_no_epoch.sub('', version))); + if not os.path.exists(dsc_file): + utils.fubar("%s not found." % (dsc_file)); install_date = time.strftime("%Y-%m-%d", time.localtime(os.path.getmtime(dsc_file))); fingerprint = check_signature(dsc_file); fingerprint_id = db_access.get_or_set_fingerprint_id(fingerprint); @@ -472,7 +444,7 @@ def process_packages (filename, suite, component, archive): md5sum = Scanner.Section["md5sum"]; files_id = get_or_set_files_id (filename, size, md5sum, location_id); type = "deb"; # FIXME - cache_key = "%s~%s~%s~%d~%d~%d" % (package, version, repr(source_id), architecture_id, location_id, files_id); + cache_key = "%s~%s~%s~%d~%d~%d~%d" % (package, version, repr(source_id), architecture_id, location_id, files_id, suite_id); if not arch_all_cache.has_key(cache_key): arch_all_cache[cache_key] = 1; cache_key = "%s~%s~%s~%d" % (package, version, repr(source_id), architecture_id); @@ -518,6 +490,23 @@ def do_da_do_da (): global Cnf, projectB, query_cache, files_query_cache, source_query_cache, src_associations_query_cache, dsc_files_query_cache, bin_associations_query_cache, binaries_query_cache; Cnf = utils.get_conf(); + Arguments = [('a', "action", "Neve::Options::Action"), + ('h', "help", "Neve::Options::Help")]; + for i in [ "action", "help" ]: + if not Cnf.has_key("Neve::Options::%s" % (i)): + Cnf["Neve::Options::%s" % (i)] = ""; + + apt_pkg.ParseCommandLine(Cnf, Arguments, sys.argv); + + Options = Cnf.SubTree("Neve::Options") + if Options["Help"]: + usage(); + + if not Options["Action"]: + utils.warn("""no -a/--action given; not doing anything. +Please read the documentation before running this script. +"""); + usage(1); print "Re-Creating DB..." (result, output) = commands.getstatusoutput("psql -f init_pool.sql template1"); @@ -538,6 +527,7 @@ def do_da_do_da (): update_suites(); update_override_type(); update_priority(); + update_section(); projectB.query("COMMIT WORK"); files_query_cache = utils.open_file(Cnf["Neve::ExportDir"]+"files","w"); @@ -621,10 +611,7 @@ def do_da_do_da (): ################################################################################ def main(): - try: - do_da_do_da(); - except: - utils.print_exc(); + utils.try_with_debug(do_da_do_da); ################################################################################