Author: fw Date: 2011-04-24 15:27:54 +0000 (Sun, 24 Apr 2011) New Revision: 16580 Modified: bin/list-queue Log: bin/list-queue: annotate packages with their distributions Modified: bin/list-queue ==================================================================--- bin/list-queue 2011-04-24 15:09:25 UTC (rev 16579) +++ bin/list-queue 2011-04-24 15:27:54 UTC (rev 16580) @@ -20,8 +20,8 @@ # unprocessed dump of the contents of the embargoed and unembargoed # queues. # -# The script reads .deb files. A caching database is written to -# ~/.cache. +# The script reads .deb and .changes files. A caching database is +# written to ~/.cache. ###################################################################### @@ -126,11 +126,13 @@ for (path,) in need_delete: del indb[path] +def stripstat(data): + "Removes the stat pair from the values in data." + for (key, value) in data.items(): + data[key] = value[2:] + def updatepackages(db, ondisk): - """Updates the package table from the file system. - - Returns the current list of package objects, in arbitary order. - """ + "Updates the package table from the file system." indb = readpackages(db) expire(db, ondisk, indb, "package") @@ -146,15 +148,11 @@ db.executemany("INSERT INTO package VALUES (?, ?, ?, ?, ?, ?, ?, ?)", do_update()) - # Return a list of BinaryPackage objects - return [item[2] for item in indb.values()] + stripstat(indb) + return indb def updatechanges(db, ondisk): - """Updates the package table from the file system. - - Returns the current list of changes objects, in arbitary order. - Change objects are pairs (DISTRIBUTION, SET-OF-DEBS) - """ + "Updates the changes table from the file system." indb = readchanges(db) expire(db, ondisk, indb, "changes") @@ -173,20 +171,42 @@ yield (path,) + stat + (dist, " ".join(sorted(debs)),) db.executemany("INSERT INTO changes VALUES (?, ?, ?, ?, ?)", do_update()) - return [tuple(row[2:]) for row in indb.values()] + stripstat(indb) + return indb +def distdict(changes): + "Computes a dict from .deb files to sets of distributions" + result = {} + for path, (dist, debs) in changes.items(): + base = os.path.dirname(path) + distset = set((dist,)) + for deb in debs: + name = os.path.join(base, deb) + if name in result: + result[name].add(dist) + else: + result[name] = set(distset) + return result + +def pkgwithdist(debs, dists): + """Merge packages and distribution information. + + Returns a list of tuples (PACKAGE-NAME, VERSION, ARCHITECTURE, + SOURCE-NAME, SOURCE-VERSION, TUPLE-OF-DISTRIBUTIONS). + """ + return [pkg.astuple() + (sorted(dists.get(path, ())),) + for (path, (pkg,)) in debs.items()] + def main(): db = createdb() debs, changes = readdirs() debs = updatepackages(db, debs) changes = updatechanges(db, changes) - for c in changes: - print repr(c) + dists = distdict(changes) + db.commit() result = { "version" : 1, - "binary" : [pkg.astuple() for pkg in debs], - "changes" : [[dist, sorted(debs)] for dist, debs in changes], + "binary" : pkgwithdist(debs, dists), } - db.commit() print json.dumps(result) main()