[pacman-dev] [PATCH v2 3/7] check fileconflicts and diskspace outside commit

Andrew Gregory andrew.gregory.8 at gmail.com
Mon Sep 14 22:37:40 UTC 2015


This is necessary in order to be able to run PreTransaction hooks as
close to the actual commit as possible so that we don't prematurely run
hooks for a transaction that ultimately never happens.

Signed-off-by: Andrew Gregory <andrew.gregory.8 at gmail.com>
---
 lib/libalpm/sync.c  | 18 ++++++++++++++----
 lib/libalpm/sync.h  |  3 ++-
 lib/libalpm/trans.c |  6 +++++-
 3 files changed, 21 insertions(+), 6 deletions(-)

diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c
index e843b07..c5607bc 100644
--- a/lib/libalpm/sync.c
+++ b/lib/libalpm/sync.c
@@ -1338,7 +1338,7 @@ int _alpm_sync_load(alpm_handle_t *handle, alpm_list_t **data)
 	return 0;
 }
 
-int _alpm_sync_commit(alpm_handle_t *handle, alpm_list_t **data)
+int _alpm_sync_check(alpm_handle_t *handle, alpm_list_t **data)
 {
 	alpm_trans_t *trans = handle->trans;
 	alpm_event_t event;
@@ -1355,7 +1355,8 @@ int _alpm_sync_commit(alpm_handle_t *handle, alpm_list_t **data)
 			if(data) {
 				*data = conflict;
 			} else {
-				alpm_list_free_inner(conflict, (alpm_list_fn_free)alpm_fileconflict_free);
+				alpm_list_free_inner(conflict,
+						(alpm_list_fn_free)alpm_fileconflict_free);
 				alpm_list_free(conflict);
 			}
 			RET_ERR(handle, ALPM_ERR_FILE_CONFLICTS, -1);
@@ -1380,12 +1381,21 @@ int _alpm_sync_commit(alpm_handle_t *handle, alpm_list_t **data)
 		EVENT(handle, &event);
 	}
 
+	return 0;
+}
+
+int _alpm_sync_commit(alpm_handle_t *handle)
+{
+	alpm_trans_t *trans = handle->trans;
+
 	/* remove conflicting and to-be-replaced packages */
 	if(trans->remove) {
-		_alpm_log(handle, ALPM_LOG_DEBUG, "removing conflicting and to-be-replaced packages\n");
+		_alpm_log(handle, ALPM_LOG_DEBUG,
+				"removing conflicting and to-be-replaced packages\n");
 		/* we want the frontend to be aware of commit details */
 		if(_alpm_remove_packages(handle, 0) == -1) {
-			_alpm_log(handle, ALPM_LOG_ERROR, _("could not commit removal transaction\n"));
+			_alpm_log(handle, ALPM_LOG_ERROR,
+					_("could not commit removal transaction\n"));
 			return -1;
 		}
 	}
diff --git a/lib/libalpm/sync.h b/lib/libalpm/sync.h
index 6281550..60ebb75 100644
--- a/lib/libalpm/sync.h
+++ b/lib/libalpm/sync.h
@@ -26,7 +26,8 @@
 
 int _alpm_sync_prepare(alpm_handle_t *handle, alpm_list_t **data);
 int _alpm_sync_load(alpm_handle_t *handle, alpm_list_t **data);
-int _alpm_sync_commit(alpm_handle_t *handle, alpm_list_t **data);
+int _alpm_sync_check(alpm_handle_t *handle, alpm_list_t **data);
+int _alpm_sync_commit(alpm_handle_t *handle);
 
 #endif /* _ALPM_SYNC_H */
 
diff --git a/lib/libalpm/trans.c b/lib/libalpm/trans.c
index 6a26e75..ed073c0 100644
--- a/lib/libalpm/trans.c
+++ b/lib/libalpm/trans.c
@@ -183,6 +183,10 @@ int SYMEXPORT alpm_trans_commit(alpm_handle_t *handle, alpm_list_t **data)
 		if(trans->flags & ALPM_TRANS_FLAG_DOWNLOADONLY) {
 			return 0;
 		}
+		if(_alpm_sync_check(handle, data) != 0) {
+			/* pm_errno is set by _alpm_sync_check() */
+			return -1;
+		}
 	}
 
 	trans->state = STATE_COMMITING;
@@ -198,7 +202,7 @@ int SYMEXPORT alpm_trans_commit(alpm_handle_t *handle, alpm_list_t **data)
 			return -1;
 		}
 	} else {
-		if(_alpm_sync_commit(handle, data) == -1) {
+		if(_alpm_sync_commit(handle) == -1) {
 			/* pm_errno is set by _alpm_sync_commit() */
 			alpm_errno_t save = handle->pm_errno;
 			alpm_logaction(handle, ALPM_CALLER_PREFIX, "transaction failed\n");
-- 
2.5.2


More information about the pacman-dev mailing list