#!/bin/bash
# Copyright 1999-2012 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

# @FUNCTION: save_ebuild_env
# @DESCRIPTION:
# echo the current environment to stdout, filtering out redundant info.
#
# --exclude-init-phases causes pkg_nofetch and src_* phase functions to
# be excluded from the output. These function are not needed for installation
# or removal of the packages, and can therefore be safely excluded.
#
save_ebuild_env() {
	(
	if has --exclude-init-phases $* ; then
		unset S _E_DOCDESTTREE_ _E_EXEDESTTREE_ \
			PORTAGE_DOCOMPRESS PORTAGE_DOCOMPRESS_SKIP
		if [[ -n $PYTHONPATH &&
			${PYTHONPATH%%:*} -ef $PORTAGE_PYM_PATH ]] ; then
			if [[ $PYTHONPATH == *:* ]] ; then
				export PYTHONPATH=${PYTHONPATH#*:}
			else
				unset PYTHONPATH
			fi
		fi
	fi

	# misc variables inherited from the calling environment
	unset COLORTERM DISPLAY EDITOR LESS LESSOPEN LOGNAME LS_COLORS PAGER \
		TERM TERMCAP USER ftp_proxy http_proxy no_proxy

	# other variables inherited from the calling environment
	unset CVS_RSH ECHANGELOG_USER GPG_AGENT_INFO \
	SSH_AGENT_PID SSH_AUTH_SOCK STY WINDOW XAUTHORITY

	# CCACHE and DISTCC config
	unset ${!CCACHE_*} ${!DISTCC_*}

	# There's no need to bloat environment.bz2 with internally defined
	# functions and variables, so filter them out if possible.

	for x in pkg_setup pkg_nofetch src_unpack src_prepare src_configure \
		src_compile src_test src_install pkg_preinst pkg_postinst \
		pkg_prerm pkg_postrm ; do
		unset -f default_$x _eapi{0,1,2,3,4}_$x
	done
	unset x

	unset -f assert assert_sigpipe_ok \
		dump_trace die diefunc \
		quiet_mode vecho elog_base eqawarn elog \
		esyslog einfo einfon ewarn eerror ebegin _eend eend KV_major \
		KV_minor KV_micro KV_to_int get_KV unset_colors set_colors has \
		has_phase_defined_up_to \
		hasv hasq qa_source qa_call \
		addread addwrite adddeny addpredict _sb_append_var \
		use usev useq has_version portageq \
		best_version use_with use_enable register_die_hook \
		keepdir unpack strip_duplicate_slashes econf einstall \
		dyn_setup dyn_unpack dyn_clean into insinto exeinto docinto \
		insopts diropts exeopts libopts docompress \
		abort_handler abort_prepare abort_configure abort_compile \
		abort_test abort_install dyn_prepare dyn_configure \
		dyn_compile dyn_test dyn_install \
		dyn_preinst dyn_pretend dyn_help debug-print debug-print-function \
		debug-print-section helpers_die inherit EXPORT_FUNCTIONS \
		nonfatal register_success_hook remove_path_entry \
		save_ebuild_env filter_readonly_variables preprocess_ebuild_env \
		set_unless_changed unset_unless_changed source_all_bashrcs \
		ebuild_main ebuild_phase ebuild_phase_with_hooks \
		_eapi5_apply_user_patches _eapi5_src_prepare \
		_ebuild_arg_to_phase _ebuild_phase_funcs default \
		_hasg _hasgq _unpack_tar \
		${QA_INTERCEPTORS}

	case "${EAPI}" in
		0|1|2|3|4|4-python|4-slot-abi) ;;
		*) unset -f usex ;;
	esac

	case "${EAPI}" in
		5_pre1) unset -f apply_user_patches ;;
	esac

	# portage config variables and variables set directly by portage
	unset ACCEPT_LICENSE BAD BRACKET BUILD_PREFIX COLS \
		DISTCC_DIR DISTDIR DOC_SYMLINKS_DIR \
		EBUILD_FORCE_TEST EBUILD_MASTER_PID \
		ECLASS_DEPTH ENDCOL FAKEROOTKEY \
		GOOD HILITE HOME \
		LAST_E_CMD LAST_E_LEN LD_PRELOAD MISC_FUNCTIONS_ARGS MOPREFIX \
		NOCOLOR NORMAL PKGDIR PKGUSE PKG_LOGDIR PKG_TMPDIR \
		PORTAGE_BASHRCS_SOURCED PORTAGE_COMPRESS \
		PORTAGE_COMPRESS_EXCLUDE_SUFFIXES \
		PORTAGE_DOHTML_UNWARNED_SKIPPED_EXTENSIONS \
		PORTAGE_DOHTML_UNWARNED_SKIPPED_FILES \
		PORTAGE_DOHTML_WARN_ON_SKIPPED_FILES \
		PORTAGE_NONFATAL PORTAGE_QUIET \
		PORTAGE_SANDBOX_DENY PORTAGE_SANDBOX_PREDICT \
		PORTAGE_SANDBOX_READ PORTAGE_SANDBOX_WRITE PREROOTPATH \
		QA_INTERCEPTORS \
		RC_DEFAULT_INDENT RC_DOT_PATTERN RC_ENDCOL RC_INDENTATION  \
		ROOT ROOTPATH RPMDIR TEMP TMP TMPDIR USE_EXPAND \
		WARN XARGS _RC_GET_KV_CACHE

	# user config variables
	unset DOC_SYMLINKS_DIR INSTALL_MASK PKG_INSTALL_MASK

	declare -p
	declare -fp
	if [[ ${BASH_VERSINFO[0]} == 3 ]]; then
		export
	fi
	)
}
