Set the ERR trap to abort upon encountering an error during the execution
of a build or package function.

Activate set -E, which lets functions inherit the ERR trap.

Signed-off-by: Henning Garus <[email protected]>
---
 scripts/makepkg.sh.in |   48 +++++++++++++++++++++++++++++++++++-------------
 1 files changed, 35 insertions(+), 13 deletions(-)

diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
index daa9585..bacf13f 100644
--- a/scripts/makepkg.sh.in
+++ b/scripts/makepkg.sh.in
@@ -174,6 +174,7 @@ clean_up() {
 ##
 # Signal Traps
 ##
+set -E
 trap 'clean_up' 0
 trap 'trap_exit "$(gettext "TERM signal caught. Exiting...")"' TERM HUP QUIT
 trap 'trap_exit "$(gettext "Aborted by user! Exiting...")"' INT
@@ -673,6 +674,16 @@ extract_sources() {
        fi
 }
 
+error_build() {
+       # first exit all subshells, then print the error
+       if [ $BASH_SUBSHELL -eq 0 ]; then
+               error "$(gettext "Build Failed.")"
+               plain "$(gettext "Aborting...")"
+               remove_deps
+       fi
+       exit 2 # $E_BUILD_FAILED
+}
+
 run_build() {
        # use distcc if it is requested (check buildenv and PKGBUILD opts)
        if [ "$(check_buildenv distcc)" = "y" -a "$(check_option distcc)" != 
"n" ]; then
@@ -716,19 +727,31 @@ run_build() {
                        mv "$BUILDLOG" "$BUILDLOG.$i"
                fi
 
+               set +E
                build 2>&1 | tee "$BUILDLOG"; ret=${PIPESTATUS[0]}
+               set -E
+               if [ $ret -gt 0 ]; then error_build; fi
        else
-               build 2>&1 || ret=$?
+               restoretrap=$(trap -p ERR)
+               trap 'error_build' ERR
+               build 2>&1
+               eval $restoretrap
        fi
        # reset our shell options
        eval "$shellopts"
+}
 
-       if [ $ret -gt 0 ]; then
-               error "$(gettext "Build Failed.")"
+error_package() {
+       if [ -p "$logpipe" ]; then
+               rm "$logpipe"
+       fi
+       # first exit all subshells, then print the error
+       if [ $BASH_SUBSHELL -eq 0 ]; then
+               error "$(gettext "Packaging Failed.")"
                plain "$(gettext "Aborting...")"
                remove_deps
-               exit 2 # $E_BUILD_FAILED
        fi
+       exit 2 # $E_BUILD_FAILED
 }
 
 run_package() {
@@ -772,19 +795,18 @@ run_package() {
                exec 3>&1
                tee "$BUILDLOG" < "$logpipe" &
                exec 1>"$logpipe" 2>"$logpipe"
-               $pkgfunc 2>&1 || ret=$?
+               restoretrap=$(trap -p ERR)
+               trap 'error_package' ERR
+               $pkgfunc 2>&1
+               eval $restoretrap
                sync
                exec 1>&3 2>&3 3>&-
                rm "$logpipe"
        else
-               $pkgfunc 2>&1 || ret=$?
-       fi
-
-       if [ $ret -gt 0 ]; then
-               error "$(gettext "Packaging Failed.")"
-               plain "$(gettext "Aborting...")"
-               remove_deps
-               exit 2 # $E_BUILD_FAILED
+               restoretrap=$(trap -p ERR)
+               trap 'error_package' ERR
+               $pkgfunc 2>&1
+               eval $restoretrap
        fi
 }
 
-- 
1.6.4.1


Reply via email to