}
static void
-reorder_dq_for_jobrules(Solver *solv, int level, Queue *dq)
+reorder_dq_for_future_installed(Solver *solv, int level, Queue *dq)
{
Pool *pool = solv->pool;
int i, j, haveone = 0, dqcount = dq->count;
if (dq->count > 1)
policy_filter_unwanted(solv, dq, POLICY_MODE_CHOOSE);
- /* if we're resolving job rules and didn't resolve the installed packages yet,
+ /* if we're resolving rules and didn't resolve the installed packages yet,
* do some special supplements ordering */
- if (dq->count > 1 && ruleid >= solv->jobrules && ruleid < solv->jobrules_end && solv->installed && !solv->focus_installed)
- reorder_dq_for_jobrules(solv, level, dq);
+ if (dq->count > 1 && solv->do_extra_reordering)
+ reorder_dq_for_future_installed(solv, level, dq);
/* if we have multiple candidates we open a branch */
if (dq->count > 1)
createbranch(solv, level, dq, 0, ruleid);
return solv->break_orphans;
case SOLVER_FLAG_FOCUS_INSTALLED:
return solv->focus_installed;
+ case SOLVER_FLAG_FOCUS_BEST:
+ return solv->focus_best;
case SOLVER_FLAG_YUM_OBSOLETES:
return solv->do_yum_obsoletes;
case SOLVER_FLAG_NEED_UPDATEPROVIDE:
case SOLVER_FLAG_FOCUS_INSTALLED:
solv->focus_installed = value;
break;
+ case SOLVER_FLAG_FOCUS_BEST:
+ solv->focus_best = value;
+ break;
case SOLVER_FLAG_YUM_OBSOLETES:
solv->do_yum_obsoletes = value;
break;
queue_init(&dq);
queue_init(&dqs);
solv->installedpos = 0;
+ solv->do_extra_reordering = 0;
/*
* here's the main loop:
*/
if (level < systemlevel && !solv->focus_installed)
{
+ if (solv->installed && solv->installed->nsolvables && !solv->installed->disabled)
+ solv->do_extra_reordering = 1;
olevel = level;
level = resolve_jobrules(solv, level, disablerules, &dq);
+ solv->do_extra_reordering = 0;
if (level < olevel)
continue;
systemlevel = level + 1;
}
+ /* resolve job dependencies in the focus_best case */
+ if (level < systemlevel && solv->focus_best && !solv->focus_installed && solv->installed && solv->installed->nsolvables && !solv->installed->disabled)
+ {
+ solv->do_extra_reordering = 1;
+ olevel = level;
+ level = resolve_dependencies(solv, level, disablerules, &dq);
+ solv->do_extra_reordering = 0;
+ if (level < olevel)
+ continue; /* start over */
+ systemlevel = level + 1;
+ }
+
/*
* installed packages
*/
int bestobeypolicy; /* true: stay in policy with the best rules */
int noautotarget; /* true: do not assume targeted for up/dup jobs that contain no installed solvable */
int focus_installed; /* true: resolve update rules first */
+ int focus_best; /* true: resolve job dependencies first */
int do_yum_obsoletes; /* true: add special yumobs rules */
int urpmreorder; /* true: do special urpm package reordering */
#define SOLVER_FLAG_YUM_OBSOLETES 21
#define SOLVER_FLAG_NEED_UPDATEPROVIDE 22
#define SOLVER_FLAG_URPM_REORDER 23
+#define SOLVER_FLAG_FOCUS_BEST 24
#define GET_USERINSTALLED_NAMES (1 << 0) /* package names instead of ids */
#define GET_USERINSTALLED_INVERTED (1 << 1) /* autoinstalled */