X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=daklib%2Fqueue.py;h=dd654cd2d67e06162057c348b4c4e461c70a3438;hb=26957544e0bbb7e6aa08850f9f5da178b2d1453a;hp=9a238bb3a13e1d01858da43ac6e8a5fcffdc63d1;hpb=4a56fdf2e1d47805a766a13b1e1cb4a5568124fa;p=dak.git diff --git a/daklib/queue.py b/daklib/queue.py index 9a238bb3..dd654cd2 100755 --- a/daklib/queue.py +++ b/daklib/queue.py @@ -6,7 +6,7 @@ Queue utility functions for dak @contact: Debian FTP Master @copyright: 2001 - 2006 James Troup -@copyright: 2009 Joerg Jaspert +@copyright: 2009, 2010 Joerg Jaspert @license: GNU General Public License version 2 or later """ @@ -288,6 +288,8 @@ class Upload(object): self.warnings = [] self.notes = [] + self.later_check_files = [] + self.pkg.reset() def package_info(self): @@ -305,7 +307,7 @@ class Upload(object): for title, messages in msgs: if messages: msg += '\n\n%s:\n%s' % (title, '\n'.join(messages)) - msg += '\n' + msg += '\n\n' return msg @@ -359,8 +361,14 @@ class Upload(object): ########################################################################### def load_changes(self, filename): """ + Load a changes file and setup a dictionary around it. Also checks for mandantory + fields within. + + @type: string + @param: Changes filename, full path. + @rtype: boolean - @rvalue: whether the changes file was valid or not. We may want to + @return: whether the changes file was valid or not. We may want to reject even if this is True (see what gets put in self.rejects). This is simply to prevent us even trying things later which will fail because we couldn't properly parse the file. @@ -820,8 +828,7 @@ class Upload(object): for f in file_keys: ret = holding.copy_to_holding(f) if ret is not None: - # XXX: Should we bail out here or try and continue? - self.rejects.append(ret) + self.warnings.append('Could not copy %s to holding; will attempt to find in DB later' % f) os.chdir(cwd) @@ -863,7 +870,9 @@ class Upload(object): if os.path.exists(f): self.rejects.append("Can't read `%s'. [permission denied]" % (f)) else: - self.rejects.append("Can't read `%s'. [file not found]" % (f)) + # Don't directly reject, mark to check later to deal with orig's + # we can find in the pool + self.later_check_files.append(f) entry["type"] = "unreadable" continue @@ -1008,6 +1017,10 @@ class Upload(object): self.check_dsc_against_db(dsc_filename, session) session.close() + # Finally, check if we're missing any files + for f in self.later_check_files: + self.rejects.append("Could not find file %s references in changes" % f) + return True ########################################################################### @@ -1089,9 +1102,7 @@ class Upload(object): def check_source(self): # Bail out if: # a) there's no source - # or c) the orig files are MIA - if not self.pkg.changes["architecture"].has_key("source") \ - or len(self.pkg.orig_files) == 0: + if not self.pkg.changes["architecture"].has_key("source"): return tmpdir = utils.temp_dirname() @@ -1927,27 +1938,17 @@ distribution.""" if self.pkg.changes["architecture"].has_key("source") and cnf.get("Dir::UrgencyLog"): UrgencyLog().log(self.pkg.dsc["source"], self.pkg.dsc["version"], self.pkg.changes["urgency"]) - # Send accept mail, announce to lists, close bugs and check for - # override disparities - if not cnf["Dinstall::Options::No-Mail"]: - self.update_subst() - self.Subst["__SUITE__"] = "" - self.Subst["__SUMMARY__"] = summary - mail_message = utils.TemplateSubst(self.Subst, - os.path.join(cnf["Dir::Templates"], 'process-unchecked.accepted')) - utils.send_mail(mail_message) - self.announce(short_summary, 1) + self.update_subst() + self.Subst["__SUITE__"] = "" + self.Subst["__SUMMARY__"] = summary + mail_message = utils.TemplateSubst(self.Subst, + os.path.join(cnf["Dir::Templates"], 'process-unchecked.accepted')) + utils.send_mail(mail_message) + self.announce(short_summary, 1) ## Helper stuff for DebBugs Version Tracking if cnf.Find("Dir::Queue::BTSVersionTrack"): - # ??? once queue/* is cleared on *.d.o and/or reprocessed - # the conditionalization on dsc["bts changelog"] should be - # dropped. - - # Write out the version history from the changelog - if self.pkg.changes["architecture"].has_key("source") and \ - self.pkg.dsc.has_key("bts changelog"): - + if self.pkg.changes["architecture"].has_key("source"): (fd, temp_filename) = utils.temp_filename(cnf["Dir::Queue::BTSVersionTrack"], prefix=".") version_history = os.fdopen(fd, 'w') version_history.write(self.pkg.dsc["bts changelog"]) @@ -1998,11 +1999,8 @@ distribution.""" cnf = Config() - # Abandon the check if: - # a) override disparity checks have been disabled - # b) we're not sending mail - if not cnf.FindB("Dinstall::OverrideDisparityCheck") or \ - cnf["Dinstall::Options::No-Mail"]: + # Abandon the check if override disparity checks have been disabled + if not cnf.FindB("Dinstall::OverrideDisparityCheck"): return summary = self.pkg.check_override() @@ -2060,8 +2058,8 @@ distribution.""" directory it will be moved to the morgue to make way for the new file. - @type files: dict - @param files: file dictionary + @type reject_files: dict + @param reject_files: file dictionary """ @@ -2077,17 +2075,17 @@ distribution.""" try: dest_fd = os.open(dest_file, os.O_RDWR | os.O_CREAT | os.O_EXCL, 0644) except OSError, e: - # File exists? Let's try and move it to the morgue + # File exists? Let's find a new name by adding a number if e.errno == errno.EEXIST: - morgue_file = os.path.join(cnf["Dir::Morgue"], cnf["Dir::MorgueReject"], file_entry) try: - morgue_file = utils.find_next_free(morgue_file) + dest_file = utils.find_next_free(dest_file, 255) except NoFreeFilenameError: # Something's either gone badly Pete Tong, or # someone is trying to exploit us. - utils.warn("**WARNING** failed to move %s from the reject directory to the morgue." % (file_entry)) + utils.warn("**WARNING** failed to find a free filename for %s in %s." % (file_entry, cnf["Dir::Queue::Reject"])) return - utils.move(dest_file, morgue_file, perms=0660) + + # Make sure we really got it try: dest_fd = os.open(dest_file, os.O_RDWR|os.O_CREAT|os.O_EXCL, 0644) except OSError, e: @@ -2192,9 +2190,8 @@ distribution.""" os.close(reason_fd) - # Send the rejection mail if appropriate - if not cnf["Dinstall::Options::No-Mail"]: - utils.send_mail(reject_mail_message) + # Send the rejection mail + utils.send_mail(reject_mail_message) if self.logger: self.logger.log(["rejected", self.pkg.changes_file]) @@ -2446,6 +2443,13 @@ distribution.""" orig_files[dsc_name]["path"] = os.path.join(i.location.path, i.filename) match = 1 + # Don't bitch that we couldn't find this file later + try: + self.later_check_files.remove(dsc_name) + except ValueError: + pass + + if not match: self.rejects.append("can not overwrite existing copy of '%s' already in the archive." % (dsc_name))