[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