]> git.decadent.org.uk Git - dak.git/blobdiff - jennifer
more typos/thinkos
[dak.git] / jennifer
index 0abbfa7e68b1d345acf129d17d9122c3196a2f14..e11153fc49f13241efde802c10ad699643202c7c 100755 (executable)
--- a/jennifer
+++ b/jennifer
@@ -2,7 +2,7 @@
 
 # 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
@@ -45,7 +45,7 @@ re_strip_revision = re.compile(r"-([^-]+)$");
 ################################################################################
 
 # Globals
-jennifer_version = "$Revision: 1.56 $";
+jennifer_version = "$Revision: 1.65 $";
 
 Cnf = None;
 Options = None;
@@ -201,7 +201,7 @@ def check_changes():
 
     # 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
@@ -230,6 +230,9 @@ def check_changes():
          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));
 
@@ -299,7 +302,7 @@ def check_distributions():
             # 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
 
@@ -667,6 +670,7 @@ def check_dsc():
 
     # 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
@@ -1032,17 +1036,23 @@ def action ():
 
     (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,;
@@ -1052,21 +1062,29 @@ def action ():
             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);
@@ -1080,52 +1098,110 @@ def action ():
         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;
 
@@ -1133,13 +1209,7 @@ def acknowledge_new (summary):
     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.";
@@ -1147,12 +1217,6 @@ def acknowledge_new (summary):
         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
@@ -1241,7 +1305,7 @@ def main():
 
     # 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