]> git.decadent.org.uk Git - dak.git/blobdiff - dak/process_unchecked.py
Merge with mainline.
[dak.git] / dak / process_unchecked.py
index 5b97b09e04371b683d29c6fd1e2ee4d304d2c088..688fd63c273363b407d96c56f655c09c68ec1ba7 100755 (executable)
@@ -39,10 +39,11 @@ from types import *
 
 ################################################################################
 
-re_valid_version = re.compile(r"^([0-9]+:)?[0-9A-Za-z\.\-\+:]+$")
+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]+\)")
 re_strip_revision = re.compile(r"-([^-]+)$")
+re_strip_srcver = re.compile(r"\s+\(\S+\)$")
 
 ################################################################################
 
@@ -89,7 +90,7 @@ def init():
     if Options["Help"]:
         usage()
 
-    Upload = daklib.queue.Queue(Cnf)
+    Upload = daklib.queue.Upload(Cnf)
 
     changes = Upload.pkg.changes
     dsc = Upload.pkg.dsc
@@ -202,6 +203,14 @@ def check_changes():
             reject("%s: Missing mandatory field `%s'." % (filename, i))
             return 0    # Avoid <undef> errors during later tests
 
+    # Strip a source version in brackets from the source field
+    if re_strip_srcver.search(changes["source"]):
+       changes["source"] = re_strip_srcver.sub('', changes["source"])
+
+    # Ensure the source field is a valid package name.
+    if not re_valid_pkg_name.match(changes["source"]):
+        reject("%s: invalid source name '%s'." % (filename, changes["source"]))
+
     # Split multi-value fields into a lower-level dictionary
     for i in ("architecture", "distribution", "binary", "closes"):
         o = changes.get(i, "")
@@ -246,7 +255,7 @@ def check_changes():
     # 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" ]:
+    for dir in [ "Accepted", "Byhand", "Done", "New", "ProposedUpdates" ]:
         if os.path.exists(Cnf["Dir::Queue::%s" % (dir) ]+'/'+base_filename):
             reject("%s: a file with this name already exists in the %s directory." % (base_filename, dir))
 
@@ -395,7 +404,7 @@ def check_files():
 
     for file in file_keys:
         # Ensure the file does not already exist in one of the accepted directories
-        for dir in [ "Accepted", "Byhand", "New" ]:
+        for dir in [ "Accepted", "Byhand", "New", "ProposedUpdates" ]:
             if os.path.exists(Cnf["Dir::Queue::%s" % (dir) ]+'/'+file):
                 reject("%s file already exists in the %s directory." % (file, dir))
         if not daklib.utils.re_taint_free.match(file):
@@ -529,8 +538,15 @@ def check_files():
                         files[file]["byhand"] = 1
                     elif os.path.exists(Cnf["Dir::Queue::New"] + '/' + dsc_filename):
                         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))
+                    else:
+                       dsc_file_exists = 0
+                        for myq in ["Accepted", "Embargoed", "Unembargoed", "ProposedUpdates"]:
+                           if Cnf.has_key("Dir::Queue::%s" % (myq)):
+                               if os.path.exists(Cnf["Dir::Queue::"+myq] + '/' + dsc_filename):
+                                   dsc_file_exists = 1
+                                   break
+                       if not dsc_file_exists:
+                            reject("no source found for %s %s (%s)." % (source_package, source_version, file))
             # Check the version and for file overwrites
             reject(Upload.check_binary_against_db(file),"")
 
@@ -594,7 +610,7 @@ def check_files():
 
             # Validate the component
             component = files[file]["component"]
-            component_id = database.get_component_id(component)
+            component_id = daklib.database.get_component_id(component)
             if component_id == -1:
                 reject("file '%s' has unknown component '%s'." % (file, component))
                 continue
@@ -609,14 +625,14 @@ def check_files():
 
             # Determine the location
             location = Cnf["Dir::Pool"]
