summaryrefslogtreecommitdiffstats
path: root/pym/portage_exec.py
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2007-07-24 00:52:59 +0000
committerZac Medico <zmedico@gentoo.org>2007-07-24 00:52:59 +0000
commit1ac14d317505a270b56d926a714eb443c92df72d (patch)
tree05a99a10018e7d347a40efc998c756789d304f5c /pym/portage_exec.py
parent3bbbf459564681e15cd1f70ded266ba70b960cbe (diff)
downloadportage-1ac14d317505a270b56d926a714eb443c92df72d.tar.gz
portage-1ac14d317505a270b56d926a714eb443c92df72d.tar.bz2
portage-1ac14d317505a270b56d926a714eb443c92df72d.zip
Add FEATURES=fakeroot support which causes install and package phases to run inside fakeroot when a non-root user runs the ebuild command. Thanks to swegener for the initial patch. (trunk r7379)
svn path=/main/branches/2.1.2/; revision=7380
Diffstat (limited to 'pym/portage_exec.py')
-rw-r--r--pym/portage_exec.py21
1 files changed, 20 insertions, 1 deletions
diff --git a/pym/portage_exec.py b/pym/portage_exec.py
index 800535f55..3a53661bb 100644
--- a/pym/portage_exec.py
+++ b/pym/portage_exec.py
@@ -8,7 +8,7 @@ import os, atexit, signal, sys
import portage_data
from portage_util import dump_traceback
-from portage_const import BASH_BINARY, SANDBOX_BINARY
+from portage_const import BASH_BINARY, SANDBOX_BINARY, FAKEROOT_BINARY
from portage_exception import CommandNotFound
try:
@@ -27,6 +27,9 @@ else:
sandbox_capable = (os.path.isfile(SANDBOX_BINARY) and
os.access(SANDBOX_BINARY, os.X_OK))
+fakeroot_capable = (os.path.isfile(FAKEROOT_BINARY) and
+ os.access(FAKEROOT_BINARY, os.X_OK))
+
def spawn_bash(mycommand, debug=False, opt_name=None, **keywords):
"""
Spawns a bash shell running a specific commands
@@ -60,6 +63,22 @@ def spawn_sandbox(mycommand, opt_name=None, **keywords):
args.append(mycommand)
return spawn(args, opt_name=opt_name, **keywords)
+def spawn_fakeroot(mycommand, fakeroot_state=None, opt_name=None, **keywords):
+ args=[FAKEROOT_BINARY]
+ if not opt_name:
+ opt_name = os.path.basename(mycommand.split()[0])
+ if fakeroot_state:
+ open(fakeroot_state, "a").close()
+ args.append("-s")
+ args.append(fakeroot_state)
+ args.append("-i")
+ args.append(fakeroot_state)
+ args.append("--")
+ args.append(BASH_BINARY)
+ args.append("-c")
+ args.append(mycommand)
+ return spawn(args, opt_name=opt_name, **keywords)
+
_exithandlers = []
def atexit_register(func, *args, **kargs):
"""Wrapper around atexit.register that is needed in order to track