X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=dak%2Fprocess_new.py;h=9ecfcdc6bbc2ade5ca50079f3880319d7fa23756;hb=ee00ba60099f741819f991db13b4d0fc65bdd960;hp=6b37d6993290aff234b7fca99155b9832cec8547;hpb=e07739afa4dcba75d0211de2d90f7146344d6a1b;p=dak.git diff --git a/dak/process_new.py b/dak/process_new.py index 6b37d699..9ecfcdc6 100755 --- a/dak/process_new.py +++ b/dak/process_new.py @@ -1,8 +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 +""" Handles NEW and BYHAND packages +@contact: Debian FTP Master +@copyright: 2001, 2002, 2003, 2004, 2005, 2006 James Troup +@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 @@ -36,19 +40,26 @@ ################################################################################ -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 @@ -81,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"]: @@ -93,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, "") @@ -109,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() @@ -229,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]) @@ -250,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]) @@ -308,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 @@ -364,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() @@ -434,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)) @@ -454,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") @@ -471,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() @@ -492,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: @@ -559,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:" @@ -573,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() @@ -660,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() @@ -722,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"]: @@ -769,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() @@ -819,9 +837,9 @@ def is_source_in_queue_dir(qdir): for entry in entries: # read the .dak u = queue.Upload(Cnf) - u.pkg.changes_file = entry + u.pkg.changes_file = os.path.join(qdir, entry) u.update_vars() - if not 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"]: @@ -833,9 +851,18 @@ def is_source_in_queue_dir(qdir): def move_to_holding(suite, queue_dir): print "Moving to %s holding area." % (suite.upper(),) + if Options["No-Action"]: + 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): @@ -843,25 +870,40 @@ def do_accept_stableupdate(suite, 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 # holding, in new, in accepted or already installed. - if is_source_in_qdir(queue_dir): + if is_source_in_queue_dir(queue_dir): # It's in p-u holding, so move it there. + print "Binary-only upload, source in %s." % (q,) move_to_holding(suite, queue_dir) - if is_source_in_qdir(Cnf["Dir::Queue::New"]): - # It's in NEW. We expect the source to land in p-u holding - # pretty soon. - move_to_holding(suite, queue_dir) - if is_source_in_qdir(Cnf["Dir::Queue::Accepted"]): - # The source is in accepted, the binary cleared NEW: accept it. - Upload.accept(summary, short_summary) - os.unlink(Upload.pkg.changes_file[:-8]+".dak") - if Upload.source_exists(Upload.pkg.changes["source"], + elif Upload.source_exists(Upload.pkg.changes["source"], Upload.pkg.changes["version"]): # dak tells us that there is source available. At time of # writing this means that it is installed, so put it into # accepted. - Upload.accept(summary, short_summary) - os.unlink(Upload.pkg.changes_file[:-8]+".dak") - move_to_holding(suite, queue_dir) + print "Binary-only upload, source installed." + _accept() + elif is_source_in_queue_dir(Cnf["Dir::Queue::Accepted"]): + # The source is in accepted, the binary cleared NEW: accept it. + print "Binary-only upload, source in accepted." + _accept() + elif is_source_in_queue_dir(Cnf["Dir::Queue::New"]): + # It's in NEW. We expect the source to land in p-u holding + # pretty soon. + print "Binary-only upload, source in new." + move_to_holding(suite, queue_dir) + else: + # No case applicable. Bail out. Return will cause the upload + # to be skipped. + print "ERROR" + print "Stable update failed. Source not found." + return + else: + # We are handling a sourceful upload. Move to accepted if currently + # in p-u holding and to p-u holding otherwise. + if is_source_in_queue_dir(queue_dir): + print "Sourceful upload in %s, accepting." % (q,) + _accept() + else: + move_to_holding(suite, queue_dir) def do_accept(): print "ACCEPT" @@ -886,10 +928,10 @@ def do_accept(): continue return do_accept_stableupdate(suite, q) # Just a normal upload, accept it... - Upload.accept(summary, short_summary) - os.unlink(Upload.pkg.changes_file[:-8]+".dak") + _accept() finally: - os.unlink(Cnf["Process-New::AcceptedLockFile"]) + if not Options["No-Action"]: + os.unlink(Cnf["Process-New::AcceptedLockFile"]) def check_status(files): new = byhand = 0