From: Zac Medico <zmedico@gentoo.org>
Date: Tue, 9 Mar 2010 02:36:00 +0000 (-0000)
Subject: When portage upgrades or downgrades itself, preload lazily referenced portage
X-Git-Tag: v2.2_rc67~13
X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=cd9e494b36b4ae554c88173309e9d4a054946e8c;p=portage.git

When portage upgrades or downgrades itself, preload lazily referenced portage
submodules into memory so that imports won't fail later.

svn path=/main/trunk/; revision=15778
---

diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py
index 76a9034eb..4eee0cf05 100644
--- a/pym/portage/dbapi/vartree.py
+++ b/pym/portage/dbapi/vartree.py
@@ -4343,6 +4343,9 @@ class dblink(object):
 		if self.myroot == "/" and \
 			match_from_list(PORTAGE_PACKAGE_ATOM, [self.mycpv]) and \
 			not self.vartree.dbapi.cpv_exists(self.mycpv):
+			# Load lazily referenced portage submodules into memory,
+			# so imports won't fail during portage upgrade/downgrade.
+			portage.proxy.lazyimport._preload_portage_submodules()
 			settings = self.settings
 			base_path_orig = os.path.dirname(settings["PORTAGE_BIN_PATH"])
 			from tempfile import mkdtemp
diff --git a/pym/portage/proxy/lazyimport.py b/pym/portage/proxy/lazyimport.py
index c62f90788..84b2c730b 100644
--- a/pym/portage/proxy/lazyimport.py
+++ b/pym/portage/proxy/lazyimport.py
@@ -20,6 +20,24 @@ if sys.hexversion >= 0x3000000:
 _module_proxies = {}
 _module_proxies_lock = threading.RLock()
 
+def _preload_portage_submodules():
+	"""
+	Load lazily referenced portage submodules into memory,
+	so imports won't fail during portage upgrade/downgrade.
+	Note that this recursively loads only the modules that
+	are lazily referenced by currently imported modules,
+	so some portage submodules may still remain unimported
+	after this function is called.
+	"""
+	while True:
+		remaining = False
+		for name in list(_module_proxies):
+			if name.startswith('portage.'):
+				remaining = True
+				_unregister_module_proxy(name)
+		if not remaining:
+			break
+
 def _register_module_proxy(name, proxy):
 	_module_proxies_lock.acquire()
 	try: