aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'pym/euscan/handlers/gnome.py')
-rw-r--r--pym/euscan/handlers/gnome.py85
1 files changed, 85 insertions, 0 deletions
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