EAPI="5-progress": Add package_manager_build_user() and package_manager_build_group().
authorArfrever Frehtes Taifersar Arahesis <Arfrever@Apache.Org>
Fri, 16 Nov 2012 04:35:57 +0000 (05:35 +0100)
committerArfrever Frehtes Taifersar Arahesis <Arfrever@Apache.Org>
Fri, 16 Nov 2012 04:35:57 +0000 (05:35 +0100)
bin/eapi.sh
bin/phase-functions.sh
bin/phase-helpers.sh
bin/save-ebuild-env.sh
doc/package/ebuild/eapi/5-progress.docbook
pym/portage/package/ebuild/_config/special_env_vars.py
pym/portage/package/ebuild/doebuild.py

index d21b69df7a212b32ad18fd5038a235d56a1a8a73..e63f145ee4ed4dfb7c1681e957dd056535f9c107 100644 (file)
@@ -84,6 +84,14 @@ ___eapi_has_license_path() {
        [[ ${1-${EAPI}} =~ ^(5-progress)$ ]]
 }
 
+___eapi_has_package_manager_build_user() {
+       [[ ${1-${EAPI}} =~ ^(5-progress)$ ]]
+}
+
+___eapi_has_package_manager_build_group() {
+       [[ ${1-${EAPI}} =~ ^(5-progress)$ ]]
+}
+
 # HELPERS BEHAVIOR
 
 ___eapi_best_version_and_has_version_support_--host-root() {
index 714f7a609598734b468f28ba9352af59b10db039..9de94363096155af92cb24b865f945e0f7ddfc57 100644 (file)
@@ -16,7 +16,8 @@ PORTAGE_READONLY_VARS="D EBUILD EBUILD_PHASE EBUILD_PHASE_FUNC \
        PM_EBUILD_HOOK_DIR \
        PORTAGE_ACTUAL_DISTDIR PORTAGE_ARCHLIST PORTAGE_BASHRC  \
        PORTAGE_BINPKG_FILE PORTAGE_BINPKG_TAR_OPTS PORTAGE_BINPKG_TMPFILE \
-       PORTAGE_BIN_PATH PORTAGE_BUILDDIR PORTAGE_BUNZIP2_COMMAND \
+       PORTAGE_BIN_PATH PORTAGE_BUILDDIR PORTAGE_BUILD_GROUP \
+       PORTAGE_BUILD_USER PORTAGE_BUNZIP2_COMMAND \
        PORTAGE_BZIP2_COMMAND PORTAGE_COLORMAP PORTAGE_CONFIGROOT \
        PORTAGE_DEBUG PORTAGE_DEPCACHEDIR PORTAGE_EBUILD_EXIT_FILE \
        PORTAGE_GID PORTAGE_GRPNAME PORTAGE_INST_GID PORTAGE_INST_UID \
index 5055060f7f7911b4438bbc9e8d1dfc5fbbee356c..bc00e44d8de525ff616f68b3da2a94cb210b7b40 100644 (file)
@@ -895,3 +895,15 @@ if ___eapi_has_license_path; then
                esac
        }
 fi
