X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=daklib%2Fqueue.py;h=9e5c16c4c1fbc4a7f9806f03c533f42d0594a79b;hb=3f19ec37baba79ae02d61587867400521fd2baa6;hp=31f9a25be9e48e5f34ea59d3d6743f539338825e;hpb=632902b01b6a0d13f67d25d2bc0261628b4caa85;p=dak.git diff --git a/daklib/queue.py b/daklib/queue.py index 31f9a25b..9e5c16c4 100755 --- a/daklib/queue.py +++ b/daklib/queue.py @@ -290,15 +290,15 @@ class Upload(object): msg = '' if len(self.rejects) > 0: - msg += "Reject Reasons:\n" + msg += "\n\nReject Reasons:\n" msg += "\n".join(self.rejects) if len(self.warnings) > 0: - msg += "Warnings:\n" + msg += "\n\nWarnings:\n" msg += "\n".join(self.warnings) if len(self.notes) > 0: - msg += "Notes:\n" + msg += "\n\nNotes:\n" msg += "\n".join(self.notes) return msg @@ -1025,16 +1025,21 @@ class Upload(object): ########################################################################### - def ensure_all_source_exists(self, source_dir, dest_dir=None): - """ - Ensure that dest_dir contains all the orig tarballs for the specified - changes. If it does not, symlink them into place. + def get_changelog_versions(self, source_dir): + """Extracts a the source package and (optionally) grabs the + version history out of debian/changelog for the BTS.""" - If dest_dir is None, populate the current directory. - """ + cnf = Config() - if dest_dir is None: - dest_dir = os.getcwd() + # Find the .dsc (again) + dsc_filename = None + for f in self.pkg.files.keys(): + if self.pkg.files[f]["type"] == "dsc": + dsc_filename = f + + # If there isn't one, we have nothing to do. (We have reject()ed the upload already) + if not dsc_filename: + return # Create a symlink mirror of the source files in our temporary directory for f in self.pkg.files.keys(): @@ -1048,7 +1053,7 @@ class Upload(object): 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(dest_dir, f) + dest = os.path.join(os.getcwd(), f) os.symlink(src, dest) # If the orig files are not a part of the upload, create symlinks to the @@ -1059,26 +1064,6 @@ class Upload(object): dest = os.path.join(os.getcwd(), os.path.basename(orig_file)) os.symlink(self.pkg.orig_files[orig_file]["path"], dest) - ########################################################################### - - def get_changelog_versions(self, source_dir): - """Extracts a the source package and (optionally) grabs the - version history out of debian/changelog for the BTS.""" - - cnf = Config() - - # Find the .dsc (again) - dsc_filename = None - for f in self.pkg.files.keys(): - if self.pkg.files[f]["type"] == "dsc": - dsc_filename = f - - # If there isn't one, we have nothing to do. (We have reject()ed the upload already) - if not dsc_filename: - return - - self.ensure_all_source_exists(source_dir) - # Extract the source cmd = "dpkg-source -sn -x %s" % (dsc_filename) (result, output) = commands.getstatusoutput(cmd) @@ -1211,7 +1196,98 @@ 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() + + # Don't reject binary uploads + if not self.pkg.changes['architecture'].has_key('source'): + return + # Only check some distributions valid_dist = False for dist in ('unstable', 'experimental'): @@ -1222,13 +1298,11 @@ class Upload(object): if not valid_dist: return - self.ensure_all_source_exists() - - cnf = Config() 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() @@ -1239,6 +1313,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. @@ -1258,8 +1335,12 @@ class Upload(object): # to then parse it. command = "lintian --show-overrides --tags-from-file %s %s" % (temp_filename, self.pkg.changes_file) (result, output) = commands.getstatusoutput(command) - # We are done with lintian, remove our tempfile + + # We are done with lintian, remove our tempfile and any symlinks we created os.unlink(temp_filename) + 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:] ")) @@ -1269,9 +1350,7 @@ class Upload(object): def log(*txt): if self.logger: - args = [self.pkg.changes_file, "check_lintian"] - args.extend(txt) - self.logger.log(args) + 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. @@ -1299,14 +1378,16 @@ class Upload(object): 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) + log("ftpmaster does not allow tag to be overridable", 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']: + log("auto rejecting", "overridable", etag) self.rejects.append("%s: If you have a good reason, you may override this lintian tag." % (epackage)) + else: + log("auto rejecting", "not overridable", etag) ########################################################################### def check_urgency(self):