commit:     690b9deaf22f85a3cc7b366f5bd126b9e603c90d
Author:     Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Sun Nov  9 23:19:11 2014 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Sat Nov 15 05:12:14 2014 +0000
URL:        
http://sources.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=690b9dea

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 <AT> gentoo.org>

---
 pym/portage/__init__.py              |  3 +++
 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 66bfeb0..d8046f3 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 2ceb122..c7308a4 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")

Reply via email to