summaryrefslogtreecommitdiff
blob: b8911f26a0d55e64f61b1f0165e16daf5d929427 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
--- prefix-portage-2.2.01.18980/bin/ebuild.sh
+++ prefix-portage-2.2.01.18980/bin/ebuild.sh
@@ -59,7 +59,7 @@
 qa_call() {
 	local shopts=$(shopt) OLDIFS="$IFS"
 	local retval
-	"$@"
+	call-ebuildshell "$@"
 	retval=$?
 	set +e
 	[[ $shopts != $(shopt) ]] &&
@@ -1824,7 +1824,7 @@
 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_.* COMP_WORDBREAKS HISTCMD
 		HISTFILE HOSTNAME HOSTTYPE IFS LINENO MACHTYPE OLDPWD
 		OPTERR OPTIND OSTYPE POSIXLY_CORRECT PS4 PWD RANDOM
@@ -1833,8 +1833,10 @@
 		SANDBOX_DEBUG_LOG SANDBOX_DISABLED SANDBOX_LIB
 		SANDBOX_LOG SANDBOX_ON"
 	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.
@@ -1864,7 +1866,11 @@
 			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
 		filtered_vars="
 			${filtered_vars}
 			${PORTAGE_SAVED_READONLY_VARS}
@@ -1995,6 +2001,56 @@
 	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"
+			if [[ ${BASH_VERSINFO[0]} == 3 ]]; then
+				echo "	export"
+			fi
+			echo -n ")"
+			echo -n " | filter_readonly_variables --filter-metadata"
+			echo " > ${T}/ebuildshell-environment-outcome' 0"
+		) > ${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