Florian Weimer
2010-May-08 10:14 UTC
[Secure-testing-commits] r14639 - doc lib/python/sectracker lib/python/sectracker_test
Author: fw Date: 2010-05-08 10:14:00 +0000 (Sat, 08 May 2010) New Revision: 14639 Modified: doc/python-format.txt lib/python/sectracker/parsers.py lib/python/sectracker_test/test_parsers.py Log: sectracker.parsers.sourcepackages(): extract binary packages It turns out that we can reconstruct the binary packages list from the Binary: field in the Sources files. Modified: doc/python-format.txt ==================================================================--- doc/python-format.txt 2010-05-08 09:16:30 UTC (rev 14638) +++ doc/python-format.txt 2010-05-08 10:14:00 UTC (rev 14639) @@ -14,6 +14,19 @@ internal order of named tuples (so you really should not rely on that). +# Source packages + +The dictionary returned by sectracker.parsers.sourcepackages() +contains the source package name as the key, and as values named +tuples with the following field: + +* pkg.name: the name of the source package + +* pkg.version: the source version + +* pkg.binary: a list of binary package names compiled from this source + package + # Individual bug information The data/*/list files are parsed as lists of bugs. A line which does Modified: lib/python/sectracker/parsers.py ==================================================================--- lib/python/sectracker/parsers.py 2010-05-08 09:16:30 UTC (rev 14638) +++ lib/python/sectracker/parsers.py 2010-05-08 10:14:00 UTC (rev 14639) @@ -23,8 +23,13 @@ import sectracker.xpickle as _xpickle import sectracker.diagnostics -FORMAT = "1" +FORMAT = "2" +def _sortedtuple(seq): + l = list(seq) + l.sort() + return tuple(l) + @_xpickle.loader("BINARY" + FORMAT) def binarypackages(name, f): """Returns a sequence of binary package names""" @@ -34,39 +39,37 @@ obj.sort() return tuple(obj) +SourcePackage = _namedtuple("SourcePackage", "name version binary") @_xpickle.loader("SOURCE" + FORMAT) def sourcepackages(name, f): - """Returns a dictionary of source package objects. - - The keys are strings, containing the source package name, the - values are corresponding source package versions.""" - + """Returns a dictionary of source package objects""" data = {} for p in debian_support.PackageFile(name, f): - pkg_name, pkg_version = (None, None) + pkg_name = pkg_version = pkg_binary = None for name, contents in p: if name == "Package": pkg_name = intern(contents) elif name == "Version": pkg_version = contents + elif name == "Binary": + pkg_binary = _sortedtuple(contents.replace(",", " ") + .strip().split()) if pkg_name is None: raise SyntaxError("package record does not contain package name") if pkg_version is None: raise SyntaxError("package record for %s does not contain version" % pkg_name) + if pkg_binary is None: + raise SyntaxError("package record lacks Binary field") + if pkg_name in data: - oversion = debian_support.Version(data[pkg_name]) + oversion = debian_support.Version(data[pkg_name].version) if oversion >= debian_support.Version(pkg_version): continue - data[pkg_name] = pkg_version + data[pkg_name] = SourcePackage(pkg_name, pkg_version, pkg_binary) return data -def _sortedtuple(seq): - l = list(seq) - l.sort() - return tuple(l) - FlagAnnotation = _namedtuple("FlagAnnotation", "line type") StringAnnotation = _namedtuple("StringAnnotation", "line type description") Modified: lib/python/sectracker_test/test_parsers.py ==================================================================--- lib/python/sectracker_test/test_parsers.py 2010-05-08 09:16:30 UTC (rev 14638) +++ lib/python/sectracker_test/test_parsers.py 2010-05-08 10:14:00 UTC (rev 14639) @@ -19,13 +19,11 @@ import sectracker.parsers as p from sectracker.xpickle import safeunlink, EXTENSION -o = binarypackages("../../data/packages/sid__main_i386_Packages") -assert type(o) == type(()) -assert "bash" in o - o = sourcepackages("../../data/packages/sid__main_Sources") assert type(o) == type({}) assert "bash" in o +assert o["bash"].name == "bash" +assert "bash" in o["bash"].binary safeunlink("../../data/CVE/list" + EXTENSION) o = cvelist("../../data/CVE/list")