Hello community,

here is the log from the commit of package perl-BSSolv for openSUSE:Factory 
checked in at 2012-10-23 21:25:04
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/perl-BSSolv (Old)
 and      /work/SRC/openSUSE:Factory/.perl-BSSolv.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "perl-BSSolv", Maintainer is "[email protected]"

Changes:
--------
--- /work/SRC/openSUSE:Factory/perl-BSSolv/perl-BSSolv.changes  2012-05-09 
18:32:44.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.perl-BSSolv.new/perl-BSSolv.changes     
2012-10-23 21:25:05.000000000 +0200
@@ -1,0 +2,7 @@
+Mon Oct 15 17:46:37 CEST 2012 - [email protected]
+
+- update libsolv and BSSolv.xs to current version
+  * export all dependencies
+  * obey package conflicts when expanding
+
+-------------------------------------------------------------------

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ BSSolv.xs ++++++
--- /var/tmp/diff_new_pack.rsy2eJ/_old  2012-10-23 21:25:10.000000000 +0200
+++ /var/tmp/diff_new_pack.rsy2eJ/_new  2012-10-23 21:25:10.000000000 +0200
@@ -69,6 +69,8 @@
     return KEY_STORAGE_DROPPED;
   if (key->name == SOLVABLE_LICENSE)
     return KEY_STORAGE_DROPPED;
+  if (key->name == SOLVABLE_PKGID)
+    return KEY_STORAGE_INCORE;
   i = repo_write_stdkeyfilter(repo, key, kfdata);
   if (i == KEY_STORAGE_VERTICAL_OFFSET)
     return KEY_STORAGE_DROPPED;
@@ -181,12 +183,120 @@
   return pool_rel2id(pool, id, pool_strn2id(pool, n, s - n, 1), flags, 1);
 }
 
+static inline Offset
+importdeps(HV *hv, const char *key, int keyl, Repo *repo)
+{
+  Pool *pool = repo->pool;
+  int i;
+  AV *av = hvlookupav(hv, key, keyl);
+  Offset off = 0;
+  if (av)
+    {
+      for (i = 0; i <= av_len(av); i++)
+       {
+         char *str = avlookupstr(av, i);
+         if (str)
+           off = repo_addid_dep(repo, off, dep2id(pool, str), 0);
+       }
+    }
+  return off;
+}
+
+void
+exportdeps(HV *hv, const char *key, int keyl, Repo *repo, Offset off, Id skey)
+{
+  Pool *pool = repo->pool;
+  AV *av;
+  Id id, *pp;
+  const char *str;
+
+  if (!off || !repo->idarraydata[off])
+    return;
+  pp = repo->idarraydata + off;
+  av = 0;
+  while ((id = *pp++))
+    {
+      if (id == SOLVABLE_FILEMARKER)
+       break;
+      str = pool_dep2str(pool, id);
+      if (ISRELDEP(id))
+       {
+         Reldep *rd = GETRELDEP(pool, id);
+         if (skey == SOLVABLE_CONFLICTS && rd->flags == REL_NAMESPACE && 
rd->name == NAMESPACE_OTHERPROVIDERS)
+           {
+           if (!strncmp(str, "namespace:", 10))
+             str += 10;
+           }
+         if (skey == SOLVABLE_SUPPLEMENTS)
+           {
+             if (rd->flags == REL_NAMESPACE && rd->name == 
NAMESPACE_FILESYSTEM)
+               {
+                 if (!strncmp(str, "namespace:", 10))
+                   str += 10;
+               }
+             else if (rd->flags == REL_NAMESPACE && rd->name == 
NAMESPACE_MODALIAS)
+               {
+                 if (!strncmp(str, "namespace:", 10))
+                   str += 10;
+               }
+             else if (rd->flags == REL_AND)
+               {
+                 /* either packageand chain or modalias */
+                 str = 0;
+                 if (ISRELDEP(rd->evr))
+                   {
+                     Reldep *mrd = GETRELDEP(pool, rd->evr);
+                     if (mrd->flags == REL_NAMESPACE && mrd->name == 
NAMESPACE_MODALIAS)
+                       {
+                         str = pool_tmpjoin(pool, "modalias(", 
pool_dep2str(pool, rd->name), ":");
+                         str = pool_tmpappend(pool, str, pool_dep2str(pool, 
mrd->evr), ")");
+                       }
+                     else if (mrd->flags >= 8)
+                       continue;
+                   }
+                 if (!str)
+                   {
+                     /* must be and chain */
+                     str = pool_dep2str(pool, rd->evr);
+                     for (;;)
+                       {
+                         id = rd->name;
+                         if (!ISRELDEP(id))
+                           break;
+                         rd = GETRELDEP(pool, id);
+                         if (rd->flags != REL_AND)
+                           break;
+                         str = pool_tmpjoin(pool, pool_dep2str(pool, rd->evr), 
":", str);
+                       }
+                     str = pool_tmpjoin(pool, pool_dep2str(pool, id), ":", 
str);
+                     str = pool_tmpjoin(pool, "packageand(", str, ")");
+                   }
+               }
+             else if (rd->flags >= 8)
+               continue;
+           }
+       }
+      if (skey == SOLVABLE_REQUIRES)
+       {
+         if (id == SOLVABLE_PREREQMARKER)
+           continue;
+         if (*str == 'r' && !strncmp(str, "rpmlib(", 7))
+           continue;
+       }
+      if (!av)
+        av = newAV();
+      av_push(av, newSVpv(str, 0));
+    }
+  if (av)
+    (void)hv_store(hv, key, keyl, newRV_noinc((SV*)av), 0);
+}
+
 static inline void
 expander_installed(Expander *xp, Id p, Map *installed, Map *conflicts, Queue 
*out, Queue *todo)
 {
   Pool *pool = xp->pool;
   Solvable *s = pool->solvables + p;
-  Id req, id, *reqp;
+  Id req, id, *reqp, con, *conp;
   const char *n;
 
   MAPSET(installed, p);
@@ -246,10 +356,61 @@
          queue_push2(todo, req, p);
        }
     }
