]> git.decadent.org.uk Git - dak.git/blobdiff - jennifer
2005-01-14 Anthony Towns <ajt@debian.org> * kelly: when UNACCEPTing, don't double...
[dak.git] / jennifer
index b11935618085b215e948c387b6d328230bfb37cd..90fd13feae08eaf6fad353197726f3978862087a 100755 (executable)
--- a/jennifer
+++ b/jennifer
@@ -2,7 +2,7 @@
 
 # Checks Debian packages from Incoming
 # Copyright (C) 2000, 2001, 2002, 2003, 2004  James Troup <james@nocrew.org>
-# $Id: jennifer,v 1.48 2004-04-19 16:04:34 troup Exp $
+# $Id: jennifer,v 1.55 2005-01-14 14:07:17 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
@@ -37,8 +37,6 @@ from types import *;
 
 ################################################################################
 
-re_bad_diff = re.compile("^[\-\+][\-\+][\-\+] /dev/null");
-re_is_changes = re.compile(r"(.+?)_(.+?)_(.+?)\.changes$");
 re_valid_version = re.compile(r"^([0-9]+:)?[0-9A-Za-z\.\-\+:]+$");
 re_valid_pkg_name = re.compile(r"^[\dA-Za-z][\dA-Za-z\+\-\.]+$");
 re_changelog_versions = re.compile(r"^\w[-+0-9a-z.]+ \([^\(\) \t]+\)");
@@ -47,7 +45,7 @@ re_strip_revision = re.compile(r"-([^-]+)$");
 ################################################################################
 
 # Globals
-jennifer_version = "$Revision: 1.48 $";
+jennifer_version = "$Revision: 1.55 $";
 
 Cnf = None;
 Options = None;
@@ -182,11 +180,6 @@ def clean_holding():
 def check_changes():
     filename = pkg.changes_file;
 
-    # Defaults in case we bail out
-    changes["maintainer2047"] = Cnf["Dinstall::MyEmailAddress"];
-    changes["changedby2047"] = Cnf["Dinstall::MyEmailAddress"];
-    changes["architecture"] = {};
-
     # Parse the .changes field into a dictionary
     try:
         changes.update(utils.parse_changes(filename));
@@ -281,6 +274,9 @@ def check_distributions():
                 changes["distribution"][dest] = 1;
                 if type != "silent-map":
                     reject("Mapping %s to %s." % (source, dest),"");
+            if changes.has_key("distribution-version"):
+                if changes["distribution-version"].has_key(source):
+                    changes["distribution-version"][source]=dest
         elif type == "map-unreleased":
             (source, dest) = args[1:3];
             if changes["distribution"].has_key(source):
@@ -295,6 +291,17 @@ def check_distributions():
             if changes["distribution"].has_key(suite):
                 del changes["distribution"][suite];
                 reject("Ignoring %s as a target suite." % (suite), "Warning: ");
+        elif type == "reject":
+            suite = args[1];
+            if changes["distribution"].has_key(suite):
+                reject("Uploads to %s are not accepted." % (suite));
+        elif type == "propup-version":
+            # 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"]:
+                changes.setdefault("distribution-version", {})
+                for suite in args[2:]: changes["distribution-version"][suite]=suite
 
     # Ensure there is (still) a target distribution
     if changes["distribution"].keys() == []:
@@ -323,6 +330,24 @@ def check_files():
             copy_to_holding(file);
         os.chdir(cwd);
 
+    # Check there isn't already a .changes or .katie file of the same name in
+    # the proposed-updates "CopyChanges" or "CopyKatie" storage directories.
+    # [NB: this check must be done post-suite mapping]
+    base_filename = os.path.basename(pkg.changes_file);
+    katie_filename = base_filename[:-8]+".katie"
+    for suite in changes["distribution"].keys():
+        copychanges = "Suite::%s::CopyChanges" % (suite);
+        if Cnf.has_key(copychanges) and \
+               os.path.exists(Cnf[copychanges]+"/"+base_filename):
+            reject("%s: a file with this name already exists in %s" \
+                   % (base_filename, Cnf[copychanges]));
+
+        copykatie = "Suite::%s::CopyKatie" % (suite);
+        if Cnf.has_key(copykatie) and \
+               os.path.exists(Cnf[copykatie]+"/"+katie_filename):
+            reject("%s: a file with this name already exists in %s" \
+                   % (katie_filename, Cnf[copykatie]));
+
     reprocess = 0;
     has_binaries = 0;
     has_source = 0;
@@ -517,16 +542,13 @@ def check_files():
                 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 \
                files[file]["component"] not in Cnf.ValueList("Suite::%s::Components" % (suite)):
                 reject("unknown component `%s' for suite `%s'." % (files[file]["component"], suite));
                 continue;
 
