]> git.decadent.org.uk Git - dak.git/blobdiff - jennifer
natalie got renamed
[dak.git] / jennifer
index 872d11d62267cf82ef4849b2bcb94e7005862425..83a558851fbe60e028f53ec72c3acacb6792b0de 100755 (executable)
--- a/jennifer
+++ b/jennifer
@@ -2,7 +2,7 @@
 
 # Checks Debian packages from Incoming
 # Copyright (C) 2000, 2001  James Troup <james@nocrew.org>
-# $Id: jennifer,v 1.5 2002-02-22 01:12:15 troup Exp $
+# $Id: jennifer,v 1.15 2002-04-22 11:06:57 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
@@ -44,7 +44,7 @@ re_is_changes = re.compile (r"(.+?)_(.+?)_(.+?)\.changes$");
 ################################################################################
 
 # Globals
-jennifer_version = "$Revision: 1.5 $";
+jennifer_version = "$Revision: 1.15 $";
 
 Cnf = None;
 Options = None;
@@ -174,17 +174,6 @@ def get_status_output(cmd, status_read, status_write):
 
 def Dict(**dict): return dict
 
-def prefix_multi_line_string(str, prefix):
-    out = "";
-    for line in string.split(str, '\n'):
-        line = string.strip(line);
-        if line:
-            out = out + "%s %s\n" % (prefix, line);
-    # Strip trailing new line
-    if out:
-        out = out[:-1];
-    return out;
-
 def reject (str, prefix="Rejected: "):
     global reject_message;
     if str:
@@ -261,9 +250,9 @@ def check_signature (filename):
     if exit_status:
         reject("gpgv failed while checking %s." % (filename));
         if string.strip(status):
-            reject(prefix_multi_line_string(status, " [GPG status-fd output:]"), "");
+            reject(utils.prefix_multi_line_string(status, " [GPG status-fd output:] "), "");
         else:
-            reject(prefix_multi_line_string(output, " [GPG output:]"), "");
+            reject(utils.prefix_multi_line_string(output, " [GPG output:] "), "");
         return None;
 
     # Sanity check the good stuff we expect
@@ -459,30 +448,12 @@ def check_changes():
     changes["chopversion"] = utils.re_no_epoch.sub('', changes["version"])
     changes["chopversion2"] = utils.re_no_revision.sub('', changes["chopversion"])
 
-    # Ensure the changes filename matches it's contents.
-
-    base_filename = os.path.basename(filename);
-    m = re_is_changes.match(base_filename);
-    # source package name
-    if m:
-        file_source = m.group(1);
-        if changes["source"] != file_source:
-            reject("package name part of changes filename (%s) does not match source field (%s) in the changes file." % (file_source, changes["source"]));
-        # source version
-        file_version = m.group(2);
-        if changes["chopversion"] != file_version:
-            reject("version part of changes filename (%s) does not match version field (%s) in the changes file." % (file_version, changes["chopversion"]));
-    else:
-        reject("invalid changes filename '%s'." % (filename));
-
-    # But ... we can't check architecture because there's no
-    # established policy or practice on how to handle
-    # multi-architecture uploads.  Instead we check what we can and
-    # reject if there's a changes file of the same name already in one
+    # Check there isn't already a changes file of the same name in one
     # of the queue directories.
+    base_filename = os.path.basename(filename);
     for dir in [ "Accepted", "Byhand", "Done", "New" ]:
         if os.path.exists(Cnf["Dir::Queue%sDir" % (dir) ]+'/'+base_filename):
-            reject("a changes file with the same name exists in the %s directory." % (dir));
+            reject("a changes file with the same name already exists in the %s directory." % (dir));
 
     return 1;
 
@@ -533,12 +504,15 @@ def check_files():
             files[file]["type"] = "deb";
 
             # Extract package control information
+            deb_file = utils.open_file(file);
             try:
-                control = apt_pkg.ParseSection(apt_inst.debExtractControl(utils.open_file(file)));
+                control = apt_pkg.ParseSection(apt_inst.debExtractControl(deb_file));
             except:
                 reject("%s: debExtractControl() raised %s." % (file, sys.exc_type));
+                deb_file.close();
                 # Can't continue, none of the checks on control would work.
                 continue;
+            deb_file.close();
 
             # Check for mandatory fields
             for field in [ "Package", "Architecture", "Version" ]:
@@ -689,10 +663,14 @@ def check_files():
             if string.find(files[file]["priority"],'/') != -1:
                 reject("file '%s' has invalid priority '%s' [contains '/']." % (file, files[file]["priority"]));
 
-            # Check the md5sum & size against existing files (if any)
+            # Determine the location
             location = Cnf["Dir::PoolDir"];
-            files[file]["location id"] = db_access.get_location_id (location, component, archive);
+            location_id = db_access.get_location_id (location, component, archive);
+            if location_id == -1:
+                reject("[INTERNAL ERROR] couldn't determine location (Component: %s, Archive: %s)" % (component, archive));
+            files[file]["location id"] = location_id;
 
