From 86e5c8bc0649a6df814bdff850a787826612f366 Mon Sep 17 00:00:00 2001 From: Aurelien Foret Date: Sat, 7 Jan 2006 18:42:44 +0000 Subject: sync_commit can now return conflicting files with a trans_prepare like data structure (patch from VMiklos ) --- lib/libalpm/alpm.c | 4 ++-- lib/libalpm/alpm.h | 2 +- lib/libalpm/sync.c | 11 +++++------ lib/libalpm/sync.h | 2 +- lib/libalpm/trans.c | 4 ++-- lib/libalpm/trans.h | 2 +- src/pacman/add.c | 2 +- src/pacman/pacman.c | 2 +- src/pacman/remove.c | 2 +- src/pacman/sync.c | 13 ++++++++++++- 10 files changed, 27 insertions(+), 17 deletions(-) diff --git a/lib/libalpm/alpm.c b/lib/libalpm/alpm.c index 819807c6..610c3f64 100644 --- a/lib/libalpm/alpm.c +++ b/lib/libalpm/alpm.c @@ -619,7 +619,7 @@ int alpm_trans_prepare(PMList **data) return(trans_prepare(handle->trans, data)); } -int alpm_trans_commit() +int alpm_trans_commit(PMList **data) { pmtrans_t *trans; @@ -633,7 +633,7 @@ int alpm_trans_commit() /* Check for database R/W permission */ ASSERT(handle->access == PM_ACCESS_RW, RET_ERR(PM_ERR_BADPERMS, -1)); - return(trans_commit(handle->trans)); + return(trans_commit(handle->trans, data)); } int alpm_trans_release() diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h index 59ea151c..321bdc5a 100644 --- a/lib/libalpm/alpm.h +++ b/lib/libalpm/alpm.h @@ -262,7 +262,7 @@ int alpm_trans_init(unsigned char type, unsigned char flags, alpm_trans_cb_event int alpm_trans_sysupgrade(void); int alpm_trans_addtarget(char *target); int alpm_trans_prepare(PM_LIST **data); -int alpm_trans_commit(void); +int alpm_trans_commit(PM_LIST **data); int alpm_trans_release(void); /* diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c index fc962a36..fe655b8b 100644 --- a/lib/libalpm/sync.c +++ b/lib/libalpm/sync.c @@ -616,10 +616,9 @@ error: return(-1); } -int sync_commit(pmtrans_t *trans, pmdb_t *db_local) +int sync_commit(pmtrans_t *trans, pmdb_t *db_local, PMList **data) { PMList *i; - PMList *data; pmtrans_t *tr = NULL; int replaces = 0; int removal = 0; @@ -665,13 +664,13 @@ int sync_commit(pmtrans_t *trans, pmdb_t *db_local) } if(replaces+removal != 0) { _alpm_log(PM_LOG_FLOW1, "removing conflicting and to-be-replaced packages"); - if(trans_prepare(tr, &data) == -1) { + if(trans_prepare(tr, data) == -1) { _alpm_log(PM_LOG_ERROR, "could not prepare removal transaction"); goto error; } /* we want the frontend to be aware of commit details */ tr->cb_event = trans->cb_event; - if(trans_commit(tr) == -1) { + if(trans_commit(tr, NULL) == -1) { _alpm_log(PM_LOG_ERROR, "could not commit removal transaction"); goto error; } @@ -709,13 +708,13 @@ int sync_commit(pmtrans_t *trans, pmdb_t *db_local) spkg->reason = PM_PKG_REASON_EXPLICIT; } } - if(trans_prepare(tr, &data) == -1) { + if(trans_prepare(tr, data) == -1) { _alpm_log(PM_LOG_ERROR, "could not prepare transaction"); goto error; } /* we want the frontend to be aware of commit details */ tr->cb_event = trans->cb_event; - if(trans_commit(tr) == -1) { + if(trans_commit(tr, NULL) == -1) { _alpm_log(PM_LOG_ERROR, "could not commit transaction"); goto error; } diff --git a/lib/libalpm/sync.h b/lib/libalpm/sync.h index 5e4cae73..f8859977 100644 --- a/lib/libalpm/sync.h +++ b/lib/libalpm/sync.h @@ -41,7 +41,7 @@ PMList *sync_load_dbarchive(char *archive); int sync_sysupgrade(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync); int sync_addtarget(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync, char *name); int sync_prepare(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync, PMList **data); -int sync_commit(pmtrans_t *trans, pmdb_t *db_local); +int sync_commit(pmtrans_t *trans, pmdb_t *db_local, PMList **data); #endif /* _ALPM_SYNC_H */ diff --git a/lib/libalpm/trans.c b/lib/libalpm/trans.c index 8830a1ec..12441f01 100644 --- a/lib/libalpm/trans.c +++ b/lib/libalpm/trans.c @@ -179,7 +179,7 @@ int trans_prepare(pmtrans_t *trans, PMList **data) return(0); } -int trans_commit(pmtrans_t *trans) +int trans_commit(pmtrans_t *trans, PMList **data) { /* Sanity checks */ ASSERT(trans != NULL, RET_ERR(PM_ERR_TRANS_NULL, -1)); @@ -204,7 +204,7 @@ int trans_commit(pmtrans_t *trans) } break; case PM_TRANS_TYPE_SYNC: - if(sync_commit(trans, handle->db_local) == -1) { + if(sync_commit(trans, handle->db_local, data) == -1) { /* pm_errno is set by sync_commit() */ return(-1); } diff --git a/lib/libalpm/trans.h b/lib/libalpm/trans.h index bc0ed2fa..aa0633b8 100644 --- a/lib/libalpm/trans.h +++ b/lib/libalpm/trans.h @@ -67,7 +67,7 @@ int trans_init(pmtrans_t *trans, unsigned char type, unsigned char flags, alpm_t int trans_sysupgrade(pmtrans_t *trans); int trans_addtarget(pmtrans_t *trans, char *target); int trans_prepare(pmtrans_t *trans, PMList **data); -int trans_commit(pmtrans_t *trans); +int trans_commit(pmtrans_t *trans, PMList **data); #endif /* _ALPM_TRANS_H */ diff --git a/src/pacman/add.c b/src/pacman/add.c index fb6c4a58..10c618eb 100644 --- a/src/pacman/add.c +++ b/src/pacman/add.c @@ -122,7 +122,7 @@ int pacman_add(list_t *targets) /* Step 3: actually perform the installation */ - if(alpm_trans_commit() == -1) { + if(alpm_trans_commit(NULL) == -1) { ERR(NL, "failed to commit transaction (%s)\n", alpm_strerror(pm_errno)); return(1); } diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c index 646f7e9e..e1dff655 100644 --- a/src/pacman/pacman.c +++ b/src/pacman/pacman.c @@ -89,7 +89,7 @@ int main(int argc, char *argv[]) return(1); } config->op = PM_OP_MAIN; - config->debug |= PM_LOG_WARNING | PM_LOG_ERROR; + config->debug |= PM_LOG_WARNING; /* parse the command line */ ret = parseargs(argc, argv); diff --git a/src/pacman/remove.c b/src/pacman/remove.c index 6dc3758c..b730dd9b 100644 --- a/src/pacman/remove.c +++ b/src/pacman/remove.c @@ -126,7 +126,7 @@ int pacman_remove(list_t *targets) /* Step 3: actually perform the removal */ - if(alpm_trans_commit() == -1) { + if(alpm_trans_commit(NULL) == -1) { ERR(NL, "failed to commit transaction (%s)\n", alpm_strerror(pm_errno)); goto error; } diff --git a/src/pacman/sync.c b/src/pacman/sync.c index 7a76dea0..74733e06 100644 --- a/src/pacman/sync.c +++ b/src/pacman/sync.c @@ -756,8 +756,19 @@ int pacman_sync(list_t *targets) } /* Step 3: actually perform the installation */ - if(alpm_trans_commit() == -1) { + if(alpm_trans_commit(&data) == -1) { ERR(NL, "failed to commit transaction (%s)\n", alpm_strerror(pm_errno)); + switch(pm_errno) { + case PM_ERR_FILE_CONFLICTS: + for(lp = alpm_list_first(data); lp; lp = alpm_list_next(lp)) { + MSG(NL, ":: %s\n", (char *)alpm_list_getdata(lp)); + } + alpm_list_free(data); + MSG(NL, "\nerrors occurred, no packages were upgraded.\n"); + break; + default: + break; + } retval = 1; goto cleanup; } -- cgit v1.2.3-24-g4f1b