[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