euscan-ng/src/euscan/handlers/gnome.py

84 lines
1.9 KiB
Python

# -*- coding: utf-8 -*-
import re
import urllib.request, urllib.error, urllib.parse
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 = {
"data": guess_package(pkg.cpv, url),
"type": "gnome",
}
return scan_pkg(pkg, package)
def scan_pkg(pkg, options):
package = options["data"]
output.einfo("Using Gnome json cache: " + package)
fp = urllib.request.urlopen("/".join([GNOME_URL_SOURCE, package, "cache.json"]))
content = fp.read()
fp.close()
cache = json.loads(content, encoding="ascii")
if cache[0] != 4:
output.eerror("Unknow cache format detected")
return []
versions = cache[2][package]
if not versions:
return []
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:
output.ewarn("No tarball for release %s" % up_pv)
ret.append((url, pv, HANDLER_NAME, CONFIDENCE))
return ret