[pacman-dev] Simple refactoring in remove.c
K. Piche
kpiche at rogers.com
Wed Apr 9 22:16:10 EDT 2008
>From 01b83715ef5e5dab3cb3eb5e2a3a660aaad5fb62 Mon Sep 17 00:00:00 2001
From: K. Piche <kevin at 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 at 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 at rogers.com>
More information about the pacman-dev
mailing list