-            location_id = database.get_location_id (location, component, archive)
+            location_id = daklib.database.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"] = daklib.utils.poolify (changes["source"], files[file]["component"])
-            files_id = database.get_files_id(files[file]["pool name"] + file, files[file]["size"], files[file]["md5sum"], files[file]["location id"])
+            files_id = daklib.database.get_files_id(files[file]["pool name"] + file, files[file]["size"], files[file]["md5sum"], files[file]["location id"])
             if files_id == -1:
                 reject("INTERNAL ERROR, get_files_id() returned multiple matches for %s." % (file))
             elif files_id == -2:
@@ -1036,12 +1052,15 @@ def action ():
     queue_info = {
          "New": { "is": is_new, "process": acknowledge_new },
          "Byhand" : { "is": is_byhand, "process": do_byhand },
+         "StableUpdate" : { "is": is_stableupdate, "process": do_stableupdate },
          "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" ]
+    else:
+        queues += [ "StableUpdate" ]
 
     (prompt, answer) = ("", "XXX")
     if Options["No-Action"] or Options["Automatic"]:
@@ -1066,7 +1085,7 @@ def action ():
                 break
         if queue:
             print "%s for %s\n%s%s" % (
-                daklib.queue.upper(), ", ".join(changes["distribution"].keys()), 
+                queue.upper(), ", ".join(changes["distribution"].keys()), 
                 reject_message, summary),
             queuekey = queue[0].upper()
             if queuekey in "RQSA":
@@ -1131,7 +1150,12 @@ def is_unembargo ():
     if ql:
         return 1
 
-    if pkg.directory == Cnf["Dir::Queue::Disembargo"].rstrip("/"):
+    oldcwd = os.getcwd()
+    os.chdir(Cnf["Dir::Queue::Disembargo"])
+    disdir = os.getcwd()
+    os.chdir(oldcwd)
+
+    if pkg.directory == disdir:
         if changes["architecture"].has_key("source"):
             if Options["No-Action"]: return 1
 
@@ -1173,6 +1197,35 @@ def queue_embargo (summary):
 
 ################################################################################
 
+def is_stableupdate ():
+    if not changes["distribution"].has_key("proposed-updates"):
+       return 0
+
+    if not changes["architecture"].has_key("source"):
+        pusuite = database.get_suite_id("proposed-updates")
+        q = Upload.projectB.query(
+          "SELECT S.source FROM source s JOIN src_associations sa ON (s.id = sa.source) WHERE s.source = '%s' AND s.version = '%s' AND sa.suite = %d" % 
+          (changes["source"], changes["version"], pusuite))
+        ql = q.getresult()
+        if ql:
+            # source is already in proposed-updates
+            return 0
+
+    return 1
+
+def do_stableupdate (summary):
+    print "Moving to PROPOSED-UPDATES holding area."
+    Logger.log(["Moving to proposed-updates", pkg.changes_file]);
+
+    Upload.dump_vars(Cnf["Dir::Queue::ProposedUpdates"]);
+    move_to_dir(Cnf["Dir::Queue::ProposedUpdates"])
+
+    # Check for override disparities
+    Upload.Subst["__SUMMARY__"] = summary;
+    Upload.check_override();
+
+################################################################################
+
 def is_byhand ():
     for file in files.keys():
         if files[file].has_key("byhand"):
@@ -1318,7 +1371,7 @@ def main():
         Logger = Upload.Logger = daklib.logging.Logger(Cnf, "process-unchecked")
 
     # debian-{devel-,}-changes@lists.debian.org toggles writes access based on this header
-    bcc = "X-DAK: dak process-unchecked\nX-Katie: this header is obsolete"
+    bcc = "X-DAK: dak process-unchecked\nX-Katie: $Revision: 1.65 $"
     if Cnf.has_key("Dinstall::Bcc"):
         Upload.Subst["__BCC__"] = bcc + "\nBcc: %s" % (Cnf["Dinstall::Bcc"])
     else: