# vim: ft=zsh noet typeset -g FSB_EMERGE_JOBS : ${FSB_EMERGE_JOBS:=$(cat /proc/cpuinfo | grep '^processor' | wc -l)} local emerge_ret emerge_calls current_failure previous_failure failure resolution local -a emerge_cmd chroot_cmd last_emerge_status if [[ -o xtrace ]]; then chroot_cmd=( zsh -x $build_dir/chroot.sh /bin/bash --login -x ) else chroot_cmd=( $build_dir/chroot.sh /bin/bash --login ) fi emerge_cmd=( FEATURES=-userpriv emerge --jobs $FSB_EMERGE_JOBS --verbose-conflicts ) emerge_calls=1 previous_failure="" fsb_chroot_bash_nocheck $emerge_cmd "$@" emerge_ret=$? while (($emerge_ret)); do last_emerge_status=( ${(f)"$(emerge_log_sanitizer.sed <$build_dir/var/log/emerge.log | last_emerge.awk)"} ) current_failure=$(printf "%s\n" $last_emerge_status[2,-1] | cut -f 2 | sort) if [[ $previous_failure == $current_failure ]]; then die "Hackfix: Stuck on repeating error" fi for failure in $last_emerge_status[2,-1]; do resolution=$(portage_logcat $=failure $build_dir | awk -v EMERGE_CMD="$emerge_cmd" ' /configure: error: XML::Parser perl module is required/ { print EMERGE_CMD " -1 XML-Parser" exit 0 } ') if [[ -n $resolution ]]; then break fi done if [[ -z $resolution ]]; then die "Emerge failed and no autoresolution: $*" fi $chroot_cmd -c "$resolution" || die "Hackfix autoresolution failed: $resolution" emerge_calls=$[ $emerge_cmd + 1 ] fsb_chroot_bash_nocheck $emerge_cmd "$@" emerge_ret=$? done return $emerge_ret