From: Michael Schroeder Date: Mon, 1 Sep 2008 17:55:07 +0000 (+0000) Subject: - implement otherproviders() X-Git-Tag: BASE-SuSE-Code-12_1-Branch~308^2~236 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9a92ce288cd64382b0b305203f79fd3cb97e5215;p=thirdparty%2Flibsolv.git - implement otherproviders() --- diff --git a/src/knownid.h b/src/knownid.h index 3cad8c6d..6c290bdf 100644 --- a/src/knownid.h +++ b/src/knownid.h @@ -48,6 +48,7 @@ KNOWNID(NAMESPACE_MODALIAS, "namespace:modalias"), KNOWNID(NAMESPACE_SPLITPROVIDES, "namespace:splitprovides"), KNOWNID(NAMESPACE_LANGUAGE, "namespace:language"), KNOWNID(NAMESPACE_FILESYSTEM, "namespace:filesystem"), +KNOWNID(NAMESPACE_OTHERPROVIDERS, "namespace:otherproviders"), KNOWNID(SYSTEM_SYSTEM, "system:system"), KNOWNID(ARCH_SRC, "src"), KNOWNID(ARCH_NOSRC, "nosrc"), diff --git a/src/pool.c b/src/pool.c index 1761d42d..66bc3f73 100644 --- a/src/pool.c +++ b/src/pool.c @@ -496,6 +496,12 @@ pool_addrelproviders(Pool *pool, Id d) queue_pushunique(&plist, p); break; case REL_NAMESPACE: + if (name == NAMESPACE_OTHERPROVIDERS) + { + pp = pool_whatprovides(pool, evr); + pool->whatprovides_rel[d] = pp - pool->whatprovidesdata; + return pp; + } if (pool->nscallback) { /* ask callback which packages provide the dependency diff --git a/src/repo.c b/src/repo.c index cae33970..16be78e1 100644 --- a/src/repo.c +++ b/src/repo.c @@ -316,7 +316,7 @@ repo_freeallrepos(Pool *pool, int reuseids) } Offset -repo_fix_legacy(Repo *repo, Offset provides, Offset supplements, Offset freshens) +repo_fix_supplements(Repo *repo, Offset provides, Offset supplements, Offset freshens) { Pool *pool = repo->pool; Id id, idp, idl; @@ -507,6 +507,35 @@ repo_fix_legacy(Repo *repo, Offset provides, Offset supplements, Offset freshens return supplements; } +Offset +repo_fix_conflicts(Repo *repo, Offset conflicts) +{ + char buf[1024], *p, *dep; + Pool *pool = repo->pool; + Id id; + int i; + + if (!conflicts) + return conflicts; + for (i = conflicts; repo->idarraydata[i]; i++) + { + id = repo->idarraydata[i]; + if (ISRELDEP(id)) + continue; + dep = (char *)id2str(pool, id); + if (!strncmp(dep, "otherproviders(", 15) && strlen(dep) < sizeof(buf) - 2) + { + strcpy(buf, dep + 15); + if ((p = strchr(buf, ')')) != 0) + *p = 0; + id = str2id(pool, buf, 1); + id = rel2id(pool, NAMESPACE_OTHERPROVIDERS, id, REL_NAMESPACE, 1); + repo->idarraydata[i] = id; + } + } + return conflicts; +} + struct matchdata { Pool *pool; diff --git a/src/repo.h b/src/repo.h index 4999b5d1..b2821539 100644 --- a/src/repo.h +++ b/src/repo.h @@ -61,7 +61,8 @@ extern void repo_freeallrepos(Pool *pool, int reuseids); extern Offset repo_addid(Repo *repo, Offset olddeps, Id id); extern Offset repo_addid_dep(Repo *repo, Offset olddeps, Id id, Id marker); extern Offset repo_reserve_ids(Repo *repo, Offset olddeps, int num); -extern Offset repo_fix_legacy(Repo *repo, Offset provides, Offset supplements, Offset freshens); +extern Offset repo_fix_supplements(Repo *repo, Offset provides, Offset supplements, Offset freshens); +extern Offset repo_fix_conflicts(Repo *repo, Offset conflicts); static inline const char *repo_name(const Repo *repo) { diff --git a/src/repo_helix.c b/src/repo_helix.c index c9955451..1ad52bed 100644 --- a/src/repo_helix.c +++ b/src/repo_helix.c @@ -622,7 +622,8 @@ endElement(void *userData, const char *name) /* ensure self-provides */ if (s->arch != ARCH_SRC && s->arch != ARCH_NOSRC) s->provides = repo_addid_dep(pd->repo, s->provides, rel2id(pool, s->name, s->evr, REL_EQ, 1), 0); - s->supplements = repo_fix_legacy(pd->repo, s->provides, s->supplements, pd->freshens); + s->supplements = repo_fix_supplements(pd->repo, s->provides, s->supplements, pd->freshens); + s->conflicts = repo_fix_conflicts(pd->repo, s->conflicts); pd->freshens = 0; /* see bugzilla bnc#190163 */ diff --git a/src/solver.c b/src/solver.c index d70dac9f..5e4079f1 100644 --- a/src/solver.c +++ b/src/solver.c @@ -1280,7 +1280,15 @@ addrpmrulesforsolvable(Solver *solv, Solvable *s, Map *m) continue; /* p == n: self conflict */ if (p == n && !solv->allowselfconflicts) - p = 0; /* make it a negative assertion, aka 'uninstallable' */ + { + if (ISRELDEP(con)) + { + Reldep *rd = GETRELDEP(pool, con); + if (rd->flags == REL_NAMESPACE && rd->name == NAMESPACE_OTHERPROVIDERS) + continue; + } + p = 0; /* make it a negative assertion, aka 'uninstallable' */ + } if (p && ispatch && solv->noobsoletes.size && MAPTST(&solv->noobsoletes, p) && ISRELDEP(con)) { /* our patch conflicts with a noobsoletes (aka multiversion) package */ diff --git a/tools/repo_content.c b/tools/repo_content.c index b13ca9bb..7f76bc49 100644 --- a/tools/repo_content.c +++ b/tools/repo_content.c @@ -289,7 +289,7 @@ repo_add_content(Repo *repo, FILE *fp) if (s && s->arch != ARCH_SRC && s->arch != ARCH_NOSRC) s->provides = repo_addid_dep(repo, s->provides, rel2id(pool, s->name, s->evr, REL_EQ, 1), 0); if (s && code10) - s->supplements = repo_fix_legacy(repo, s->provides, s->supplements, 0); + s->supplements = repo_fix_supplements(repo, s->provides, s->supplements, 0); /* Only support one product. */ s = pool_id2solvable(pool, repo_add_solvable(repo)); repodata_extend(data, s - pool->solvables); @@ -397,7 +397,7 @@ repo_add_content(Repo *repo, FILE *fp) { s->provides = repo_addid_dep(repo, s->provides, rel2id(pool, s->name, s->evr, REL_EQ, 1), 0); if (code10) - s->supplements = repo_fix_legacy(repo, s->provides, s->supplements, 0); + s->supplements = repo_fix_supplements(repo, s->provides, s->supplements, 0); } if (pd.tmp) diff --git a/tools/repo_patchxml.c b/tools/repo_patchxml.c index 0465b8b9..e03613f9 100644 --- a/tools/repo_patchxml.c +++ b/tools/repo_patchxml.c @@ -620,7 +620,8 @@ endElement(void *userData, const char *name) s->arch = ARCH_NOARCH; if (s->arch != ARCH_SRC && s->arch != ARCH_NOSRC) s->provides = repo_addid_dep(pd->repo, s->provides, rel2id(pool, s->name, s->evr, REL_EQ, 1), 0); - s->supplements = repo_fix_legacy(pd->repo, s->provides, s->supplements, pd->freshens); + s->supplements = repo_fix_supplements(pd->repo, s->provides, s->supplements, pd->freshens); + s->conflicts = repo_fix_conflicts(pd->repo, s->conflicts); pd->freshens = 0; break; case STATE_NAME: diff --git a/tools/repo_rpmdb.c b/tools/repo_rpmdb.c index aeb23e5a..0efc8b36 100644 --- a/tools/repo_rpmdb.c +++ b/tools/repo_rpmdb.c @@ -837,7 +837,8 @@ rpm2solv(Pool *pool, Repo *repo, Repodata *repodata, Solvable *s, RpmHead *rpmhe s->suggests = makedeps(pool, repo, rpmhead, TAG_SUGGESTSNAME, TAG_SUGGESTSVERSION, TAG_SUGGESTSFLAGS, 1); s->supplements = makedeps(pool, repo, rpmhead, TAG_ENHANCESNAME, TAG_ENHANCESVERSION, TAG_ENHANCESFLAGS, 2); s->enhances = makedeps(pool, repo, rpmhead, TAG_ENHANCESNAME, TAG_ENHANCESVERSION, TAG_ENHANCESFLAGS, 1); - s->supplements = repo_fix_legacy(repo, s->provides, s->supplements, 0); + s->supplements = repo_fix_supplements(repo, s->provides, s->supplements, 0); + s->conflicts = repo_fix_conflicts(repo, s->conflicts); if (repodata) { diff --git a/tools/repo_rpmmd.c b/tools/repo_rpmmd.c index 2c87fd2e..8cf4b65f 100644 --- a/tools/repo_rpmmd.c +++ b/tools/repo_rpmmd.c @@ -915,7 +915,8 @@ endElement(void *userData, const char *name) s->evr = ID_EMPTY; /* some patterns have this */ if (s->arch != ARCH_SRC && s->arch != ARCH_NOSRC) s->provides = repo_addid_dep(repo, s->provides, rel2id(pool, s->name, s->evr, REL_EQ, 1), 0); - s->supplements = repo_fix_legacy(repo, s->provides, s->supplements, pd->freshens); + s->supplements = repo_fix_supplements(repo, s->provides, s->supplements, pd->freshens); + s->conflicts = repo_fix_conflicts(repo, s->conflicts); pd->freshens = 0; pd->kind = 0; break; diff --git a/tools/repo_susetags.c b/tools/repo_susetags.c index e3642797..9329a1fc 100644 --- a/tools/repo_susetags.c +++ b/tools/repo_susetags.c @@ -458,7 +458,8 @@ finish_solvable(struct parsedata *pd, Solvable *s, int handle, Offset freshens) rel2id(pool, s->name, s->evr, REL_EQ, 1), 0); /* XXX This uses repo_addid_dep internally, so should also be harmless to do twice. */ - s->supplements = repo_fix_legacy(pd->repo, s->provides, s->supplements, freshens); + s->supplements = repo_fix_supplements(pd->repo, s->provides, s->supplements, freshens); + s->conflicts = repo_fix_conflicts(pd->repo, s->conflicts); if (pd->ndirs) commit_diskusage (pd, handle); }