]> git.ipfire.org Git - thirdparty/libsolv.git/commitdiff
- 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 3cad8c6df661a5e5eccffc4fc9bbc273039c3bd3..6c290bdfe4fdf0359167e87c6490213863a1fc15 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 1761d42d51e8267e332511b5554f67331d73095c..66bc3f73e1634dcdab43dfa9d496adba2ffea7d0 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 cae3397002c9ba18ed6ce6a6bcdb6ca454777afa..16be78e17233006deafab08c63c6410b7bc9dfbe 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 4999b5d1fa7a8a8d2bd45f26c1d9f88a4b4bb770..b2821539bb4f7956593cbc99d9d8f7d63b1fd248 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 c995545164296255dfa81548350e5306e8972798..1ad52bed9765a9a18924b997497898b82efa1885 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 d70dac9f698c5ee2fed062b329626a01353f2379..5e4079f1c8ec0ea9e78a7b5b646a4bf947018ebe 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 b13ca9bb5065661884870aa3ecf9a6fa33bb9675..7f76bc499352d51287e0d90d232028bfb795a0c3 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 0465b8b9543c44feabeb7cb9bf9aaf07d766af72..e03613f96d9dda2edaefff82377a4ef58812288b 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 aeb23e5a9f05b18f5a7464bfafd1976c2c86902f..0efc8b3678bbef77a86a126248a8faf3d1805b40 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 2c87fd2ea719bb51d8082b2bd992132e2a4dccbe..8cf4b65f9eb9ac0c20a78e07ea3f9df375110438 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 e364279775c9205a30577259eb56549fe7dbfa79..9329a1fce9ecede51f1ef62b24aa5ff3ec93da91 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);
 }