diff options
-rw-r--r-- | scripts/lib/recipetool/create_cpan.py | 168 | ||||
-rw-r--r-- | scripts/lib/recipetool/metacpan/__init__.py | 0 | ||||
-rw-r--r-- | scripts/lib/recipetool/metacpan/query.py | 535 |
3 files changed, 703 insertions, 0 deletions
diff --git a/scripts/lib/recipetool/create_cpan.py b/scripts/lib/recipetool/create_cpan.py new file mode 100644 index 00000000000..811fb65aeb8 --- /dev/null +++ b/scripts/lib/recipetool/create_cpan.py @@ -0,0 +1,168 @@ +# Recipe creation tool - perl CPAN module support plugin +# +# Copyright (C) 2016 Intel Corporation +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +import json +import logging +import os +import re +import requests +import shutil +import subprocess +import tempfile +from recipetool.create import RecipeHandler, split_pkg_licenses, handle_license_vars +from recipetool.metacpan.query import AbstractQuery, AuthorQuery, BugtrackerQuery, BuildDependsQuery, HomepageQuery, LicenseQuery, PauseIdQuery + +logger = logging.getLogger('recipetool') + +plugins = None +tinfoil = None + +def plugin_init(pluginlist): + # Take a reference to the list so we can use it later + global plugins + plugins = pluginlist + +def tinfoil_init(instance): + global tinfoil + tinfoil = instance + + +class CpanRecipeHandler(RecipeHandler): + + def process(self, srctree, classes, lines_before, lines_after, handled, extravalues): + import bb.utils + import bb.providers + import oe + from collections import OrderedDict + + if 'buildsystem' in handled: + return False + + def read_meta_json(fn): + with open(fn, 'r', errors='surrogateescape') as f: + return json.loads(f.read()) + + # FIXME: really old modules will have META.yml and not META.json + files = RecipeHandler.checkfiles(srctree, ['META.json']) + logger.debug( bb.providers.getRuntimeProviders(tinfoil.cooker_data, 'libxml-perl')) + if files: + data = read_meta_json(files[0]) + if 'name' in data and 'version' in data: + extravalues['PN'] = "lib%s-perl" % data['name'].lower() + extravalues['PV'] = data['version'] + logger.debug("PN = \"%s\"" % extravalues['PN']) + logger.debug("PV = \"%s\"" % extravalues['PV']) + pq = PauseIdQuery(pn=data['name'], pv=data['version']) + logger.debug("PauseIdQuery.pauseid = \"%s\"" % pq.pauseid) + if pq.pauseid != None: + extravalues['PAUSEID'] = pq.pauseid + logger.debug("PAUSEID = \"%s\"" % extravalues['PAUSEID']) + aq = AuthorQuery(pauseid=pq.pauseid) + logger.debug("AuthorQuery.author = \"%s\"" % aq.author) + if aq.author != None: + extravalues['AUTHOR'] = aq.author + logger.debug("AUTHOR = \"%s\"" % extravalues['AUTHOR']) + classes.append('cpan') + handled.append('buildsystem') + absq = AbstractQuery(pn=data['name'], pv=data['version']) + if absq.abstract != None: + extravalues['SUMMARY'] = absq.abstract + logger.info("SUMMARY = \"%s\"" % extravalues['SUMMARY']) + hpq = HomepageQuery(pn=data['name'], pv=data['version']) + if hpq.homepage != None: + extravalues['HOMEPAGE'] = hpq.homepage + logger.info("HOMEPAGE = \"%s\"" % extravalues['HOMEPAGE']) + btq = BugtrackerQuery(pn=data['name'], pv=data['version']) + if btq.bugtracker != None: + extravalues['BUGTRACKER'] = btq.bugtracker + logger.info("BUGTRACKER = \"%s\"" % extravalues['BUGTRACKER']) + lq = LicenseQuery(pn=data['name'], pv=data['version']) + # if no license in response, try looking for LICENSE file and match text + # otherwise, look in README for typical copyright/license clause + # finally, punt and leave it to the user + try: + license_file = RecipeHandler.checkfiles(srctree, ['LICENSE'])[0] + except IndexError: + license_file = False + try: + readme_file = RecipeHandler.checkfiles(srctree, ['README'])[0] + except IndexError: + readme_file = False + if license_file: + if "under the same terms as Perl itself." in open(license_file, 'r').read(): + extravalues['LICENSE'] = "Artistic-1.0 | GPL-1.0+" + logger.info("LICENSE = \"%s\"" % extravalues['LICENSE']) + else: + # figure out another way to determine the license from the license file + extravalues['LICENSE'] = "Unknown" + logger.debug("LICENSE = \"%s\"" % extravalues['LICENSE']) + perl_license = re.compile(r"This program is free software; you may redistribute it and/or modify it under the same terms as Perl itself.") + with open(license_file, 'r') as f: + logger.info("LICENSE: %s" % f.read()) + logger.debug('re.search %s ' % re.search("under the same terms as Perl itself", f.read())) + logger.debug('perl_license.search %s ' % perl_license.search(f.read())) + logger.debug('perl_license.match %s ' % perl_license.match(f.read())) + if perl_license.match(f.read()): + logger.debug('LICENSE file matches perl_5 license') + extravalues['LICENSE'] = "Artistic-1.0 | GPL-1.0+" + if readme_file: + # need to match COPYRIGHT text and use beginline endline + if "under the same terms as Perl itself." in open(readme_file, 'r').read(): + # need to handle similar to guess_license in create.py + extravalues['LICENSE'] = "Artistic-1.0 | GPL-1.0+" + logger.info("LICENSE = \"%s\"" % extravalues['LICENSE']) + else: + # figure out another way to determine the license from the readme file + extravalues['LICENSE'] = "Unknown" + logger.info("LICENSE = \"%s\"" % extravalues['LICENSE']) + elif lq.license != None: + extravalues['LICENSE'] = lq.license + logger.info("LICENSE = \"%s\"" % extravalues['LICENSE']) + deps = data.get('dependencies', {}) + logger.debug(deps) + bdq = BuildDependsQuery(pn=data['name'], pv=data['version']) + + #updated = self._handle_dependencies(tinfoil.config_data, deps, lines_before, srctree) + #if updated: + # We need to redo the license stuff + # self._replace_license_vars(srctree, lines_before, handled, extravalues, tinfoil.config_data) + # if line.startswith('LICENSE = '): + # lines_before[i] = 'LICENSE = "%s"' % ' & '.join(all_licenses) + + # Need to move S setting after inherit npm + for i, line in enumerate(lines_before): + if line.startswith('S ='): + lines_before.pop(i) + lines_after.insert(0, '# Must be set after inherit npm since that itself sets S') + lines_after.insert(1, line) + break + + return True + + return False + +# def _handle_dependencies(self, d, deps, lines_before, srctree): +# import scriptutils + #declared_build_deps = #_build_dependency_query() + #declared_runtime_deps = #_runtime_dependency_query() + #declared_test_deps = #_test_dependency_query() +# return declared_build_deps + +def register_recipe_handlers(handlers): + handlers.append((CpanRecipeHandler(), 80)) + +# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4 diff --git a/scripts/lib/recipetool/metacpan/__init__.py b/scripts/lib/recipetool/metacpan/__init__.py new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/scripts/lib/recipetool/metacpan/__init__.py diff --git a/scripts/lib/recipetool/metacpan/query.py b/scripts/lib/recipetool/metacpan/query.py new file mode 100644 index 00000000000..4b1725a6831 --- /dev/null +++ b/scripts/lib/recipetool/metacpan/query.py @@ -0,0 +1,535 @@ +import json +import logging +import re +import requests +import scriptutils +import string + +DEBUG = False + +logger = logging.getLogger('recipetool') + +class MetaCPANQuery(object): + + def __init__(self): + pass + +class GetQuery(MetaCPANQuery): + + def __init__(self, params=None): + self.params = params + + +class PostQuery(MetaCPANQuery): + url = "https://fastapi.metacpan.org/v1/_search" + + def __init__(self, + url="https://fastapi.metacpan.org/v1/_search", + data=None): + self.url = url + self.data = data + super(MetaCPANQuery, self).__init__() + + +class ReleaseQuery(PostQuery): + url = 'https://fastapi.metacpan.org/v1/release/_search' + + def __init__(self, + url='https://fastapi.metacpan.org/v1/release/_search', + data=None, pn=None, pv=None, fields=[]): + self.pn = pn + self.pv = pv + self.fields = fields + self.release = { 'release': self.pn, + 'version': self.pv } + self.query = {"query": { 'match_all':{} }} + self.query["fields"] = self.fields + self.query["filter"] = { 'and': + [{'term': {'distribution': '%s' % self.pn}}, + {'term': {'version': '%s' % self.pv}}]} + self.data = json.dumps(self.query) + super(ReleaseQuery, self).__init__(url=url, data=self.data) + self.url = url + + def _query(self): + r = requests.post(url=self.url,data=self.data) + if r.status_code == 200: + return r + else: + logger.error( "ReleaseQuery => Response: %s" % r.status_code ) + return None + + +class PauseIdQuery(ReleaseQuery): + + def __init__(self, pn, pv): + self.pn = pn + self.pv = pv + self.fields = ["author"] + super(PauseIdQuery, self).__init__(self, pn=self.pn, pv=self.pv, fields=self.fields) + self.url = ReleaseQuery.url + self.pauseid = self._pauseid_query() + + def _pauseid_query(self): + r = ReleaseQuery._query(self) + #logger.debug("_pauseid_query: r.json(): %s " % r.json()) + #logger.debug("_pauseid_query: r.json().get('hits'): %s " % r.json().get('hits')) + if r != None: + self.pauseid = r.json().get('hits').get('hits')[0].get('fields').get('author') + # TODO: add to file data : print( "PAUSEID: %s" % result ) + return self.pauseid + else: + logger.error( "PauseIdQuery => Response: %s" % r.status_code ) + self.pauseid = None + return self.pauseid + + +class AuthorQuery(PostQuery): + + def __init__(self, + url='https://fastapi.metacpan.org/v1/author/_search', + pauseid=''): + self.url = url + self.pauseid = pauseid + self.query = {"query": { "match_all":{} }} + self.query["fields"] = ["name"] + self.query["filter"] = {"term": {"pauseid": "%s" % self.pauseid}} + self.data = json.dumps(self.query) + super(AuthorQuery, self).__init__(url=self.url, data=self.data) + self.author = self._author_query() + + def _author_query(self): + logger.debug("metacpan.query._author_query.query = %", self.data ) + r = requests.post(url=self.url,data=self.data) + if r.status_code == 200: + logger.debug("metacpan.query._author_query.r = %", r.json()) + self.author = r.json().get('hits').get('hits')[0].get('fields').get('name') + # TODO: add to file data: print( "AUTHOR = \"%s\"" % result ) + return self.author + else: + logger.error( "AuthorQuery => Response: %s" % r.status_code ) + self.author = None + return self.author + +class AbstractQuery(ReleaseQuery): + + def __init__(self, pn, pv): + self.pn = pn + self.pv = pv + self.fields = ["abstract"] + super(AbstractQuery, self).__init__(self, pn=pn, pv=pv, fields=self.fields) + self.url = ReleaseQuery.url + self.abstract = self._abstract_query() + + def _abstract_query(self): + r = ReleaseQuery._query(self) + if r != None: + self.abstract = r.json().get('hits').get('hits')[0].get('fields').get('abstract') + return self.abstract + else: + logger.error( "AbstractQuery => Response: %s" % r.status_code ) + self.abstract = None + return self.abstract + + +class HomepageQuery(ReleaseQuery): + """ + { + "query": { + "match_all": {} + }, + "size": 10, + "fields": [ "distribution", "version", "resources.homepage" ], + "filter": { + "and": [ + { "term": {"maturity": "released"} }, + { "term": {"status": "latest"} }, + { "exists" : { "field" : "resources.homepage" } } + ] + } + } + """ + def __init__(self, pn, pv): + logger.debug("HomepageQuery: __init__") + self.pn = pn + self.pv = pv + self.fields = ["resources.homepage"] + super(HomepageQuery, self).__init__(self, pn=pn, pv=pv, fields=self.fields) + self.url = ReleaseQuery.url + self.homepage = self._homepage_query() + + def _homepage_query(self): + #logger.debug("HomepageQuery: _homepage_query") + r = ReleaseQuery._query(self) + #logger.debug("_homepage_query: r.json().get('hits').get('hits')[0]: %s" % r.json().get('hits').get('hits')[0]) + if r.json().get('hits').get('hits')[0].get('fields') != None: + self.homepage = r.json().get('hits').get('hits')[0].get('fields').get('resources.homepage') + return self.homepage + else: + if r.status_code == 200: + logger.warn( "HomepageQuery: No 'homepage' in response") + else: + logger.error( "HomepageQuery => Response: %s" % r.status_code ) + self.homepage = None + return self.homepage + + +class BugtrackerQuery(ReleaseQuery): + + def __init__(self, pn, pv): + logger.debug("BugtrackerQuery: __init__") + self.pn = pn + self.pv = pv + self.fields = ["resources.bugtracker.web"] + super(BugtrackerQuery, self).__init__(self, pn=pn, pv=pv, fields=self.fields) + self.url = ReleaseQuery.url + self.bugtracker = self._bugtracker_query() + + def _bugtracker_query(self): + #logger.debug("BugtrackerQuery: _bugtracker_query") + r = ReleaseQuery._query(self) + #logger.debug("_bugtracker_query: r.json().get('hits').get('hits')[0]: %s" % r.json().get('hits').get('hits')[0]) + if r.json().get('hits').get('hits')[0].get('fields') != None: + self.bugtracker = r.json().get('hits').get('hits')[0].get('fields').get('resources.bugtracker.web') + return self.bugtracker + else: + if r.status_code == 200: + logger.warn( "BugtrackerQuery: No 'bugtracker' in response") + else: + logger.error( "BugtrackerQuery => Response: %s" % r.status_code ) + self.bugtracker = None + return self.bugtracker + + +class LicenseQuery(ReleaseQuery): + + def __init__(self, pn, pv): + self.pn = pn + self.pv = pv + self.fields = ["license"] + super(LicenseQuery, self).__init__(self, pn=pn, pv=pv, fields=self.fields) + self.url = ReleaseQuery.url + self.license = self._license_query() + + def _license_query(self): + r = ReleaseQuery._query(self) + logger.debug("_license_query: r => %s" % len(r.json().get('hits').get('hits'))) + logger.debug("_license_query: r => %s" % len(r.json().get('hits').get('hits')[0])) + if len(r.json().get('hits').get('hits')) > 0 and r.json().get('hits').get('hits')[0].get('fields') != None: + raw_license = r.json().get('hits').get('hits')[0].get('fields').get('license') + logger.debug("_license_query: raw_license => %s" % raw_license ) + if raw_license == 'perl_5': + self.license = "Artistic-1.0 | GPL-1.0+" + return self.license + else: + if r.status_code == 200: + logger.warn( "LicenseQuery: No 'license' in response") + else: + logger.error( "LicenseQuery => Response: %s" % r.status_code ) + self.license = "Unknown" + return self.license + + +class BuildDependsQuery(ReleaseQuery): + + def __init__(self, pn, pv): + self.pn = pn + self.pv = pv + self.fields = ["prereqs.configure.requires"] + super(BuildDependsQuery, self).__init__(self, pn=pn, pv=pv, fields=self.fields) + self.url = ReleaseQuery.url + self.build_depends = self._build_dependency_query() + + def _build_dependency_query(self): + r = ReleaseQuery._query(self) + logger.debug("_build_dependency_query: query => %s " % self.data) + logger.debug("_build_dependency_query: r.json => %s " % r.json()) + if r.json().get('hits').get('hits')[0].get('fields') != None: + logger.debug("_build_dependency_query: %s" % r.json() ) + result = r.json().get('hits').get('hits')[0].get('fields').get('prereqs.configure.requires') + mylist = list(result) + deps = ' '.join([dep for dep in mylist if dep is not '']) + inherit = 'inherit cpan' + if u'ExtUtils::MakeMaker' in deps: + inherit = 'inherit cpan' + deps = re.sub(u'ExtUtils::MakeMaker', '', deps) + elif u'Module::Build' in deps: + inherit = 'inherit cpan_build' + deps = re.sub(u'Module::Build', '', deps) + else: + logger.warn('Failed to interpret build engine defaulting to \"cpan\"') + inherit = 'inherit cpan' + deps = re.sub(u'ExtUtils::MakeMaker', '', deps) + deps = deps.strip() # strip leading or trailing whitespace + modules = deps.split() + distribution = list() + for module in modules: + distribution.append(_module_to_distribution(module)['distribution']) + if distribution: + depends = ' '.join([dist for dist in distribution if dist is not '']) + logger.warn("DEPENDS = \"%s\"" % depends) + logger.warn( inherit ) + return result + else: + if r.status_code == 200: + logger.warn( "BuildDependsQuery: No 'prereqs.configure.requires' in response") + else: + logger.error( "BuildDepndsQuery => Response: %s" % r.status_code ) + return None + + +class ModuleQuery(GetQuery): + + def __init__(self, module): + self.module = module + self.distribution = '' + self.version = '' + + +# NOTE: must have exact distribution name and exact version to get only one hit +pn = "Moo" +pv = "2.002004" +#url = "https://fastapi.metacpan.org/v1/release/_search" + + +""" /module/<module> is a convenience GET URL """ +def _module_to_distribution(module): + module_url = "http://fastapi.metacpan.org/v1/module/%s" % module + r = requests.get(url=module_url) + if DEBUG: print( r.url ) + if r.status_code == 200: + if DEBUG: print( r.json() ) + distribution = r.json().get('distribution') + version = r.json().get('version') + if DEBUG: print( "\"%s\" => \"%s\", \"%s\"" % ( module, distribution, version )) + return { "distribution": distribution, "version": version } + else: + print( "Response: %s" % r.status_code ) + return None, None + +""" /module/<module> is a convenience GET URL """ +def _module_to_debian_naming(module): + module_url = "http://fastapi.metacpan.org/v1/module/%s" % module + r = requests.get(url=module_url) + if DEBUG: print( r.url ) + if r.status_code == 200: + if DEBUG: print( r.json() ) + name = r.json().get('path') + if DEBUG: print( "\"%s\" => \"%s\"" % ( module, name )) + name = re.sub('^lib/', 'lib', name) + name = re.sub('\.pm$', '-perl', name) + name = re.sub('/', '-', name) + name = name.encode('utf-8').lower() + return name + else: + print( "Response: %s" % r.status_code ) + return None + +""" /module/<module> is a convenience GET URL """ +def _distribution_to_debian_naming(module): + module_url = "http://fastapi.metacpan.org/v1/module/%s" % module + r = requests.get(url=module_url) + if DEBUG: print( r.url ) + if r.status_code == 200: + if DEBUG: print( r.json() ) + name = r.json().get('path') + if DEBUG: print( "\"%s\" => \"%s\"" % ( module, name )) + name = re.sub('^lib/', 'lib', name) + name = re.sub('\.pm$', '-perl', name) + name = re.sub('/', '-', name) + return name + else: + print( "Response: %s" % r.status_code ) + return None + +""" Returns 'abstract' which is what is known as 'SUMMARY' in OE """ +def _abstract_query(): + query = json.dumps({'query': { 'match_all':{} }, 'fields': ['abstract'], 'filter': { 'and': [{'term': {'release.distribution': '%s' % pn}}, {'term': {'release.version': '%s' % pv}}]}}) + if DEBUG: print( query ) + r = requests.post(url=url,data=query) + if r.status_code == 200: + if DEBUG: print( r.json() ) + result = r.json().get('hits').get('hits')[0].get('fields').get('abstract') + print( "SUMMARY = \"%s\"" % result) + return result + else: + print( "Response: %s" % r.status_code ) + return None + +""" This is not often populated """ +def _homepage_query(): + query = json.dumps({'query': { 'match_all':{} }, 'fields': ['resources.homepage'], 'filter': { 'and': [{'term': {'release.distribution': '%s' % pn}}, {'term': {'release.version': '%s' % pv}}]}}) + if DEBUG: print( query ) + r = requests.post(url=url,data=query) + if r.status_code == 200: + if DEBUG: print( r.json() ) + try: + result = r.json().get('hits').get('hits')[0].get('fields').get('resources.homepage') + except: + result = "https://metacpan.org/pod/%s" % pn + print( "HOMEPAGE = \"%s\"" % result) + return result + else: + print( "Response: %s" % r.status_code ) + return None + +""" This query will return the license 'perl_5' """ +def _license_query(): + query = json.dumps({'query': { 'match_all':{} }, 'fields': ['license'], 'filter': { 'and': [{'term': {'release.distribution': '%s' % pn}}, {'term': {'release.version': '%s' % pv}}]}}) + if DEBUG: print( query ) + r = requests.post(url=url,data=query) + if r.status_code == 200: + if DEBUG: print( r.json() ) + result = r.json().get('hits').get('hits')[0].get('fields').get('license') + if result == 'perl_5': result = 'Artistic-1.0 | GPL-1.0+' + print( "LICENSE = \"%s\"" % result) + return result + else: + print( "Response: %s" % r.status_code ) + return None + +def _pauseid_query(pn, pv): + query = json.dumps({'query': { 'match_all':{} }, 'fields': ['author'], 'filter': { 'and': [{'term': {'release.distribution': '%s' % pn}}, {'term': {'release.version': '%s' % pv}}]}}) + logger.debug( query ) + r = requests.post(url=url,data=query) + if r.status_code == 200: + logger.debug( r.json() ) + result = r.json().get('hits').get('hits')[0].get('fields').get('author') + print( "PAUSEID: %s" % result ) + return result + else: + print( "Response: %s" % r.status_code ) + return None + +def _author_query(pn, pv): + author_url = "http://fastapi.metacpan.org/v1/author/_search" + self.query = {'query': { 'match_all':{} }} + self.query['fields'] = ['name'] + self.query['filter'] = { 'term': {'pauseid': '%s' % self.pauseid}} + query = json.dumps(self.query) + print( query ) + #logger.debug(print( query )) + r = requests.post(url=author_url,data=query) + if r.status_code == 200: + #logger.debug(print( r.json() )) + result = r.json().get('hits').get('hits')[0].get('fields').get('name') + print( "AUTHOR = \"%s\"" % result ) + return result + else: + print( "Response: %s" % r.status_code ) + return None + +def _build_dependency_query(): + query = json.dumps({'query': { 'match_all':{} }, 'fields': ['metadata.prereqs.configure.requires'], 'filter': { 'and': [{'term': {'release.distribution': '%s' % pn}}, {'term': {'release.version': '%s' % pv}}]}}) + if DEBUG: print( query ) + r = requests.post(url=url,data=query) + if r.status_code == 200: + if DEBUG: print( r.json() ) + result = r.json().get('hits').get('hits')[0].get('fields').get('metadata.prereqs.configure.requires') + mylist = list(result) + deps = ' '.join([dep for dep in mylist if dep is not '']) + inherit = 'inherit cpan' + if u'ExtUtils::MakeMaker' in deps: + inherit = 'inherit cpan' + deps = re.sub(u'ExtUtils::MakeMaker', '', deps) + elif u'Module::Build' in deps: + inherit = 'inherit cpan_build' + deps = re.sub(u'Module::Build', '', deps) + else: + print( 'Failed to interpret build engine defaulting to \"cpan\"') + deps = deps.strip() # strip leading or trailing whitespace + modules = deps.split() + distribution = list() + for module in modules: + distribution.append(_module_to_distribution(module)['distribution']) + if distribution: + depends = ' '.join([dist for dist in distribution if dist is not '']) + print( "DEPENDS = \"%s\"" % depends ) + print( inherit ) + return result + else: + print( "Response: %s" % r.status_code ) + return None + +def _runtime_dependency_query(): + query = json.dumps({'query': { 'match_all':{} }, 'fields': ['metadata.prereqs.runtime.requires'], 'filter': { 'and': [{'term': {'release.distribution': '%s' % pn}}, {'term': {'release.version': '%s' % pv}}]}}) + if DEBUG: print( query ) + r = requests.post(url=url,data=query) + if r.status_code == 200: + if DEBUG: print( r.json() ) + result = r.json().get('hits').get('hits')[0].get('fields').get('metadata.prereqs.runtime.requires') + mylist = list(result) + deps = ' '.join([dep for dep in mylist if dep is not '']) + deps.strip() + modules = deps.split() + distribution = list() + for module in modules: + distribution.append(_module_to_distribution(module)['distribution']) + if distribution: + rdepends = ' '.join([dist for dist in distribution if dist is not '']) + print( "RDEPENDS_${PN} = \"%s\"" % rdepends ) + return rdepends + else: + print( "Response: %s" % r.status_code ) + return None + +def _test_dependency_query(): + query = json.dumps({'query': { 'match_all':{} }, 'fields': ['metadata.prereqs.test.requires'], 'filter': { 'and': [{'term': {'release.distribution': '%s' % pn}}, {'term': {'release.version': '%s' % pv}}]}}) + if DEBUG: print( query ) + r = requests.post(url=url,data=query) + if r.status_code == 200: + if DEBUG: print( r.json() ) + result = r.json().get('hits').get('hits')[0].get('fields').get('metadata.prereqs.test.requires') + mylist = list(result) + deps = ' '.join([dep for dep in mylist if dep is not '']) + modules = deps.split() + distribution = list() + for module in modules: + distribution.append(_module_to_distribution(module)['distribution']) + if distribution: + rdepends = ' '.join([dist for dist in distribution if dist is not '']) + print( "RDEPENDS_${PN}-ptest = \"%s\"" % rdepends ) + return rdepends + else: + print( "Response: %s" % r.status_code ) + return None + +def _provides_query(): + query = json.dumps({'query': { 'match_all':{} }, 'fields': ['provides'], 'filter': { 'and': [{'term': {'release.distribution': '%s' % pn}}, {'term': {'release.version': '%s' % pv}}]}}) + if DEBUG: print( query ) + r = requests.post(url=url,data=query) + if r.status_code == 200: + if DEBUG: print( r.json() ) + result = r.json().get('hits').get('hits')[0].get('fields').get('provides') + mylist = list(result) + # 'provides' which start with underscore are always internal only + provides = ' '.join([provide for provide in mylist if provide is not '' and not '::_' in provide]) + modules = provides.split() + for module in modules: + provides = ' '.join([_module_to_debian_naming( module ) for module in modules]) + print( "PROVIDES_${PN} = \"%s\"" % provides ) + return result + else: + print( "Response: %s" % r.status_code ) + return None + +if __name__ == "__main__": + #DEBUG = True + _abstract_query() + _bugtracker_query() + _homepage_query() + _license_query() + _author_query() + _build_dependency_query() + _runtime_dependency_query() + _test_dependency_query() + _provides_query() + _module_to_debian_naming() +# TODO: FILES_${PN}-ptest = "/t" and a reasonable run-ptest script +# perl Makefile.pl / make test => something better? +# strip makefile and only package test goal? +# +# TODO: map module name to perl-* or lib*-perl +# use generated lookup table for perl-* mapping +# might need to build all of meta-perl before mapping lib*-perl +# or use a versioned generated lookup table |