From 3d537d4b4e25189ee3fcbe8d4fb3dd7def702b1b Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Aug 12 2016 14:33:19 +0000 Subject: Add the possibility to query package by the name of their source package --- diff --git a/mdapi/__init__.py b/mdapi/__init__.py index beeddac..4f82bb1 100644 --- a/mdapi/__init__.py +++ b/mdapi/__init__.py @@ -56,10 +56,13 @@ with open(indexfile) as stream: @asyncio.coroutine -def _get_pkg(branch, name, action=None): +def _get_pkg(branch, name=None, action=None, srcname=None): ''' Return the pkg information for the given package in the specified branch or raise an aiohttp exception. ''' + if not name and not srcname: + raise web.HTTPBadRequest() + pkg = None wrongdb = False for repotype in ['updates-testing', 'updates', 'testing', None]: @@ -80,11 +83,14 @@ def _get_pkg(branch, name, action=None): with file_lock.FileFlock(dbfile + '.lock'): session = yield from mdapilib.create_session( 'sqlite:///%s' % dbfile) - if action: - pkg = yield from mdapilib.get_package_by( - session, action, name) - else: - pkg = yield from mdapilib.get_package(session, name) + if name: + if action: + pkg = yield from mdapilib.get_package_by( + session, action, name) + else: + pkg = yield from mdapilib.get_package(session, name) + elif srcname: + pkg = yield from mdapilib.get_package_by_src(session, srcname) session.close() if pkg: break @@ -184,6 +190,22 @@ def get_pkg(request): @asyncio.coroutine +def get_src_pkg(request): + branch = request.match_info.get('branch') + pretty = _get_pretty(request) + name = request.match_info.get('name') + pkg, repotype = yield from _get_pkg(branch, srcname=name) + + output = yield from _expand_pkg_info(pkg, branch, repotype) + + args = {} + if pretty: + args = dict(sort_keys=True, indent=4, separators=(',', ': ')) + + return web.Response(body=json.dumps(output, **args).encode('utf-8'), + content_type='application/json') + +@asyncio.coroutine def get_pkg_files(request): branch = request.match_info.get('branch') name = request.match_info.get('name') @@ -343,6 +365,7 @@ def init(loop): ('/', index), ('/branches', list_branches), ('/{branch}/pkg/{name}', get_pkg), + ('/{branch}/srcpkg/{name}', get_src_pkg), ('/{branch}/provides/{name}', get_provides), ('/{branch}/requires/{name}', get_requires), diff --git a/mdapi/lib.py b/mdapi/lib.py index fce7fb0..3d8380c 100644 --- a/mdapi/lib.py +++ b/mdapi/lib.py @@ -101,6 +101,34 @@ def get_package(session, pkg_name): return output + +@asyncio.coroutine +def get_package_by_src(session, pkg_name): + ''' Return information about a package, if we can find it. + ''' + cnt = 0 + try: + pkg = session.query( + primary.Package + ).filter( + primary.Package.rpm_sourcerpm.like('{}%'.format(pkg_name)) + ).order_by( + primary.Package.epoch.desc(), + primary.Package.version.desc(), + primary.Package.release.desc(), + ) + output = pkg.first() + except SQLAlchemyError as err: + cnt += 1 + if cnt > RETRY_ATTEMPT: + raise + else: + time.sleep(0.1) + output = yield from get_package(session, pkg_name) + + return output + + @asyncio.coroutine def get_package_by(session, tablename, key, cnt=None): ''' Return information the package providing the provides, if we can find it.