+
+if ___eapi_has_package_manager_build_user; then
+       package_manager_build_user() {
+               echo "${PORTAGE_BUILD_USER}"
+       }
+fi
+
+if ___eapi_has_package_manager_build_group; then
+       package_manager_build_group() {
+               echo "${PORTAGE_BUILD_GROUP}"
+       }
+fi
index f6dc2c5e71bac33d1135c5cdb5fee5f455766c9b..5b68b0793ec3bcc2f2919583ee84c7c2af61add7 100644 (file)
@@ -82,6 +82,8 @@ __save_ebuild_env() {
        ___eapi_has_available_eclasses && unset -f available_eclasses
        ___eapi_has_eclass_path && unset -f eclass_path
        ___eapi_has_license_path && unset -f license_path
+       ___eapi_has_package_manager_build_user && unset -f package_manager_build_user
+       ___eapi_has_package_manager_build_group && unset -f package_manager_build_group
 
        unset -f $(compgen -A function ___eapi_)
 
index bc7c3006696f4143985a0323e4016e296fb00d86..33464644fd6823228e213d2086cf670d89bfdbe0 100644 (file)
                                New license_path function prints path to specified license for current repository.
                        </para>
                </section>
+               <section id='package-ebuild-eapi-5-progress-helpers-package-manager-build-user'>
+                       <title>package_manager_build_user</title>
+                       <para>
+                               New package_manager_build_user function prints name of user used by package manager in build phases.
+                       </para>
+               </section>
+               <section id='package-ebuild-eapi-5-progress-helpers-package-manager-build-group'>
+                       <title>package_manager_build_group</title>
+                       <para>
+                               New package_manager_build_group function prints name of group used by package manager in build phases.
+                       </para>
+               </section>
                <section id='package-ebuild-eapi-5-progress-helpers-dohtml-extended-default-list-of-extensions'>
                        <title>Extended default list of extensions in dohtml</title>
                        <para>
index 3ca9687ece4db39ed80b04b81d77d3f77f4e3366..150dafebaa1e24d667d4dce0a7c940fbc9a67e21 100644 (file)
@@ -51,7 +51,8 @@ environ_whitelist += [
        "PORTAGE_BINPKG_FILE", "PORTAGE_BINPKG_TAR_OPTS",
        "PORTAGE_BINPKG_TMPFILE",
        "PORTAGE_BIN_PATH",
-       "PORTAGE_BUILDDIR", "PORTAGE_BUNZIP2_COMMAND", "PORTAGE_BZIP2_COMMAND",
+       "PORTAGE_BUILDDIR", "PORTAGE_BUILD_GROUP", "PORTAGE_BUILD_USER",
+       "PORTAGE_BUNZIP2_COMMAND", "PORTAGE_BZIP2_COMMAND",
        "PORTAGE_COLORMAP", "PORTAGE_COMPRESS",
        "PORTAGE_COMPRESS_EXCLUDE_SUFFIXES",
        "PORTAGE_CONFIGROOT", "PORTAGE_DEBUG", "PORTAGE_DEPCACHEDIR",
index 0a1f1df0e94251689513ed2d30fecb44d17eacf0..5002c5bab97e17a7531bb2fd968995320dfc1b70 100644 (file)
@@ -3,12 +3,14 @@
 
 __all__ = ['doebuild', 'doebuild_environment', 'spawn', 'spawnebuild']
 
+import grp
 import gzip
 import errno
 import io
 from itertools import chain
 import logging
 import os as _os
+import pwd
 import re
 import signal
 import stat
@@ -1419,10 +1421,22 @@ def spawn(mystring, mysettings, debug=0, free=0, droppriv=0, sesandbox=0, fakero
        # fake ownership/permissions will have to be converted to real
        # permissions in the merge phase.
        fakeroot = fakeroot and uid != 0 and portage.process.fakeroot_capable
-       if droppriv and uid == 0 and portage_gid and portage_uid and \
-               hasattr(os, "setgroups"):
-               keywords.update({"uid":portage_uid,"gid":portage_gid,
-                       "groups":userpriv_groups,"umask":0o02})
+       portage_build_uid = os.getuid()
+       portage_build_gid = os.getgid()
+       if uid == 0 and portage_uid and portage_gid and hasattr(os, "setgroups"):
+               if droppriv:
+                       keywords.update({
+                               "uid": portage_uid,
+                               "gid": portage_gid,
+                               "groups": userpriv_groups,
+                               "umask": 0o02
+                       })
+               if "userpriv" in features and "userpriv" not in mysettings["PORTAGE_RESTRICT"].split() and secpass >= 2:
+                       portage_build_uid = portage_uid
+                       portage_build_gid = portage_gid
+       mysettings["PORTAGE_BUILD_USER"] = pwd.getpwuid(portage_build_uid).pw_name
+       mysettings["PORTAGE_BUILD_GROUP"] = grp.getgrgid(portage_build_gid).gr_name
+
        if not free:
                free=((droppriv and "usersandbox" not in features) or \
                        (not droppriv and "sandbox" not in features and \