]> git.decadent.org.uk Git - dak.git/blobdiff - natalie
Add new top level directories
[dak.git] / natalie
diff --git a/natalie b/natalie
index 456840fe0bf2be901d2d5d136e0b60fe6ee1ed3a..4a5d62bca7ac641f41f32527bdf7c80727d74df8 100755 (executable)
--- a/natalie
+++ b/natalie
@@ -1,8 +1,8 @@
 #!/usr/bin/env python
 
 # Manipulate override files
-# Copyright (C) 2000, 2001, 2002  James Troup <james@nocrew.org>
-# $Id: natalie,v 1.2 2002-05-14 15:33:51 troup Exp $
+# Copyright (C) 2000, 2001, 2002, 2003  James Troup <james@nocrew.org>
+# $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
 
 ################################################################################
 
-import pg, string, sys, time;
+# On 30 Nov 1998, James Troup wrote:
+# 
+# > James Troup<2> <troup2@debian.org>
+# > 
+# >    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.
+
+# <Pine.LNX.3.96.981130011300.30365Z-100000@wakko>
+
+################################################################################
+
+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();
 
 #######################################################################################