-            # See if the package is NEW
-            if not Katie.in_override_p(files[file]["package"], files[file]["component"], suite, files[file].get("dbtype",""), file):
-                files[file]["new"] = 1;
-
             # Validate the component
             component = files[file]["component"];
             component_id = db_access.get_component_id(component);
@@ -534,6 +556,10 @@ def check_files():
                 reject("file '%s' has unknown component '%s'." % (file, component));
                 continue;
 
+            # See if the package is NEW
+            if not Katie.in_override_p(files[file]["package"], files[file]["component"], suite, files[file].get("dbtype",""), file):
+                files[file]["new"] = 1;
+
             # Validate the priority
             if files[file]["priority"].find('/') != -1:
                 reject("file '%s' has invalid priority '%s' [contains '/']." % (file, files[file]["priority"]));
@@ -583,7 +609,7 @@ def check_dsc():
 
     # Ensure there is source to check
     if not changes["architecture"].has_key("source"):
-        return;
+        return 1;
 
     # Find the .dsc
     dsc_filename = None;
@@ -591,17 +617,17 @@ def check_dsc():
         if files[file]["type"] == "dsc":
             if dsc_filename:
                 reject("can not process a .changes file with multiple .dsc's.");
-                return;
+                return 0;
             else:
                 dsc_filename = file;
 
     # If there isn't one, we have nothing to do. (We have reject()ed the upload already)
     if not dsc_filename:
-        return;
+        return 0;
 
     # Parse the .dsc file
     try:
-        dsc.update(utils.parse_changes(dsc_filename, dsc_whitespace_rules=1));
+        dsc.update(utils.parse_changes(dsc_filename, signing_rules=1));
     except utils.cant_open_exc:
         # if not -n copy_to_holding() will have done this for us...
         if Options["No-Action"]:
@@ -615,16 +641,16 @@ def check_dsc():
         dsc_files.update(utils.build_file_list(dsc, is_a_dsc=1));
     except utils.no_files_exc:
         reject("%s: no Files: field." % (dsc_filename));
-        return;
+        return 0;
     except utils.changes_parse_error_exc, line:
         reject("%s: parse error, can't grok: %s." % (dsc_filename, line));
-        return;
+        return 0;
 
     # Enforce mandatory fields
     for i in ("format", "source", "version", "binary", "maintainer", "architecture", "files"):
         if not dsc.has_key(i):
             reject("%s: missing mandatory field `%s'." % (dsc_filename, i));
-            return;
+            return 0;
 
     # Validate the source and version fields
     if not re_valid_pkg_name.match(dsc["source"]):
@@ -642,7 +668,7 @@ def check_dsc():
         utils.fix_maintainer (dsc["maintainer"]);
     except utils.ParseMaintError, msg:
         reject("%s: Maintainer field ('%s') failed to parse: %s" \
-               % (dsc_filename, changes["changed-by"], msg));
+               % (dsc_filename, dsc["maintainer"], msg));
 
     # Validate the build-depends field(s)
     for field_name in [ "build-depends", "build-depends-indep" ]:
@@ -695,6 +721,8 @@ def check_dsc():
         files[orig_tar_gz]["type"] = "orig.tar.gz";
         reprocess = 2;
 
+    return 1;
+
 ################################################################################
 
 def get_changelog_versions(source_dir):
@@ -1091,6 +1119,9 @@ def process_it (changes_file):
     # Reset some globals
     reprocess = 1;
     Katie.init_vars();
+    # Some defaults in case we can't fully process the .changes file
+    changes["maintainer2047"] = Cnf["Dinstall::MyEmailAddress"];
+    changes["changedby2047"] = Cnf["Dinstall::MyEmailAddress"];
     reject_message = "";
 
     # Absolutize the filename to avoid the requirement of being in the
@@ -1111,13 +1142,17 @@ def process_it (changes_file):
             # rather than the original...
             pkg.changes_file = os.path.basename(pkg.changes_file);
         changes["fingerprint"] = utils.check_signature(pkg.changes_file, reject);
-        changes_valid = check_changes();
-        if changes_valid:
+        if changes["fingerprint"]:
+            valid_changes_p = check_changes();
+        else:
+            valid_changes_p = 0;
+        if valid_changes_p:
             while reprocess:
                 check_distributions();
                 check_files();
-                check_dsc();
-                check_source();
+                valid_dsc_p = check_dsc();
+                if valid_dsc_p:
+                    check_source();
                 check_md5sums();
                 check_urgency();
                 check_timestamps();