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"),
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
}
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;
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;
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)
{
/* 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 */
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 */
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);
{
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)
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:
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)
{
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;
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);
}