+            # Check the md5sum & size against existing files (if any)
             files[file]["pool name"] = utils.poolify (changes["source"], files[file]["component"]);
             files_id = db_access.get_files_id(files[file]["pool name"] + file, files[file]["size"], files[file]["md5sum"], files[file]["location id"]);
             if files_id == -1:
@@ -709,7 +687,7 @@ def check_files():
     if changes["architecture"].has_key("source"):
         has_source = 0;
         for file in file_keys:
-            if file[file]["type"] == "dsc":
+            if files[file]["type"] == "dsc":
                 has_source = 1;
         if not has_source:
             reject("no source found and Architecture line in changes mention source.");
@@ -761,6 +739,18 @@ def check_dsc ():
             if epochless_dsc_version != files[file]["version"]:
                 reject("version ('%s') in .dsc does not match version ('%s') in .changes." % (epochless_dsc_version, changes_version));
 
+            # Ensure there is a .tar.gz in the .dsc file
+            has_tar = 0;
+            for f in dsc_files.keys():
+                m = utils.re_issource.match(f);
+                if not m:
+                    reject("%s mentioned in the Files field of %s not recognised as source." % (f, file));
+                type = m.group(3);
+                if type == "orig.tar.gz" or type == "tar.gz":
+                    has_tar = 1;
+            if not has_tar:
+                reject("no .tar.gz or .orig.tar.gz listed in the Files field of %s." % (file));
+
             # Ensure source is newer than existing source in target suites
             reject(Katie.check_source_against_db(file),"");
 
@@ -820,6 +810,7 @@ def check_md5sums ():
         else:
             if apt_pkg.md5sum(file_handle) != files[file]["md5sum"]:
                 reject("md5sum check failed for %s." % (file));
+            file_handle.close();
 
 ################################################################################
 
@@ -856,6 +847,7 @@ def check_timestamps():
                 apt_inst.debExtract(deb_file,tar.callback,"control.tar.gz");
                 deb_file.seek(0);
                 apt_inst.debExtract(deb_file,tar.callback,"data.tar.gz");
+                deb_file.close();
                 #
                 future_files = tar.future_files.keys();
                 if future_files:
@@ -876,7 +868,6 @@ def check_timestamps():
                               time.ctime(ancient_date)));
             except:
                 reject("%s: timestamp check failed; caught %s" % (filename, sys.exc_type));
-                raise;
 
 ################################################################################
 ################################################################################
@@ -885,17 +876,25 @@ def check_timestamps():
 # the file is still being uploaded.
 
 def upload_too_new():
+    too_new = 0;
+    # Move back to the original directory to get accurate time stamps
+    cwd = os.getcwd();
+    os.chdir(pkg.directory);
     file_list = pkg.files.keys();
     file_list.extend(pkg.dsc_files.keys());
     file_list.append(pkg.changes_file);
     for file in file_list:
         try:
-            last_modified = time.time()-os.path.getmtime(pkg.changes_file);
+            last_modified = time.time()-os.path.getmtime(file);
             if last_modified < int(Cnf["Dinstall::SkipTime"]):
-                return 1;
+                too_new = 1;
+                break;
         except:
             pass;
-    return 0;
+    os.chdir(cwd);
+    return too_new;
+
+################################################################################
 
 def action ():
     # changes["distribution"] may not exist in corner cases
@@ -942,12 +941,11 @@ def action ():
             answer = 'A';
 
     while string.find(prompt, answer) == -1:
-        print prompt,;
-        answer = utils.our_raw_input()
-        m = katie.re_default_answer.match(prompt)
+        answer = utils.our_raw_input(prompt);
+        m = katie.re_default_answer.match(prompt);
         if answer == "":
-            answer = m.group(1)
-        answer = string.upper(answer[:1])
+            answer = m.group(1);
+        answer = string.upper(answer[:1]);
 
     if answer == 'R':
         os.chdir (pkg.directory);
@@ -986,10 +984,10 @@ def do_byhand (summary):
 
     file_keys = files.keys();
 
-    # Move all the files into the accepted directory
+    # Move all the files into the byhand directory
     utils.move (pkg.changes_file, Cnf["Dir::QueueByhandDir"]);
     for file in file_keys:
-        utils.move (file, Cnf["Dir::QueueByhandDir"]);
+        utils.move (file, Cnf["Dir::QueueByhandDir"], perms=0660);
 
     # Check for override disparities
     if not Cnf["Dinstall::Options::No-Mail"]:
@@ -1017,7 +1015,7 @@ def acknowledge_new (summary):
     # Move all the files into the accepted directory
     utils.move (pkg.changes_file, Cnf["Dir::QueueNewDir"]);
     for file in file_keys:
-        utils.move (file, Cnf["Dir::QueueNewDir"]);
+        utils.move (file, Cnf["Dir::QueueNewDir"], perms=0660);
 
     if not Options["No-Mail"]:
         print "Sending new ack.";