diff options
author | Zac Medico <zmedico@gentoo.org> | 2014-11-09 15:19:11 -0800 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2014-11-14 21:12:14 -0800 |
commit | 690b9deaf22f85a3cc7b366f5bd126b9e603c90d (patch) | |
tree | 94a030386b6be3e190b82fbdc86c66257762e484 | |
parent | fs_template._ensure_dirs: handle EEXIST (529120) (diff) | |
download | portage-690b9deaf22f85a3cc7b366f5bd126b9e603c90d.tar.gz portage-690b9deaf22f85a3cc7b366f5bd126b9e603c90d.tar.bz2 portage-690b9deaf22f85a3cc7b366f5bd126b9e603c90d.zip |
unprivileged mode: generate PORTAGE_DEPCACHEDIR
For unprivileged mode, if PORTAGE_DEPCACHEDIR is unset and the default
PORTAGE_DEPCACHEDIR setting does not refer to a writable directory
(or there are not sufficient permissions to create it), then
automatically make PORTAGE_DEPCACHEDIR relative to the current target
root (which should always be writable for unprivileged mode). Also, in
create_trees, propagate the automatically generated PORTAGE_DEPCACHEDIR
setting to the config instance that is instantiated for ROOT = "/".
The result is that unprivileged mode will get a writable
PORTAGE_DEPCACHEDIR by default, and the default can be overridden by
setting the PORTAGE_DEPCACHEDIR variable.
Fixes: 1364fcd89384 ("Support unprivileged mode for bug #433453.")
X-Gentoo-Bug: 433453
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=433453
Acked-by: Alexander Berntsen <bernalex@gentoo.org>
-rw-r--r-- | pym/portage/__init__.py | 3 | ||||
-rw-r--r-- | pym/portage/package/ebuild/config.py | 39 |
2 files changed, 32 insertions, 10 deletions
diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py index 66bfeb078..d8046f3c7 100644 --- a/pym/portage/__init__.py +++ b/pym/portage/__init__.py @@ -570,6 +570,7 @@ def create_trees(config_root=None, target_root=None, trees=None, env=None, env=env, eprefix=eprefix) settings.lock() + depcachedir = settings.get('PORTAGE_DEPCACHEDIR') trees._target_eroot = settings['EROOT'] myroots = [(settings['EROOT'], settings)] if settings["ROOT"] == "/" and settings["EPREFIX"] == const.EPREFIX: @@ -587,6 +588,8 @@ def create_trees(config_root=None, target_root=None, trees=None, env=None, v = settings.get(k) if v is not None: clean_env[k] = v + if depcachedir is not None: + clean_env['PORTAGE_DEPCACHEDIR'] = depcachedir settings = config(config_root=None, target_root="/", env=clean_env, eprefix=None) settings.lock() diff --git a/pym/portage/package/ebuild/config.py b/pym/portage/package/ebuild/config.py index 2ceb12260..c7308a482 100644 --- a/pym/portage/package/ebuild/config.py +++ b/pym/portage/package/ebuild/config.py @@ -8,6 +8,7 @@ __all__ = [ ] import copy +import errno from itertools import chain import grp import logging @@ -826,16 +827,6 @@ class config(object): if "USE_ORDER" not in self: self.backupenv["USE_ORDER"] = "env:pkg:conf:defaults:pkginternal:repo:env.d" - self.depcachedir = DEPCACHE_PATH - if portage.const.EPREFIX: - self.depcachedir = os.path.join(portage.const.EPREFIX, - DEPCACHE_PATH.lstrip(os.sep)) - - if self.get("PORTAGE_DEPCACHEDIR", None): - self.depcachedir = self["PORTAGE_DEPCACHEDIR"] - self["PORTAGE_DEPCACHEDIR"] = self.depcachedir - self.backup_changes("PORTAGE_DEPCACHEDIR") - if "CBUILD" not in self and "CHOST" in self: self["CBUILD"] = self["CHOST"] self.backup_changes("CBUILD") @@ -898,6 +889,34 @@ class config(object): self[var] = default_val self.backup_changes(var) + self.depcachedir = self.get("PORTAGE_DEPCACHEDIR") + if self.depcachedir is None: + self.depcachedir = os.path.join(os.sep, + portage.const.EPREFIX, DEPCACHE_PATH.lstrip(os.sep)) + if unprivileged and target_root != os.sep: + # In unprivileged mode, automatically make + # depcachedir relative to target_root if the + # default depcachedir is not writable. + current_dir = self.depcachedir + found_dir = False + while current_dir != os.sep and not found_dir: + try: + os.stat(current_dir) + found_dir = True + except OSError as e: + if e.errno == errno.ENOENT: + current_dir = os.path.dirname( + current_dir) + else: + found_dir = True + + if not os.access(current_dir, os.W_OK): + self.depcachedir = os.path.join(eroot, + DEPCACHE_PATH.lstrip(os.sep)) + + self["PORTAGE_DEPCACHEDIR"] = self.depcachedir + self.backup_changes("PORTAGE_DEPCACHEDIR") + if portage._internal_caller: self["PORTAGE_INTERNAL_CALLER"] = "1" self.backup_changes("PORTAGE_INTERNAL_CALLER") |