- implement otherproviders()
authorMichael Schroeder <mls@suse.de>
Mon, 1 Sep 2008 17:55:07 +0000 (17:55 +0000)
committerMichael Schroeder <mls@suse.de>
Mon, 1 Sep 2008 17:55:07 +0000 (17:55 +0000)
src/knownid.h
src/pool.c
src/repo.c
src/repo.h
src/repo_helix.c
src/solver.c
tools/repo_content.c
tools/repo_patchxml.c
tools/repo_rpmdb.c
tools/repo_rpmmd.c
tools/repo_susetags.c

index 3cad8c6..6c290bd 100644 (file)
@@ -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"),
index 1761d42..66bc3f7 100644 (file)
@@ -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
index cae3397..16be78e 100644 (file)
@@ -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;
index 4999b5d..b282153 100644 (file)
@@ -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)
 {
index c995545..1ad52be 100644 (file)
@@ -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 */
index d70dac9..5e4079f 100644 (file)
@@ -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 */
index b13ca9b..7f76bc4 100644 (file)
@@ -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)
index 0465b8b..e03613f 100644 (file)
@@ -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:
index aeb23e5..0efc8b3 100644 (file)
@@ -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)
     {
index 2c87fd2..8cf4b65 100644 (file)
@@ -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;
index e364279..9329a1f 100644 (file)
@@ -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);
 }