Lines 130-136
__qa_source() {
Link Here
|
130 |
__qa_call() { |
130 |
__qa_call() { |
131 |
local shopts=$(shopt) OLDIFS="$IFS" |
131 |
local shopts=$(shopt) OLDIFS="$IFS" |
132 |
local retval |
132 |
local retval |
133 |
"$@" |
133 |
__call-ebuildshell "$@" |
134 |
retval=$? |
134 |
retval=$? |
135 |
set +e |
135 |
set +e |
136 |
[[ $shopts != $(shopt) ]] && |
136 |
[[ $shopts != $(shopt) ]] && |
Lines 537-542
if [[ -n ${QA_INTERCEPTORS} ]] ; then
Link Here
|
537 |
unset BIN_PATH BIN BODY FUNC_SRC |
537 |
unset BIN_PATH BIN BODY FUNC_SRC |
538 |
fi |
538 |
fi |
539 |
|
539 |
|
|
|
540 |
__call-ebuildshell() { |
541 |
if ! has ebuildshell ${FEATURES}; then |
542 |
"$@" |
543 |
return $? |
544 |
fi |
545 |
local __ebuildshell_args=( "$@" ) |
546 |
# These are the variables I have seen 'bash -i' maintaining the values for: |
547 |
local __ebuildshell_bash_i_vars="__ebuildshell_.* |
548 |
_ BASH_ARGC BASH_ARGV BASH_COMMAND BASH_LINENO BASH_SOURCE |
549 |
BASH_VERSINFO BASH_SUBSHELL BASHOPTS BASHPID COMP_WORDBREAKS |
550 |
DIRSTACK EUID FUNCNAME GROUPS HISTCMD HISTFILE LINENO |
551 |
PIPESTATUS PPID PWD RANDOM SECONDS SHELLOPTS UID" |
552 |
# Allow recursive ebuildshell, for use in multibuild.eclass and similar: |
553 |
local __ebuildshell_pid=${BASHPID:-$(__bashpid)} |
554 |
local __ebuildshell_tmpf="${T}/ebuildshell.${__ebuildshell_pid}" |
555 |
rm -f "${__ebuildshell_tmpf}."{ebuild,return}-{env,rovars} |
556 |
( |
557 |
( |
558 |
declare -p |
559 |
declare -fp |
560 |
shopt -p |
561 |
[[ ${BASH_VERSINFO[0]} == 3 ]] && export |
562 |
) | |
563 |
( |
564 |
# we need everything but the bash vars after 'env -i' |
565 |
2>"${__ebuildshell_tmpf}.ebuild-rovars" \ |
566 |
"${PORTAGE_PYTHON:-/tools/haubi/gentoo/s01en24/usr/bin/python}" \ |
567 |
"${PORTAGE_BIN_PATH}"/filter-bash-environment.py \ |
568 |
--report-readonly-variables \ |
569 |
--preserve-readonly-attribute \ |
570 |
"${__ebuildshell_bash_i_vars}" \ |
571 |
|| die "filter-bash-environment.py failed" |
572 |
) |
573 |
# The already readonly variables, without bash maintained ones: |
574 |
__ebuildshell_ro_ebuild_vars=$(<"${__ebuildshell_tmpf}.ebuild-rovars") |
575 |
cat <<-EOE |
576 |
# properly quote the function arguments |
577 |
$(declare -p __ebuildshell_args) |
578 |
set -- "\${__ebuildshell_args[@]}" |
579 |
unset __ebuildshell_args |
580 |
# be informative about what to do |
581 |
PS1="EBUILD ${PN} $1 \$ " |
582 |
type $1 |
583 |
echo "WANTED: \$@" |
584 |
echo "or use: \"\\\$@\"" |
585 |
# use bash history, but not the 'user's real one |
586 |
HISTFILE=~/.bash_history |
587 |
# for copy&paste function body lines containing: ! |
588 |
set +H |
589 |
# Support the 'local' keyword outside any shell function |
590 |
# for copy&paste of function body lines: Remember these |
591 |
# "local" variable names for filtering from return-env. |
592 |
__ebuildshell_local_vars= |
593 |
__ebuildshell_local() { |
594 |
local __ebuildshell_local_attr= |
595 |
while [[ \${1} == -* ]]; do |
596 |
__ebuildshell_local_attr+=" \${1}" |
597 |
shift |
598 |
done |
599 |
__ebuildshell_local_vars+=" \${1%%=*} " |
600 |
# Need to declare into the global shell namespace, |
601 |
# as we are in some shell function here apparently. |
602 |
declare -g \${__ebuildshell_local_attr} "\$@" |
603 |
} |
604 |
# within some function, BASH_LINENO is set, and we use real 'local' |
605 |
alias local='\$( (( \${#BASH_LINENO} > 0 )) && echo local || echo __ebuildshell_local)' |
606 |
# at exit, dump the current environment |
607 |
trap " |
608 |
unalias local |
609 |
unset -f __ebuildshell_local |
610 |
rm -f '${__ebuildshell_tmpf}.return-'* |
611 |
( |
612 |
( |
613 |
declare -p |
614 |
declare -fp |
615 |
shopt -p | grep -v 'extdebug$' |
616 |
$([[ ${BASH_VERSINFO[0]} == 3 ]] && echo export) |
617 |
) | |
618 |
( |
619 |
# We may have more readonly variables now, but we |
620 |
# need to filter variables that are readonly already. |
621 |
2>'${__ebuildshell_tmpf}.return-rovars' \\ |
622 |
'${PORTAGE_PYTHON:-/tools/haubi/gentoo/s01en24/usr/bin/python}' \\ |
623 |
'${PORTAGE_BIN_PATH}'/filter-bash-environment.py \\ |
624 |
--report-readonly-variables \\ |
625 |
--preserve-readonly-attribute \\ |
626 |
'${__ebuildshell_bash_i_vars} |
627 |
${__ebuildshell_ro_ebuild_vars} |
628 |
'\" \${__ebuildshell_local_vars}\" \\ |
629 |
|| die 'filter-bash-environment.py failed' |
630 |
) |
631 |
) > '${__ebuildshell_tmpf}.return-env' |
632 |
" EXIT |
633 |
# this is a debugging shell already |
634 |
shopt -u extdebug |
635 |
trap - DEBUG |
636 |
# can do some cleanup already |
637 |
rm -f '${__ebuildshell_tmpf}.ebuild-'* |
638 |
EOE |
639 |
) > "${__ebuildshell_tmpf}.ebuild-env" |
640 |
|
641 |
# pre-fill the history with "$@" |
642 |
echo '"$@"' >> ~/.bash_history |
643 |
|
644 |
env -i ${BASH} --rcfile "${__ebuildshell_tmpf}.ebuild-env" -i |
645 |
|
646 |
# The environment- and exit-status handling after leaving the ebuildshell |
647 |
# prompt is expected to be identical as without the ebuildshell prompt. |
648 |
local __ebuildshell_status=$? |
649 |
|
650 |
# Defining a variable without using the the local keyword makes this |
651 |
# variable visible to the 'global' shell namespace. But 'declare -p' |
652 |
# does not show the -g flag, so we need to add that one for all |
653 |
# variables that have been visible to the EXIT trap above. |
654 |
local __ebuildshell_orig_expand_aliases=$(shopt -p expand_aliases) |
655 |
alias declare='declare -g' |
656 |
shopt -s expand_aliases |
657 |
source "${__ebuildshell_tmpf}.return-env" |
658 |
unalias declare |
659 |
${__ebuildshell_orig_expand_aliases} |
660 |
# Portage does whitelist readonly variables. If an ebuild defines |
661 |
# more readonly variables, their readonly attribute is removed. |
662 |
# If we ever want to preserve additional readonly variables across |
663 |
# phases, their names are in "${__ebuildshell_tmpf}.return-rovars". |
664 |
rm -f "${__ebuildshell_tmpf}."{ebuild,return}-{env,rovars} |
665 |
|
666 |
return ${__ebuildshell_status} |
667 |
} |
668 |
|
540 |
# Subshell/helper die support (must export for the die helper). |
669 |
# Subshell/helper die support (must export for the die helper). |
541 |
export EBUILD_MASTER_PID=${BASHPID:-$(__bashpid)} |
670 |
export EBUILD_MASTER_PID=${BASHPID:-$(__bashpid)} |
542 |
trap 'exit 1' SIGTERM |
671 |
trap 'exit 1' SIGTERM |