diff -urpN prefix-portage-2.2.01.21165.orig/bin/ebuild.sh prefix-portage-2.2.01.21165/bin/ebuild.sh --- prefix-portage-2.2.01.21165.orig/bin/ebuild.sh 2012-09-30 05:14:20.000000000 -0700 +++ prefix-portage-2.2.01.21165/bin/ebuild.sh 2012-10-08 05:33:29.924672740 -0700 @@ -86,7 +86,7 @@ __qa_source() { __qa_call() { local shopts=$(shopt) OLDIFS="$IFS" local retval - "$@" + call-ebuildshell "$@" retval=$? set +e [[ $shopts != $(shopt) ]] && @@ -473,6 +473,58 @@ if [[ -n ${QA_INTERCEPTORS} ]] ; then unset BIN_PATH BIN BODY FUNC_SRC fi +call-ebuildshell() { + if ! has ebuildshell ${FEATURES}; then + "$@" + return $? + fi + ( + umask 002 + ( + ( + set + declare -p + declare -fp + shopt -p + if [[ ${BASH_VERSINFO[0]} == 3 ]]; then + export + fi + ) | __filter_readonly_variables --filter-for-subshell + echo 'declare -r $PORTAGE_READONLY_METADATA $PORTAGE_READONLY_VARS' + echo "export PS1='EBUILD ${PN} $1 \$ '" + echo 'unset ENV' + echo "type $1" + echo "echo WANTED: $@" + echo "trap '" + echo "umask 002" + echo "(" + echo " set" + echo " declare -p" + echo " declare -fp" + echo " shopt -p | grep -v extdebug$" + if [[ ${BASH_VERSINFO[0]} == 3 ]]; then + echo " export" + fi + echo -n ")" + echo -n " | __filter_readonly_variables --filter-metadata" + echo " > ${T}/ebuildshell-environment-outcome' 0" + echo "shopt -u extdebug" + echo "trap - DEBUG" + ) > ${T}/ebuildshell-environment + chown ${PORTAGE_USER:-portage}:${PORTAGE_GROUP:-portage} "${T}/ebuildshell-environment" &>/dev/null + chmod g+w "${T}/ebuildshell-environment" &>/dev/null + ) + + rm -f "${T}/ebuildshell-environment-outcome" >&/dev/null + + unset BASH_ENV + env -i ${BASH} --rcfile "${T}/ebuildshell-environment" -i || die + + chown ${PORTAGE_USER:-portage}:${PORTAGE_GROUP:-portage} "${T}/ebuildshell-environment-outcome" &>/dev/null + chmod g+w "${T}/ebuildshell-environment-outcome" &>/dev/null + source "${T}/ebuildshell-environment-outcome" &>/dev/null +} + # Subshell/helper die support (must export for the die helper). export EBUILD_MASTER_PID=$BASHPID trap 'exit 1' SIGTERM diff -urpN prefix-portage-2.2.01.21165.orig/bin/phase-functions.sh prefix-portage-2.2.01.21165/bin/phase-functions.sh --- prefix-portage-2.2.01.21165.orig/bin/phase-functions.sh 2012-09-30 04:37:20.000000000 -0700 +++ prefix-portage-2.2.01.21165/bin/phase-functions.sh 2012-10-08 05:32:40.756852828 -0700 @@ -84,7 +84,7 @@ PORTAGE_MUTABLE_FILTERED_VARS="AA HOSTNA __filter_readonly_variables() { local x filtered_vars local readonly_bash_vars="BASHOPTS BASHPID DIRSTACK EUID - FUNCNAME GROUPS PIPESTATUS PPID SHELLOPTS UID" + FUNCNAME GROUPS PIPESTATUS PPID SHELLOPTS UID BASH_VERSINFO" local bash_misc_vars="BASH BASH_.* COLUMNS COMP_WORDBREAKS HISTCMD HISTFILE HOSTNAME HOSTTYPE IFS LINENO MACHTYPE OLDPWD OPTERR OPTIND OSTYPE POSIXLY_CORRECT PS4 PWD RANDOM @@ -95,8 +95,10 @@ __filter_readonly_variables() { # Untrusted due to possible application of package renames to binpkgs local binpkg_untrusted_vars="CATEGORY P PF PN PR PV PVR" local misc_garbage_vars="_portage_filter_opts" - filtered_vars="$readonly_bash_vars $bash_misc_vars - $PORTAGE_READONLY_VARS $misc_garbage_vars" + filtered_vars="$readonly_bash_vars" + if ! has --filter-for-subshell $* ; then + filtered_vars="$filtered_vars $bash_misc_vars $PORTAGE_READONLY_VARS $misc_garbage_vars" + fi # Don't filter/interfere with prefix variables unless they are # supported by the current EAPI. @@ -120,7 +122,11 @@ __filter_readonly_variables() { LC_CTYPE LC_MESSAGES LC_MONETARY LC_NUMERIC LC_PAPER LC_TIME" fi - if ! has --allow-extra-vars $* ; then + if has --filter-metadata $* ; then + filtered_vars="$filtered_vars $PORTAGE_READONLY_METADATA" + fi + if ! has --allow-extra-vars $* && + ! has --filter-for-subshell $* ; then if [ "${EMERGE_FROM}" = binary ] ; then # preserve additional variables from build time, # while excluding untrusted variables diff -urpN prefix-portage-2.2.01.21165.orig/man/make.conf.5 prefix-portage-2.2.01.21165/man/make.conf.5 --- prefix-portage-2.2.01.21165.orig/man/make.conf.5 2012-09-30 05:14:48.000000000 -0700 +++ prefix-portage-2.2.01.21165/man/make.conf.5 2012-10-08 05:32:40.757852889 -0700 @@ -313,6 +313,12 @@ exist). Also see the related \fIunmerge\ Use locks to ensure that unsandboxed ebuild phases never execute concurrently. Also see \fIparallel\-install\fR. .TP +.B ebuildshell +Drop into an interactive shell for each phase function, meant for +debugging. Because the shell would normally be used to execute the +phase function, commands like src_unpack or epatch are available in the +interactive shell. Use `exit 1` to terminate the merge. +.TP .B fakeroot Enable fakeroot for the install and package phases when a non-root user runs the \fBebuild\fR(1) command. diff -urpN prefix-portage-2.2.01.21165.orig/pym/_emerge/AbstractEbuildProcess.py prefix-portage-2.2.01.21165/pym/_emerge/AbstractEbuildProcess.py --- prefix-portage-2.2.01.21165.orig/pym/_emerge/AbstractEbuildProcess.py 2012-09-30 04:37:20.000000000 -0700 +++ prefix-portage-2.2.01.21165/pym/_emerge/AbstractEbuildProcess.py 2012-10-08 05:32:40.757852889 -0700 @@ -97,6 +97,7 @@ class AbstractEbuildProcess(SpawnProcess self.fd_pipes = {} null_fd = None if 0 not in self.fd_pipes and \ + "ebuildshell" not in self.settings.features and \ self.phase not in self._phases_interactive_whitelist and \ "interactive" not in self.settings.get("PROPERTIES", "").split(): null_fd = os.open('/dev/null', os.O_RDONLY) diff -urpN prefix-portage-2.2.01.21165.orig/pym/portage/const.py prefix-portage-2.2.01.21165/pym/portage/const.py --- prefix-portage-2.2.01.21165.orig/pym/portage/const.py 2012-09-30 04:24:10.000000000 -0700 +++ prefix-portage-2.2.01.21165/pym/portage/const.py 2012-10-08 05:33:29.924672740 -0700 @@ -131,7 +131,7 @@ SUPPORTED_FEATURES = frozenset([ "collision-protect", "compress-build-logs", "compressdebug", "compress-index", "config-protect-if-modified", "digest", "distcc", "distcc-pump", "distlocks", - "downgrade-backup", "ebuild-locks", "fakeroot", + "downgrade-backup", "ebuildshell", "ebuild-locks", "fakeroot", "fail-clean", "force-mirror", "force-prefix", "getbinpkg", "installsources", "keeptemp", "keepwork", "fixlafiles", "lmirror", "metadata-transfer", "mirror", "multilib-strict", "news",