[pacman-dev] Long functions and other minor fixes

James Rosten seinfeld90 at gmail.com
Fri Dec 29 21:09:36 EST 2006


I've refactored _alpm_checkconflicts, but there appears to be something
slightly off.  With a normal cvs build of pacman3, trying to install
sonata-svn with normal sonata produces this:

loading package data... done.checking dependencies... :: sonata-svn
conflicts with sonata. Remove sonata? [Y/n] y
error: failed to prepare transaction (conflicting dependencies)
:: sonata-svn: conflicts with sonata

But with my patch:

loading package data... done.checking dependencies... done.
checking for file conflicts (1/1)
[###############################################################] 100%
error: failed to prepare transaction (conflicting files)
sonata-svn: /usr/bin/sonata exists in filesystemsonata-svn:
/usr/lib/python2.4/site-packages/mmkeys.so exists in
filesystemsonata-svn: /usr/lib/python2.4/site-packages/mpdclient3.py
exists in filesystemsonata-svn:
/usr/lib/python2.4/site-packages/mpdclient3.pyc exists in
filesystemsonata-svn: /usr/lib/python2.4/site-packages/sonata.py exists
in filesystemsonata-svn: /usr/lib/python2.4/site-packages/sonata.pyc
exists in filesystemsonata-svn: /usr/share/applications/sonata.desktop
exists in filesystemsonata-svn:
/usr/share/locale/de/LC_MESSAGES/sonata.mo exists in
filesystemsonata-svn: /usr/share/locale/fr/LC_MESSAGES/sonata.mo exists
in filesystemsonata-svn: /usr/share/locale/pl/LC_MESSAGES/sonata.mo
exists in filesystemsonata-svn:
/usr/share/locale/ru/LC_MESSAGES/sonata.mo exists in
filesystemsonata-svn: /usr/share/pixmaps/sonata.png exists in
filesystemsonata-svn: /usr/share/pixmaps/sonatacd.png exists in
filesystemsonata-svn: /usr/share/pixmaps/sonatacd_large.png exists in
filesystemsonata-svn: /usr/share/sonata/CHANGELOG exists in
filesystemsonata-svn: /usr/share/sonata/README exists in
filesystemsonata-svn: /usr/share/sonata/TODO exists in
filesystemsonata-svn: /usr/share/sonata/TRANSLATORS exists in filesystem
errors occurred, no packages were upgraded.

As you can see it flipped out, but even with the normal pacman3 it still
fails to install.  Both were executed with:

sudo ./pacman.static -A /var/abs/local/sonata-svn/sonata-svn-246-1.pkg.tar.gz 

Using -U instead of -A yields the same results.

So below is the patch for you guys to look over and see what might be
screwing this up (cause I have no idea).

~ Jamie / yankees26
-------------- next part --------------
Index: lib/libalpm/conflict.c
===================================================================
RCS file: /home/cvs-pacman/pacman-lib/lib/libalpm/conflict.c,v
retrieving revision 1.28
diff -u -r1.28 conflict.c
--- lib/libalpm/conflict.c	22 Nov 2006 09:03:42 -0000	1.28
+++ lib/libalpm/conflict.c	30 Dec 2006 01:45:46 -0000
@@ -46,155 +46,141 @@
 #include "deps.h"
 #include "conflict.h"
 
-/* Returns a pmlist_t* of pmdepmissing_t pointers.
- *
- * conflicts are always name only
+/* Buddy functions galor for _alpm_checkconflicts
+ * _alpm_conflict_check1
+ * _alpm_conflict_check2
+ * _alpm_conflict_check3
  */
-pmlist_t *_alpm_checkconflicts(pmdb_t *db, pmlist_t *packages)
+void _alpm_conflict_check1(pmpkg_t *tp, pmlist *j, pmlist_t *baddeps, pmdepmissing_t *miss)
 {
-	pmpkg_t *info = NULL;
-	pmlist_t *i, *j, *k;
-	pmlist_t *baddeps = NULL;
-	pmdepmissing_t *miss = NULL;
-
-	if(db == NULL) {
-		return(NULL);
-	}
-
-	for(i = packages; i; i = i->next) {
-		pmpkg_t *tp = i->data;
-		if(tp == NULL) {
+	pmlist_t *k;
+	for ( j = tp->conflicts; j; j = j->next ) {
+		if ( !strcmp(tp->name, j->data) ) {
+			/* a package cannont conflict with itself -- that's just not nice */
 			continue;
 		}
-
-		for(j = tp->conflicts; j; j = j->next) {
-			if(!strcmp(tp->name, j->data)) {
-				/* a package cannot conflict with itself -- that's just not nice */
-				continue;
-			}
-			/* CHECK 1: check targets against database */
-			_alpm_log(PM_LOG_DEBUG, _("checkconflicts: targ '%s' vs db"), tp->name);
-			for(k = _alpm_db_get_pkgcache(db, INFRQ_DEPENDS); k; k = k->next) {
-				pmpkg_t *dp = (pmpkg_t *)k->data;
-				if(!strcmp(dp->name, tp->name)) {
-					/* a package cannot conflict with itself -- that's just not nice */
-					continue;
-				}
-				if(!strcmp(j->data, dp->name)) {
-					/* conflict */
-					_alpm_log(PM_LOG_DEBUG, _("targs vs db: found %s as a conflict for %s"),
-					          dp->name, tp->name);
-					miss = _alpm_depmiss_new(tp->name, PM_DEP_TYPE_CONFLICT, PM_DEP_MOD_ANY, dp->name, NULL);
-					if(!_alpm_depmiss_isin(miss, baddeps)) {
-						baddeps = _alpm_list_add(baddeps, miss);
-					} else {
-						FREE(miss);
-					}
+		_alpm_log(PM_LOG_DEBUG, _("checkconflicts: tar '%s' vs db"), tp->name);
+		for ( k = _alpm_db_get_pkgcache(db, INFRQ_DEPENDS); k; k = k->next ) {
+			pmpkg_t *dp = (pmpkg_t *)k->data;
+			if ( !strcmp(dp->name, tp->name) ) {
+				/* CONFLICT ALERT!!!!!!!!!!!!!!!!!! */
+				_alpm_log(PM_LOG_DEBUG, _("targs vs db: found %s as a conflict for %s"),
+					  dp->name, tp->name);
+				miss = _alpm_depmiss_new(tp->name, PM_DEP_TYPE_CONFLICT, PM_DEP_MOD_ANY, dp->name, NULL);
+				if ( !_alpm_depmiss_isin(miss, baddeps) ) {
+					baddeps = _alpm_list_add(baddeps, miss);
 				} else {
-					/* see if dp provides something in tp's conflict list */
-					pmlist_t *m;
-					for(m = dp->provides; m; m = m->next) {
-						if(!strcmp(m->data, j->data)) {
-							/* confict */
-							_alpm_log(PM_LOG_DEBUG, _("targs vs db: found %s as a conflict for %s"),
-							          dp->name, tp->name);
-							miss = _alpm_depmiss_new(tp->name, PM_DEP_TYPE_CONFLICT, PM_DEP_MOD_ANY, dp->name, NULL);
-							if(!_alpm_depmiss_isin(miss, baddeps)) {
-								baddeps = _alpm_list_add(baddeps, miss);
-							} else {
-								FREE(miss);
-							}
+					FREE(miss);
+				}
+			} else {
+				/* see if dp provides something in tp's conflict list */
+				pmlist_t *m;
+				for ( m = dp->provides; m; m = m->next ) {
+					if ( !strcmp(m->data, j->data) ) {
+						/* CONFLICT!!!!!!!!!!! */
+						_alpm_log(PM_LOG_DEBUG, _("targs vs db: found %s as a conflict of %s"),
+							  dp->name, tp->name);
+						miss = _alpm_depmiss_new(tp->name, PM_DEP_TYPE_CONFLICT, PM_DEP_MOD_ANY, dp->name, NULL);
+						if ( !alpm_depmiss_isin(miss, baddeps) ) {
+							baddeps = _alpm_list_add(baddeps, miss);
+						} else {
+							FREE(miss);
 						}
 					}
 				}
 			}
-			/* CHECK 2: check targets against targets */
-			_alpm_log(PM_LOG_DEBUG, _("checkconflicts: targ '%s' vs targs"), tp->name);
-			for(k = packages; k; k = k->next) {
-				pmpkg_t *otp = (pmpkg_t *)k->data;
-				if(!strcmp(otp->name, tp->name)) {
-					/* a package cannot conflict with itself -- that's just not nice */
-					continue;
-				}
-				if(!strcmp(otp->name, (char *)j->data)) {
-					/* otp is listed in tp's conflict list */
+		}
+	}
+}
+
+void _alpm_conflict_check2(pmpkg_t *tp, pmlist *j, pmlist_t *baddeps, pmdepmissing_t *miss, pmlist_t *packages)
+{
+	pmlist_t *k;
+	for ( k = packages; k; k= k->next ) {
+		pmpkg_t *otp = (pmpkg_t *)k->data;
+		if ( !strcmp(otp->name, tp->name) ) {
+			/* a package cannot conflict with itself -- that's just not nice */
+			continue;
+		} if ( !strcmp(otp->name, (char *)j->data) ) {
+			/* otp is listed in tp's conflict list */
+			_alpm_log(PM_LOG_DEBUG, _("targs vs targs: found %s as a conflict of %s"),
+				  otp->name, tp->name);
+			miss = _alpm_depmiss_new(tp->name, PM_DEP_TYPE_CONFLICT, PM_DEP_MOD_ANY, otp->name, NULL);
+			if ( !_alpm_depmiss_isin(miss, baddeps) ) {
+				baddeps = _alpm_list_add(baddeps, miss);
+			} else {
+				FREE(miss);
+			}
+		} else {
+			/* see if otp provides something in tp's conflict list */
+			pmlist_t *m;
+			for ( m = otp->provides; m; m = m->next ) {
+				if ( !strcmp(m->data, j->data) ) {
 					_alpm_log(PM_LOG_DEBUG, _("targs vs targs: found %s as a conflict for %s"),
-					          otp->name, tp->name);
+						  otp->name, tp->name);
 					miss = _alpm_depmiss_new(tp->name, PM_DEP_TYPE_CONFLICT, PM_DEP_MOD_ANY, otp->name, NULL);
-					if(!_alpm_depmiss_isin(miss, baddeps)) {
+					if ( !_alpm_depmiss_isin(miss, baddeps) ) {
 						baddeps = _alpm_list_add(baddeps, miss);
 					} else {
 						FREE(miss);
 					}
-				} else {
-					/* see if otp provides something in tp's conflict list */ 
-					pmlist_t *m;
-					for(m = otp->provides; m; m = m->next) {
-						if(!strcmp(m->data, j->data)) {
-							_alpm_log(PM_LOG_DEBUG, _("targs vs targs: found %s as a conflict for %s"),
-							          otp->name, tp->name);
-							miss = _alpm_depmiss_new(tp->name, PM_DEP_TYPE_CONFLICT, PM_DEP_MOD_ANY, otp->name, NULL);
-							if(!_alpm_depmiss_isin(miss, baddeps)) {
-								baddeps = _alpm_list_add(baddeps, miss);
-							} else {
-								FREE(miss);
-							}
-						}
-					}
 				}
 			}
 		}
-		/* CHECK 3: check database against targets */
-		_alpm_log(PM_LOG_DEBUG, _("checkconflicts: db vs targ '%s'"), tp->name);
-		for(k = _alpm_db_get_pkgcache(db, INFRQ_DEPENDS); k; k = k->next) {
-			pmlist_t *conflicts = NULL;
-			int usenewconflicts = 0;
-
-			info = k->data;
-			if(!strcmp(info->name, tp->name)) {
-				/* a package cannot conflict with itself -- that's just not nice */
-				continue;
-			}
-			/* If this package (*info) is also in our packages pmlist_t, use the
-			 * conflicts list from the new package, not the old one (*info)
-			 */
-			for(j = packages; j; j = j->next) {
-				pmpkg_t *pkg = j->data;
-				if(!strcmp(pkg->name, info->name)) {
-					/* Use the new, to-be-installed package's conflicts */
-					conflicts = pkg->conflicts;
-					usenewconflicts = 1;
-				}
-			}
-			if(!usenewconflicts) {
-				/* Use the old package's conflicts, it's the only set we have */
-				conflicts = info->conflicts;
+	}
+}
+
+void _alpm_conflict_check3(pmpkg_t *tp, pmpkg_t *info, pmlist_t *baddeps, pmdepmissing_t *miss, pmlist_t *packages)
+{
+	pmlist_t *j, *k;
+	_alpm_log(PM_LOG_DEBUG, _("checkconflicts: db vs targ '%s'"), tp->name);
+	for ( k = _alpm_db_get_pkgcache(db, INFRQ_DEPENDS); k; k = k->next ) {
+		pmlist_t *conflicts = NULL;
+		int usenewconflicts = 0;
+		
+		info = k->data;
+		if ( !strcmp(info->name, tp->name) ) {
+			/* a package cannont conflict with itself -- that's not nice */
+			continue;
+		}
+		/* If this package (*info) is also our packages pmlist_t, use the
+		 * conflicts list from the new package, not the old one (*info)
+		 */
+		for ( j = packages; j; j= j->next ) {
+			pmpkg_t *pkg = j->data;
+			if ( !strcmp(pkg->name, info->name) ) {
+				/* Use th new, to-be-install package's conflicts */
+				conflicts = pkg->conflicts;
+				usenewconflicts = 1;
 			}
-			for(j = conflicts; j; j = j->next) {
-				if(!strcmp((char *)j->data, tp->name)) {
-					_alpm_log(PM_LOG_DEBUG, _("db vs targs: found %s as a conflict for %s"),
-					          info->name, tp->name);
-					miss = _alpm_depmiss_new(tp->name, PM_DEP_TYPE_CONFLICT, PM_DEP_MOD_ANY, info->name, NULL);
-					if(!_alpm_depmiss_isin(miss, baddeps)) {
-						baddeps = _alpm_list_add(baddeps, miss);
-					} else {
-						FREE(miss);
-					}
+		}
+		if ( !usenewconflicts ) {
+			/* Use old package's conflicts, it's the only set we have */
+			conflicts = info->conflicts;
+		}
+		for ( j = conflicts; j; j = j->next ) {
+			if ( !strcmp((char *)j->data, tp->name) ) {
+				_alpm_log(PM_LOG_DEBUG, _("db vs targs: found %s as a conflict for %s"),
+					  info->name, tp->name);
+				miss = _alpm_depmiss_new(tp->name, PM_DEP_TYPE_CONFLICT, PM_DEP_MOD_ANY, info->name, NULL);
+				if ( !_alpm_depmiss_isin(miss, baddeps) ) {
+					baddeps = _alpm_list_add(baddeps, miss);
 				} else {
-					/* see if the db package conflicts with something we provide */
-					pmlist_t *m;
-					for(m = conflicts; m; m = m->next) {
-						pmlist_t *n;
-						for(n = tp->provides; n; n = n->next) {
-							if(!strcmp(m->data, n->data)) {
-								_alpm_log(PM_LOG_DEBUG, _("db vs targs: found %s as a conflict for %s"),
-								          info->name, tp->name);
-								miss = _alpm_depmiss_new(tp->name, PM_DEP_TYPE_CONFLICT, PM_DEP_MOD_ANY, info->name, NULL);
-								if(!_alpm_depmiss_isin(miss, baddeps)) {
-									baddeps = _alpm_list_add(baddeps, miss);
-								} else {
-									FREE(miss);
-								}
+					FREE(miss);
+				}
+			} else {
+				pmlist_t *m;
+				for ( m = conflicts; m; m = m->next ) {
+					pmlist_t *n;
+					for ( n = tp->provides; n; n = n->next ) {
+						if ( !strcmp(m->data, n->data) ) {
+							_alpm_log(PM_LOG_DEBUG, ("db vs targs: found %s as a conflict for %s"),
+								  info->name, tp->name);
+							miss = _alpm_depmiss_new(tp->name, PM_DEP_TYPE_CONFLICT, PM_DEP_MOD_ANY, info->name, NULL);
+							if ( !_alpm_depmiss_isin(miss, baddeps) ) {
+								baddeps = _alpm_list_add(baddeps, miss);
+							} else {
+								FREE(miss);
 							}
 						}
 					}
@@ -202,6 +188,32 @@
 			}
 		}
 	}
+}
+
+/* Returns a pmlist_t* of pmdepmissing_t pointers.
+ *
+ * conflicts are always name only
+ */
+pmlist_t *_alpm_checkconflicts(pmdb_t *db, pmlist_t *packages)
+{
+	pmpkg_t *info = NULL;
+	pmlist_t *i, *j;
+	pmlist_t *baddeps = NULL;
+	pmdepmissing_t *miss = NULL;
+
+	if(db == NULL) {
+		return(NULL);
+	}
+
+	for ( i = packages; i; i = i->next ) {
+		pmpkg_t *tp = i->data;
+		if ( tp == NULL ) {
+			continue;
+		}
+		_alpm_conflict_check1(tp, j, baddeps, miss);
+		_alpm_conflict_check2(tp, j, baddeps, miss, packages);
+		_alpm_conflict_check3(tp, info, baddeps, miss, packages);
+	}
 
 	return(baddeps);
 }
Index: lib/libalpm/conflict.h
===================================================================
RCS file: /home/cvs-pacman/pacman-lib/lib/libalpm/conflict.h,v
retrieving revision 1.9
diff -u -r1.9 conflict.h
--- lib/libalpm/conflict.h	20 Nov 2006 09:10:23 -0000	1.9
+++ lib/libalpm/conflict.h	30 Dec 2006 01:45:46 -0000
@@ -32,7 +32,9 @@
 	char file[CONFLICT_FILE_LEN];
 	char ctarget[PKG_NAME_LEN];
 };
-
+void _alpm_conflict_check1(pmpkg_t *tp, pmlist *j, pmlist_t *baddeps, pmdepmissing_t *miss);
+void _alpm_conflict_check2(pmpkg_t *tp, pmlist *j, pmlist_t *baddeps, pmdepmissing_t *miss, pmlist_t *packages);
+void _alpm_conflict_check3(pmpkg_t *tp, pmpkg_t *info, pmlist_t *baddeps, pmdepmissing_t *miss, pmlist_t *packages);
 pmlist_t *_alpm_checkconflicts(pmdb_t *db, pmlist_t *packages);
 pmlist_t *_alpm_db_find_conflicts(pmdb_t *db, pmtrans_t *trans, char *root, pmlist_t **skip_list);
 


More information about the pacman-dev mailing list