X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=katie.py;h=bee2c03e63b431a4ac00cf85403244d36f52f6df;hb=c5617d291dc17395a9d23c757d7dc815f6eed49e;hp=2a9a9ecdc4b7512882cfcfa7dba3af18bd6398c5;hpb=d1429a5ed3d1914ccc502ae146b32445967e9ba8;p=dak.git diff --git a/katie.py b/katie.py index 2a9a9ecd..bee2c03e 100644 --- a/katie.py +++ b/katie.py @@ -2,7 +2,7 @@ # Utility functions for katie # Copyright (C) 2001, 2002, 2003 James Troup -# $Id: katie.py,v 1.31 2003-03-14 19:06:02 troup Exp $ +# $Id: katie.py,v 1.36 2003-07-29 14:57:03 ajt Exp $ # 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 @@ -601,28 +601,37 @@ distribution."""; # (2) Bin-only NMU of an MU => 1.0-3.0.1 # (3) Bin-only NMU of a sourceful-NMU => 1.0-3.1.1 - def source_exists (self, package, source_version): - q = self.projectB.query("SELECT s.version FROM source s WHERE s.source = '%s'" % (package)); - - # Reduce the query results to a list of version numbers - ql = map(lambda x: x[0], q.getresult()); - - # Try (1) - if ql.count(source_version): - return 1; - - # Try (2) - orig_source_version = re_bin_only_nmu_of_mu.sub('', source_version); - if ql.count(orig_source_version): - return 1; - - # Try (3) - orig_source_version = re_bin_only_nmu_of_nmu.sub('', source_version); - if ql.count(orig_source_version): - return 1; - - # No source found... - return 0; + def source_exists (self, package, source_version, suites = ["any"]): + okay = 1 + for suite in suites: + if suite == "any": + que = "SELECT s.version FROM source s WHERE s.source = '%s'" % \ + (package) + else: + suite_id = db_access.get_suite_id(suite); + que = "SELECT s.version FROM source s JOIN src_associations sa ON (s.id = sa.source) WHERE sa.suite = %d AND s.source = '%s'" % (suite_id, package) + q = self.projectB.query(que) + + # Reduce the query results to a list of version numbers + ql = map(lambda x: x[0], q.getresult()); + + # Try (1) + if ql.count(source_version): + continue + + # Try (2) + orig_source_version = re_bin_only_nmu_of_mu.sub('', source_version) + if ql.count(orig_source_version): + continue + + # Try (3) + orig_source_version = re_bin_only_nmu_of_nmu.sub('', source_version) + if ql.count(orig_source_version): + continue + + # No source found... + okay = 0 + return okay ################################################################################ @@ -746,6 +755,14 @@ SELECT s.version, su.suite_name FROM source s, src_associations sa, suite su ################################################################################ + # **WARNING** + # NB: this function can remove entries from the 'files' index [if + # the .orig.tar.gz is a duplicate of the one in the archive]; if + # you're iterating over 'files' and call this function as part of + # the loop, be sure to add a check to the top of the loop to + # ensure you haven't just tried to derefernece the deleted entry. + # **WARNING** + def check_dsc_against_db(self, file): self.reject_message = ""; files = self.pkg.files; @@ -763,9 +780,16 @@ SELECT s.version, su.suite_name FROM source s, src_associations sa, suite su actual_size = int(files[dsc_file]["size"]); found = "%s in incoming" % (dsc_file) # Check the file does not already exist in the archive - q = self.projectB.query("SELECT f.size, f.md5sum FROM files f, location l WHERE (f.filename ~ '/%s$' OR f.filename = '%s') AND l.id = f.location" % (utils.regex_safe(dsc_file), dsc_file)); + q = self.projectB.query("SELECT size, md5sum, filename FROM files WHERE filename LIKE '%%%s%%'" % (dsc_file)); - # "It has not broken them. It has fixed a + ql = q.getresult(); + # Strip out anything that isn't '%s' or '/%s$' + for i in ql: + if i[2] != dsc_file and i[2][-(len(dsc_file)+1):] != '/'+dsc_file: + self.Logger.log(["check_dsc_against_db",i[2],dsc_file]); + ql.remove(i); + + # "[katie] has not broken them. [katie] has fixed a # brokenness. Your crappy hack exploited a bug in # the old dinstall. # @@ -774,7 +798,6 @@ SELECT s.version, su.suite_name FROM source s, src_associations sa, suite su # the same name and version.)" # -- ajk@ on d-devel@l.d.o - ql = q.getresult(); if ql: # Ignore exact matches for .orig.tar.gz match = 0; @@ -791,8 +814,13 @@ SELECT s.version, su.suite_name FROM source s, src_associations sa, suite su self.reject("can not overwrite existing copy of '%s' already in the archive." % (dsc_file)); elif dsc_file.endswith(".orig.tar.gz"): # Check in the pool - q = self.projectB.query("SELECT l.path, f.filename, l.type, f.id, l.id FROM files f, location l WHERE (f.filename ~ '/%s$' OR f.filename = '%s') AND l.id = f.location" % (utils.regex_safe(dsc_file), dsc_file)); + q = self.projectB.query("SELECT l.path, f.filename, l.type, f.id, l.id FROM files f, location l WHERE f.filename LIKE '%%%s%%' AND l.id = f.location" % (dsc_file)); ql = q.getresult(); + # Strip out anything that isn't '%s' or '/%s$' + for i in ql: + if i[1] != dsc_file and i[1][-(len(dsc_file)+1):] != '/'+dsc_file: + self.Logger.log(["check_dsc_against_db",i[1],dsc_file]); + ql.remove(i); if ql: # Unfortunately, we make get more than one