X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=natalie;h=4a5d62bca7ac641f41f32527bdf7c80727d74df8;hb=155a2a479011874c09351074f2970cce66275b82;hp=456840fe0bf2be901d2d5d136e0b60fe6ee1ed3a;hpb=35c07e2f1396cae0e415f57131f017fb4ea7b3aa;p=dak.git diff --git a/natalie b/natalie index 456840fe..4a5d62bc 100755 --- a/natalie +++ b/natalie @@ -1,8 +1,8 @@ #!/usr/bin/env python # Manipulate override files -# Copyright (C) 2000, 2001, 2002 James Troup -# $Id: natalie,v 1.2 2002-05-14 15:33:51 troup Exp $ +# Copyright (C) 2000, 2001, 2002, 2003 James Troup +# $Id: natalie,v 1.7 2005-11-15 09:50:32 ajt 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 @@ -20,7 +20,37 @@ ################################################################################ -import pg, string, sys, time; +# On 30 Nov 1998, James Troup wrote: +# +# > James Troup<2> +# > +# > James is a clone of James; he's going to take over the world. +# > After he gets some sleep. +# +# Could you clone other things too? Sheep? Llamas? Giant mutant turnips? +# +# Your clone will need some help to take over the world, maybe clone up an +# army of penguins and threaten to unleash them on the world, forcing +# governments to sway to the new James' will! +# +# Yes, I can envision a day when James' duplicate decides to take a horrific +# vengance on the James that spawned him and unleashes his fury in the form +# of thousands upon thousands of chickens that look just like Captin Blue +# Eye! Oh the horror. +# +# Now you'll have to were name tags to people can tell you apart, unless of +# course the new clone is truely evil in which case he should be easy to +# identify! +# +# Jason +# Chicken. Black. Helicopters. +# Be afraid. + +# + +################################################################################ + +import pg, sys, time; import utils, db_access, logging; import apt_pkg; @@ -34,7 +64,7 @@ Logger = None; def usage (exit_code=0): print """Usage: natalie.py [OPTIONS] - -h, --help this help + -h, --help print this help and exit -c, --component=CMPT list/set overrides by component (contrib,*main,non-free) @@ -43,8 +73,9 @@ def usage (exit_code=0): -t, --type=TYPE list/set overrides by type (*deb,dsc,udeb) - -S, --set set overrides from stdin - -l, --list list overrides on stdout + -a, --add add overrides (changes and deletions are ignored) + -S, --set set overrides + -l, --list list overrides -q, --quiet be less verbose @@ -53,7 +84,7 @@ def usage (exit_code=0): ################################################################################ -def process_file (file, suite, component, type): +def process_file (file, suite, component, type, action): suite_id = db_access.get_suite_id(suite); if suite_id == -1: utils.fubar("Suite '%s' not recognised." % (suite)); @@ -86,58 +117,62 @@ def process_file (file, suite, component, type): start_time = time.time(); projectB.query("BEGIN WORK"); for line in file.readlines(): - line = string.strip(utils.re_comments.sub('', line[:-1])) + line = utils.re_comments.sub('', line).strip(); if line == "": continue; maintainer_override = None; if type == "dsc": - split_line = string.split(line, None, 2); + split_line = line.split(None, 2); if len(split_line) == 2: (package, section) = split_line; elif len(split_line) == 3: (package, section, maintainer_override) = split_line; else: utils.warn("'%s' does not break into 'package section [maintainer-override]'." % (line)); - c_error = c_error + 1; + c_error += 1; continue; priority = "source"; else: # binary or udeb - split_line = string.split(line, None, 3); + split_line = line.split(None, 3); if len(split_line) == 3: (package, priority, section) = split_line; elif len(split_line) == 4: (package, priority, section, maintainer_override) = split_line; else: utils.warn("'%s' does not break into 'package priority section [maintainer-override]'." % (line)); - c_error = c_error + 1; + c_error += 1; continue; section_id = db_access.get_section_id(section); if section_id == -1: utils.warn("'%s' is not a valid section. ['%s' in suite %s, component %s]." % (section, package, suite, component)); - c_error = c_error + 1; + c_error += 1; continue; priority_id = db_access.get_priority_id(priority); if priority_id == -1: utils.warn("'%s' is not a valid priority. ['%s' in suite %s, component %s]." % (priority, package, suite, component)); - c_error = c_error + 1; + c_error += 1; continue; if new.has_key(package): utils.warn("Can't insert duplicate entry for '%s'; ignoring all but the first. [suite %s, component %s]" % (package, suite, component)); - c_error = c_error + 1; + c_error += 1; continue; new[package] = ""; if original.has_key(package): (old_priority_id, old_section_id, old_maintainer_override, old_priority, old_section) = original[package]; - if old_priority_id == priority_id and old_section_id == section_id and old_maintainer_override == maintainer_override: - # Same? Ignore it - c_skipped = c_skipped + 1; + if action == "add" or old_priority_id == priority_id and \ + old_section_id == section_id and \ + ((old_maintainer_override == maintainer_override) or \ + (old_maintainer_override == "" and maintainer_override == None)): + # If it's unchanged or we're in 'add only' mode, ignore it + c_skipped += 1; continue; else: - # Changed? Delete the old one so we can reinsert it with the new information - c_updated = c_updated + 1; + # If it's changed, delete the old one so we can + # reinsert it with the new information + c_updated += 1; projectB.query("DELETE FROM override WHERE suite = %s AND component = %s AND package = '%s' AND type = %s" % (suite_id, component_id, package, type_id)); # Log changes @@ -149,26 +184,27 @@ def process_file (file, suite, component, type): Logger.log(["changed maintainer override",package,old_maintainer_override,maintainer_override]); update_p = 1; else: - c_added = c_added + 1; + c_added += 1; update_p = 0; if maintainer_override: projectB.query("INSERT INTO override (suite, component, type, package, priority, section, maintainer) VALUES (%s, %s, %s, '%s', %s, %s, '%s')" % (suite_id, component_id, type_id, package, priority_id, section_id, maintainer_override)); else: - projectB.query("INSERT INTO override (suite, component, type, package, priority, section) VALUES (%s, %s, %s, '%s', %s, %s)" + projectB.query("INSERT INTO override (suite, component, type, package, priority, section,maintainer) VALUES (%s, %s, %s, '%s', %s, %s, '')" % (suite_id, component_id, type_id, package, priority_id, section_id)); if not update_p: Logger.log(["new override",suite,component,type,package,priority,section,maintainer_override]); - # Delete any packages which were removed - for package in original.keys(): - if not new.has_key(package): - projectB.query("DELETE FROM override WHERE suite = %s AND component = %s AND package = '%s' AND type = %s" - % (suite_id, component_id, package, type_id)); - c_removed = c_removed + 1; - Logger.log(["removed override",suite,component,type,package]); + if not action == "add": + # Delete any packages which were removed + for package in original.keys(): + if not new.has_key(package): + projectB.query("DELETE FROM override WHERE suite = %s AND component = %s AND package = '%s' AND type = %s" + % (suite_id, component_id, package, type_id)); + c_removed += 1; + Logger.log(["removed override",suite,component,type,package]); projectB.query("COMMIT WORK"); if not Cnf["Natalie::Options::Quiet"]: @@ -205,8 +241,9 @@ def main (): global Cnf, projectB, Logger; Cnf = utils.get_conf(); - Arguments = [('h', "help", "Natalie::Options::Help"), + Arguments = [('a', "add", "Natalie::Options::Add"), ('c', "component", "Natalie::Options::Component", "HasArg"), + ('h', "help", "Natalie::Options::Help"), ('l', "list", "Natalie::Options::List"), ('q', "quiet", "Natalie::Options::Quiet"), ('s', "suite", "Natalie::Options::Suite", "HasArg"), @@ -214,7 +251,7 @@ def main (): ('t', "type", "Natalie::Options::Type", "HasArg")]; # Default arguments - for i in ["help", "list", "quiet", "set" ]: + for i in [ "add", "help", "list", "quiet", "set" ]: if not Cnf.has_key("Natalie::Options::%s" % (i)): Cnf["Natalie::Options::%s" % (i)] = ""; if not Cnf.has_key("Natalie::Options::Component"): @@ -233,9 +270,9 @@ def main (): db_access.init(Cnf, projectB); action = None; - for i in [ "list", "set" ]: + for i in [ "add", "list", "set" ]: if Cnf["Natalie::Options::%s" % (i)]: - if action != None: + if action: utils.fubar("Can not perform more than one action at once."); action = i; @@ -247,9 +284,9 @@ def main (): Logger = logging.Logger(Cnf, "natalie"); if file_list: for file in file_list: - process_file(utils.open_file(file), suite, component, type); + process_file(utils.open_file(file), suite, component, type, action); else: - process_file(sys.stdin, suite, component, type); + process_file(sys.stdin, suite, component, type, action); Logger.close(); #######################################################################################