# 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 $
+# $Id: natalie,v 1.4 2002-10-16 02:47:32 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
################################################################################
-import pg, string, sys, time;
+import pg, sys, time;
import utils, db_access, logging;
import apt_pkg;
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)
-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
################################################################################
-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));
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[:-1]).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:
+ # 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
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:
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"]:
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"),
('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"):
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;
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();
#######################################################################################