public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-commits] proj/R_overlay:master commit in: /, roverlay/config/, roverlay/, roverlay/overlay/
@ 2013-01-09 19:15 André Erdmann
  0 siblings, 0 replies; only message in thread
From: André Erdmann @ 2013-01-09 19:15 UTC (permalink / raw
  To: gentoo-commits

commit:     c21ba468360abafe892920d675c4c4731bc40b7f
Author:     André Erdmann <dywi <AT> mailerd <DOT> de>
AuthorDate: Thu Nov 29 19:53:33 2012 +0000
Commit:     André Erdmann <dywi <AT> mailerd <DOT> de>
CommitDate: Thu Nov 29 21:19:16 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=c21ba468

misc changes

* roverlay.py,
-> renamed "overlay" variable to "overlay_creator"
-> some action if-branches replaced by elif-branches

* roverlay/__init__.py,
-> replaced "config.<sth>" and "roverlay.config.<sth>" with
   "roverlay_config.<sth>" in load_config_file(...)

* roverlay/overlay/,
-> the default overlay is now created in ./root.py (new_configured())
   instead of ./creator.py
-> fix Overlay.list_packages()

* roverlay/packageinfo.py
-> make update key sets class-wide

Bump version to 0.2.1

---
 roverlay.py                 |   78 ++++++++++++++++++++++---------------------
 roverlay/__init__.py        |   21 +++++++-----
 roverlay/config/static.py   |   13 +++----
 roverlay/overlay/creator.py |    8 +---
 roverlay/overlay/root.py    |   50 ++++++++++++++++++++++-----
 roverlay/packageinfo.py     |   66 ++++++++++++++++++++++++++++--------
 roverlay/util.py            |    3 +-
 7 files changed, 153 insertions(+), 86 deletions(-)

diff --git a/roverlay.py b/roverlay.py
index 3a0232a..51dfeec 100755
--- a/roverlay.py
+++ b/roverlay.py
@@ -56,8 +56,6 @@ def roverlay_main():
 			return call ( *args, **kw )
 	# --- end of optionally (...) ---
 
-	#repo_list = None
-	#overlay   = None
 	def run_sync():
 		if "sync" in actions_done: return
 		try:
@@ -97,21 +95,22 @@ def roverlay_main():
 		if "create" in actions_done: return
 		#run_sync()
 		try:
-			global overlay
-			overlay = OverlayCreator (
+			global overlay_creator
+			overlay_creator = OverlayCreator (
 				skip_manifest           = OPTION ( 'skip_manifest' ),
 				incremental             = OPTION ( 'incremental' ),
 				allow_write             = OPTION ( 'write_overlay' ),
 				immediate_ebuild_writes = OPTION ( 'immediate_ebuild_writes' ),
 			)
 
-			repo_list.add_packages ( overlay.add_package )
+			repo_list.add_packages ( overlay_creator.add_package )
 
-			overlay.run ( close_when_done=True )
+			overlay_creator.run ( close_when_done=True )
 
-			optionally ( overlay.write_overlay, 'write_overlay' )
-			optionally ( overlay.show_overlay,  'show_overlay'  )
-			if OPTION ( 'print_stats' ): print ( "\n" + overlay.stats_str() )
+			optionally ( overlay_creator.write_overlay, 'write_overlay' )
+			optionally ( overlay_creator.show_overlay,  'show_overlay'  )
+			if OPTION ( 'print_stats' ):
+				print ( "\n" + overlay_creator.stats_str() )
 
 			set_action_done ( "create" )
 
@@ -123,11 +122,11 @@ def roverlay_main():
 			else:
 				raise
 		finally:
-			if 'overlay' in locals() and not overlay.closed:
+			if 'overlay_creator' in locals() and not overlay_creator.closed:
 				# This is important 'cause it unblocks remaining ebuild creation
 				# jobs/threads, specifically waiting EbuildJobChannels in depres.
 				# It also writes the deps_unresolved file
-				overlay.close()
+				overlay_creator.close()
 	# --- end of run_overlay_create() ---
 
 	# get args
@@ -235,11 +234,11 @@ def roverlay_main():
 
 
 	if 'EXIT_AFTER_CONFIG' in locals() and EXIT_AFTER_CONFIG:
-		sys.exit ( os.EX_OK )
-
+		pass
+		#sys.exit ( os.EX_OK )
 
 	# switch to depres console
-	if 'depres_console' in actions or 'depres' in actions:
+	elif 'depres_console' in actions or 'depres' in actions:
 		if len ( actions ) != 1:
 			die ( "depres_console cannot be run with other commands!", DIE.USAGE )
 
@@ -259,38 +258,41 @@ def roverlay_main():
 			else:
 				raise
 
+	else:
+		# sync/create
+		# -- import roverlay modules
 
+		try:
+			from roverlay.remote          import RepoList
+			from roverlay.overlay.creator import OverlayCreator
+		except ImportError:
+			if HIDE_EXCEPTIONS:
+				die ( "Cannot import roverlay modules!", DIE.IMPORT )
+			else:
+				raise
 
-	# -- import roverlay modules
-
-	try:
-		from roverlay.remote          import RepoList
-		from roverlay.overlay.creator import OverlayCreator
-	except ImportError:
-		if HIDE_EXCEPTIONS:
-			die ( "Cannot import roverlay modules!", DIE.IMPORT )
-		else:
-			raise
+		# -- run methods (and some vars)
+		# imports: nothing
 
-	# -- run methods (and some vars)
-	# imports: nothing
+		#repo_list       = None
+		#overlay_creator = None
 
-	actions_done = set()
-	set_action_done = actions_done.add
+		actions_done = set()
+		set_action_done = actions_done.add
 
-	# -- run
+		# -- run
 
-	# always run sync 'cause commands = {create,sync}
-	# and create implies (no)sync
-	run_sync()
+		# always run sync 'cause commands = {create,sync}
+		# and create implies (no)sync
+		run_sync()
 
-	if 'create' in actions: run_overlay_create()
+		if 'create' in actions: run_overlay_create()
 
-	if len ( actions ) > len ( actions_done ):
-		die (
-			"Some actions (out of {!r}) could not be performed!".format (
-				actions ), DIE.CMD_LEFTOVER
-		)
+		if len ( actions ) > len ( actions_done ):
+			die (
+				"Some actions (out of {!r}) could not be performed!".format (
+					actions ), DIE.CMD_LEFTOVER
+			)
 # --- end of main() ---
 
 if __name__ == '__main__':

diff --git a/roverlay/__init__.py b/roverlay/__init__.py
index ba8c032..f39c3a5 100644
--- a/roverlay/__init__.py
+++ b/roverlay/__init__.py
@@ -13,9 +13,9 @@ load_config_file) and some information vars (__version__, name, ...).
 __all__ = [ 'setup_initial_logger', 'load_config_file', ]
 
 name        = "R_overlay"
-version     = ( 0, 2 )
-__version__ = "0.2"
-#__version__ = '.'.join ( str ( i ) for i in version )
+version     = ( 0, 2, 1 )
+#__version__ = "0.2.1"
+__version__ = '.'.join ( str ( i ) for i in version )
 
 description_str = "R overlay creation (roverlay) " + __version__
 license_str=(
@@ -43,15 +43,18 @@ def load_config_file ( cfile, extraconf=None ):
 	* extraconf -- a dict with additional config entries that will override
 	               entries read from cfile
 	"""
+	roverlay_config = roverlay.config.access()
+
 	if cfile:
-		roverlay.config.get_loader().load_config ( cfile )
+		roverlay_config.get_loader().load_config ( cfile )
 
 	if extraconf is not None:
-		roverlay.config.access().merge_with ( extraconf )
+		roverlay_config.merge_with ( extraconf )
 
-	roverlay.recipe.easylogger.setup ( roverlay.config.access() )
+	roverlay.recipe.easylogger.setup ( roverlay_config )
 
-	fdef_f = config.get_or_fail ( "DESCRIPTION.field_definition_file" )
-	roverlay.config.get_loader().load_field_definition ( fdef_f )
+	roverlay_config.get_loader().load_field_definition (
+		roverlay_config.get_or_fail ( "DESCRIPTION.field_definition_file" )
+	)
 
-	return config.access()
+	return roverlay_config

diff --git a/roverlay/config/static.py b/roverlay/config/static.py
index dda6b58..e4c789e 100644
--- a/roverlay/config/static.py
+++ b/roverlay/config/static.py
@@ -37,14 +37,11 @@ def get ( key, fallback_value=None, fail_if_unset=False ):
 	* fallback_value --
 	* fail_if_unset  --
 	"""
-	if not fallback_value is None:
-		return access().get (
-			key, fallback_value=fallback_value, fail_if_unset=fail_if_unset
-		)
-	else:
-		return access().get (
-			key, fallback_value=None, fail_if_unset=fail_if_unset
-		)
+	return access().get (
+		key,
+		fallback_value = fallback_value,
+		fail_if_unset  = fail_if_unset
+	)
 # --- end of get (...) ---
 
 def get_or_fail ( key ):

diff --git a/roverlay/overlay/creator.py b/roverlay/overlay/creator.py
index 4b500df..1e1c3cb 100644
--- a/roverlay/overlay/creator.py
+++ b/roverlay/overlay/creator.py
@@ -50,6 +50,7 @@ class PseudoAtomicCounter ( object ):
 			if step > 0:
 				self._value += step
 				ret = ( self._value, old_val )
+			#elif step < 0: raise...
 			else:
 				ret = old_val
 		finally:
@@ -93,13 +94,8 @@ class OverlayCreator ( object ):
 		self._err_queue = errorqueue.ErrorQueue()
 
 		# init overlay using config values
-		self.overlay = Overlay (
-			name                = config.get_or_fail ( 'OVERLAY.name' ),
+		self.overlay = Overlay.new_configured (
 			logger              = self.logger,
-			directory           = config.get_or_fail ( 'OVERLAY.dir' ),
-			default_category    = config.get_or_fail ( 'OVERLAY.category' ),
-			eclass_files        = config.get ( 'OVERLAY.eclass_files', None ),
-			ebuild_header       = config.get ( 'EBUILD.default_header', None ),
 			incremental         = incremental,
 			write_allowed       = allow_write,
 			skip_manifest       = skip_manifest,

diff --git a/roverlay/overlay/root.py b/roverlay/overlay/root.py
index 99c0850..ae707ef 100644
--- a/roverlay/overlay/root.py
+++ b/roverlay/overlay/root.py
@@ -27,13 +27,45 @@ from roverlay import config, util
 from roverlay.overlay.category import Category
 from roverlay.overlay.header   import EbuildHeader
 
-DEFAULT_USE_DESC = '\n'.join ( [
-	'byte-compile - enable byte compiling',
-	'R_suggests - install recommended packages'
-] )
-
-
 class Overlay ( object ):
+	DEFAULT_USE_DESC = '\n'.join ( (
+		'byte-compile - enable byte compiling',
+		'R_suggests - install recommended packages'
+	) )
+
+	@classmethod
+	def new_configured ( cls,
+		logger, incremental, write_allowed, skip_manifest,
+		runtime_incremental=False
+	):
+		"""
+		Returns a new Overlay instance that uses the roverlay configuration where
+		possible.
+
+		arguments:
+		* logger              --
+		* incremental         --
+		* write_allowed       --
+		* skip_manifest       --
+		* runtime_incremental --
+		* readonly            -- see Overlay.__init__
+		"""
+		name = config.get_or_fail ( 'OVERLAY.name' )
+		return cls (
+			name                = name,
+			logger              = (
+				logger or logging.getLogger ( 'Overlay:' + name )
+			),
+			directory           = config.get_or_fail ( 'OVERLAY.dir' ),
+			default_category    = config.get_or_fail ( 'OVERLAY.category' ),
+			eclass_files        = config.get ( 'OVERLAY.eclass_files',  None ),
+			ebuild_header       = config.get ( 'EBUILD.default_header', None ),
+			incremental         = incremental,
+			write_allowed       = write_allowed,
+			skip_manifest       = skip_manifest,
+			runtime_incremental = runtime_incremental,
+		)
+	# --- end of new_configured (...) ---
 
 	def __init__ (
 		self,
@@ -46,7 +78,7 @@ class Overlay ( object ):
 		write_allowed,
 		incremental,
 		skip_manifest,
-		runtime_incremental=False
+		runtime_incremental=False,
 	):
 		"""Initializes an overlay.
 
@@ -234,7 +266,7 @@ class Overlay ( object ):
 			# profiles/use.desc
 			use_desc = config.get (
 				'OVERLAY.use_desc',
-				fallback_value=DEFAULT_USE_DESC
+				fallback_value=self.__class__.DEFAULT_USE_DESC
 			)
 			if use_desc:
 				write_profiles_file ( 'use.desc', use_desc + '\n' )
@@ -277,7 +309,7 @@ class Overlay ( object ):
 
 	def list_packages ( self, for_deprules=True ):
 		for cat in self._categories.values():
-			for package in cat.list_packages ( for_deprules=True ):
+			for package in cat.list_packages ( for_deprules=for_deprules ):
 				yield package
 	# --- end of list_packages (...) ---
 

diff --git a/roverlay/packageinfo.py b/roverlay/packageinfo.py
index 244dbb7..fb1a570 100644
--- a/roverlay/packageinfo.py
+++ b/roverlay/packageinfo.py
@@ -52,6 +52,14 @@ class PackageInfo ( object ):
 	                     loaded before import this module)
 	* ALWAYS_FALLBACK -- a set of keys for which get() always returns a
 	                     fallback value (None)
+
+	* _UPDATE_KEYS_SIMPLE         -- a set of keys that can be added
+	                                 without further checks
+	* _UPDATE_KEYS_SIMPLE_INITIAL -- like _UPDATE_KEYS_SIMPLE, but only used
+	                                 on the first update() call (as long as
+	                                 no keys have been stored)
+	* _UPDATE_KEYS_FILTER_NONE    -- like _UPDATE_KEYS_SIMPLE, but stores
+	                                 key's value only if it is not None
 	"""
 
 	EBUILDVER_REGEX = re.compile ( '[-]{1,}' )
@@ -60,6 +68,21 @@ class PackageInfo ( object ):
 	)
 	ALWAYS_FALLBACK = frozenset ( ( 'ebuild', 'ebuild_file' ) )
 
+	_UPDATE_KEYS_SIMPLE         = frozenset ((
+		'origin',
+		'ebuild',
+		'ebuild_file',
+		'physical_only',
+		'src_uri',
+	))
+	_UPDATE_KEYS_SIMPLE_INITIAL = frozenset ((
+		'package_filename',
+	))
+	_UPDATE_KEYS_FILTER_NONE    = frozenset ((
+		'src_uri_base',
+		'distdir',
+	))
+
 	def __init__ ( self, **initial_info ):
 		"""Initializes a PackageInfo.
 
@@ -155,6 +178,22 @@ class PackageInfo ( object ):
 
 	has = has_key
 
+	def has_key_or ( self, *keys ):
+		"""Returns True if at least one key out of keys is accessible.
+
+		arguments:
+		* *keys -- keys to check
+		"""
+		for k in keys:
+			if k in self._info:
+				return True
+			elif self.get ( k, do_fallback=True ) is not None:
+				return True
+		return False
+	# --- end of has_key_or (...) ---
+
+	has_or = has_key_or
+
 	def compare_version ( self, other_package ):
 		"""Compares the version of two PackageInfo objects.
 		Returns 1 if self's version is higher, -1 if lower and 0 if equal.
@@ -237,6 +276,13 @@ class PackageInfo ( object ):
 				return "http://localhost/R-packages/" + \
 					self._info ['package_filename']
 
+		elif key_low == 'ebuild_dir':
+			ebuild_file = self._info ['ebuild_file']
+			if ebuild_file is not None:
+				return os.path.dirname ( ebuild_file )
+
+		# end if <key matches ...>
+
 
 		# fallback
 		if do_fallback or fallback_value is not None:
@@ -309,27 +355,19 @@ class PackageInfo ( object ):
 			# nothing to do
 			return
 
-		simple_keys = frozenset ((
-			'origin',
-			'ebuild',
-			'ebuild_file',
-			'physical_only',
-			'src_uri',
-		))
-
-		simple_keys_filter_none = frozenset ((
-			'src_uri_base',
-			'distdir',
-		))
+		initial = len ( self._info ) == 0
 
 		self._writelock_acquire()
 
 		for key, value in info.items():
 
-			if key in simple_keys:
+			if key in self.__class__._UPDATE_KEYS_SIMPLE:
+				self [key] = value
+
+			elif initial and key in self.__class__._UPDATE_KEYS_SIMPLE_INITIAL:
 				self [key] = value
 
-			elif key in simple_keys_filter_none:
+			elif key in self.__class__._UPDATE_KEYS_FILTER_NONE:
 				if value is not None:
 					self [key] = value
 

diff --git a/roverlay/util.py b/roverlay/util.py
index c3fe348..be2cd33 100644
--- a/roverlay/util.py
+++ b/roverlay/util.py
@@ -33,8 +33,7 @@ def keepenv ( *to_keep ):
 	myenv = dict()
 
 	for item in to_keep:
-		if isinstance ( item, tuple ) and len ( item ) == 2:
-
+		if ( not isinstance ( item, str ) ) and hasattr ( item, '__iter__' ):
 			var      = item [0]
 			fallback = item [1]
 		else:


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2013-01-09 19:16 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-01-09 19:15 [gentoo-commits] proj/R_overlay:master commit in: /, roverlay/config/, roverlay/, roverlay/overlay/ André Erdmann

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox