From c7bcaeb7e82b9b74ab9734863827ff98db2b1fdd Mon Sep 17 00:00:00 2001
From: Aurelien Foret <aurelien@archlinux.org>
Date: Tue, 17 Jan 2006 22:01:57 +0000
Subject: fixed detection for duplicate entries in list of deps/conflicts

---
 lib/libalpm/conflict.c | 12 ++++++------
 lib/libalpm/deps.c     | 21 ++++++++++++++++++---
 lib/libalpm/deps.h     |  1 +
 3 files changed, 25 insertions(+), 9 deletions(-)

(limited to 'lib/libalpm')

diff --git a/lib/libalpm/conflict.c b/lib/libalpm/conflict.c
index 9f6ddecb..749cad24 100644
--- a/lib/libalpm/conflict.c
+++ b/lib/libalpm/conflict.c
@@ -75,7 +75,7 @@ PMList *checkconflicts(pmdb_t *db, PMList *packages)
 					miss->depend.version[0] = '\0';
 					STRNCPY(miss->target, tp->name, PKG_NAME_LEN);
 					STRNCPY(miss->depend.name, dp->name, PKG_NAME_LEN);
-					if(!pm_list_is_in(miss, baddeps)) {
+					if(!dep_isin(miss, baddeps)) {
 						_alpm_log(PM_LOG_DEBUG, "checkconflict: targs vs db: adding %s as a conflict for %s",
 						          dp->name, tp->name);
 						baddeps = pm_list_add(baddeps, miss);
@@ -94,7 +94,7 @@ PMList *checkconflicts(pmdb_t *db, PMList *packages)
 							miss->depend.version[0] = '\0';
 							STRNCPY(miss->target, tp->name, PKG_NAME_LEN);
 							STRNCPY(miss->depend.name, dp->name, PKG_NAME_LEN);
-							if(!pm_list_is_in(miss, baddeps)) {
+							if(!dep_isin(miss, baddeps)) {
 								_alpm_log(PM_LOG_DEBUG, "checkconflict: targs vs db: adding %s as a conflict for %s",
 								          dp->name, tp->name);
 								baddeps = pm_list_add(baddeps, miss);
@@ -120,7 +120,7 @@ PMList *checkconflicts(pmdb_t *db, PMList *packages)
 					miss->depend.version[0] = '\0';
 					STRNCPY(miss->target, tp->name, PKG_NAME_LEN);
 					STRNCPY(miss->depend.name, otp->name, PKG_NAME_LEN);
-					if(!pm_list_is_in(miss, baddeps)) {
+					if(!dep_isin(miss, baddeps)) {
 						_alpm_log(PM_LOG_DEBUG, "checkconflict: targs vs targs: adding %s as a conflict for %s",
 						          otp->name, tp->name);
 						baddeps = pm_list_add(baddeps, miss);
@@ -138,7 +138,7 @@ PMList *checkconflicts(pmdb_t *db, PMList *packages)
 							miss->depend.version[0] = '\0';
 							STRNCPY(miss->target, tp->name, PKG_NAME_LEN);
 							STRNCPY(miss->depend.name, otp->name, PKG_NAME_LEN);
-							if(!pm_list_is_in(miss, baddeps)) {
+							if(!dep_isin(miss, baddeps)) {
 								_alpm_log(PM_LOG_DEBUG, "checkconflict: targs vs targs: adding %s as a conflict for %s",
 								          otp->name, tp->name);
 								baddeps = pm_list_add(baddeps, miss);
@@ -165,7 +165,7 @@ PMList *checkconflicts(pmdb_t *db, PMList *packages)
 					miss->depend.version[0] = '\0';
 					STRNCPY(miss->target, tp->name, PKG_NAME_LEN);
 					STRNCPY(miss->depend.name, info->name, PKG_NAME_LEN);
-					if(!pm_list_is_in(miss, baddeps)) {
+					if(!dep_isin(miss, baddeps)) {
 						_alpm_log(PM_LOG_DEBUG, "checkconflict: db vs targs: adding %s as a conflict for %s",
 						          info->name, tp->name);
 						baddeps = pm_list_add(baddeps, miss);
@@ -185,7 +185,7 @@ PMList *checkconflicts(pmdb_t *db, PMList *packages)
 								miss->depend.version[0] = '\0';
 								STRNCPY(miss->target, tp->name, PKG_NAME_LEN);
 								STRNCPY(miss->depend.name, info->name, PKG_NAME_LEN);
-								if(!pm_list_is_in(miss, baddeps)) {
+								if(!dep_isin(miss, baddeps)) {
 									_alpm_log(PM_LOG_DEBUG, "checkconflict: db vs targs: adding %s as a conflict for %s",
 									          info->name, tp->name);
 									baddeps = pm_list_add(baddeps, miss);
diff --git a/lib/libalpm/deps.c b/lib/libalpm/deps.c
index ff6fc505..e7520560 100644
--- a/lib/libalpm/deps.c
+++ b/lib/libalpm/deps.c
@@ -37,6 +37,21 @@
 
 extern pmhandle_t *handle;
 
+int dep_isin(pmdepmissing_t *needle, PMList *haystack)
+{
+	PMList *i;
+
+	for(i = haystack; i; i = i->next) {
+		pmdepmissing_t *miss = i->data;
+		if(!memcmp(needle, miss, sizeof(pmdepmissing_t))
+		   && !memcmp(&needle->depend, &miss->depend, sizeof(pmdepend_t))) {
+			return(1);
+		}
+	}
+
+	return(0);
+}
+
 static pmdepmissing_t *depmissing_new(const char *target, unsigned char type, unsigned char depmod,
                                       const char *depname, const char *depversion)
 {
@@ -225,7 +240,7 @@ PMList *checkdeps(pmdb_t *db, unsigned char op, PMList *packages)
 					STRNCPY(miss->target, p->name, PKG_NAME_LEN);
 					STRNCPY(miss->depend.name, depend.name, PKG_NAME_LEN);
 					STRNCPY(miss->depend.version, depend.version, PKG_VERSION_LEN);
-					if(!pm_list_is_in(miss, baddeps)) {
+					if(!dep_isin(miss, baddeps)) {
 						baddeps = pm_list_add(baddeps, miss);
 					} else {
 						FREE(miss);
@@ -339,7 +354,7 @@ PMList *checkdeps(pmdb_t *db, unsigned char op, PMList *packages)
 					STRNCPY(miss->target, tp->name, PKG_NAME_LEN);
 					STRNCPY(miss->depend.name, depend.name, PKG_NAME_LEN);
 					STRNCPY(miss->depend.version, depend.version, PKG_VERSION_LEN);
-					if(!pm_list_is_in(miss, baddeps)) {
+					if(!dep_isin(miss, baddeps)) {
 						baddeps = pm_list_add(baddeps, miss);
 					} else {
 						FREE(miss);
@@ -363,7 +378,7 @@ PMList *checkdeps(pmdb_t *db, unsigned char op, PMList *packages)
 					miss->depend.version[0] = '\0';
 					STRNCPY(miss->target, tp->name, PKG_NAME_LEN);
 					STRNCPY(miss->depend.name, (char *)j->data, PKG_NAME_LEN);
-					if(!pm_list_is_in(miss, baddeps)) {
+					if(!dep_isin(miss, baddeps)) {
 						baddeps = pm_list_add(baddeps, miss);
 					} else {
 						FREE(miss);
diff --git a/lib/libalpm/deps.h b/lib/libalpm/deps.h
index b01314bc..99032833 100644
--- a/lib/libalpm/deps.h
+++ b/lib/libalpm/deps.h
@@ -36,6 +36,7 @@ typedef struct __pmdepmissing_t {
 	pmdepend_t depend;
 } pmdepmissing_t;
 
+int dep_isin(pmdepmissing_t *needle, PMList *haystack);
 PMList *sortbydeps(PMList *targets, int mode);
 PMList *checkdeps(pmdb_t *db, unsigned char op, PMList *packages);
 int splitdep(char *depstr, pmdepend_t *depend);
-- 
cgit v1.2.3-70-g09d2