From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from pigeon.gentoo.org ([208.92.234.80] helo=lists.gentoo.org) by finch.gentoo.org with esmtp (Exim 4.60) (envelope-from ) id 1ScMII-00016h-DP for garchives@archives.gentoo.org; Wed, 06 Jun 2012 19:53:26 +0000 Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id C1136E093A; Wed, 6 Jun 2012 19:52:38 +0000 (UTC) Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) by pigeon.gentoo.org (Postfix) with ESMTP id 7D73EE093A for ; Wed, 6 Jun 2012 19:52:38 +0000 (UTC) Received: from hornbill.gentoo.org (hornbill.gentoo.org [94.100.119.163]) (using TLSv1 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id A9FF81B404D for ; Wed, 6 Jun 2012 19:52:37 +0000 (UTC) Received: from localhost.localdomain (localhost [127.0.0.1]) by hornbill.gentoo.org (Postfix) with ESMTP id 8B143E543A for ; Wed, 6 Jun 2012 19:52:35 +0000 (UTC) From: "André Erdmann" To: gentoo-commits@lists.gentoo.org Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "André Erdmann" Message-ID: <1339012032.f0a5ee703f0d23a4968963f57817336486806451.dywi@gentoo> Subject: [gentoo-commits] proj/R_overlay:master commit in: roverlay/ X-VCS-Repository: proj/R_overlay X-VCS-Files: roverlay/ebuildcreator.py roverlay/ebuildjob.py X-VCS-Directories: roverlay/ X-VCS-Committer: dywi X-VCS-Committer-Name: André Erdmann X-VCS-Revision: f0a5ee703f0d23a4968963f57817336486806451 X-VCS-Branch: master Date: Wed, 6 Jun 2012 19:52:35 +0000 (UTC) Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: quoted-printable X-Archives-Salt: 7b25275b-5190-4351-aa30-38bcadd9ff60 X-Archives-Hash: ce8c434d5bc40c49254aeff798e596db commit: f0a5ee703f0d23a4968963f57817336486806451 Author: Andr=C3=A9 Erdmann mailerd de> AuthorDate: Wed Jun 6 19:47:12 2012 +0000 Commit: Andr=C3=A9 Erdmann mailerd de> CommitDate: Wed Jun 6 19:47:12 2012 +0000 URL: http://git.overlays.gentoo.org/gitweb/?p=3Dproj/R_overlay.git= ;a=3Dcommit;h=3Df0a5ee70 add dependency resolution to ebuild creation modified: roverlay/ebuildcreator.py modified: roverlay/ebuildjob.py --- roverlay/ebuildcreator.py | 11 +++-- roverlay/ebuildjob.py | 111 ++++++++++++++++++++++++++++-----------= ------ 2 files changed, 75 insertions(+), 47 deletions(-) diff --git a/roverlay/ebuildcreator.py b/roverlay/ebuildcreator.py index bc74490..3713c3b 100644 --- a/roverlay/ebuildcreator.py +++ b/roverlay/ebuildcreator.py @@ -3,6 +3,8 @@ # Distributed under the terms of the GNU General Public License v2 =20 from roverlay.ebuildjob import EbuildJob +from roverlay.depres import depresolver +from roverlay.depres.communication import EbuildJobChannel =20 class EbuildCreator: =20 @@ -12,7 +14,7 @@ class EbuildCreator: every R package added. """ self.ebuild_headers =3D dict () - self.depresolve_main =3D None # TODO + self.depresolve_main =3D depresolver.DependencyResolver () self.ebuild_jobs =3D [] =20 # --- end of init (...) --- @@ -26,7 +28,7 @@ class EbuildCreator: * package_file -- path R package file """ =20 - new_job =3D EbuildJob ( package_file, self.get_resolver ( False ) ) + new_job =3D EbuildJob ( package_file, self.get_resolver_channel ) =20 self.ebuild_jobs.append ( new_job ) =20 @@ -34,15 +36,14 @@ class EbuildCreator: =20 # --- end of add_package (...) --- =20 - def get_resolver ( self, readonly=3DTrue ): + def get_resolver_channel ( self, name=3DNone ): """Returns a communication channel to the dependency resolver. =20 arguments: readonly -- whether the channel is listen-only (no write methods) or n= ot defaults to True """ - # - return None + return self.depresolve_main.register_channel ( EbuildJobChannel ( name= =3Dname ) ) #return self.depresolve_main.get_channel() =20 # --- end of get_resolver (...) --- diff --git a/roverlay/ebuildjob.py b/roverlay/ebuildjob.py index be8e5e3..fa13a48 100644 --- a/roverlay/ebuildjob.py +++ b/roverlay/ebuildjob.py @@ -36,7 +36,7 @@ class EbuildJob: FAIL =3D [], ) =20 - def __init__ ( self, package_file, dep_resolver=3DNone ): + def __init__ ( self, package_file, depres_channel_spawner=3DNone ): """Initializes an EbuildJob, which creates an ebuild for an R package. =20 arguments: @@ -49,8 +49,6 @@ class EbuildJob: dep resolver 'communication channel', status codes etc. """ =20 - #self.package_file =3D package_file - self.dep_resolver =3D dep_resolver # get description reader from args? self.description_reader =3D DescriptionReader ( package_file ) =20 @@ -58,10 +56,26 @@ class EbuildJob: =20 self.ebuild =3D None =20 + # only allow a function (at least callable) for self.get_resolver + if hasattr ( depres_channel_spawner, '__call__' ): + self.request_resolver =3D depres_channel_spawner + # _depres contains (almost) dependency resolution data/.., including + # communication channels and should only be modified in run() + self._depres =3D dict () + else: + self.request_resolver =3D None + self.status =3D 'INIT' =20 # --- end of __init__ (...) --- =20 + def get_resolver ( self, dependency_type ): + if not dependency_type in self._depres: + self._depres [dependency_type] =3D self.request_resolver () + + return self._depres [dependency_type] + + def get_ebuild ( self ): """Returns the Ebuild that is created by this object. Note that you sh= ould check the status with status ( $TODO::EBUILD_READY ) before trying to = use @@ -148,73 +162,86 @@ class EbuildJob: False ) =20 - if self.dep_resolver and self.dep_resolver.enabled(): + if not self.request_resolver is None: + + dep_type =3D desc_field =3D None =20 - # collect depdencies from desc and add them to the resolver - raw_depends =3D dict () =20 - dep_type =3D field =3D None + for dep_type in EbuildJob.DEPENDENCY_FIELDS: =20 - for dep_type in EbuildJob.DEPENDENCY_FIELDS.keys(): + resolver =3D None =20 - raw_depends [dep_type] =3D [] + for desc_field in EbuildJob.DEPENDENCY_FIELDS [dep_type]: =20 - for field in EbuildJob.DEPENDENCY_FIELDS [dep_type]: + if desc_field in desc: + if not resolver: + resolver =3D self.get_resolver ( dep_type ) =20 - if field in desc: - if isinstance ( desc [field], list ): - raw_depends.extend ( desc [field] ) - self.dep_resolver.add_dependencies ( desc [field] ) + if isinstance ( desc [desc_field], list ): + resolver.add_dependencies ( desc [desc_field] ) =20 else: - raw_depends.append ( desc [field] ) - self.dep_resolver.add_depency ( desc [field] ) + resolver.add_depency ( desc [desc_field] ) =20 - del field, dep_type + del resolver =20 =20 - while not self.dep_resolver.done(): + # wait + resolver_list =3D self._depres.values() + wait_resolve =3D True + while wait_resolve: + wait_resolve =3D False =20 if not self._set_status ( 'WAIT_RESOLVE' ): return =20 + self.logger.debug ( "WAITING" ) + # tell the resolver to run (again) - self.dep_resolver.run() + for r in resolver_list : r.trigger_run () =20 if not self._set_status ( 'BUSY' ): return =20 - if self.dep_resolver.satisfy_request(): + for r in resolver_list : + if not r.done (): + wait_resolve =3D True + break =20 - dep_type =3D dep_str =3D dep =3D None =20 + # check if all deps resolved + deps_resolved =3D True + for r in resolver_list: + if not r.satisfy_request(): + deps_resolved =3D False + break + + if deps_resolved: # dependencies resolved, add them to the ebuild - for dep_type in raw_depends.keys(): - - for dep_str in raw_depends [dep_type]: - # lookup (str) should return a str here - dep =3D self.dep_resolver.lookup ( dep_str ) - if dep is None: - raise Exception ( - "dep_resolver is broken: lookup() returns None but satisfy_requ= est() says ok." - ) - else: - # add depencies in append mode - dep =3D self.dep_resolver.lookup ( dep_str ) - ebuild.add ( dep_type, - self.dep_resolver.lookup ( dep_str ), - True - ) + for dep_type, resolver in self._depres.items(): + + deplist =3D resolver.collect_dependencies () =20 - del dep, dep_str, dep_type + if deplist is None or not isinstance ( deplist, list ): + ## false positive: "empty" channel + raise Exception ( + "dep_resolver is broken: lookup() returns None but satisfy_reque= st() says ok." + ) + else: + # add dependencies in no_append/override mode + ebuild.add ( dep_type, deplist, False ) =20 - # tell the dep resolver that we're done here - self.dep_resolver.close() + # tell the dep resolver channels that we're done + for r in resolver_list: r.close () =20 else: - # ebuild is not creatable, set status to FAIL and close dep resolve= r + # ebuild is not creatable, set status to FAIL and close dep resolve= rs + self.logger.info ( "Failed to resolve dependencies for this package= ." ) + for r in resolver_list: r.close () self._set_status ( 'FAIL' ) - self.dep_resolver.close() return =20 + # --- end dep resolution + + ## finalize self.ebuild: forced text creation + make it readonly if ebuild.prepare ( True, True ): self.ebuild =3D ebuild