From eadf38960776e36df75d6c3caf3a35b976acc56c Mon Sep 17 00:00:00 2001
From: Olivier Brunel <jjk@jjacky.com>
Date: Tue, 15 Dec 2015 09:14:37 +0100
Subject: alpm: Abort ASAP on failure in pre-transaction hooks

There is no need to run any/remaining pre-transaction hooks as soon as a failure
has occured, which will lead to aborting the transaction.

So if an error occured during the first phase (reading directories/parsing
files), or as soon as a hook flagged abort_on_fail does fail, we stop processing
them and return.

(For post-transaction hooks, all hooks are run regardless since there's no
aborting.)

Signed-off-by: Olivier Brunel <jjk@jjacky.com>
Signed-off-by: Allan McRae <allan@archlinux.org>
---
 lib/libalpm/hook.c | 8 ++++++++
 1 file changed, 8 insertions(+)

(limited to 'lib')

diff --git a/lib/libalpm/hook.c b/lib/libalpm/hook.c
index fd251fa9..b5ed17d6 100644
--- a/lib/libalpm/hook.c
+++ b/lib/libalpm/hook.c
@@ -712,6 +712,10 @@ int _alpm_hook_run(alpm_handle_t *handle, alpm_hook_when_t when)
 		closedir(d);
 	}
 
+	if(ret != 0 && when == ALPM_HOOK_PRE_TRANSACTION) {
+		goto cleanup;
+	}
+
 	hooks = alpm_list_msort(hooks, alpm_list_count(hooks),
 			(alpm_list_fn_cmp)_alpm_hook_cmp);
 
@@ -745,6 +749,10 @@ int _alpm_hook_run(alpm_handle_t *handle, alpm_hook_when_t when)
 
 			hook_event.type = ALPM_EVENT_HOOK_RUN_DONE;
 			EVENT(handle, &hook_event);
+
+			if(ret != 0 && when == ALPM_HOOK_PRE_TRANSACTION) {
+				break;
+			}
 		}
 
 		alpm_list_free(hooks_triggered);
-- 
cgit v1.2.3-70-g09d2