diff --git a/pym/euscan/handlers/gnome.py b/pym/euscan/handlers/gnome.py new file mode 100644 index 0000000..512f634 --- /dev/null +++ b/pym/euscan/handlers/gnome.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- + +import re +import urllib2 + +try: + import simplejson as json +except ImportError: + import json + +import portage + +from euscan import mangling, helpers, output + +HANDLER_NAME = "gnome" +CONFIDENCE = 100 +PRIORITY = 90 + +GNOME_URL_SOURCE = 'http://ftp.gnome.org/pub/GNOME/sources' + +def can_handle(_pkg, url=None): + return url and url.startswith('mirror://gnome/') + + +def guess_package(cp, url): + match = re.search('mirror://gnome/sources/([^/]+)/.*', url) + if match: + return match.group(1) + + _cat, pkg = cp.split("/") + + return pkg + + +def scan_url(pkg, url, options): + 'http://ftp.gnome.org/pub/GNOME/sources/' + package = guess_package(pkg.cpv, url) + return scan_pkg(pkg, package) + + +def scan_pkg(pkg, options): + # For some weird reasons package with no metadata + # will fail without this hack + options = { + 'data': options, + 'type': 'gnome', + } + package = options['data'] + + output.einfo("Using Gnome json cache: " + package) + + print 'Opening', '/'.join([GNOME_URL_SOURCE, package, 'cache.json']) + fp = urllib2.urlopen('/'.join([GNOME_URL_SOURCE, package, 'cache.json'])) + content = fp.read() + fp.close() + + cache = json.loads(content, encoding='ascii') + + if cache[0] != 4: + raise Exception('Unknow cache format detected') + + versions = cache[2][package] + + if not versions: + return versions + + versions.reverse() + + cp, ver, _rev = portage.pkgsplit(pkg.cpv) + + ret = [] + for up_pv in versions: + pv = mangling.mangle_version(up_pv, options) + if helpers.version_filtered(cp, ver, pv): + continue + up_files = cache[1][package][up_pv] + for tarball_comp in ('tar.xz', 'tar.bz2', 'tar.gz'): + if tarball_comp in up_files: + url = '/'.join([GNOME_URL_SOURCE, package, + up_files[tarball_comp]]) + break + else: + raise Exception('No tarball for release ' + up_pv) + ret.append((url, pv, HANDLER_NAME, CONFIDENCE)) + return ret