summaryrefslogtreecommitdiffstats
path: root/pym
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2007-11-29 06:06:08 +0000
committerZac Medico <zmedico@gentoo.org>2007-11-29 06:06:08 +0000
commit332af2d11866a7a1e4d2d22a84c6dbfffd794de6 (patch)
tree899f27ea7c1145a5fc1d8b5edb4a85c8b732a1ff /pym
parent9b9ada2d7ab45567fa063321cfa243963214c37c (diff)
downloadportage-332af2d11866a7a1e4d2d22a84c6dbfffd794de6.tar.gz
portage-332af2d11866a7a1e4d2d22a84c6dbfffd794de6.tar.bz2
portage-332af2d11866a7a1e4d2d22a84c6dbfffd794de6.zip
When portage reinstalls itself, copy both the bin and pym
directories to a temp dir. Insert the temporary PORTAGE_PYM_PATH as the first element of sys.path and register an atexit hook to clean up the temporary directories. svn path=/main/trunk/; revision=8743
Diffstat (limited to 'pym')
-rw-r--r--pym/portage/dbapi/vartree.py51
1 files changed, 26 insertions, 25 deletions
diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py
index 70a43c5e6..c64c236e0 100644
--- a/pym/portage/dbapi/vartree.py
+++ b/pym/portage/dbapi/vartree.py
@@ -2350,38 +2350,39 @@ class dblink(object):
def merge(self, mergeroot, inforoot, myroot, myebuild=None, cleanup=0,
mydbapi=None, prev_mtimes=None):
-
- # If portage is reinstalling itself, create a temporary
- # copy of PORTAGE_BIN_PATH in order to avoid relying on
- # on the new versions which may be incompatible.
- bin_path_tmp = None
- bin_path_orig = None
+ """
+ If portage is reinstalling itself, create temporary
+ copies of PORTAGE_BIN_PATH and PORTAGE_PYM_PATH in order
+ to avoid relying on the new versions which may be
+ incompatible. Insert the temporary PORTAGE_PYM_PATH
+ as the first element of sys.path and register an atexit
+ hook to clean up the temporary directories.
+ """
if self.myroot == "/" and \
"sys-apps" == self.cat and \
"portage" == pkgsplit(self.pkg)[0]:
- bin_path_orig = self.settings["PORTAGE_BIN_PATH"]
+ settings = self.settings
+ base_path_orig = os.path.dirname(settings["PORTAGE_BIN_PATH"])
from tempfile import mkdtemp
import shutil
- bin_path_tmp = mkdtemp()
- for x in os.listdir(bin_path_orig):
- path = os.path.join(bin_path_orig, x)
- if not os.path.isfile(path):
- continue
- shutil.copy(path, os.path.join(bin_path_tmp, x))
- os.chmod(bin_path_tmp, 0755)
- try:
- if bin_path_tmp:
- self.settings["PORTAGE_BIN_PATH"] = bin_path_tmp
- self.settings.backup_changes("PORTAGE_BIN_PATH")
- return self._merge(mergeroot, inforoot,
+ base_path_tmp = mkdtemp()
+ from portage.process import atexit_register
+ atexit_register(shutil.rmtree, base_path_tmp)
+ dir_perms = 0755
+ for subdir in "bin", "pym":
+ var_name = "PORTAGE_%s_PATH" % subdir.upper()
+ var_orig = settings[var_name]
+ var_new = os.path.join(base_path_tmp, subdir)
+ settings[var_name] = var_new
+ settings.backup_changes(var_name)
+ shutil.copytree(var_orig, var_new, symlinks=True)
+ os.chmod(var_new, dir_perms)
+ os.chmod(base_path_tmp, dir_perms)
+ sys.path.insert(0, settings["PORTAGE_PYM_PATH"])
+
+ return self._merge(mergeroot, inforoot,
myroot, myebuild=myebuild, cleanup=cleanup,
mydbapi=mydbapi, prev_mtimes=prev_mtimes)
- finally:
- if bin_path_tmp:
- bin_path_orig = self.settings["PORTAGE_BIN_PATH"]
- self.settings.backup_changes("PORTAGE_BIN_PATH")
- from shutil import rmtree
- rmtree(bin_path_tmp)
def _merge(self, mergeroot, inforoot, myroot, myebuild=None, cleanup=0,
mydbapi=None, prev_mtimes=None):