]> git.decadent.org.uk Git - dak.git/blobdiff - jennifer
add OverrideSuite for w-p-u
[dak.git] / jennifer
index 1f1016bcc285eb8f60d100e070d57adda097ecf1..125d7d5dd70e42c774a3337a9e0d69975758b562 100755 (executable)
--- a/jennifer
+++ b/jennifer
@@ -2,7 +2,7 @@
 
 # Checks Debian packages from Incoming
 # Copyright (C) 2000, 2001, 2002  James Troup <james@nocrew.org>
-# $Id: jennifer,v 1.16 2002-05-08 11:52:31 troup Exp $
+# $Id: jennifer,v 1.23 2002-06-09 17:32:31 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
@@ -43,7 +43,7 @@ re_is_changes = re.compile (r"(.+?)_(.+?)_(.+?)\.changes$");
 ################################################################################
 
 # Globals
-jennifer_version = "$Revision: 1.16 $";
+jennifer_version = "$Revision: 1.23 $";
 
 Cnf = None;
 Options = None;
@@ -160,9 +160,11 @@ def get_status_output(cmd, status_read, status_write):
             try:
                 os.close(status_write);
                 os.close(status_read);
+                os.close(c2pread);
                 os.close(c2pwrite);
                 os.close(p2cwrite);
                 os.close(errin);
+                os.close(errout);
             except:
                 pass;
             break;
@@ -207,7 +209,7 @@ def check_signature (filename):
             continue;
         args = split[2:];
         if keywords.has_key(keyword) and keyword != "NODATA":
-            internal_error = internal_error + "found duplicate status token ('%s')." % (keyword);
+            internal_error = internal_error + "found duplicate status token ('%s').\n" % (keyword);
             continue;
         else:
             keywords[keyword] = args;
@@ -309,7 +311,7 @@ def copy_to_holding(filename):
     try:
         shutil.copy(filename, dest);
     except IOError, e:
-        # In either case (ENOENT or EPERM) we want to remove the
+        # In either case (ENOENT or EACCES) we want to remove the
         # O_CREAT | O_EXCLed ghost file, so add the file to the list
         # of 'in holding' even if it's not the real file.
         if errno.errorcode[e.errno] == 'ENOENT':
@@ -353,7 +355,7 @@ def check_changes():
 
     # Parse the .changes field into a dictionary
     try:
-        changes.update(utils.parse_changes(filename, 0));
+        changes.update(utils.parse_changes(filename));
     except utils.cant_open_exc:
         reject("can't read changes file '%s'." % (filename));
         return 0;
@@ -363,7 +365,7 @@ def check_changes():
 
     # Parse the Files field from the .changes into another dictionary
     try:
-        files.update(utils.build_file_list(changes, ""));
+        files.update(utils.build_file_list(changes));
     except utils.changes_parse_error_exc, line:
         reject("error parsing changes file '%s', can't grok: %s." % (filename, line));
     except utils.nk_format_exc, format:
@@ -417,30 +419,30 @@ def check_distributions():
     "Check and map the Distribution field of a .changes file."
 
     # Handle suite mappings
-    if Cnf.has_key("SuiteMappings"):
-        for map in Cnf.ValueList("SuiteMappings"):
-            args = string.split(map);
-            type = args[0];
-            if type == "map":
-                (source, dest) = args[1:3];
-                if changes["distribution"].has_key(source):
-                    del changes["distribution"][source]
-                    changes["distribution"][dest] = 1;
+    for map in Cnf.ValueList("SuiteMappings"):
+        args = string.split(map);
+        type = args[0];
+        if type == "map" or type == "silent-map":
+            (source, dest) = args[1:3];
+            if changes["distribution"].has_key(source):
+                del changes["distribution"][source]
+                changes["distribution"][dest] = 1;
+                if type != "silent-map":
                     reject("Mapping %s to %s." % (source, dest),"");
