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 <[email protected]>
---
 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

Reply via email to