diff options
author | shuai.fu <shuai01.fu@samsung.com> | 2017-01-14 14:38:43 +0800 |
---|---|---|
committer | SoonKyu Park <sk7.park@samsung.com> | 2017-02-20 09:56:08 +0900 |
commit | 6ffa225b9ba0400af0891a6c51db8b0abf0326da (patch) | |
tree | affbe51a49d3087c6cafd33e2b0f1cf55acfa432 | |
parent | 385ead62ac78d2ecf63635074f533bf8a329faee (diff) | |
download | perl-BSSolv-obs-2.4-master.tar.gz perl-BSSolv-obs-2.4-master.tar.bz2 perl-BSSolv-obs-2.4-master.zip |
Allow to understand recommands reference git hub openSUSE/perl-BSSolv three patch and commit-id is f66b c3fa f2daHEADsubmit/trunk/20191021.083710submit/trunk/20191021.061922submit/trunk/20191021.051025submit/trunk/20190930.015208submit/trunk/20190930.011717submit/trunk/20190927.012743submit/devel/20190730.075441accepted/tizen/devbase/services/20190930.043401release-20170224masterdevelaccepted/tizen_devbase_services
Change-Id: I408bf1f19b8eeb808faf8955fb4e52f8fc2fe233
Signed-off-by: shuai.fu <shuai01.fu@samsung.com>
-rw-r--r-- | BSSolv.xs | 81 |
1 files changed, 77 insertions, 4 deletions
@@ -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: |