Imported Upstream version 0.6.29
[platform/upstream/libsolv.git] / src / policy.c
index 3a0a737..468be67 100644 (file)
@@ -202,14 +202,14 @@ solver_prune_to_highest_prio_per_name(Solver *solv, Queue *plist)
     {
       if (pool->solvables[plist->elements[i]].name != name)
        {
+         name = pool->solvables[plist->elements[i]].name;
          if (pq.count > 2)
            solver_prune_to_highest_prio(solv, &pq);
          for (k = 0; k < pq.count; k++)
            plist->elements[j++] = pq.elements[k];
          queue_empty(&pq);
-         queue_push(&pq, plist->elements[i]);
-         name = pool->solvables[pq.elements[0]].name;
        }
+      queue_push(&pq, plist->elements[i]);
     }
   if (pq.count > 2)
     solver_prune_to_highest_prio(solv, &pq);
@@ -981,23 +981,7 @@ sort_by_name_evr_sortcmp(const void *ap, const void *bp, void *dp)
     return 0;
   a = aa[2] < 0 ? -aa[2] : aa[2];
   b = bb[2] < 0 ? -bb[2] : bb[2];
-  if (pool->disttype != DISTTYPE_DEB && a != b)
-    {
-      /* treat release-less versions different */
-      const char *as = pool_id2str(pool, a);
-      const char *bs = pool_id2str(pool, b);
-      if (strchr(as, '-'))
-       {
-         if (!strchr(bs, '-'))
-           return -2;
-       }
-      else
-       {
-         if (strchr(bs, '-'))
-           return 2;
-       }
-    }
-  r = pool_evrcmp(pool, b, a, EVRCMP_COMPARE);
+  r = pool_evrcmp(pool, b, a, pool->disttype != DISTTYPE_DEB ? EVRCMP_MATCH_RELEASE : EVRCMP_COMPARE);
   if (!r && (aa[2] < 0 || bb[2] < 0))
     {
       if (bb[2] >= 0)
@@ -1005,9 +989,7 @@ sort_by_name_evr_sortcmp(const void *ap, const void *bp, void *dp)
       if (aa[2] >= 0)
        return -1;
     }
-  if (r)
-    return r < 0 ? -1 : 1;
-  return 0;
+  return r;
 }
 
 /* common end of sort_by_srcversion and sort_by_common_dep */
@@ -1231,8 +1213,15 @@ urpm_reorder(Solver *solv, Queue *plist)
              if (knid)
                {
                  FOR_PROVIDES(p, pp, knid)
-                   if (solv->decisionmap[p] > 0 || (pool->installed && pool->solvables[p].repo == pool->installed))
-                     score = 3;
+                   {
+                     if (solv->decisionmap[p] > 0)
+                       {
+                         score = 4;
+                         break;
+                       }
+                     else if (pool->installed && pool->solvables[p].repo == pool->installed)
+                       score = 3;
+                   }
                }
            }
        }
@@ -1257,8 +1246,15 @@ urpm_reorder(Solver *solv, Queue *plist)
                      if (knid)
                        {
                          FOR_PROVIDES(p, pp, knid)
-                           if (solv->decisionmap[p] > 0 || (pool->installed && pool->solvables[p].repo == pool->installed))
-                             score = 3;
+                           {
+                             if (solv->decisionmap[p] > 0)
+                               {
+                                 score = 4;
+                                 break;
+                               }
+                             if (pool->installed && pool->solvables[p].repo == pool->installed)
+                               score = 3;
+                           }
                        }
                    }
                }
@@ -1284,8 +1280,15 @@ urpm_reorder(Solver *solv, Queue *plist)
                {
                  score = 0;
                  FOR_PROVIDES(p, pp, id)
-                   if (solv->decisionmap[p] > 0 || (pool->installed && pool->solvables[p].repo == pool->installed))
-                     score = 3;
+                   {
+                     if (solv->decisionmap[p] > 0)
+                       {
+                         score = 4;
+                         break;
+                       }
+                     if (pool->installed && pool->solvables[p].repo == pool->installed)
+                       score = 3;
+                   }
                  break;
                }
            }
@@ -1350,6 +1353,22 @@ policy_filter_unwanted(Solver *solv, Queue *plist, int mode)
     }
 }
 
+void
+pool_best_solvables(Pool *pool, Queue *plist, int flags)
+{
+  if (plist->count > 1)
+    prune_to_highest_prio(pool, plist);
+  if (plist->count > 1)
+    prune_to_best_arch(pool, plist);
+  if (plist->count > 1)
+    prune_to_best_version(pool, plist);
+  if (plist->count > 1)
+    {
+      dislike_old_versions(pool, plist);
+      sort_by_common_dep(pool, plist);
+    }
+}
+
 
 /* check if there is an illegal architecture change if
  * installed solvable s1 is replaced by s2 */