When portage reinstalls itself, pre-load elog modules in
authorZac Medico <zmedico@gentoo.org>
Thu, 29 Nov 2007 09:06:52 +0000 (09:06 -0000)
committerZac Medico <zmedico@gentoo.org>
Thu, 29 Nov 2007 09:06:52 +0000 (09:06 -0000)
dblink.merge() since we won't be able to later if they get
unmerged (happens when namespace changes).

svn path=/main/trunk/; revision=8749

pym/portage/dbapi/vartree.py
pym/portage/elog/__init__.py

index 12ecb3171bbae23d4610bb932fe25e36e4890365..e0cc8e45b0b4b699575ed7b4c6723f32450534bf 100644 (file)
@@ -2355,7 +2355,9 @@ class dblink(object):
                copies of PORTAGE_BIN_PATH and PORTAGE_PYM_PATH in order
                to avoid relying on the new versions which may be
                incompatible. Register an atexit hook to clean up the
-               temporary directories.
+               temporary directories. Pre-load elog modules here since
+               we won't be able to later if they get unmerged (happens
+               when namespace changes).
                """
                if self.myroot == "/" and \
                        "sys-apps" == self.cat and \
@@ -2377,6 +2379,9 @@ class dblink(object):
                                shutil.copytree(var_orig, var_new, symlinks=True)
                                os.chmod(var_new, dir_perms)
                        os.chmod(base_path_tmp, dir_perms)
+                       # This serves so pre-load the modules.
+                       elog_process(self.mycpv, self.settings,
+                               phasefilter=filter_mergephases)
 
                return self._merge(mergeroot, inforoot,
                                myroot, myebuild=myebuild, cleanup=cleanup,
index e1df6d9bd3c2f0d8ac8630316a6d89304f7e1a97..c68fedca0d4a0bdf4d0faada24712a2f09ac21bf 100644 (file)
@@ -42,6 +42,7 @@ def _combine_logentries(logentries):
                        rValue.append("\n")
        return "".join(rValue)
 
+_elog_mod_imports = {}
 _elog_atexit_handlers = []
 _preserve_logentries = {}
 def elog_process(cpv, mysettings, phasefilter=None):
@@ -94,9 +95,12 @@ def elog_process(cpv, mysettings, phasefilter=None):
                                # FIXME: ugly ad.hoc import code
                                # TODO:  implement a common portage module loader
                                name = "portage.elog.mod_" + s
-                               m = __import__(name)
-                               for comp in name.split(".")[1:]:
-                                       m = getattr(m, comp)
+                               m = _elog_mod_imports.get(name)
+                               if m is None:
+                                       m = __import__(name)
+                                       for comp in name.split(".")[1:]:
+                                               m = getattr(m, comp)
+                                       _elog_mod_imports[name] = m
                                def timeout_handler(signum, frame):
                                        raise PortageException("Timeout in elog_process for system '%s'" % s)
                                import signal