[pacman-dev] [PATCH] makepkg: exit on error during build() or package()
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 <henning.garus@gmail.com> --- 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
Henning Garus wrote:
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 <henning.garus@gmail.com>
Did a lot of testing here and everything appears awesome. Signed-off and on my working branch. Allan
participants (2)
-
Allan McRae
-
Henning Garus