-            elif type == "map-unreleased":
-                (source, dest) = args[1:3];
-                if changes["distribution"].has_key(source):
-                    for arch in changes["architecture"].keys():
-                        if not Cnf.has_key("Suite::%s::Architectures::%s" % (source, arch)):
-                            reject("Mapping %s to %s for unreleased architecture %s." % (source, dest, arch),"");
-                            del changes["distribution"][source];
-                            changes["distribution"][dest] = 1;
-                            break;
-            elif type == "ignore":
-                suite = args[1];
-                if changes["distribution"].has_key(suite):
-                    del changes["distribution"][suite];
-                    reject("Ignoring %s as a target suite." % (suite), "Warning: ");
+        elif type == "map-unreleased":
+            (source, dest) = args[1:3];
+            if changes["distribution"].has_key(source):
+                for arch in changes["architecture"].keys():
+                    if arch not in Cnf.ValueList("Suite::%s::Architectures" % (source)):
+                        reject("Mapping %s to %s for unreleased architecture %s." % (source, dest, arch),"");
+                        del changes["distribution"][source];
+                        changes["distribution"][dest] = 1;
+                        break;
+        elif type == "ignore":
+            suite = args[1];
+            if changes["distribution"].has_key(suite):
+                del changes["distribution"][suite];
+                reject("Ignoring %s as a target suite." % (suite), "Warning: ");
 
     # Ensure there is (still) a target distribution
     if changes["distribution"].keys() == []:
@@ -519,13 +521,14 @@ def check_files():
 
             # Ensure the architecture of the .deb is one we know about.
             default_suite = Cnf.get("Dinstall::DefaultSuite", "Unstable")
-            if not Cnf.has_key("Suite::%s::Architectures::%s" % (default_suite, control.Find("Architecture", ""))):
-                reject("Unknown architecture '%s'." % (control.Find("Architecture", "")));
+            architecture = control.Find("Architecture", "");
+            if architecture not in Cnf.ValueList("Suite::%s::Architectures" % (default_suite)):
+                reject("Unknown architecture '%s'." % (architecture));
 
             # Ensure the architecture of the .deb is one of the ones
             # listed in the .changes.
-            if not changes["architecture"].has_key(control.Find("Architecture", "")):
-                reject("%s: control file lists arch as `%s', which isn't in changes file." % (file, control.Find("Architecture", "")));
+            if not changes["architecture"].has_key(architecture):
+                reject("%s: control file lists arch as `%s', which isn't in changes file." % (file, architecture));
 
             # Check the section & priority match those given in the .changes (non-fatal)
             if control.Find("Section") != None and files[file]["section"] != "" and files[file]["section"] != control.Find("Section"):
@@ -534,7 +537,7 @@ def check_files():
                 reject("%s control file lists priority as `%s', but changes file has `%s'." % (file, control.Find("Priority", ""), files[file]["priority"]),"Warning: ");
 
             files[file]["package"] = control.Find("Package");
-            files[file]["architecture"] = control.Find("Architecture");
+            files[file]["architecture"] = architecture;
             files[file]["version"] = control.Find("Version");
             files[file]["maintainer"] = control.Find("Maintainer", "");
             if file[-5:] == ".udeb":
@@ -543,9 +546,7 @@ def check_files():
                 files[file]["dbtype"] = "deb";
             else:
                 reject("%s is neither a .deb or a .udeb." % (file));
-            files[file]["source"] = control.Find("Source", "");
-            if files[file]["source"] == "":
-                files[file]["source"] = files[file]["package"];
+            files[file]["source"] = control.Find("Source", files[file]["package"]);
             # Get the source version
             source = files[file]["source"];
             source_version = ""
@@ -592,6 +593,8 @@ def check_files():
                         files[file]["new"] = 1;
                     elif not os.path.exists(Cnf["Dir::Queue::Accepted"] + '/' + dsc_filename):
                         reject("no source found for %s %s (%s)." % (source_package, source_version, file));
+            # Check the version and for file overwrites
+            reject(Katie.check_binary_against_db(file),"");
 
         # Checks for a source package...
         else:
@@ -633,10 +636,17 @@ def check_files():
         for suite in changes["distribution"].keys():
             # Skip byhand
             if files[file].has_key("byhand"):
-                continue
+                continue;
 
+            # Handle component mappings
+            for map in Cnf.ValueList("ComponentMappings"):
+                (source, dest) = string.split(map);
+                if files[file]["component"] == source:
+                    files[file]["original component"] = source;
+                    files[file]["component"] = dest;
             # Ensure the component is valid for the target suite
