From 01b83715ef5e5dab3cb3eb5e2a3a660aaad5fb62 Mon Sep 17 00:00:00 2001 From: K. Piche <kevin@archlinux.org> Date: Fri, 4 Apr 2008 23:02:23 -0400 Subject: [PATCH] Pulled two loops out of _alpm_remove_prepare and gave them their own functions.
Signed-off-by: K. Piche <kevin@archlinux.org> --- lib/libalpm/remove.c | 108 +++++++++++++++++++++++++++++++------------------ 1 files changed, 68 insertions(+), 40 deletions(-) diff --git a/lib/libalpm/remove.c b/lib/libalpm/remove.c index 3119bf8..5ef32a2 100644 --- a/lib/libalpm/remove.c +++ b/lib/libalpm/remove.c @@ -81,6 +81,64 @@ int _alpm_remove_loadtarget(pmtrans_t *trans, pmdb_t *db, char *name) return(0); } + + +void _alpm_remove_prepare_cascade(pmtrans_t *trans, pmdb_t *db, alpm_list_t *lp) +{ + ALPM_LOG_FUNC; + + while(lp) { + alpm_list_t *i; + for(i = lp; i; i = i->next) { + pmdepmissing_t *miss = (pmdepmissing_t *)i->data; + pmpkg_t *info = _alpm_db_get_pkgfromcache(db, miss->target); + if(info) { + if(!_alpm_pkg_find(alpm_pkg_get_name(info), trans->packages)) { + _alpm_log(PM_LOG_DEBUG, "pulling %s in the targets list\n", + alpm_pkg_get_name(info)); + trans->packages = alpm_list_add(trans->packages, _alpm_pkg_dup(info)); + } + } else { + _alpm_log(PM_LOG_ERROR, _("could not find %s in database -- skipping\n"), + miss->target); + } + } + alpm_list_free_inner(lp, (alpm_list_fn_free)_alpm_depmiss_free); + alpm_list_free(lp); + lp = alpm_checkdeps(db, 1, trans->packages, NULL); + } +} + + + +void _alpm_remove_prepare_keep_needed(pmtrans_t *trans, pmdb_t *db, alpm_list_t *lp) +{ + ALPM_LOG_FUNC; + + /* Remove needed packages (which break dependencies) from the target list */ + while(lp != NULL) { + alpm_list_t *i; + for(i = lp; i; i = i->next) { + pmdepmissing_t *miss = (pmdepmissing_t *)i->data; + void *vpkg; + pmpkg_t *pkg; + trans->packages = alpm_list_remove(trans->packages, miss->causingpkg, + _alpm_pkgname_pkg_cmp, &vpkg); + pkg = vpkg; + if(pkg) { + _alpm_log(PM_LOG_WARNING, "removing %s from the target-list\n", + alpm_pkg_get_name(pkg)); + _alpm_pkg_free(pkg); + } + } + alpm_list_free_inner(lp, (alpm_list_fn_free)_alpm_depmiss_free); + alpm_list_free(lp); + lp = alpm_checkdeps(db, 1, trans->packages, NULL); + } +} + + + int _alpm_remove_prepare(pmtrans_t *trans, pmdb_t *db, alpm_list_t **data) { alpm_list_t *lp; @@ -101,49 +159,18 @@ int _alpm_remove_prepare(pmtrans_t *trans, pmdb_t *db, alpm_list_t **data) _alpm_log(PM_LOG_DEBUG, "looking for unsatisfied dependencies\n"); lp = alpm_checkdeps(db, 1, trans->packages, NULL); if(lp != NULL) { + if(trans->flags & PM_TRANS_FLAG_CASCADE) { - while(lp) { - alpm_list_t *i; - for(i = lp; i; i = i->next) { - pmdepmissing_t *miss = (pmdepmissing_t *)i->data; - pmpkg_t *info = _alpm_db_get_pkgfromcache(db, miss->target); - if(info) { - if(!_alpm_pkg_find(alpm_pkg_get_name(info), trans->packages)) { - _alpm_log(PM_LOG_DEBUG, "pulling %s in the targets list\n", - alpm_pkg_get_name(info)); - trans->packages = alpm_list_add(trans->packages, _alpm_pkg_dup(info)); - } - } else { - _alpm_log(PM_LOG_ERROR, _("could not find %s in database -- skipping\n"), - miss->target); - } - } - alpm_list_free_inner(lp, (alpm_list_fn_free)_alpm_depmiss_free); - alpm_list_free(lp); - lp = alpm_checkdeps(db, 1, trans->packages, NULL); - } + + _alpm_remove_prepare_cascade(trans, db, lp); + } else if (trans->flags & PM_TRANS_FLAG_UNNEEDED) { - /* Remove needed packages (which break dependencies) from the target list */ - while(lp != NULL) { - alpm_list_t *i; - for(i = lp; i; i = i->next) { - pmdepmissing_t *miss = (pmdepmissing_t *)i->data; - void *vpkg; - pmpkg_t *pkg; - trans->packages = alpm_list_remove(trans->packages, miss->causingpkg, - _alpm_pkgname_pkg_cmp, &vpkg); - pkg = vpkg; - if(pkg) { - _alpm_log(PM_LOG_WARNING, "removing %s from the target-list\n", - alpm_pkg_get_name(pkg)); - _alpm_pkg_free(pkg); - } - } - alpm_list_free_inner(lp, (alpm_list_fn_free)_alpm_depmiss_free); - alpm_list_free(lp); - lp = alpm_checkdeps(db, 1, trans->packages, NULL); - } + + /* Remove needed packages (which would break dependencies) from the target list */ + _alpm_remove_prepare_keep_needed(trans, db, lp); + } else { + if(data) { *data = lp; } else { @@ -151,6 +178,7 @@ int _alpm_remove_prepare(pmtrans_t *trans, pmdb_t *db, alpm_list_t **data) alpm_list_free(lp); } RET_ERR(PM_ERR_UNSATISFIED_DEPS, -1); + } } } -- 1.5.4.5 -- K. Piche <kpiche@rogers.com>