From 7cbe517a70ab12b8d8327a9c12e52bd5c6b4059f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Date: Thu, 14 Jun 2012 12:33:55 +0200 Subject: [PATCH] Initial support for github downloads. Right now, it just handles ebuilds using mirror://github. --- pym/euscan/handlers/__init__.py | 4 +-- pym/euscan/handlers/github.py | 51 +++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 pym/euscan/handlers/github.py diff --git a/pym/euscan/handlers/__init__.py b/pym/euscan/handlers/__init__.py index 41236cc..0b4b510 100644 --- a/pym/euscan/handlers/__init__.py +++ b/pym/euscan/handlers/__init__.py @@ -1,6 +1,6 @@ -from euscan.handlers import generic, php, pypi, rubygem, kde, cpan +from euscan.handlers import generic, php, pypi, rubygem, kde, cpan, github -handlers = [kde, php, pypi, rubygem, cpan, generic] +handlers = [kde, php, pypi, rubygem, cpan, github, generic] def find_best_handler(cpv, url): diff --git a/pym/euscan/handlers/github.py b/pym/euscan/handlers/github.py new file mode 100644 index 0000000..6bddad1 --- /dev/null +++ b/pym/euscan/handlers/github.py @@ -0,0 +1,51 @@ +import json, urllib2 +import re + +import portage + +from euscan import helpers, output + +HANDLER_NAME = "github" +CONFIDENCE = 100.0 + +def can_handle(cpv, url): + return url.startswith('mirror://github/') + +def guess_package(cp, url): + match = re.search('^mirror://github/(.*?)/(.*?)/(.*)$', url) + + assert(match) + return (match.group(1), match.group(2), match.group(3)) + +def scan(cpv, url): + 'http://developer.github.com/v3/repos/downloads/' + + user, project, filename = guess_package(cpv, url) + + # find out where version is expected to be found + cp, ver, rev = portage.pkgsplit(cpv) + if ver not in filename: + return + + # now create a filename-matching regexp + # XXX: supposedly replace first with (?P...) + # and remaining ones with (?P=foo) + fnre = re.compile('^%s$' % re.escape(filename).replace(re.escape(ver), '(.*?)')) + + output.einfo("Using github API for: " + '/'.join(package)) + + dlreq = urllib2.urlopen('https://api.github.com/repos/%s/%s/downloads' % (user, project)) + dls = json.load(dlreq) + + for dl in dls: + m = fnre.match(dl['name']) + + if m: + pv = helpers.gentoo_mangle_version(m.group(1)) + if helpers.version_filtered(cp, ver, pv): + continue + yield ('mirror://github/%s' % dl['name'], + pv, HANDLER_NAME, CONFIDENCE) + +def brute_force(cpv, url): + return []