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);