[pacman-dev] [PATCH] makepkg: exit on error during build() or package()

Henning Garus henning.garus at googlemail.com
Sun Aug 23 11:16:21 EDT 2009


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 at 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



More information about the pacman-dev mailing list