Hello community,

here is the log from the commit of package libsolv for openSUSE:Factory checked 
in at 2020-10-08 13:09:36
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/libsolv (Old)
 and      /work/SRC/openSUSE:Factory/.libsolv.new.4249 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "libsolv"

Thu Oct  8 13:09:36 2020 rev:81 rq:840023 version:0.7.15

Changes:
--------
--- /work/SRC/openSUSE:Factory/libsolv/libsolv.changes  2020-09-24 
16:12:06.120770073 +0200
+++ /work/SRC/openSUSE:Factory/.libsolv.new.4249/libsolv.changes        
2020-10-08 13:10:37.683087901 +0200
@@ -1,0 +2,6 @@
+Mon Oct  5 13:06:44 CEST 2020 - m...@suse.de
+
+- make testcase_mangle_repo_names deal correctly with freed repos
+  [bnc#1177238]
+
+-------------------------------------------------------------------

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

Other differences:
------------------
++++++ libsolv-0.7.15.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsolv-0.7.15/ext/testcase.c 
new/libsolv-0.7.15/ext/testcase.c
--- old/libsolv-0.7.15/ext/testcase.c   2020-09-08 12:03:10.000000000 +0200
+++ new/libsolv-0.7.15/ext/testcase.c   2020-10-05 10:16:53.000000000 +0200
@@ -1826,14 +1826,12 @@
       for (mp = buf; *mp; mp++)
        if (*mp == ' ' || *mp == '\t' || *mp == '/')
          *mp = '_';
-      for (;;)
-       {
-         for (i = 1; i < repoid; i++)
-           if (!strcmp(buf, names[i]))
-             break;
-         if (i == repoid)
-           break;
+      for (i = 1; i < repoid; i++)
+        {
+         if (!names[i] || strcmp(buf, names[i]) != 0)
+           continue;
           sprintf(mp, "_%d", mangle++);
+         i = 0;        /* restart conflict check */
        }
       names[repoid] = buf;
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsolv-0.7.15/package/libsolv.changes 
new/libsolv-0.7.15/package/libsolv.changes
--- old/libsolv-0.7.15/package/libsolv.changes  2020-09-11 12:39:26.000000000 
+0200
+++ new/libsolv-0.7.15/package/libsolv.changes  2020-10-05 13:09:44.000000000 
+0200
@@ -1,4 +1,10 @@
 -------------------------------------------------------------------
+Mon Oct  5 13:06:44 CEST 2020 - m...@suse.de
+
+- make testcase_mangle_repo_names deal correctly with freed repos
+  [bnc#1177238]
+
+-------------------------------------------------------------------
 Fri Sep 11 12:31:27 CEST 2020 - m...@suse.de
 
 - fix deduceq2addedmap clearing bits outside of the map
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsolv-0.7.15/src/rules.c 
new/libsolv-0.7.15/src/rules.c
--- old/libsolv-0.7.15/src/rules.c      2020-05-27 11:39:15.000000000 +0200
+++ new/libsolv-0.7.15/src/rules.c      2020-10-06 13:44:37.000000000 +0200
@@ -3187,6 +3187,44 @@
   return 1;    /* none of the new packages provided it */
 }
 
+static int
+solver_choicerulecheck2(Solver *solv, Id pi, Id pt, Queue *q)
+{
+  Pool *pool = solv->pool;
+  Rule *ur;
+  Id p, pp;
+  int i;
+
+  if (!q->count || q->elements[0] != pi)
+    {
+      if (q->count)
+        queue_empty(q);
+      ur = solv->rules + solv->updaterules + (pi - pool->installed->start);
+      if (!ur->p)
+        ur = solv->rules + solv->featurerules + (pi - pool->installed->start);
+      if (!ur->p)
+       return 0;
+      queue_push2(q, pi, 0);
+      FOR_RULELITERALS(p, pp, ur)
+       if (p > 0 && p != pi)
+         queue_push(q, p);
+      queue_push(q, pi);
+    }
+  if (q->count <= 3)
+    return q->count == 3 && q->elements[2] == pt ? 1 : 0;
+  if (!q->elements[1])
+    {
+      queue_deleten(q, 0, 2);
+      policy_filter_unwanted(solv, q, POLICY_MODE_CHOOSE);
+      queue_unshift(q, 1);     /* filter mark */
+      queue_unshift(q, pi);
+    }
+  for (i = 2; i < q->count; i++)
+    if (q->elements[i] == pt)
+      return 1;
+  return 0;    /* not newest */
+}
+
 static inline void
 queue_removeelement(Queue *q, Id el)
 {
@@ -3203,20 +3241,62 @@
     }
 }
 
+static Id
+choicerule_find_installed(Pool *pool, Id p)
+{
+  Solvable *s = pool->solvables + p;
+  Id p2, pp2;
+
+  if (!s->repo)
+    return 0;
+  if (s->repo == pool->installed)
+    return p;
+  FOR_PROVIDES(p2, pp2, s->name)
+    {
+      Solvable *s2 = pool->solvables + p2;
+      if (s2->repo != pool->installed)
+       continue;
+      if (!pool->implicitobsoleteusesprovides && s->name != s2->name)
+       continue;
+      if (pool->implicitobsoleteusescolors && !pool_colormatch(pool, s, s2))
+       continue;
+      return p2;
+    }
+  if (s->obsoletes)
+    {
+      Id obs, *obsp = s->repo->idarraydata + s->obsoletes;
+      while ((obs = *obsp++) != 0)
+       {
+         FOR_PROVIDES(p2, pp2, obs)
+           {
+             Solvable *s2 = pool->solvables + p2;
+             if (s2->repo != pool->installed)
+               continue;
+             if (!pool->obsoleteusesprovides && !pool_match_nevr(pool, 
pool->solvables + p2, obs))
+               continue;
+             if (pool->obsoleteusescolors && !pool_colormatch(pool, s, s2))
+               continue;
+             return p2;
+           }
+       }
+    }
+  return 0;
+}
+
 void
 solver_addchoicerules(Solver *solv)
 {
   Pool *pool = solv->pool;
   Map m, mneg;
   Rule *r;
-  Queue q, qi, qcheck, infoq;
+  Queue q, qi, qcheck, qcheck2, infoq;
   int i, j, rid, havechoice, negcnt;
-  Id p, d, pp;
-  Id p2, pp2;
-  Solvable *s, *s2;
+  Id p, d, pp, p2;
+  Solvable *s;
   Id lastaddedp, lastaddedd;
   int lastaddedcnt;
   unsigned int now;
+  int isnewest = 0;
 
   solv->choicerules = solv->nrules;
   if (!pool->installed)
@@ -3229,6 +3309,7 @@
   queue_init(&q);
   queue_init(&qi);
   queue_init(&qcheck);
+  queue_init(&qcheck2);
   queue_init(&infoq);
   map_init(&m, pool->nsolvables);
   map_init(&mneg, pool->nsolvables);
@@ -3260,80 +3341,28 @@
            continue;
          if (s->repo == pool->installed)
            {
+             queue_push2(&qi, p, p);
              queue_push(&q, p);
              continue;
            }
-         /* check if this package is "blocked" by a installed package */
-         s2 = 0;
-         FOR_PROVIDES(p2, pp2, s->name)
-           {
-             s2 = pool->solvables + p2;
-             if (s2->repo != pool->installed)
-               continue;
-             if (!pool->implicitobsoleteusesprovides && s->name != s2->name)
-               continue;
-             if (pool->implicitobsoleteusescolors && !pool_colormatch(pool, s, 
s2))
-               continue;
-             break;
-           }
+         /* find an installed package p2 that we can update/downgrade to p */
+         p2 = choicerule_find_installed(pool, p);
          if (p2)
            {
-             /* found installed package p2 that we can update to p */
              if (MAPTST(&mneg, p))
                continue;
-             if (policy_is_illegal(solv, s2, s, 0))
-               continue;
-#if 0
-             if (solver_choicerulecheck(solv, p2, r, &m))
+             if (policy_is_illegal(solv, pool->solvables + p2, s, 0))
                continue;
-             queue_push(&qi, p2);
-#else
              queue_push2(&qi, p2, p);
-#endif
              queue_push(&q, p);
              continue;
            }
-         if (s->obsoletes)
-           {
-             Id obs, *obsp = s->repo->idarraydata + s->obsoletes;
-             s2 = 0;
-             while ((obs = *obsp++) != 0)
-               {
-                 FOR_PROVIDES(p2, pp2, obs)
-                   {
-                     s2 = pool->solvables + p2;
-                     if (s2->repo != pool->installed)
-                       continue;
-                     if (!pool->obsoleteusesprovides && !pool_match_nevr(pool, 
pool->solvables + p2, obs))
-                       continue;
-                     if (pool->obsoleteusescolors && !pool_colormatch(pool, s, 
s2))
-                       continue;
-                     break;
-                   }
-                 if (p2)
-                   break;
-               }
-             if (obs)
-               {
-                 /* found installed package p2 that we can update to p */
-                 if (MAPTST(&mneg, p))
-                   continue;
-                 if (policy_is_illegal(solv, s2, s, 0))
-                   continue;
-#if 0
-                 if (solver_choicerulecheck(solv, p2, r, &m))
-                   continue;
-                 queue_push(&qi, p2);
-#else
-                 queue_push2(&qi, p2, p);
-#endif
-                 queue_push(&q, p);
-                 continue;
-               }
-           }
          /* package p is independent of the installed ones */
          havechoice = 1;
        }
+#if 0
+      printf("havechoice: %d qcount %d qicount %d\n", havechoice, q.count, 
qi.count);
+#endif
       if (!havechoice || !q.count || !qi.count)
        continue;       /* no choice */
 
@@ -3341,13 +3370,25 @@
         if (p > 0)
          MAPSET(&m, p);
 
+      isnewest = 1;
+      FOR_RULELITERALS(p, pp, r)
+       {
+         if (p > 0)
+           break;
+         p2 = choicerule_find_installed(pool, -p);
+         if (p2 && !solver_choicerulecheck2(solv, p2, -p, &qcheck2))
+           {
+             isnewest = 0;
+             break;
+           }
+       }
       /* do extra checking */
       for (i = j = 0; i < qi.count; i += 2)
        {
          p2 = qi.elements[i];
          if (!p2)
            continue;
-         if (solver_choicerulecheck(solv, p2, r, &m, &qcheck))
+         if (isnewest && solver_choicerulecheck(solv, p2, r, &m, &qcheck))
            {
              /* oops, remove element p from q */
              queue_removeelement(&q, qi.elements[i + 1]);
@@ -3441,6 +3482,7 @@
   queue_free(&q);
   queue_free(&qi);
   queue_free(&qcheck);
+  queue_free(&qcheck2);
   queue_free(&infoq);
   map_free(&m);
   map_free(&mneg);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libsolv-0.7.15/test/testcases/choicerules/choice2.t 
new/libsolv-0.7.15/test/testcases/choicerules/choice2.t
--- old/libsolv-0.7.15/test/testcases/choicerules/choice2.t     1970-01-01 
01:00:00.000000000 +0100
+++ new/libsolv-0.7.15/test/testcases/choicerules/choice2.t     2020-10-06 
13:44:37.000000000 +0200
@@ -0,0 +1,23 @@
+repo system 0 testtags <inline>
+#>=Pkg: A 1 1 noarch
+#>=Req: P = 1
+#>=Pkg: B 1 1 noarch
+#>=Prv: P = 1
+repo available 0 testtags <inline>
+#>=Pkg: A 2 1 noarch
+#>=Req: P = 2
+#>=Pkg: A 2 2 noarch
+#>=Req: P = 2
+#>=Pkg: B 2 1 noarch
+#>=Prv: P = 2
+#>=Pkg: C 1 1 noarch
+#>=Prv: P = 1
+#>=Pkg: C 2 1 noarch
+#>=Prv: P = 2
+system i686 rpm system
+
+job update name B
+result transaction,problems <inline>
+result transaction,problems <inline>
+#>upgrade A-1-1.noarch@system A-2-2.noarch@available
+#>upgrade B-1-1.noarch@system B-2-1.noarch@available


Reply via email to