# Checks Debian packages from Incoming
# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 James Troup <james@nocrew.org>
-# $Id: jennifer,v 1.56 2005-01-18 22:18:31 troup Exp $
+# $Id: jennifer,v 1.65 2005-12-05 05:35:47 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
################################################################################
# Globals
-jennifer_version = "$Revision: 1.56 $";
+jennifer_version = "$Revision: 1.65 $";
Cnf = None;
Options = None;
# Check for mandatory fields
for i in ("source", "binary", "architecture", "version", "distribution",
- "maintainer", "files", "changes"):
+ "maintainer", "files", "changes", "description"):
if not changes.has_key(i):
reject("%s: Missing mandatory field `%s'." % (filename, i));
return 0 # Avoid <undef> errors during later tests
changes["changedbyname"], changes["changedbyemail"]) = \
utils.fix_maintainer (changes.get("changed-by", ""));
except utils.ParseMaintError, msg:
+ (changes["changedby822"], changes["changedby2047"],
+ changes["changedbyname"], changes["changedbyemail"]) = \
+ ("", "", "", "")
reject("%s: Changed-By field ('%s') failed to parse: %s" \
% (filename, changes["changed-by"], msg));
# give these as "uploaded-to(non-mapped) suites-to-add-when-upload-obsoletes"
#
# changes["distribution-version"] looks like: {'testing': 'testing-proposed-updates'}
- if args[1] in changes["distribution"]:
+ if changes["distribution"].has_key(args[1]):
changes.setdefault("distribution-version", {})
for suite in args[2:]: changes["distribution-version"][suite]=suite
# If there isn't one, we have nothing to do. (We have reject()ed the upload already)
if not dsc_filename:
+ reject("source uploads must contain a dsc file");
return 0;
# Parse the .dsc file
(summary, short_summary) = Katie.build_summaries();
- byhand = new = "";
- for file in files.keys():
- if files[file].has_key("byhand"):
- byhand = 1
- elif files[file].has_key("new"):
- new = 1
+ # q-unapproved hax0ring
+ queue_info = {
+ "New": { "is": is_new, "process": acknowledge_new },
+ "Byhand" : { "is": is_byhand, "process": do_byhand },
+ "Unembargo" : { "is": is_unembargo, "process": queue_unembargo },
+ "Embargo" : { "is": is_embargo, "process": queue_embargo },
+ }
+ queues = [ "New", "Byhand" ]
+ if Cnf.FindB("Dinstall::SecurityQueueHandling"):
+ queues += [ "Unembargo", "Embargo" ]
(prompt, answer) = ("", "XXX")
if Options["No-Action"] or Options["Automatic"]:
answer = 'S'
+ queuekey = ''
+
if reject_message.find("Rejected") != -1:
if upload_too_new():
print "SKIP (too new)\n" + reject_message,;
prompt = "[R]eject, Skip, Quit ?";
if Options["Automatic"]:
answer = 'R';
- elif new:
- print "NEW to %s\n%s%s" % (", ".join(changes["distribution"].keys()), reject_message, summary),;
- prompt = "[N]ew, Skip, Quit ?";
- if Options["Automatic"]:
- answer = 'N';
- elif byhand:
- print "BYHAND\n" + reject_message + summary,;
- prompt = "[B]yhand, Skip, Quit ?";
- if Options["Automatic"]:
- answer = 'B';
else:
- print "ACCEPT\n" + reject_message + summary,;
- prompt = "[A]ccept, Skip, Quit ?";
- if Options["Automatic"]:
- answer = 'A';
+ queue = None
+ for q in queues:
+ if queue_info[q]["is"]():
+ queue = q
+ break
+ if queue:
+ print "%s for %s\n%s%s" % (
+ queue.upper(), ", ".join(changes["distribution"].keys()),
+ reject_message, summary),
+ queuekey = queue[0].upper()
+ if queuekey in "RQSA":
+ queuekey = "D"
+ prompt = "[D]ivert, Skip, Quit ?"
+ else:
+ prompt = "[%s]%s, Skip, Quit ?" % (queuekey, queue[1:].lower())
+ if Options["Automatic"]:
+ answer = queuekey
+ else:
+ print "ACCEPT\n" + reject_message + summary,;
+ prompt = "[A]ccept, Skip, Quit ?";
+ if Options["Automatic"]:
+ answer = 'A';
while prompt.find(answer) == -1:
answer = utils.our_raw_input(prompt);
Katie.do_reject(0, reject_message);
elif answer == 'A':
accept(summary, short_summary);
- elif answer == 'B':
- do_byhand(summary);
- elif answer == 'N':
- acknowledge_new (summary);
+ remove_from_unchecked()
+ elif answer == queuekey:
+ queue_info[queue]["process"](summary)
+ remove_from_unchecked()
elif answer == 'Q':
sys.exit(0)
+def remove_from_unchecked():
+ os.chdir (pkg.directory);
+ for file in files.keys():
+ os.unlink(file);
+ os.unlink(pkg.changes_file);
+
################################################################################
def accept (summary, short_summary):
Katie.accept(summary, short_summary);
Katie.check_override();
- # Finally, remove the originals from the unchecked directory
- os.chdir (pkg.directory);
- for file in files.keys():
- os.unlink(file);
- os.unlink(pkg.changes_file);
+################################################################################
+
+def move_to_dir (dest, perms=0660, changesperms=0664):
+ utils.move (pkg.changes_file, dest, perms=changesperms);
+ file_keys = files.keys();
+ for file in file_keys:
+ utils.move (file, dest, perms=perms);
+
+################################################################################
+
+def is_unembargo ():
+ q = Katie.projectB.query(
+ "SELECT package FROM disembargo WHERE package = '%s' AND version = '%s'" %
+ (changes["source"], changes["version"]))
+ ql = q.getresult()
+ if ql:
+ return 1
+
+ if pkg.directory == Cnf["Dir::Queue::Disembargo"].rstrip("/"):
+ if changes["architecture"].has_key("source"):
+ if Options["No-Action"]: return 1
+
+ Katie.projectB.query(
+ "INSERT INTO disembargo (package, version) VALUES ('%s', '%s')" %
+ (changes["source"], changes["version"]))
+ return 1
+
+ return 0
+
+def queue_unembargo (summary):
+ print "Moving to UNEMBARGOED holding area."
+ Logger.log(["Moving to unembargoed", pkg.changes_file]);
+
+ Katie.dump_vars(Cnf["Dir::Queue::Unembargoed"]);
+ move_to_dir(Cnf["Dir::Queue::Unembargoed"])
+ Katie.queue_build("unembargoed", Cnf["Dir::Queue::Unembargoed"])
+
+ # Check for override disparities
+ Katie.Subst["__SUMMARY__"] = summary;
+ Katie.check_override();
################################################################################
+def is_embargo ():
+ return 0
+
+def queue_embargo (summary):
+ print "Moving to EMBARGOED holding area."
+ Logger.log(["Moving to embargoed", pkg.changes_file]);
+
+ Katie.dump_vars(Cnf["Dir::Queue::Embargoed"]);
+ move_to_dir(Cnf["Dir::Queue::Embargoed"])
+ Katie.queue_build("embargoed", Cnf["Dir::Queue::Embargoed"])
+
+ # Check for override disparities
+ Katie.Subst["__SUMMARY__"] = summary;
+ Katie.check_override();
+
+################################################################################
+
+def is_byhand ():
+ for file in files.keys():
+ if files[file].has_key("byhand"):
+ return 1
+ return 0
+
def do_byhand (summary):
print "Moving to BYHAND holding area."
Logger.log(["Moving to byhand", pkg.changes_file]);
Katie.dump_vars(Cnf["Dir::Queue::Byhand"]);
-
- file_keys = files.keys();
-
- # Move all the files into the byhand directory
- utils.move (pkg.changes_file, Cnf["Dir::Queue::Byhand"]);
- for file in file_keys:
- utils.move (file, Cnf["Dir::Queue::Byhand"], perms=0660);
+ move_to_dir(Cnf["Dir::Queue::Byhand"])
# Check for override disparities
Katie.Subst["__SUMMARY__"] = summary;
Katie.check_override();
- # Finally remove the originals.
- os.chdir (pkg.directory);
- for file in file_keys:
- os.unlink(file);
- os.unlink(pkg.changes_file);
-
################################################################################
+def is_new ():
+ for file in files.keys():
+ if files[file].has_key("new"):
+ return 1
+ return 0
+
def acknowledge_new (summary):
Subst = Katie.Subst;
Logger.log(["Moving to new", pkg.changes_file]);
Katie.dump_vars(Cnf["Dir::Queue::New"]);
-
- file_keys = files.keys();
-
- # Move all the files into the 'new' directory
- utils.move (pkg.changes_file, Cnf["Dir::Queue::New"]);
- for file in file_keys:
- utils.move (file, Cnf["Dir::Queue::New"], perms=0660);
+ move_to_dir(Cnf["Dir::Queue::New"])
if not Options["No-Mail"]:
print "Sending new ack.";
new_ack_message = utils.TemplateSubst(Subst,Cnf["Dir::Templates"]+"/jennifer.new");
utils.send_mail(new_ack_message);
- # Finally remove the originals.
- os.chdir (pkg.directory);
- for file in file_keys:
- os.unlink(file);
- os.unlink(pkg.changes_file);
-
################################################################################
# reprocess is necessary for the case of foo_1.2-1 and foo_1.2-2 in
# Check that we aren't going to clash with the daily cron job
- if not Options["No-Action"] and os.path.exists("%s/Archive_Maintenance_In_Progress" % (Cnf["Dir::Root"])) and not Options["No-Lock"]:
+ if not Options["No-Action"] and os.path.exists("%s/daily.lock" % (Cnf["Dir::Lock"])) and not Options["No-Lock"]:
utils.fubar("Archive maintenance in progress. Try again later.");
# Obtain lock if not in no-action mode and initialize the log