From fc8be933144b5f4552c300afc40e967504222555 Mon Sep 17 00:00:00 2001 From: Aurelien Foret Date: Sat, 21 Jan 2006 18:28:38 +0000 Subject: [PATCH] resolvedeps: return the depmiss info to the frontend in case of failure --- lib/libalpm/alpm.h | 1 - lib/libalpm/deps.c | 27 +++++++++++++++++++++++---- lib/libalpm/deps.h | 3 ++- lib/libalpm/error.c | 2 -- lib/libalpm/sync.c | 2 +- 5 files changed, 26 insertions(+), 9 deletions(-) diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h index a237fe36..c3255f66 100644 --- a/lib/libalpm/alpm.h +++ b/lib/libalpm/alpm.h @@ -354,7 +354,6 @@ extern enum __pmerrno_t { /* Dependencies */ PM_ERR_UNSATISFIED_DEPS, PM_ERR_CONFLICTING_DEPS, - PM_ERR_UNRESOLVABLE_DEPS, PM_ERR_FILE_CONFLICTS, /* Misc */ PM_ERR_USER_ABORT, diff --git a/lib/libalpm/deps.c b/lib/libalpm/deps.c index 41e1b46d..36eeb517 100644 --- a/lib/libalpm/deps.c +++ b/lib/libalpm/deps.c @@ -510,7 +510,8 @@ PMList* removedeps(pmdb_t *db, PMList *targs) * * make sure *list and *trail are already initialized */ -int resolvedeps(pmdb_t *local, PMList *dbs_sync, pmpkg_t *syncpkg, PMList *list, PMList *trail, pmtrans_t *trans) +int resolvedeps(pmdb_t *local, PMList *dbs_sync, pmpkg_t *syncpkg, PMList *list, + PMList *trail, pmtrans_t *trans, PMList **data) { PMList *i, *j; PMList *targ; @@ -571,7 +572,16 @@ int resolvedeps(pmdb_t *local, PMList *dbs_sync, pmpkg_t *syncpkg, PMList *list, if(sync == NULL) { _alpm_log(PM_LOG_ERROR, "cannot resolve dependencies for \"%s\" (\"%s\" is not in the package set)", miss->target, miss->depend.name); - pm_errno = PM_ERR_UNRESOLVABLE_DEPS; + if(data) { + if((miss = (pmdepmissing_t *)malloc(sizeof(pmdepmissing_t))) == NULL) { + FREELIST(*data); + pm_errno = PM_ERR_MEMORY; + goto error; + } + *miss = *(pmdepmissing_t *)i->data; + *data = pm_list_add(*data, miss); + } + pm_errno = PM_ERR_UNSATISFIED_DEPS; goto error; } if(pkg_isin(sync->name, list)) { @@ -593,7 +603,7 @@ int resolvedeps(pmdb_t *local, PMList *dbs_sync, pmpkg_t *syncpkg, PMList *list, } if(usedep) { trail = pm_list_add(trail, sync); - if(resolvedeps(local, dbs_sync, sync, list, trail, trans)) { + if(resolvedeps(local, dbs_sync, sync, list, trail, trans, data)) { goto error; } _alpm_log(PM_LOG_DEBUG, "pulling dependency %s (needed by %s)", @@ -601,7 +611,16 @@ int resolvedeps(pmdb_t *local, PMList *dbs_sync, pmpkg_t *syncpkg, PMList *list, list = pm_list_add(list, sync); } else { _alpm_log(PM_LOG_ERROR, "cannot resolve dependencies for \"%s\"", miss->target); - pm_errno = PM_ERR_UNRESOLVABLE_DEPS; + if(data) { + if((miss = (pmdepmissing_t *)malloc(sizeof(pmdepmissing_t))) == NULL) { + FREELIST(*data); + pm_errno = PM_ERR_MEMORY; + goto error; + } + *miss = *(pmdepmissing_t *)i->data; + *data = pm_list_add(*data, miss); + } + pm_errno = PM_ERR_UNSATISFIED_DEPS; goto error; } } else { diff --git a/lib/libalpm/deps.h b/lib/libalpm/deps.h index 9451d8b4..fbbd6438 100644 --- a/lib/libalpm/deps.h +++ b/lib/libalpm/deps.h @@ -43,7 +43,8 @@ PMList *sortbydeps(PMList *targets, int mode); PMList *checkdeps(pmdb_t *db, unsigned char op, PMList *packages); int splitdep(char *depstr, pmdepend_t *depend); PMList *removedeps(pmdb_t *db, PMList *targs); -int resolvedeps(pmdb_t *local, PMList *dbs_sync, pmpkg_t *syncpkg, PMList *list, PMList *trail, pmtrans_t *trans); +int resolvedeps(pmdb_t *local, PMList *dbs_sync, pmpkg_t *syncpkg, PMList *list, + PMList *trail, pmtrans_t *trans, PMList **data); #endif /* _ALPM_DEPS_H */ diff --git a/lib/libalpm/error.c b/lib/libalpm/error.c index 609e598f..54220e0b 100644 --- a/lib/libalpm/error.c +++ b/lib/libalpm/error.c @@ -102,8 +102,6 @@ char *alpm_strerror(int err) return "could not satisfy dependencies"; case PM_ERR_CONFLICTING_DEPS: return "conflicting dependencies"; - case PM_ERR_UNRESOLVABLE_DEPS: - return "could not resolve dependencies"; case PM_ERR_FILE_CONFLICTS: return "conflicting files"; /* Miscellaenous */ diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c index 1c88b978..9e23bb31 100644 --- a/lib/libalpm/sync.c +++ b/lib/libalpm/sync.c @@ -376,7 +376,7 @@ int sync_prepare(pmtrans_t *trans, pmdb_t *db_local, PMList *dbs_sync, PMList ** _alpm_log(PM_LOG_FLOW1, "resolving targets dependencies"); for(i = trans->packages; i; i = i->next) { pmpkg_t *spkg = ((pmsyncpkg_t *)i->data)->pkg; - if(resolvedeps(db_local, dbs_sync, spkg, list, trail, trans) == -1) { + if(resolvedeps(db_local, dbs_sync, spkg, list, trail, trans, data) == -1) { /* pm_errno is set by resolvedeps */ goto error; }