X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=daklib%2Fqueue.py;h=88cc1f916049558ed63df36d2c86716613851d81;hb=0cae38077922be67a896bf99c57274b9467c1592;hp=25b407232f602575e9ee9eeb26660b7fea56c653;hpb=3a044cf559c390a0a4dc0658ec565b6a327f136a;p=dak.git diff --git a/daklib/queue.py b/daklib/queue.py index 25b40723..88cc1f91 100755 --- a/daklib/queue.py +++ b/daklib/queue.py @@ -26,7 +26,6 @@ Queue utility functions for dak ############################################################################### -import cPickle import errno import os import pg @@ -73,7 +72,7 @@ def get_type(f, session): """ # Determine the type if f.has_key("dbtype"): - file_type = file["dbtype"] + file_type = f["dbtype"] elif re_source_ext.match(f["type"]): file_type = "dsc" else: @@ -1000,11 +999,6 @@ class Upload(object): for field_name in [ "build-depends", "build-depends-indep" ]: field = self.pkg.dsc.get(field_name) if field: - # Check for broken dpkg-dev lossage... - if field.startswith("ARRAY"): - self.rejects.append("%s: invalid %s field produced by a broken version of dpkg-dev (1.10.11)" % \ - (dsc_filename, field_name.title())) - # Have apt try to parse them... try: apt_pkg.ParseSrcDepends(field) @@ -1056,8 +1050,8 @@ class Upload(object): if not os.path.exists(src): return ftype = m.group(3) - if re_is_orig_source.match(f) and pkg.orig_files.has_key(f) and \ - pkg.orig_files[f].has_key("path"): + if re_is_orig_source.match(f) and self.pkg.orig_files.has_key(f) and \ + self.pkg.orig_files[f].has_key("path"): continue dest = os.path.join(os.getcwd(), f) os.symlink(src, dest) @@ -1075,7 +1069,7 @@ class Upload(object): (result, output) = commands.getstatusoutput(cmd) if (result != 0): self.rejects.append("'dpkg-source -x' failed for %s [return code: %s]." % (dsc_filename, result)) - self.rejects.append(utils.prefix_multi_line_string(output, " [dpkg-source output:] "), "") + self.rejects.append(utils.prefix_multi_line_string(output, " [dpkg-source output:] ")) return if not cnf.Find("Dir::Queue::BTSVersionTrack"): @@ -1202,7 +1196,94 @@ class Upload(object): self.ensure_hashes() ########################################################################### + + def ensure_orig(self, target_dir='.', session=None): + """ + Ensures that all orig files mentioned in the changes file are present + in target_dir. If they do not exist, they are symlinked into place. + + An list containing the symlinks that were created are returned (so they + can be removed). + """ + + symlinked = [] + cnf = Config() + + for filename, entry in self.pkg.dsc_files.iteritems(): + if not re_is_orig_source.match(filename): + # File is not an orig; ignore + continue + + if os.path.exists(filename): + # File exists, no need to continue + continue + + def symlink_if_valid(path): + f = utils.open_file(path) + md5sum = apt_pkg.md5sum(f) + f.close() + + fingerprint = (os.stat(path)[stat.ST_SIZE], md5sum) + expected = (int(entry['size']), entry['md5sum']) + + if fingerprint != expected: + return False + + dest = os.path.join(target_dir, filename) + + os.symlink(path, dest) + symlinked.append(dest) + + return True + + session_ = session + if session is None: + session_ = DBConn().session() + + found = False + + # Look in the pool + for poolfile in get_poolfile_like_name('/%s' % filename, session_): + poolfile_path = os.path.join( + poolfile.location.path, poolfile.filename + ) + + if symlink_if_valid(poolfile_path): + found = True + break + + if session is None: + session_.close() + + if found: + continue + + # Look in some other queues for the file + queues = ('Accepted', 'New', 'Byhand', 'ProposedUpdates', + 'OldProposedUpdates', 'Embargoed', 'Unembargoed') + + for queue in queues: + if not cnf.get('Dir::Queue::%s' % queue): + continue + + queuefile_path = os.path.join( + cnf['Dir::Queue::%s' % queue], filename + ) + + if not os.path.exists(queuefile_path): + # Does not exist in this queue + continue + + if symlink_if_valid(queuefile_path): + break + + return symlinked + + ########################################################################### + def check_lintian(self): + cnf = Config() + # Only check some distributions valid_dist = False for dist in ('unstable', 'experimental'): @@ -1213,8 +1294,11 @@ class Upload(object): if not valid_dist: return - cnf = Config() - tagfile = cnf("Dinstall::LintianTags") + tagfile = cnf.get("Dinstall::LintianTags") + if tagfile is None: + # We don't have a tagfile, so just don't do anything. + return + # Parse the yaml file sourcefile = file(tagfile, 'r') sourcecontent = sourcefile.read() @@ -1225,6 +1309,9 @@ class Upload(object): utils.fubar("Can not read the lintian tags file %s, YAML error: %s." % (tagfile, msg)) return + # Try and find all orig mentioned in the .dsc + symlinked = self.ensure_orig() + # Now setup the input file for lintian. lintian wants "one tag per line" only, # so put it together like it. We put all types of tags in one file and then sort # through lintians output later to see if its a fatal tag we detected, or not. @@ -1243,17 +1330,24 @@ class Upload(object): # So now we should look at running lintian at the .changes file, capturing output # to then parse it. command = "lintian --show-overrides --tags-from-file %s %s" % (temp_filename, self.pkg.changes_file) - (result, output) = commands.getstatusoutput(cmd) - # We are done with lintian, remove our tempfile + (result, output) = commands.getstatusoutput(command) + + # We are done with lintian, remove our tempfile and any symlinks we created os.unlink(temp_filename) - if (result != 0): - self.rejects.append("lintian failed for %s [return code: %s]." % (self.pkg.changes_file, result)) - self.rejects.append(utils.prefix_multi_line_string(output, " [possible output:] "), "") - return + for symlink in symlinked: + os.unlink(symlink) + + if (result == 2): + utils.warn("lintian failed for %s [return code: %s]." % (self.pkg.changes_file, result)) + utils.warn(utils.prefix_multi_line_string(output, " [possible output:] ")) if len(output) == 0: return + def log(*txt): + if self.logger: + self.logger.log([self.pkg.changes_file, "check_lintian"] + list(txt)) + # We have output of lintian, this package isn't clean. Lets parse it and see if we # are having a victim for a reject. # W: tzdata: binary-without-manpage usr/sbin/tzconfig @@ -1276,15 +1370,18 @@ class Upload(object): if etag in lintiantags['warning']: # The tag is overriden, and it is allowed to be overriden. # Don't add a reject message. + pass elif etag in lintiantags['error']: # The tag is overriden - but is not allowed to be self.rejects.append("%s: Overriden tag %s found, but this tag may not be overwritten." % (epackage, etag)) + log("overidden tag is overridden", etag) else: # Tag is known, it is not overriden, direct reject. self.rejects.append("%s: Found lintian output: '%s %s', automatically rejected package." % (epackage, etag, etext)) + log("auto rejecting", etag) # Now tell if they *might* override it. if etag in lintiantags['warning']: - self.rejects.append("%s: If you have a good reason, you may override this lintian tag. Laziness to fix your crap is NOT A GOOD REASON, sod off" % (epackage)) + self.rejects.append("%s: If you have a good reason, you may override this lintian tag." % (epackage)) ########################################################################### def check_urgency(self): @@ -1739,7 +1836,7 @@ distribution.""" # yes # This routine returns None on success or an error on failure - res = get_queue('accepted').autobuild_upload(self.pkg, cnf["Dir::Queue::Accepted"]) + res = get_or_set_queue('accepted').autobuild_upload(self.pkg, cnf["Dir::Queue::Accepted"]) if res: utils.fubar(res) @@ -1921,7 +2018,7 @@ distribution.""" if not manual: self.Subst["__REJECTOR_ADDRESS__"] = cnf["Dinstall::MyEmailAddress"] self.Subst["__MANUAL_REJECT_MESSAGE__"] = "" - self.Subst["__CC__"] = "X-DAK-Rejection: automatic (moo)\nX-Katie-Rejection: automatic (moo)" + self.Subst["__CC__"] = "X-DAK-Rejection: automatic (moo)" os.write(reason_fd, reject_message) reject_mail_message = utils.TemplateSubst(self.Subst, rej_template) else: @@ -2339,7 +2436,7 @@ distribution.""" self.Subst["__REJECTOR_ADDRESS__"] = cnf["Dinstall::MyEmailAddress"] self.Subst["__REJECT_MESSAGE__"] = self.package_info() self.Subst["__CC__"] = "Cc: " + cnf["Dinstall::MyEmailAddress"] - self.Subst["__BCC__"] = "X-DAK: dak process-accepted\nX-Katie: $Revision: 1.18 $" + self.Subst["__BCC__"] = "X-DAK: dak process-accepted" if cnf.has_key("Dinstall::Bcc"): self.Subst["__BCC__"] += "\nBcc: %s" % (cnf["Dinstall::Bcc"])