Florian Weimer
2010-May-08 16:30 UTC
[Secure-testing-commits] r14643 - data lib/python/sectracker lib/python/sectracker_test
Author: fw Date: 2010-05-08 16:30:10 +0000 (Sat, 08 May 2010) New Revision: 14643 Added: data/config.json Modified: lib/python/sectracker/repo.py lib/python/sectracker_test/test_repo.py Log: sectracker.repo.Config: new class, for loading config.json Added: data/config.json ==================================================================--- data/config.json (rev 0) +++ data/config.json 2010-05-08 16:30:10 UTC (rev 14643) @@ -0,0 +1,53 @@ +{ + "repositories" : { + "etch": "http://mirror.1und1.de/debian/dists/etch", + "etch-security" : + "http://security.debian.org/debian-security/dists/etch/updates", + "etch-proposed-updates" : + "http://mirror.1und1.de/debian/dists/etch-proposed-updates", + + "lenny": "http://mirror.1und1.de/debian/dists/lenny", + "lenny-security" : + "http://security.debian.org/debian-security/dists/lenny/updates", + "lenny-proposed-updates" : + "http://mirror.1und1.de/debian/dists/lenny-proposed-updates", + + "squeeze": "http://mirror.1und1.de/debian/dists/squeeze", + "squeeze-security" : + "http://security.debian.org/debian-security/dists/squeeze/updates", + "squeeze-proposed-updates" : + "http://mirror.1und1.de/debian/dists/squeeze-proposed-updates", + + "sid" : "http://mirror.1und1.de/debian/dists/sid" + }, + + "distributions" : { + "etch" : { + "members" : { + "unsupported" : ["etch", "etch-security"], + "optional" : ["etch-proposed-updates"] + }, + "release" : "oldstable" + }, + "lenny" : { + "members" : { + "supported" : ["lenny", "lenny-security"], + "optional" : ["lenny-proposed-updates"] + }, + "release" : "stable" + }, + "squeeze" : { + "members" : { + "supported" : ["squeeze", "squeeze-security"], + "optional" : ["squeeze-proposed-updates"] + }, + "release" : "testing" + }, + "sid" : { + "members" : { + "supported" : ["sid"] + }, + "release" : "unstable" + } + } +} Modified: lib/python/sectracker/repo.py ==================================================================--- lib/python/sectracker/repo.py 2010-05-08 14:49:37 UTC (rev 14642) +++ lib/python/sectracker/repo.py 2010-05-08 16:30:10 UTC (rev 14643) @@ -18,6 +18,7 @@ from __future__ import with_statement import bz2 as _bz2 +import cjson as _cjson import hashlib as _hashlib import gzip as _gzip import os as _os @@ -199,7 +200,10 @@ with file(self._relname(name)) as f: return _parserelease(name, f) - def filemap(self): + def filemap(self, load=False): + """Returns dictionaries mapping repositories to components to files. + If load is true, the files are loaded using the source packages + parser.""" d = {} for name in self.repos: rel = self.release(name) @@ -216,7 +220,10 @@ self.warn("file %s for %s/%s not present" % (listname, name, comp)) continue - comps[comp] = listname + if load: + comps[comp] = _parsers.sourcepackages(listname) + else: + comps[comp] = listname d[name] = comps return d @@ -245,3 +252,51 @@ def warn(self, msg): if self.verbose: print msg + +class Config(object): + def __init__(self, config, root): + with file(config) as f: + self.config = _cjson.decode(f.read()) + self.repositories = self.config["repositories"] + self.distributions = self.config["distributions"] + self.releases = {} + + self.collection = RepoCollection(root) + for k,v in self.repositories.items(): + self.collection.add(k, v) + + for d, dobj in self.distributions.items(): + for m, mobj in dobj.get("members", {}).items(): + for mem in mobj: + if mem not in self.repositories: + raise ValueError( + "distributions[%r][%r] (%r) not a valid repository" + % (d, m, mem)) + if dobj.has_key("release"): + rel = dobj["release"] + if rel in self.releases: + raise ValueError( + "distributions[%r] is duplicate of %r (previous was %r)" + % (d, rel, self.releases[rel])) + self.releases[rel] = d + + def update(self): + self.collection.update() + + def releasepackageversions(self): + """Returns dictionaries mapping release codenames to packages + to a set of versions.""" + fm = self.collection.filemap(load=True) + r = {} + for d, dobj in self.distributions.items(): + pkgver = {} + for mobj in dobj.get("members", {}).values(): + for mem in mobj: + for comps in fm[mem].values(): + for src in comps.values(): + if src.name in pkgver: + pkgver[src.name].add(src.version) + else: + pkgver[src.name] = set((src.version,)) + r[d] = pkgver + return r Modified: lib/python/sectracker_test/test_repo.py ==================================================================--- lib/python/sectracker_test/test_repo.py 2010-05-08 14:49:37 UTC (rev 14642) +++ lib/python/sectracker_test/test_repo.py 2010-05-08 16:30:10 UTC (rev 14643) @@ -15,6 +15,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +import os.path import shutil import tempfile @@ -41,3 +42,12 @@ assert "bash" in o["bash"].binary finally: shutil.rmtree(tmp) + +if not os.path.exists("sectracker_test/tmp"): + os.makedirs("sectracker_test/tmp") +c = Config("../../data/config.json", "sectracker_test/tmp/repo") +c.update() +rpv = c.releasepackageversions() +assert "sid" in rpv +assert "bash" in rpv["sid"] +