#!/usr/bin/python # # Copyright (C) 2011, Stefano Rivera # # Permission to use, copy, modify, and/or distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. import gzip import json import optparse import os import time import urllib from devscripts.logger import Logger from ubuntutools.lp.lpapicache import Distribution, PackageNotFoundException DATA_URL = ('http://people.ubuntuwire.org/~stefanor/ubuntu-image-contents/' 'image_contents.json.gz') def load_index(): '''Download a new copy of the image contents index, if necessary, and read it. ''' cachedir = os.path.expanduser('~/.cache/ubuntu-dev-tools') fn = os.path.join(cachedir, 'image_contents.json.gz') if (not os.path.isfile(fn) or time.time() - os.path.getmtime(fn) > 60 * 60 * 24): if not os.path.isdir(cachedir): os.makedirs(cachedir) urllib.urlretrieve(DATA_URL, fn) with gzip.open(fn, 'r') as f: return json.load(f) def main(): '''Query which images the specified packages are on''' parser = optparse.OptionParser('%prog [options] package...') parser.add_option('-b', '--binary', default=False, action='store_true', help="Binary packages are being specified, " "not source packages (fast)") options, args = parser.parse_args() if len(args) < 1: parser.error("At least one package must be specified") index = load_index() if options.binary: for binary in args: if binary in index: for flavor, type_ in index[binary]: print "%s is present on %s %s" % (binary, flavor, type_) else: print "%s is not present on any current images" % binary else: archive = Distribution('ubuntu').getArchive() for source in args: try: spph = archive.getSourcePackage(source) except PackageNotFoundException, e: Logger.error(str(e)) continue binaries = frozenset(bpph.getPackageName() for bpph in spph.getBinaries()) present = False for binary in binaries: if binary in index: present = True for flavor, type_ in index[binary]: print ("src:%s: %s is present on %s %s" % (source, binary, flavor, type_)) if not present: print ("No binaries from %s are present on any current images" % source) if __name__ == '__main__': main()