index : pacman | |
Archlinux32 fork of pacman | gitolite user |
summaryrefslogtreecommitdiff |
author | K. Piche <kevin@archlinux.org> | 2008-04-04 23:02:23 -0400 |
---|---|---|
committer | Dan McGee <dan@archlinux.org> | 2008-04-14 17:36:33 -0500 |
commit | 2d991a25ae23ca73a9fd01aacade9e2842c2f9db (patch) | |
tree | 69e104d4537117305eed4d703d28618ab2694a76 /lib/libalpm/remove.c | |
parent | db4258c1fdf27708968baf9c4e730a014af40fd8 (diff) |
-rw-r--r-- | lib/libalpm/remove.c | 99 |
diff --git a/lib/libalpm/remove.c b/lib/libalpm/remove.c index 3119bf85..f2e84ef5 100644 --- a/lib/libalpm/remove.c +++ b/lib/libalpm/remove.c @@ -81,6 +81,60 @@ int _alpm_remove_loadtarget(pmtrans_t *trans, pmdb_t *db, char *name) return(0); } +static void 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); + } +} + +static void 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,48 +155,13 @@ 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); - } + 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 */ + remove_prepare_keep_needed(trans, db, lp); } else { if(data) { *data = lp; |