+  if (s->conflicts)
+    {
+      conp = s->repo->idarraydata + s->conflicts;
+      while ((con = *conp++) != 0)
+       {
+         Id p2, pp2;
+         FOR_PROVIDES(p2, pp2, con)
+           {
+             if (p2 == p)
+               continue;
+             MAPEXP(conflicts, pool->nsolvables);
+             MAPSET(conflicts, p2);
+           }
+       }
+    }
+  if (s->obsoletes)
+    {
+      conp = s->repo->idarraydata + s->obsoletes;
+      while ((con = *conp++) != 0)
+       {
+         Id p2, pp2;
+         FOR_PROVIDES(p2, pp2, con)
+           {
+             if (p2 == p || !pool_match_nevr(pool, pool->solvables + p2, con))
+               continue;
+             MAPEXP(conflicts, pool->nsolvables);
+             MAPSET(conflicts, p2);
+           }
+       }
+    }
 }
 
-#define ERROR_NOPROVIDER 1
-#define ERROR_CHOICE    2
+static inline int
+expander_checkconflicts(Pool *pool, Id p, Map *installed, Id *conflicts, int 
isobsoletes)
+{
+  Id con, p2, pp2;
+  
+  while ((con = *conflicts++) != 0)
+    {
+      FOR_PROVIDES(p2, pp2, con)
+       {
+         if (p == p2)
+           continue;
+         if (isobsoletes && !pool_match_nevr(pool, pool->solvables + p2, con))
+           continue;
+         if (MAPTST(installed, p2))
+           return 1;
+       }
+    }
+  return 0;
+}
+
+#define ERROR_NOPROVIDER               1
+#define ERROR_CHOICE                   2
+#define ERROR_CONFLICTINGPROVIDER      3
 
 
 int
@@ -261,7 +422,7 @@
   Map conflicts;
   Solvable *s;
   Id q, p, pp;
-  int i, j, nerrors, doamb, ambcnt;
+  int i, j, nerrors, doamb, ambcnt, conflprov;
   Id id, who, whon, pn;
 
   map_init(&installed, pool->nsolvables);
@@ -330,6 +491,7 @@
 // fflush(stdout);
       whon = pool->solvables[who].name;
       queue_empty(&qq);
+      conflprov = 0;
       FOR_PROVIDES(p, pp, id)
        {
          Id pn;
@@ -345,14 +507,27 @@
                break;
            }
          if (conflicts.size && MAPTST(&conflicts, p))
-           continue;
+           {
+             conflprov = 1;
+             continue;
+           }
+         if (pool->solvables[p].conflicts && expander_checkconflicts(pool, p, 
&installed, pool->solvables[p].repo->idarraydata + 
pool->solvables[p].conflicts, 0))
+           {
+             conflprov = 1;
+             continue;
+           }
+         if (pool->solvables[p].obsoletes && expander_checkconflicts(pool, p, 
&installed, pool->solvables[p].repo->idarraydata + 
pool->solvables[p].obsoletes, 1))
+           {
+             conflprov = 1;
+             continue;
+           }
          queue_push(&qq, p);
        }
       if (p)
        continue;
       if (qq.count == 0)
        {
-         queue_push(&errors, ERROR_NOPROVIDER);
+         queue_push(&errors, conflprov ? ERROR_CONFLICTINGPROVIDER : 
ERROR_NOPROVIDER);
          queue_push2(&errors, id, who);
          continue;
        }
@@ -1247,8 +1422,6 @@
            Repodata *data;
            SV *sv;
            HV *hv;
-           AV *av;
-           int i;
            char *str, *key;
            I32 keyl;
            Id p;
