diff options
-rwxr-xr-x | bin/ebuild.sh | 28 | ||||
-rwxr-xr-x | bin/isolated-functions.sh | 2 | ||||
-rw-r--r-- | pym/portage/__init__.py | 36 |
3 files changed, 42 insertions, 24 deletions
diff --git a/bin/ebuild.sh b/bin/ebuild.sh index a5b89c9d4..f8f7377d7 100755 --- a/bin/ebuild.sh +++ b/bin/ebuild.sh @@ -1547,32 +1547,14 @@ if hasq "depend" "${EBUILD_SH_ARGS}"; then unset BIN_PATH BIN BODY FUNC_SRC fi -# Automatically try to load environment.bz2 whenever -# "${T}/environment" does not exist, except for phases -# such as nofetch that do not require ${T} to exist. -if ! hasq ${EBUILD_SH_ARGS} clean depend nofetch && \ - [ ! -f "${T}/environment" ] ; then - bzip2 -dc "${EBUILD%/*}"/environment.bz2 > \ - "${T}/environment" 2> /dev/null - if [ $? -eq 0 ] && [ -s "${T}/environment" ] ; then - preprocess_ebuild_env || \ - die "error processing '${EBUILD%/*}/environment.bz2'" - else - rm -f "${T}/environment" - fi -fi - if hasq ${EBUILD_SH_ARGS} clean ; then true elif ! hasq ${EBUILD_PHASE} depend && [ -f "${T}"/environment ] ; then - if [ "${PN}" == "portage" ] && [ -n "${EBUILD_SH_ARGS}" ] ; then - # When portage reinstalls itself, during inst/rm phases, the - # environment may have been saved by a different version of ebuild.sh, - # so it can't trusted that it's been properly filtered. Therefore, - # always preprocess the environment when ${PN} == portage. - preprocess_ebuild_env || \ - die "error processing environment" - fi + # The environment may have been extracted from environment.bz2 or + # may have come from another version of ebuild.sh or something. + # In any case, preprocess it to prevent any potential interference. + preprocess_ebuild_env || \ + die "error processing environment" # Colon separated SANDBOX_* variables need to be cumulative. for x in SANDBOX_DENY SANDBOX_READ SANDBOX_PREDICT SANDBOX_WRITE ; do eval PORTAGE_${x}=\${!x} diff --git a/bin/isolated-functions.sh b/bin/isolated-functions.sh index 70cae7097..62824b2bc 100755 --- a/bin/isolated-functions.sh +++ b/bin/isolated-functions.sh @@ -423,7 +423,7 @@ save_ebuild_env() { EBUILD_EXIT_STATUS_FILE EBUILD_MASTER_PID \ ECLASSDIR ECLASS_DEPTH ENDCOL FAKEROOTKEY FEATURES \ GOOD HILITE HOME IMAGE \ - KV LAST_E_CMD LAST_E_LEN LD_PRELOAD MOPREFIX \ + KV LAST_E_CMD LAST_E_LEN LD_PRELOAD MISC_FUNCTIONS_ARGS MOPREFIX \ NORMAL PATH PKGDIR PKGUSE PKG_LOGDIR PKG_TMPDIR \ PORTAGE_ACTUAL_DISTDIR PORTAGE_ARCHLIST PORTAGE_BASHRC \ PORTAGE_BINPKG_TMPFILE PORTAGE_BUILDDIR \ diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py index 8970f476b..94ab57780 100644 --- a/pym/portage/__init__.py +++ b/pym/portage/__init__.py @@ -4302,6 +4302,42 @@ def doebuild(myebuild, mydo, myroot, mysettings, debug=0, listonly=0, if logfile and not os.access(os.path.dirname(logfile), os.W_OK): logfile = None if have_build_dirs: + env_file = os.path.join(mysettings["T"], "environment") + env_stat = None + saved_env = None + try: + env_stat = os.stat(env_file) + except OSError, e: + if e.errno != errno.ENOENT: + raise + del e + if not env_stat: + saved_env = os.path.join( + os.path.dirname(myebuild), "environment.bz2") + if not os.path.isfile(saved_env): + saved_env = None + if saved_env: + retval = os.system( + "bzip2 -dc '%s' > '%s'" % (saved_env, env_file)) + try: + env_stat = os.stat(env_file) + except OSError, e: + if e.errno != errno.ENOENT: + raise + del e + if os.WIFEXITED(retval) and \ + os.WEXITSTATUS(retval) == os.EX_OK and \ + env_stat and env_stat.st_size > 0: + pass + else: + writemsg("!!! Error extracting saved environment: '%s'" % \ + saved_env, noiselevel=-1) + try: + os.unlink(env_file) + except OSError, e: + if e.errno != errno.ENOENT: + raise + del e _doebuild_exit_status_unlink( mysettings.get("EBUILD_EXIT_STATUS_FILE")) else: |