diff --git a/leaf b/leaf index 98441f3..93a942a 100755 --- a/leaf +++ b/leaf @@ -1,5 +1,6 @@ #!/bin/bash set -e +shopt -s inherit_errexit 2>/dev/null || true RED_COLOR="\e[1;31m" PURPLE_COLOR="\e[1;35m" @@ -404,6 +405,44 @@ leaf_update_environment() { [ ! -r /etc/profile ] || source /etc/profile } +leaf_run_phase() { + # usage: leaf_run_phase + local phase="$1" fn="$2" + + LEAF_PHASE_RC=0 + + declare -F "$fn" >/dev/null || { + LEAF_PHASE_RC=127 + return 0 + } + + echo -e "${GREEN_COLOR}>>> ${PKG_PREFIX}/${PKG_NAME}: ${phase}${CLEAR_COLOR}" + + set +e + ( + set -eE -o pipefail + "$fn" + ) + LEAF_PHASE_RC=$? + set -e + + return 0 +} + +leaf_phase_must() { + local phase="$1" fn="$2" msg="$3" + leaf_run_phase "$phase" "$fn" + if [ "${LEAF_PHASE_RC}" -ne 0 ]; then + leaf_error "${msg:-${fn} failed (rc=${LEAF_PHASE_RC})}" + fi +} + +leaf_phase_try() { + # just run, caller checks $LEAF_PHASE_RC + leaf_run_phase "$1" "$2" +} + + leaf_prepare_package() { local url sourcefile index _md5sum local_src @@ -453,22 +492,42 @@ leaf_prepare_package() { popd >/dev/null || true echo "Sources ready." - src_prepare + leaf_phase_must "Preparing" src_prepare "Prepare faild." } leaf_build_package() { leaf_prepare_package - src_build + leaf_phase_must "Building" src_build "Build faild." - if ! src_check; then - if [ "${FORCE_INSTALL}" == "1" ]; then + leaf_phase_try "Checking" src_check + if [ "${LEAF_PHASE_RC}" -ne 0 ]; then + if [ "${FORCE_INSTALL:-0}" = "1" ]; then echo -e "${RED_COLOR}* Tests failed, but is in force-install mode.${CLEAR_COLOR}" else leaf_error "Tests failed, please check. Aborting installation." fi fi - src_install + ## run tests (strict: any failing command inside src_check fails the whole check) + #local _check_rc=0 + #set +e + #( set -e; src_check ) + #_check_rc=$? + #set -e + # + #if [ "${_check_rc}" -ne 0 ]; then + # if [ "${FORCE_INSTALL}" = "1" ]; then + # echo -e "${RED_COLOR}* Tests failed, but is in force-install mode.${CLEAR_COLOR}" + # else + # leaf_error "Tests failed, please check. Aborting installation." + # fi + #fi + + # ensure pkgdir exists + rm -rf -- "${pkgdir}" + install -dm755 -- "${pkgdir}" + + leaf_phase_must "Installing" src_install "Installing failed." local _option for _option in $(echo ${!BUILD_OPTIONS[*]}); do if [[ x"${_option}" == x"strip" ]] && [[ x"${BUILD_OPTIONS[$_option]}" == x"1" ]]; then @@ -492,9 +551,9 @@ leaf_install_package() { # trace need to to in the same fakeroot leaf_trace_package "${pkgdir}" # ROOT starts - src_preinstall + leaf_phase_must "Preinstall" src_preinstall "Preinstall failed." leaf_merge_package "${pkgdir}" - src_postinstall + leaf_phase_must "Postinstall" src_postinstall "Postinstall failed." leaf_update_package_database add "${PKG_PREFIX}/${PKG_NAME}" leaf_update_environment # ROOT ends @@ -507,9 +566,9 @@ leaf_dirct-install_package() { # trace need to to in the same fakeroot leaf_trace_package "${pkgdir}" # ROOT starts - src_preinstall + leaf_phase_must "Preinstall" src_preinstall "Preinstall failed." leaf_merge_package "${pkgdir}" - src_postinstall + leaf_phase_must "Postinstall" src_postinstall "Postinstall failed." leaf_update_package_database add "${PKG_PREFIX}/${PKG_NAME}" leaf_update_environment # ROOT ends @@ -525,7 +584,7 @@ leaf_remove_package() { [ -n "$(grep "${PKG_PREFIX}/${PKG_NAME}" ${INSTALLED_PACKAGES})" ] || { leaf_error "Package ${PKG_PREFIX}/${PKG_NAME} is NOT installed" } - src_preremove + leaf_phase_must "Preremove" src_preremove "Preremove failed." local _file _link _directory _etc_backup_path _relative_path _backup_etc=false _etc_backup_path="/etc/.leaf_backup/${PKGNAME}_$(date +%Y%m%d%H%M%S)" cat "${TRACE_DIR}/${PKG_PREFIX}/${PKG_NAME}/FILES" | while read -r _file; do @@ -549,7 +608,7 @@ leaf_remove_package() { rmdir --ignore-fail-on-non-empty "${_directory}" fi done - src_postremove + leaf_phase_must "Postremove" src_postremove "Postremove failed." leaf_invoke_hooks remove rm -rf "${TRACE_DIR}/${PKG_PREFIX}/${PKG_NAME}" leaf_update_package_database delete "${PKG_PREFIX}/${PKG_NAME}"