summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshuai.fu <shuai01.fu@samsung.com>2017-01-14 14:38:43 +0800
committerSoonKyu Park <sk7.park@samsung.com>2017-02-20 09:56:08 +0900
commit6ffa225b9ba0400af0891a6c51db8b0abf0326da (patch)
treeaffbe51a49d3087c6cafd33e2b0f1cf55acfa432
parent385ead62ac78d2ecf63635074f533bf8a329faee (diff)
downloadperl-BSSolv-obs-2.4-master.tar.gz
perl-BSSolv-obs-2.4-master.tar.bz2
perl-BSSolv-obs-2.4-master.zip
Change-Id: I408bf1f19b8eeb808faf8955fb4e52f8fc2fe233 Signed-off-by: shuai.fu <shuai01.fu@samsung.com>
-rw-r--r--BSSolv.xs81
1 files changed, 77 insertions, 4 deletions
diff --git a/BSSolv.xs b/BSSolv.xs
index d8fce9d..610d4cd 100644
--- a/BSSolv.xs
+++ b/BSSolv.xs
@@ -44,6 +44,7 @@ typedef struct _Expander {
char *debugstr;
int debugstrl;
int debugstrf;
+ int userecommendsforchoices;
} Expander;
typedef Pool *BSSolv__pool;
@@ -502,6 +503,28 @@ expander_updateconflictsinfo(Expander *xp, Queue *conflictsinfo, int *cidone, Qu
*cidone = out->count;
}
+static void
+expander_updaterecommendedmap(Expander *xp, Map *recommended, int *recdone, Queue *out)
+{
+ Pool *pool = xp->pool;
+
+ int i;
+ Id p, pp, rec, *recp;
+ for (i = *recdone; i < out->count; i++)
+ {
+ Solvable *s;
+ s = pool->solvables + out->elements[i];
+ if (s->recommends)
+ {
+ MAPEXP(recommended, pool->nsolvables);
+ for (recp = s->repo->idarraydata + s->recommends; (rec = *recp++) != 0; )
+ FOR_PROVIDES(p, pp, rec)
+ MAPSET(recommended, p);
+ }
+ }
+ *recdone = out->count;
+}
+
static inline int
findconflictsinfo(Queue *conflictsinfo, Id p)
{
@@ -528,16 +551,21 @@ expander_expand(Expander *xp, Queue *in, Queue *out)
Queue todo, errors, cerrors, qq, posfoundq;
Map installed;
Map conflicts;
+ Map recommended;
Queue conflictsinfo;
int cidone;
+ int recdone;
Solvable *s;
Id q, p, pp;
int i, j, nerrors, doamb, ambcnt;
Id id, who, whon, pn;
Id conflprov, conflprovpc;
+ int haverecommended = 0;
+ int haverecommended_done = 0;
map_init(&installed, pool->nsolvables);
map_init(&conflicts, 0);
+ map_init(&recommended, 0);
queue_init(&conflictsinfo);
queue_init(&todo);
queue_init(&qq);
@@ -547,7 +575,7 @@ expander_expand(Expander *xp, Queue *in, Queue *out)
queue_empty(out);
cidone = 0;
-
+ recdone = 0;
/* do direct expands */
for (i = 0; i < in->count; i++)
{
@@ -612,11 +640,30 @@ expander_expand(Expander *xp, Queue *in, Queue *out)
who = queue_shift(&todo);
if (ambcnt == 0)
{
- if (doamb)
+ //if (doamb)
+ if (doamb >= 2)
break; /* amb pass had no progress, stop */
+
+ doamb = xp->userecommendsforchoices ? doamb + 1 : 3;
+ if (doamb == 1 && !haverecommended)
+ {
+ for (i = haverecommended_done; i < out->count; i++)
+ if (pool->solvables[out->elements[i]].recommends)
+ haverecommended = 1;
+ haverecommended_done = out->count;
+ if (!haverecommended)
+ doamb = 3;
+ }
+
if (xp->debug)
- expander_dbg(xp, "now doing undecided dependencies\n");
- doamb = 1; /* start amb pass */
+
+ {
+ if (doamb == 2)
+ expander_dbg(xp, "now doing undecided dependencies with recommends\n");
+ else
+ expander_dbg(xp, "now doing undecided dependencies\n");
+ }
+
ambcnt = todo.count;
}
else
@@ -843,6 +890,30 @@ expander_expand(Expander *xp, Queue *in, Queue *out)
break;
}
}
+
+
+ if (qq.count > 1 && doamb == 1)
+ {
+ queue_push2(&todo, id, who);
+ continue;
+ }
+
+ /* prioritize recommended packages. */
+ if (qq.count > 1 && doamb == 2)
+ {
+ expander_updaterecommendedmap(xp, &recommended, &recdone, out);
+ if (recommended.size)
+ {
+ for (i = j = 0; i < qq.count; i++)
+ if (MAPTST(&recommended, qq.elements[i]))
+ qq.elements[j++] = qq.elements[i];
+ if (j)
+ queue_truncate(&qq, j);
+ }
+ }
+
+
+
if (qq.count > 1)
{
queue_push(&cerrors, ERROR_CHOICE);
@@ -863,6 +934,7 @@ expander_expand(Expander *xp, Queue *in, Queue *out)
}
map_free(&installed);
map_free(&conflicts);
+ map_free(&recommended);
queue_free(&conflictsinfo);
nerrors = 0;
if (errors.count || cerrors.count)
@@ -2407,6 +2479,7 @@ new(char *packname = "BSSolv::expander", BSSolv::pool pool, HV *config)
sv = get_sv("Build::expand_dbg", FALSE);
if (sv && SvTRUE(sv))
xp->debug = 1;
+ xp->userecommendsforchoices = 1;
RETVAL = xp;
}
OUTPUT: