]> git.decadent.org.uk Git - dak.git/blobdiff - dak/process_new.py
Merge commit 'ftpmaster/master'
[dak.git] / dak / process_new.py
index f79c87ee8f4e91ef42387597af6b15e036a3b4c1..9ecfcdc6bbc2ade5ca50079f3880319d7fa23756 100755 (executable)
@@ -1,9 +1,12 @@
 #!/usr/bin/env python
 # vim:set et ts=4 sw=4:
 
-# Handles NEW and BYHAND packages
-# Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006  James Troup <james@nocrew.org>
+""" Handles NEW and BYHAND packages
 
+@contact: Debian FTP Master <ftpmaster@debian.org>
+@copyright: 2001, 2002, 2003, 2004, 2005, 2006  James Troup <james@nocrew.org>
+@license: GNU General Public License version 2 or later
+"""
 # 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
 # the Free Software Foundation; either version 2 of the License, or
 
 ################################################################################
 
-import copy, errno, os, readline, stat, sys, time
+import copy
+import errno
+import os
+import readline
+import stat
+import sys
+import time
 import apt_pkg, apt_inst
 import examine_package
 from daklib import database
 from daklib import logging
 from daklib import queue
 from daklib import utils
+from daklib.regexes import re_no_epoch, re_default_answer, re_isanum
 
 # Globals
-Cnf = None
+Cnf = None       #: Configuration, apt_pkg.Configuration
 Options = None
 Upload = None
-projectB = None
+projectB = None  #: database connection, pgobject
 Logger = None
 
 Priorities = None
@@ -82,7 +92,7 @@ def recheck():
             source_package = files[f]["source package"]
             if not Upload.pkg.changes["architecture"].has_key("source") \
                and not Upload.source_exists(source_package, source_version, Upload.pkg.changes["distribution"].keys()):
-                source_epochless_version = utils.re_no_epoch.sub('', source_version)
+                source_epochless_version = re_no_epoch.sub('', source_version)
                 dsc_filename = "%s_%s.dsc" % (source_package, source_epochless_version)
                 found = 0
                 for q in ["Accepted", "Embargoed", "Unembargoed"]:
@@ -94,9 +104,9 @@ def recheck():
 
         # Version and file overwrite checks
         if files[f]["type"] == "deb":
-            reject(Upload.check_binary_against_db(f))
+            reject(Upload.check_binary_against_db(f), "")
         elif files[f]["type"] == "dsc":
-            reject(Upload.check_source_against_db(f))
+            reject(Upload.check_source_against_db(f), "")
             (reject_msg, is_in_incoming) = Upload.check_dsc_against_db(f)
             reject(reject_msg, "")
 
@@ -110,7 +120,7 @@ def recheck():
 
         while prompt.find(answer) == -1:
             answer = utils.our_raw_input(prompt)
-            m = queue.re_default_answer.match(prompt)
+            m = re_default_answer.match(prompt)
             if answer == "":
                 answer = m.group(1)
             answer = answer[:1].upper()
@@ -230,6 +240,7 @@ def sort_changes(changes_files):
 class Section_Completer:
     def __init__ (self):
         self.sections = []
+        self.matches = []
         q = projectB.query("SELECT section FROM section")
         for i in q.getresult():
             self.sections.append(i[0])
@@ -251,6 +262,7 @@ class Section_Completer:
 class Priority_Completer:
     def __init__ (self):
         self.priorities = []
+        self.matches = []
         q = projectB.query("SELECT priority FROM priority")
         for i in q.getresult():
             self.priorities.append(i[0])
@@ -309,8 +321,8 @@ def index_range (index):
 
 def edit_new (new):
     # Write the current data to a temporary file
-    temp_filename = utils.temp_filename()
-    temp_file = utils.open_file(temp_filename, 'w')
+    (fd, temp_filename) = utils.temp_filename()
+    temp_file = os.fdopen(fd, 'w')
     print_new (new, 0, temp_file)
     temp_file.close()
     # Spawn an editor on that file
@@ -365,7 +377,7 @@ def edit_index (new, index):
 
         while prompt.find(answer) == -1:
             answer = utils.our_raw_input(prompt)
-            m = queue.re_default_answer.match(prompt)
+            m = re_default_answer.match(prompt)
             if answer == "":
                 answer = m.group(1)
             answer = answer[:1].upper()
@@ -435,7 +447,7 @@ def edit_overrides (new):
                 answer = answer[:1].upper()
             if answer == "E" or answer == "D":
                 got_answer = 1
-            elif queue.re_isanum.match (answer):
+            elif re_isanum.match (answer):
                 answer = int(answer)
                 if (answer < 1) or (answer > index):
                     print "%s is not a valid index (%s).  Please retry." % (answer, index_range(index))
@@ -455,8 +467,8 @@ def edit_overrides (new):
 
 def edit_note(note):
     # Write the current data to a temporary file
-    temp_filename = utils.temp_filename()
-    temp_file = utils.open_file(temp_filename, 'w')
+    (fd, temp_filename) = utils.temp_filename()
+    temp_file = os.fdopen(fd, 'w')
     temp_file.write(note)
     temp_file.close()
     editor = os.environ.get("EDITOR","vi")
@@ -472,7 +484,7 @@ def edit_note(note):
         answer = "XXX"
         while prompt.find(answer) == -1:
             answer = utils.our_raw_input(prompt)
-            m = queue.re_default_answer.search(prompt)
+            m = re_default_answer.search(prompt)
             if answer == "":
                 answer = m.group(1)
             answer = answer[:1].upper()
@@ -493,16 +505,18 @@ def check_pkg ():
         stdout_fd = sys.stdout
         try:
             sys.stdout = less_fd
-            examine_package.display_changes(Upload.pkg.changes_file)
+            changes = utils.parse_changes (Upload.pkg.changes_file)
+            examine_package.display_changes(changes['distribution'], Upload.pkg.changes_file)
             files = Upload.pkg.files
             for f in files.keys():
                 if files[f].has_key("new"):
                     ftype = files[f]["type"]
                     if ftype == "deb":
-                        examine_package.check_deb(f)
+                        examine_package.check_deb(changes['distribution'], f)
                     elif ftype == "dsc":
-                        examine_package.check_dsc(f)
+                        examine_package.check_dsc(changes['distribution'], f)
         finally:
+            examine_package.output_package_relations()
             sys.stdout = stdout_fd
     except IOError, e:
         if e.errno == errno.EPIPE:
@@ -560,12 +574,12 @@ def add_overrides (new):
 
 def prod_maintainer ():
     # Here we prepare an editor and get them ready to prod...
-    temp_filename = utils.temp_filename()
+    (fd, temp_filename) = utils.temp_filename()
     editor = os.environ.get("EDITOR","vi")
     answer = 'E'
     while answer == 'E':
         os.system("%s %s" % (editor, temp_filename))
-        f = utils.open_file(temp_filename)
+        f = os.fdopen(fd)
         prod_message = "".join(f.readlines())
         f.close()
         print "Prod message:"
@@ -574,7 +588,7 @@ def prod_maintainer ():
         answer = "XXX"
         while prompt.find(answer) == -1:
             answer = utils.our_raw_input(prompt)
-            m = queue.re_default_answer.search(prompt)
+            m = re_default_answer.search(prompt)
             if answer == "":
                 answer = m.group(1)
             answer = answer[:1].upper()
@@ -661,7 +675,7 @@ def do_new():
 
         while prompt.find(answer) == -1:
             answer = utils.our_raw_input(prompt)
-            m = queue.re_default_answer.search(prompt)
+            m = re_default_answer.search(prompt)
             if answer == "":
                 answer = m.group(1)
             answer = answer[:1].upper()
@@ -723,6 +737,9 @@ def init():
             Cnf["Process-New::Options::%s" % (i)] = ""
 
     changes_files = apt_pkg.ParseCommandLine(Cnf,Arguments,sys.argv)
+    if len(changes_files) == 0 and not Cnf.get("Process-New::Options::Comments-Dir",""):
+        changes_files = utils.get_changes_files(Cnf["Dir::Queue::New"])
+
     Options = Cnf.SubTree("Process-New::Options")
 
     if Options["Help"]:
@@ -770,7 +787,7 @@ def do_byhand():
 
         while prompt.find(answer) == -1:
             answer = utils.our_raw_input(prompt)
-            m = queue.re_default_answer.search(prompt)
+            m = re_default_answer.search(prompt)
             if answer == "":
                 answer = m.group(1)
             answer = answer[:1].upper()
@@ -822,7 +839,7 @@ def is_source_in_queue_dir(qdir):
         u = queue.Upload(Cnf)
         u.pkg.changes_file = os.path.join(qdir, entry)
         u.update_vars()
-        if not Upload.pkg.changes["architecture"].has_key("source"):
+        if not u.pkg.changes["architecture"].has_key("source"):
             # another binary upload, ignore
             continue
         if Upload.pkg.changes["version"] != u.pkg.changes["version"]:
@@ -838,17 +855,17 @@ def move_to_holding(suite, queue_dir):
        return
     Logger.log(["Moving to %s" % (suite,), Upload.pkg.changes_file])
     Upload.dump_vars(queue_dir)
-    move_to_dir(queue_dir)
+    move_to_dir(queue_dir, perms=0664)
     os.unlink(Upload.pkg.changes_file[:-8]+".dak")
 
 def _accept():
     if Options["No-Action"]:
         return
+    (summary, short_summary) = Upload.build_summaries()
     Upload.accept(summary, short_summary)
     os.unlink(Upload.pkg.changes_file[:-8]+".dak")
 
 def do_accept_stableupdate(suite, q):
-    (summary, short_summary) = Upload.build_summaries()
     queue_dir = Cnf["Dir::Queue::%s" % (q,)]
     if not Upload.pkg.changes["architecture"].has_key("source"):
         # It is not a sourceful upload.  So its source may be either in p-u