Author: fw Date: 2005-09-21 15:15:42 +0000 (Wed, 21 Sep 2005) New Revision: 2071 Modified: lib/python/bugs.py lib/python/debian_support.py lib/python/security_db.py Log: Make (bug_name, package, release) unique in the package_notes table. This is necessary because otherwise, the version tracking code does not work right. We do not lose any data by doing this; package status was already tracked by bug and not by package note. lib/python/bugs.py (PackageNote.merge, Bug.mergeNotes): New. (CANFile.finishBugs, CVEFile.finishBugs, DSAFile.finishBugs): New. Merge package notes for CAN, CVE and DSA files. lib/python/security_db.py (DB): Bump schema version. (DB.initSchema): Add the UNIQUE index mentioned above. lib/python/debian_support.py (mergeAsSets): New. (test): Test cases for mergeAsSets. Modified: lib/python/bugs.py ==================================================================--- lib/python/bugs.py 2005-09-21 09:31:54 UTC (rev 2070) +++ lib/python/bugs.py 2005-09-21 15:15:42 UTC (rev 2071) @@ -169,6 +169,17 @@ ("SELECT bug FROM debian_bugs WHERE note = ?", (self.id,)): self.bugs.append(int(b)) + def merge(self, other): + """Add the contents of another, compatible package note to this one.""" + assert self.release is other.release + assert self.package == other.package + self.bugs = debian_support.mergeAsSets(self.bugs, other.bugs) + self.urgency = max(self.urgency, other.urgency) + if self.fixed_version is None or other.fixed_version is None: + self.fixed_version = None + else: + self.fixed_version = max(self.fixed_version, other.fixed_version) + class PackageNoteFromDB(PackageNote): def __init__(self, cursor, nid): for bug_name, package, fixed_version, release, urgency, package_kind\ @@ -316,6 +327,25 @@ self.xref = xref self.not_for_us = not_for_us + def mergeNotes(self): + """Merge notes so that there is only one note for each + (package, release) pair.""" + if len(self.notes) < 2: + return + notes = {} + for n in self.notes: + key = (n.package, n.release) + if notes.has_key(key): + notes[key].merge(n) + else: + notes[key] = n + l = notes.keys() + l.sort() + nts = [] + for key in l: + nts.append(notes[key]) + self.notes = nts + class BugFromDB(Bug): def __init__(self, cursor, name): assert type(name) == types.StringType @@ -698,6 +728,11 @@ desc = desc[1:-1] return (None, cve, desc) + def finishBug(self, bug): + # Merge identical package notes, for historical reasons. + bug.mergeNotes() + return bug + class CVEFile(FileBase): """A CVE file, as used by the Debian testing security team.""" @@ -726,6 +761,11 @@ desc = desc[1:-1] return (None, cve, desc) + def finishBug(self, bug): + # Merge identical package notes, for historical reasons. + bug.mergeNotes() + return bug + class DSAFile(FileBase): """A DSA file. @@ -762,6 +802,11 @@ self.raiseSyntaxError("invalid month name %s" % `month`) return ("%s-%02d-%s" % (year, month, day), name, desc) + def finishBug(self, bug): + # Merge identical package notes, for historical reasons. + bug.mergeNotes() + return bug + class DTSAFile(FileBase): """A DTSA file. Modified: lib/python/debian_support.py ==================================================================--- lib/python/debian_support.py 2005-09-21 09:31:54 UTC (rev 2070) +++ lib/python/debian_support.py 2005-09-21 15:15:42 UTC (rev 2071) @@ -419,6 +419,17 @@ replaceFile(lines, local) return lines +def mergeAsSets(*args): + """Create an order set (represented as a list) of the objects in + the sequences passed as arguments.""" + s = {} + for x in args: + for y in x: + s[y] = True + l = s.keys() + l.sort() + return l + def test(): # Version assert Version(''0'') < Version(''a'') @@ -459,5 +470,8 @@ patchLines(file_a, patchesFromEdScript(patch)) assert ''''.join(file_b) == ''''.join(file_a) + assert len(mergeAsSets([])) == 0 + assert ''''.join(mergeAsSets("abc", "cb")) == "abc" + if __name__ == "__main__": test() Modified: lib/python/security_db.py ==================================================================--- lib/python/security_db.py 2005-09-21 09:31:54 UTC (rev 2070) +++ lib/python/security_db.py 2005-09-21 15:15:42 UTC (rev 2071) @@ -93,7 +93,7 @@ self.db = apsw.Connection(name) self.verbose = verbose - self.schema_version = 8 + self.schema_version = 9 c = self.cursor() for (v,) in c.execute("PRAGMA user_version"): @@ -197,7 +197,8 @@ package_kind TEXT NOT NULL DEFAULT ''unknown'', urgency TEXT NOT NULL)""") cursor.execute( - "CREATE INDEX package_notes_bug ON package_notes(bug_name)") + """CREATE UNIQUE INDEX package_notes_bug + ON package_notes(bug_name, package, release)""") cursor.execute("""CREATE TABLE debian_bugs (bug INTEGER NOT NULL,