-            if Cnf.has_key("Suite:%s::Components" % (suite)) and not Cnf.has_key("Suite::%s::Components::%s" % (suite, files[file]["component"])):
+            if Cnf.has_key("Suite:%s::Components" % (suite)) and \
+               files[file]["component"] not in Cnf.ValueList("Suite::%s::Components" % (suite)):
                 reject("unknown component `%s' for suite `%s'." % (files[file]["component"], suite));
                 continue
 
@@ -644,9 +654,6 @@ def check_files():
             if not Katie.in_override_p(files[file]["package"], files[file]["component"], suite, files[file].get("dbtype",""), file):
                 files[file]["new"] = 1;
 
-            if files[file]["type"] == "deb":
-                reject(Katie.check_binaries_against_db(file, suite),"");
-
             # Validate the component
             component = files[file]["component"];
             component_id = db_access.get_component_id(component);
@@ -675,8 +682,18 @@ def check_files():
             files[file]["files id"] = files_id
 
             # Check for packages that have moved from one component to another
-            if files[file]["oldfiles"].has_key(suite) and files[file]["oldfiles"][suite]["name"] != files[file]["component"]:
-                files[file]["othercomponents"] = files[file]["oldfiles"][suite]["name"];
+            q = Katie.projectB.query("""
+SELECT c.name FROM binaries b, bin_associations ba, suite s, location l,
+                   component c, architecture a, files f
+ WHERE b.package = '%s' AND s.suite_name = '%s'
+   AND (a.arch_string = '%s' OR a.arch_string = 'all')
+   AND ba.bin = b.id AND ba.suite = s.id AND b.architecture = a.id
+   AND f.location = l.id AND l.component = c.id AND b.file = f.id"""
+                               % (files[file]["package"], suite,
+                                  files[file]["architecture"]));
+            ql = q.getresult();
+            if ql:
+                files[file]["othercomponents"] = ql[0][0];
 
     # If the .changes file says it has source, it must have source.
     if changes["architecture"].has_key("source"):
@@ -693,10 +710,14 @@ def check_dsc ():
     global reprocess;
 
     for file in files.keys():
+        # The .orig.tar.gz can disappear out from under us is it's a
+        # duplicate of one in the archive.
+        if not files.has_key(file):
+            continue;
         if files[file]["type"] == "dsc":
             # Parse the .dsc file
             try:
-                dsc.update(utils.parse_changes(file, 1));
+                dsc.update(utils.parse_changes(file, dsc_whitespace_rules=1));
             except utils.cant_open_exc:
                 # if not -n copy_to_holding() will have done this for us...
                 if Options["No-Action"]:
@@ -707,7 +728,7 @@ def check_dsc ():
                 reject("syntax error in .dsc file '%s', line %s." % (file, line));
             # Build up the file list of files mentioned by the .dsc
             try:
-                dsc_files.update(utils.build_file_list(dsc, 1));
+                dsc_files.update(utils.build_file_list(dsc, is_a_dsc=1));
             except utils.no_files_exc:
                 reject("no Files: field in .dsc file.");
                 continue;
@@ -789,7 +810,7 @@ def check_urgency ():
     if changes["architecture"].has_key("source"):
         if not changes.has_key("urgency"):
             changes["urgency"] = Cnf["Urgency::Default"];
-        if not Cnf.has_key("Urgency::Valid::%s" % changes["urgency"]):
+        if changes["urgency"] not in Cnf.ValueList("Urgency::Valid"):
             reject("%s is not a valid urgency; it will be treated as %s by testing." % (changes["urgency"], Cnf["Urgency::Default"]), "Warning: ");
             changes["urgency"] = Cnf["Urgency::Default"];
         changes["urgency"] = string.lower(changes["urgency"]);
@@ -811,7 +832,7 @@ def check_md5sums ():
 
 # Sanity check the time stamps of files inside debs.
 # [Files in the near future cause ugly warnings and extreme time
-#  travel can causes errors on extraction]
+#  travel can cause errors on extraction]
 
 def check_timestamps():
     class Tar: