diff options
author | Judd Vinet <judd@archlinux.org> | 2006-01-08 22:58:27 +0100 |
---|---|---|
committer | Judd Vinet <judd@archlinux.org> | 2006-01-08 22:58:27 +0100 |
commit | 38180d52317316317e9e6199626a422ebe71f350 (patch) | |
tree | ea031cd6d5bd4ba6796ae4889b416190d52322fa | |
parent | caf64da579874bb264d235bb49571fa89b2eb307 (diff) | |
download | pacman-38180d52317316317e9e6199626a422ebe71f350.tar.gz pacman-38180d52317316317e9e6199626a422ebe71f350.tar.xz |
In the database-against-targets conflict checks, scan db packages' provides
fields and look for packages that want to exclusively provide a provisio that
the target package also provides.
-rw-r--r-- | lib/libalpm/deps.c | 55 |
1 files changed, 52 insertions, 3 deletions
diff --git a/lib/libalpm/deps.c b/lib/libalpm/deps.c index 6167c7ce..b2d8a7a3 100644 --- a/lib/libalpm/deps.c +++ b/lib/libalpm/deps.c @@ -226,10 +226,15 @@ PMList *checkdeps(pmdb_t *db, unsigned char op, PMList *packages) /* CONFLICTS */ for(j = tp->conflicts; j; j = j->next) { - /* check targets against database */ + if(!strcmp(tp->name, j->data)) { + /* a package cannot conflict with itself -- that's just not nice */ + continue; + } + /* CHECK 1: check targets against database */ for(k = db_get_pkgcache(db); k; k = k->next) { pmpkg_t *dp = (pmpkg_t *)k->data; if(!strcmp(j->data, dp->name)) { + /* confict */ MALLOC(miss, sizeof(pmdepmissing_t)); miss->type = PM_DEP_TYPE_CONFLICT; miss->depend.mod = PM_DEP_MOD_ANY; @@ -241,9 +246,28 @@ PMList *checkdeps(pmdb_t *db, unsigned char op, PMList *packages) } else { FREE(miss); } + } else { + /* see if dp provides something in tp's conflict list */ + PMList *m; + for(m = dp->provides; m; m = m->next) { + if(!strcmp(m->data, j->data)) { + /* confict */ + MALLOC(miss, sizeof(pmdepmissing_t)); + miss->type = PM_DEP_TYPE_CONFLICT; + miss->depend.mod = PM_DEP_MOD_ANY; + 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)) { + baddeps = pm_list_add(baddeps, miss); + } else { + FREE(miss); + } + } + } } } - /* check targets against targets */ + /* CHECK 2: check targets against targets */ for(k = packages; k; k = k->next) { pmpkg_t *a = (pmpkg_t *)k->data; if(!strcmp(a->name, (char *)j->data)) { @@ -261,8 +285,9 @@ PMList *checkdeps(pmdb_t *db, unsigned char op, PMList *packages) } } } - /* check database against targets */ + /* CHECK 3: check database against targets */ for(k = db_get_pkgcache(db); k; k = k->next) { + int conflict = 0; info = k->data; for(j = info->conflicts; j; j = j->next) { if(!strcmp((char *)j->data, tp->name)) { @@ -277,8 +302,32 @@ PMList *checkdeps(pmdb_t *db, unsigned char op, PMList *packages) } else { FREE(miss); } + } else { + /* see if info and tp both provide something that info wants to + * exclusively provide (ie, conflicts&provides package X) */ + PMList *m; + for(m = info->conflicts; m; m = m->next) { + PMList *n; + for(n = tp->provides; n; n = n->next) { + if(!strcmp(m->data, n->data)) { + MALLOC(miss, sizeof(pmdepmissing_t)); + miss->type = PM_DEP_TYPE_CONFLICT; + miss->depend.mod = PM_DEP_MOD_ANY; + 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)) { + baddeps = pm_list_add(baddeps, miss); + } else { + FREE(miss); + } + } + } + } } } + if(conflict) { + } } /* PROVIDES -- check to see if another package already provides what |