-/* one or more installed cleandeps packages in dq that are to be updated */
-/* we need to emulate the code in resolve_installed */
-static void
-do_cleandeps_update_filter(Solver *solv, Queue *dq)
-{
- Pool *pool = solv->pool;
- Repo *installed = solv->installed;
- Id *specialupdaters = solv->specialupdaters;
- Id p, p2, pp, d;
- Queue q;
- int i, j, k;
-
- queue_init(&q);
- for (i = 0; i < dq->count; i++)
- {
- Id p = dq->elements[i];
- if (p < 0)
- p = -p;
- if (pool->solvables[p].repo != installed || !MAPTST(&solv->cleandepsmap, p - installed->start))
- continue;
- queue_empty(&q);
- /* find updaters */
- if (specialupdaters && (d = specialupdaters[p - installed->start]) != 0)
- {
- while ((p2 = pool->whatprovidesdata[d++]) != 0)
- if (solv->decisionmap[p2] >= 0)
- queue_push(&q, p2);
- }
- else
- {
- Rule *r = solv->rules + solv->updaterules + (p - installed->start);
- if (r->p)
- {
- FOR_RULELITERALS(p2, pp, r)
- if (solv->decisionmap[p2] >= 0)
- queue_push(&q, p2);
- }
- }
- if (q.count && solv->update_targets && solv->update_targets->elements[p - installed->start])
- prune_to_update_targets(solv, solv->update_targets->elements + solv->update_targets->elements[p - installed->start], &q);
- /* mark all elements in dq that are in the updaters list */
- dq->elements[i] = -p;
- for (j = 0; j < dq->count; j++)
- {
- p = dq->elements[j];
- if (p < 0)
- continue;
- for (k = 0; k < q.count; k++)
- if (q.elements[k] == p)
- {
- dq->elements[j] = -p;
- break;
- }
- }
- }
- /* now prune to marked elements */
- for (i = j = 0; i < dq->count; i++)
- if ((p = dq->elements[i]) < 0)
- dq->elements[j++] = -p;
- dq->count = j;
- queue_free(&q);
-}
-