@@ -1296,26 +1469,14 @@
                str = hvlookupstr(hv, "hdrmd5", 6);
                if (str && strlen(str) == 32)
                  repodata_set_checksum(data, p, SOLVABLE_PKGID, 
REPOKEY_TYPE_MD5, str);
-               av = hvlookupav(hv, "provides", 8);
-               if (av)
-                 {
-                   for (i = 0; i <= av_len(av); i++)
-                     {
-                       str = avlookupstr(av, i);
-                       if (str)
-                         s->provides = repo_addid_dep(repo, s->provides, 
dep2id(pool, str), 0);
-                     }
-                 }
-               av = hvlookupav(hv, "requires", 8);
-               if (av)
-                 {
-                   for (i = 0; i <= av_len(av); i++)
-                     {
-                       str = avlookupstr(av, i);
-                       if (str)
-                         s->requires = repo_addid_dep(repo, s->requires, 
dep2id(pool, str), 0);
-                     }
-                 }
+               s->provides    = importdeps(hv, "provides", 8, repo);
+               s->obsoletes   = importdeps(hv, "obsoletes", 9, repo);
+               s->conflicts   = importdeps(hv, "conflicts", 9, repo);
+               s->requires    = importdeps(hv, "requires", 8, repo);
+               s->recommends  = importdeps(hv, "recommends", 10, repo);
+               s->suggests    = importdeps(hv, "suggests", 8, repo);
+               s->supplements = importdeps(hv, "supplements", 11, repo);
+               s->enhances    = importdeps(hv, "enhances", 8, repo);
                if (!s->evr && s->provides)
                  {
                    /* look for self provides */
@@ -1498,7 +1659,6 @@
     CODE:
        {
            Solvable *s = pool->solvables + p;
-           AV *av;
            Id id;
            const char *ss, *se;
            unsigned int medianr;
@@ -1526,35 +1686,14 @@
            else
              (void)hv_store(RETVAL, "version", 7, newSVpv(ss, 0), 0);
            (void)hv_store(RETVAL, "arch", 4, newSVpv(pool_id2str(pool, 
s->arch), 0), 0);
-           av = newAV();
-           if (s->provides)
-             {
-               Id *pp = s->repo->idarraydata + s->provides;
-               while ((id = *pp++))
-                 {
-                   if (id == SOLVABLE_FILEMARKER)
-                     break;
-                   av_push(av, newSVpv(pool_dep2str(pool, id), 0));
-                 }
-             }
-           (void)hv_store(RETVAL, "provides", 8, newRV_noinc((SV*)av), 0);
-           av = newAV();
-           if (s->requires)
-             {
-               Id *pp = s->repo->idarraydata + s->requires;
-               while ((id = *pp++))
-                 {
-                   if (id == SOLVABLE_PREREQMARKER)
-                     continue;
-                   ss = pool_dep2str(pool, id);
-                   if (*ss == '/')
-                     continue;
-                   if (*ss == 'r' && !strncmp(ss, "rpmlib(", 7))
-                     continue;
-                   av_push(av, newSVpv(ss, 0));
-                 }
-             }
-           (void)hv_store(RETVAL, "requires", 8, newRV_noinc((SV*)av), 0);
+           exportdeps(RETVAL, "provides", 8, s->repo, s->provides, 
SOLVABLE_PROVIDES);
+           exportdeps(RETVAL, "obsoletes", 9, s->repo, s->obsoletes, 
SOLVABLE_OBSOLETES);
+           exportdeps(RETVAL, "conflicts", 9, s->repo, s->conflicts, 
SOLVABLE_CONFLICTS);
+           exportdeps(RETVAL, "requires", 8, s->repo, s->requires, 
SOLVABLE_REQUIRES);
+           exportdeps(RETVAL, "recommends", 10, s->repo, s->recommends, 
SOLVABLE_RECOMMENDS);
+           exportdeps(RETVAL, "suggests", 8, s->repo, s->suggests, 
SOLVABLE_SUGGESTS);
+           exportdeps(RETVAL, "supplements", 11, s->repo, s->supplements, 
SOLVABLE_SUPPLEMENTS);
+           exportdeps(RETVAL, "enhances", 8, s->repo, s->enhances, 
SOLVABLE_ENHANCES);
            if (solvable_lookup_void(s, SOLVABLE_SOURCENAME))
              ss = pool_id2str(pool, s->name);
            else
@@ -2148,6 +2287,16 @@
                          sv = newSVpvf("nothing provides %s", 
pool_dep2str(pool, id));
                        i += 3;
                      }
+                   else if (type == ERROR_CONFLICTINGPROVIDER)
+                     {
+                       id = out.elements[i + 1];
+                       who = out.elements[i + 2];
+                       if (who)
+                         sv = newSVpvf("conflict for all providers of %s 
needed by %s", pool_dep2str(pool, id), pool_id2str(pool, 
pool->solvables[who].name));
+                       else
+                         sv = newSVpvf("conflict for all providers of %s", 
pool_dep2str(pool, id));
+                       i += 3;
+                     }
                    else if (type == ERROR_CHOICE)
                      {
                        int j;

++++++ libsolv-0.1.0.tar.bz2 ++++++
++++ 2887 lines of diff (skipped)

-- 
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to