X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Ftransaction.c;h=49e58e86f8aed0bd71c8eb3eff8e562fbae18a31;hb=ba4d7201b44ecec1182b53571d98b2be4ca50264;hp=4efc4dad5297a33db51b30f12e44f2611407c2ed;hpb=3a6172b51a8971bacf086206a1a601f623410d3f;p=platform%2Fupstream%2Flibsolv.git diff --git a/src/transaction.c b/src/transaction.c index 4efc4da..49e58e8 100644 --- a/src/transaction.c +++ b/src/transaction.c @@ -46,13 +46,14 @@ obsq_sortcmp(const void *ap, const void *bp, void *dp) obs = pool->solvables + ob; if (oas->name != obs->name) { + /* bring "same name" obsoleters (i.e. upgraders) to front */ if (oas->name == s->name) return -1; if (obs->name == s->name) return 1; - return strcmp(id2str(pool, oas->name), id2str(pool, obs->name)); + return strcmp(pool_id2str(pool, oas->name), pool_id2str(pool, obs->name)); } - r = evrcmp(pool, oas->evr, obs->evr, EVRCMP_COMPARE); + r = pool_evrcmp(pool, oas->evr, obs->evr, EVRCMP_COMPARE); if (r) return -r; /* highest version first */ return oa - ob; @@ -77,22 +78,20 @@ transaction_all_obs_pkgs(Transaction *trans, Id p, Queue *pkgs) return; if (q > 0) { + /* only a single obsoleting package */ queue_push(pkgs, q); return; } /* find which packages obsolete us */ for (i = 0; i < ti->count; i += 2) if (ti->elements[i + 1] == p) - { - queue_push(pkgs, p); - queue_push(pkgs, ti->elements[i]); - } + queue_push2(pkgs, p, ti->elements[i]); /* sort obsoleters */ if (pkgs->count > 2) - sat_sort(pkgs->elements, pkgs->count / 2, 2 * sizeof(Id), obsq_sortcmp, pool); + solv_sort(pkgs->elements, pkgs->count / 2, 2 * sizeof(Id), obsq_sortcmp, pool); for (i = 0; i < pkgs->count; i += 2) pkgs->elements[i / 2] = pkgs->elements[i + 1]; - pkgs->count /= 2; + queue_truncate(pkgs, pkgs->count / 2); } else { @@ -112,8 +111,8 @@ transaction_obs_pkg(Transaction *trans, Id p) { Pool *pool = trans->pool; Solvable *s = pool->solvables + p; - Queue ti; - Id tibuf[5]; + Queue *ti; + int i; if (p <= 0 || !s->repo) return 0; @@ -122,11 +121,11 @@ transaction_obs_pkg(Transaction *trans, Id p) p = trans->transaction_installed[p - pool->installed->start]; return p < 0 ? -p : p; } - queue_init_buffer(&ti, tibuf, sizeof(tibuf)/sizeof(*tibuf)); - transaction_all_obs_pkgs(trans, p, &ti); - p = ti.count ? ti.elements[0] : 0; - queue_free(&ti); - return p; + ti = &trans->transaction_info; + for (i = 0; i < ti->count; i += 2) + if (ti->elements[i] == p) + return ti->elements[i + 1]; + return 0; } @@ -156,7 +155,7 @@ transaction_base_type(Transaction *trans, Id p) { if (s->evr == s2->evr && solvable_identical(s, s2)) return SOLVER_TRANSACTION_REINSTALLED; - r = evrcmp(pool, s->evr, s2->evr, EVRCMP_COMPARE); + r = pool_evrcmp(pool, s->evr, s2->evr, EVRCMP_COMPARE); if (r < 0) return SOLVER_TRANSACTION_UPGRADED; else if (r > 0) @@ -167,9 +166,19 @@ transaction_base_type(Transaction *trans, Id p) } else { - int noobs = trans->noobsmap.size && MAPTST(&trans->noobsmap, p); - if (noobs) - return p2 ? SOLVER_TRANSACTION_MULTIREINSTALL : SOLVER_TRANSACTION_MULTIINSTALL; + /* install or multiinstall */ + int multi = trans->multiversionmap.size && MAPTST(&trans->multiversionmap, p); + if (multi) + { + if (p2) + { + s = pool->solvables + p; + s2 = pool->solvables + p2; + if (s->name == s2->name && s->arch == s2->arch && s->evr == s2->evr) + return SOLVER_TRANSACTION_MULTIREINSTALL; + } + return SOLVER_TRANSACTION_MULTIINSTALL; + } if (!p2) return SOLVER_TRANSACTION_INSTALL; s = pool->solvables + p; @@ -178,7 +187,7 @@ transaction_base_type(Transaction *trans, Id p) { if (s->evr == s2->evr && solvable_identical(s, s2)) return SOLVER_TRANSACTION_REINSTALL; - r = evrcmp(pool, s->evr, s2->evr, EVRCMP_COMPARE); + r = pool_evrcmp(pool, s->evr, s2->evr, EVRCMP_COMPARE); if (r > 0) return SOLVER_TRANSACTION_UPGRADE; else if (r < 0) @@ -190,6 +199,68 @@ transaction_base_type(Transaction *trans, Id p) } } +/* these packages do not get installed by the package manager */ +static inline int +is_pseudo_package(Pool *pool, Solvable *s) +{ + const char *n = pool_id2str(pool, s->name); + if (*n == 'p' && !strncmp(n, "patch:", 6)) + return 1; + if (*n == 'p' && !strncmp(n, "pattern:", 8)) + return 1; + if (*n == 'p' && !strncmp(n, "product:", 8)) + return 1; + if (*n == 'a' && !strncmp(n, "application:", 12)) + return 1; + return 0; +} + +/* these packages will never show up installed */ +static inline int +is_noinst_pseudo_package(Pool *pool, Solvable *s) +{ + const char *n = pool_id2str(pool, s->name); + if (!strncmp(n, "patch:", 6)) + return 1; + if (!strncmp(n, "pattern:", 8)) + { +#if defined(SUSE) && defined(ENABLE_LINKED_PKGS) + /* unlike normal patterns, autopatterns *can* be installed (via the package link), + so do not filter them */ + if (s->provides) + { + Id prv, *prvp = s->repo->idarraydata + s->provides; + while ((prv = *prvp++) != 0) + if (ISRELDEP(prv) && !strcmp(pool_id2str(pool, prv), "autopattern()")) + return 0; + } +#endif + return 1; + } + return 0; +} + +static int +obsoleted_by_pseudos_only(Transaction *trans, Id p) +{ + Pool *pool = trans->pool; + Queue q; + Id op; + int i; + + op = transaction_obs_pkg(trans, p); + if (op && !is_pseudo_package(pool, pool->solvables + op)) + return 0; + queue_init(&q); + transaction_all_obs_pkgs(trans, p, &q); + for (i = 0; i < q.count; i++) + if (!is_pseudo_package(pool, pool->solvables + q.elements[i])) + break; + i = !q.count || i < q.count ? 0 : 1; + queue_free(&q); + return i; +} + /* * return type of transaction element * @@ -205,15 +276,12 @@ transaction_type(Transaction *trans, Id p, int mode) Queue oq, rq; Id type, q; int i, j, ref = 0; - const char *n; if (!s->repo) return SOLVER_TRANSACTION_IGNORE; - n = id2str(pool, s->name); - if (!strncmp(n, "patch:", 6)) - return SOLVER_TRANSACTION_IGNORE; - if (!strncmp(n, "pattern:", 8)) + /* XXX: SUSE only? */ + if (!(mode & SOLVER_TRANSACTION_KEEP_PSEUDO) && is_noinst_pseudo_package(pool, s)) return SOLVER_TRANSACTION_IGNORE; type = transaction_base_type(trans, p); @@ -223,11 +291,18 @@ transaction_type(Transaction *trans, Id p, int mode) if ((mode & SOLVER_TRANSACTION_RPM_ONLY) != 0) { - /* application wants to know what to feed to rpm */ + /* application wants to know what to feed to the package manager */ + if (!(mode & SOLVER_TRANSACTION_KEEP_PSEUDO) && is_pseudo_package(pool, s)) + return SOLVER_TRANSACTION_IGNORE; if (type == SOLVER_TRANSACTION_ERASE || type == SOLVER_TRANSACTION_INSTALL || type == SOLVER_TRANSACTION_MULTIINSTALL) return type; if (s->repo == pool->installed) - return SOLVER_TRANSACTION_IGNORE; /* ignore as we're being obsoleted */ + { + /* check if we're a real package that is obsoleted by pseudos */ + if (!is_pseudo_package(pool, s) && obsoleted_by_pseudos_only(trans, s - pool->solvables)) + return SOLVER_TRANSACTION_ERASE; + return SOLVER_TRANSACTION_IGNORE; /* ignore as we're being obsoleted */ + } if (type == SOLVER_TRANSACTION_MULTIREINSTALL) return SOLVER_TRANSACTION_MULTIINSTALL; return SOLVER_TRANSACTION_INSTALL; @@ -243,7 +318,7 @@ transaction_type(Transaction *trans, Id p, int mode) type = SOLVER_TRANSACTION_REINSTALL; } - if ((mode & SOLVER_TRANSACTION_CHANGE_IS_REINSTALL)) + if ((mode & SOLVER_TRANSACTION_CHANGE_IS_REINSTALL) != 0) { /* application wants to make no difference between change * and reinstall */ @@ -259,15 +334,19 @@ transaction_type(Transaction *trans, Id p, int mode) if (s->repo == pool->installed && (mode & SOLVER_TRANSACTION_SHOW_ACTIVE) == 0) { /* erase element and we're showing the passive side */ - if ((mode & SOLVER_TRANSACTION_SHOW_OBSOLETES) == 0 && type == SOLVER_TRANSACTION_OBSOLETED) + if (type == SOLVER_TRANSACTION_OBSOLETED && (mode & SOLVER_TRANSACTION_SHOW_OBSOLETES) == 0) type = SOLVER_TRANSACTION_ERASE; + if (type == SOLVER_TRANSACTION_OBSOLETED && (mode & SOLVER_TRANSACTION_OBSOLETE_IS_UPGRADE) != 0) + type = SOLVER_TRANSACTION_UPGRADED; return type; } if (s->repo != pool->installed && (mode & SOLVER_TRANSACTION_SHOW_ACTIVE) != 0) { /* install element and we're showing the active side */ - if ((mode & SOLVER_TRANSACTION_SHOW_OBSOLETES) == 0 && type == SOLVER_TRANSACTION_OBSOLETES) + if (type == SOLVER_TRANSACTION_OBSOLETES && (mode & SOLVER_TRANSACTION_SHOW_OBSOLETES) == 0) type = SOLVER_TRANSACTION_INSTALL; + if (type == SOLVER_TRANSACTION_OBSOLETES && (mode & SOLVER_TRANSACTION_OBSOLETE_IS_UPGRADE) != 0) + type = SOLVER_TRANSACTION_UPGRADE; return type; } @@ -298,7 +377,7 @@ transaction_type(Transaction *trans, Id p, int mode) return SOLVER_TRANSACTION_INSTALL; } } - + /* if there's a match, p will be shown when q * is processed */ if (transaction_obs_pkg(trans, q) == p) @@ -369,10 +448,10 @@ classify_cmp(const void *ap, const void *bp, void *dp) return r; r = a[2] - b[2]; if (r) - return a[2] && b[2] ? strcmp(id2str(pool, a[2]), id2str(pool, b[2])) : r; + return a[2] && b[2] ? strcmp(pool_id2str(pool, a[2]), pool_id2str(pool, b[2])) : r; r = a[3] - b[3]; if (r) - return a[3] && b[3] ? strcmp(id2str(pool, a[3]), id2str(pool, b[3])) : r; + return a[3] && b[3] ? strcmp(pool_id2str(pool, a[3]), pool_id2str(pool, b[3])) : r; return 0; } @@ -388,16 +467,34 @@ classify_cmp_pkgs(const void *ap, const void *bp, void *dp) sa = pool->solvables + a; sb = pool->solvables + b; if (sa->name != sb->name) - return strcmp(id2str(pool, sa->name), id2str(pool, sb->name)); + return strcmp(pool_id2str(pool, sa->name), pool_id2str(pool, sb->name)); if (sa->evr != sb->evr) { - int r = evrcmp(pool, sa->evr, sb->evr, EVRCMP_COMPARE); + int r = pool_evrcmp(pool, sa->evr, sb->evr, EVRCMP_COMPARE); if (r) return r; } return a - b; } +static inline void +queue_push4(Queue *q, Id id1, Id id2, Id id3, Id id4) +{ + queue_push(q, id1); + queue_push(q, id2); + queue_push(q, id3); + queue_push(q, id4); +} + +static inline void +queue_unshift4(Queue *q, Id id1, Id id2, Id id3, Id id4) +{ + queue_unshift(q, id4); + queue_unshift(q, id3); + queue_unshift(q, id2); + queue_unshift(q, id1); +} + void transaction_classify(Transaction *trans, int mode, Queue *classes) { @@ -418,6 +515,9 @@ transaction_classify(Transaction *trans, int mode, Queue *classes) ntypes[type]++; if (!pool->installed || s->repo != pool->installed) continue; + /* don't report vendor/arch changes if we were mapped to erase. */ + if (type == SOLVER_TRANSACTION_ERASE) + continue; /* look at arch/vendor changes */ q = transaction_obs_pkg(trans, p); if (!q) @@ -434,12 +534,7 @@ transaction_classify(Transaction *trans, int mode, Queue *classes) if (classes->elements[j] == SOLVER_TRANSACTION_ARCHCHANGE && classes->elements[j + 2] == v && classes->elements[j + 3] == vq) break; if (j == classes->count) - { - queue_push(classes, SOLVER_TRANSACTION_ARCHCHANGE); - queue_push(classes, 1); - queue_push(classes, v); - queue_push(classes, vq); - } + queue_push4(classes, SOLVER_TRANSACTION_ARCHCHANGE, 1, v, vq); else classes->elements[j + 1]++; } @@ -454,38 +549,25 @@ transaction_classify(Transaction *trans, int mode, Queue *classes) if (classes->elements[j] == SOLVER_TRANSACTION_VENDORCHANGE && classes->elements[j + 2] == v && classes->elements[j + 3] == vq) break; if (j == classes->count) - { - queue_push(classes, SOLVER_TRANSACTION_VENDORCHANGE); - queue_push(classes, 1); - queue_push(classes, v); - queue_push(classes, vq); - } + queue_push4(classes, SOLVER_TRANSACTION_VENDORCHANGE, 1, v, vq); else classes->elements[j + 1]++; } } /* now sort all vendor/arch changes */ if (classes->count > 4) - sat_sort(classes->elements, classes->count / 4, 4 * sizeof(Id), classify_cmp, trans); + solv_sort(classes->elements, classes->count / 4, 4 * sizeof(Id), classify_cmp, trans); /* finally add all classes. put erases last */ i = SOLVER_TRANSACTION_ERASE; if (ntypes[i]) - { - queue_unshift(classes, 0); - queue_unshift(classes, 0); - queue_unshift(classes, ntypes[i]); - queue_unshift(classes, i); - } + queue_unshift4(classes, i, ntypes[i], 0, 0); for (i = SOLVER_TRANSACTION_MAXTYPE; i > 0; i--) { if (!ntypes[i]) continue; if (i == SOLVER_TRANSACTION_ERASE) continue; - queue_unshift(classes, 0); - queue_unshift(classes, 0); - queue_unshift(classes, ntypes[i]); - queue_unshift(classes, i); + queue_unshift4(classes, i, ntypes[i], 0, 0); } } @@ -531,7 +613,7 @@ transaction_classify_pkgs(Transaction *trans, int mode, Id class, Id from, Id to } } if (pkgs->count > 1) - sat_sort(pkgs->elements, pkgs->count, sizeof(Id), classify_cmp_pkgs, trans); + solv_sort(pkgs->elements, pkgs->count, sizeof(Id), classify_cmp_pkgs, trans); } static void @@ -540,12 +622,12 @@ create_transaction_info(Transaction *trans, Queue *decisionq) Pool *pool = trans->pool; Queue *ti = &trans->transaction_info; Repo *installed = pool->installed; - int i, j, noobs; + int i, j, multi; Id p, p2, pp2; Solvable *s, *s2; queue_empty(ti); - trans->transaction_installed = sat_free(trans->transaction_installed); + trans->transaction_installed = solv_free(trans->transaction_installed); if (!installed) return; /* no info needed */ for (i = 0; i < decisionq->count; i++) @@ -556,7 +638,7 @@ create_transaction_info(Transaction *trans, Queue *decisionq) s = pool->solvables + p; if (!s->repo || s->repo == installed) continue; - noobs = trans->noobsmap.size && MAPTST(&trans->noobsmap, p); + multi = trans->multiversionmap.size && MAPTST(&trans->multiversionmap, p); FOR_PROVIDES(p2, pp2, s->name) { if (!MAPTST(&trans->transactsmap, p2)) @@ -564,48 +646,52 @@ create_transaction_info(Transaction *trans, Queue *decisionq) s2 = pool->solvables + p2; if (s2->repo != installed) continue; - if (noobs && (s->name != s2->name || s->evr != s2->evr || s->arch != s2->arch)) + if (multi && (s->name != s2->name || s->evr != s2->evr || s->arch != s2->arch)) continue; if (!pool->implicitobsoleteusesprovides && s->name != s2->name) continue; - if (pool->obsoleteusescolors && !pool_colormatch(pool, s, s2)) + if (pool->implicitobsoleteusescolors && !pool_colormatch(pool, s, s2)) continue; - queue_push(ti, p); - queue_push(ti, p2); + queue_push2(ti, p, p2); } - if (s->obsoletes && !noobs) + if (s->obsoletes && !multi) { Id obs, *obsp = s->repo->idarraydata + s->obsoletes; while ((obs = *obsp++) != 0) { FOR_PROVIDES(p2, pp2, obs) { + if (!MAPTST(&trans->transactsmap, p2)) + continue; s2 = pool->solvables + p2; if (s2->repo != installed) continue; - if (!pool->obsoleteusesprovides && !pool_match_nevr(pool, pool->solvables + p2, obs)) + if (!pool->obsoleteusesprovides && !pool_match_nevr(pool, s2, obs)) continue; if (pool->obsoleteusescolors && !pool_colormatch(pool, s, s2)) continue; - queue_push(ti, p); - queue_push(ti, p2); + queue_push2(ti, p, p2); } } } } - sat_sort(ti->elements, ti->count / 2, 2 * sizeof(Id), obsq_sortcmp, pool); - /* now unify */ - for (i = j = 0; i < ti->count; i += 2) + if (ti->count > 2) { - if (j && ti->elements[i] == ti->elements[j - 2] && ti->elements[i + 1] == ti->elements[j - 1]) - continue; - ti->elements[j++] = ti->elements[i]; - ti->elements[j++] = ti->elements[i + 1]; + /* sort and unify */ + solv_sort(ti->elements, ti->count / 2, 2 * sizeof(Id), obsq_sortcmp, pool); + for (i = j = 2; i < ti->count; i += 2) + { + if (ti->elements[i] == ti->elements[j - 2] && ti->elements[i + 1] == ti->elements[j - 1]) + continue; + ti->elements[j++] = ti->elements[i]; + ti->elements[j++] = ti->elements[i + 1]; + } + queue_truncate(ti, j); } - ti->count = j; /* create transaction_installed helper */ - trans->transaction_installed = sat_calloc(installed->end - installed->start, sizeof(Id)); + /* entry > 0: exactly one obsoleter, entry < 0: multiple obsoleters, -entry is "best" */ + trans->transaction_installed = solv_calloc(installed->end - installed->start, sizeof(Id)); for (i = 0; i < ti->count; i += 2) { j = ti->elements[i + 1] - installed->start; @@ -613,7 +699,7 @@ create_transaction_info(Transaction *trans, Queue *decisionq) trans->transaction_installed[j] = ti->elements[i]; else { - /* more than one package obsoletes us. compare */ + /* more than one package obsoletes us. compare to find "best" */ Id q[4]; if (trans->transaction_installed[j] > 0) trans->transaction_installed[j] = -trans->transaction_installed[j]; @@ -626,21 +712,22 @@ create_transaction_info(Transaction *trans, Queue *decisionq) } } - -void -transaction_calculate(Transaction *trans, Queue *decisionq, Map *noobsmap) +/* create a transaction from the decisionq */ +Transaction * +transaction_create_decisionq(Pool *pool, Queue *decisionq, Map *multiversionmap) { - Pool *pool = trans->pool; Repo *installed = pool->installed; - int i, neednoobs; + int i, needmulti; Id p; Solvable *s; + Transaction *trans; - if (noobsmap && !noobsmap->size) - noobsmap = 0; /* ignore empty map */ + trans = transaction_create(pool); + if (multiversionmap && !multiversionmap->size) + multiversionmap = 0; /* ignore empty map */ queue_empty(&trans->steps); map_init(&trans->transactsmap, pool->nsolvables); - neednoobs = 0; + needmulti = 0; for (i = 0; i < decisionq->count; i++) { p = decisionq->elements[i]; @@ -649,23 +736,16 @@ transaction_calculate(Transaction *trans, Queue *decisionq, Map *noobsmap) continue; if (installed && s->repo == installed && p < 0) MAPSET(&trans->transactsmap, -p); - if ((!installed || s->repo != installed) && p > 0) + if (!(installed && s->repo == installed) && p > 0) { -#if 0 - const char *n = id2str(pool, s->name); - if (!strncmp(n, "patch:", 6)) - continue; - if (!strncmp(n, "pattern:", 8)) - continue; -#endif MAPSET(&trans->transactsmap, p); - if (noobsmap && MAPTST(noobsmap, p)) - neednoobs = 1; + if (multiversionmap && MAPTST(multiversionmap, p)) + needmulti = 1; } } MAPCLR(&trans->transactsmap, SYSTEMSOLVABLE); - if (neednoobs) - map_init_clone(&trans->noobsmap, noobsmap); + if (needmulti) + map_init_clone(&trans->multiversionmap, multiversionmap); create_transaction_info(trans, decisionq); @@ -683,6 +763,7 @@ transaction_calculate(Transaction *trans, Queue *decisionq, Map *noobsmap) if (p > 0 && MAPTST(&trans->transactsmap, p)) queue_push(&trans->steps, p); } + return trans; } int @@ -715,7 +796,7 @@ transaction_installedresult(Transaction *trans, Queue *installedq) } static void -transaction_create_installedmap(Transaction *trans, Map *installedmap) +transaction_make_installedmap(Transaction *trans, Map *installedmap) { Pool *pool = trans->pool; Repo *installed = pool->installed; @@ -745,7 +826,7 @@ transaction_calc_installsizechange(Transaction *trans) Map installedmap; int change; - transaction_create_installedmap(trans, &installedmap); + transaction_make_installedmap(trans, &installedmap); change = pool_calc_installsizechange(trans->pool, &installedmap); map_free(&installedmap); return change; @@ -756,7 +837,7 @@ transaction_calc_duchanges(Transaction *trans, DUChanges *mps, int nmps) { Map installedmap; - transaction_create_installedmap(trans, &installedmap); + transaction_make_installedmap(trans, &installedmap); pool_calc_duchanges(trans->pool, &installedmap, mps, nmps); map_free(&installedmap); } @@ -788,39 +869,37 @@ struct _TransactionOrderdata { #define EDGEDATA_BLOCK 127 -void -transaction_init(Transaction *trans, Pool *pool) +Transaction * +transaction_create(Pool *pool) { - memset(trans, 0, sizeof(*trans)); + Transaction *trans = solv_calloc(1, sizeof(*trans)); trans->pool = pool; + return trans; } -void -transaction_init_clone(Transaction *trans, Transaction *srctrans) +Transaction * +transaction_create_clone(Transaction *srctrans) { - memset(trans, 0, sizeof(*trans)); - trans->pool = srctrans->pool; + Transaction *trans = transaction_create(srctrans->pool); queue_init_clone(&trans->steps, &srctrans->steps); queue_init_clone(&trans->transaction_info, &srctrans->transaction_info); if (srctrans->transaction_installed) { Repo *installed = srctrans->pool->installed; - trans->transaction_installed = sat_calloc(installed->end - installed->start, sizeof(Id)); - memcpy(trans->transaction_installed, srctrans->transaction_installed, (installed->end - installed->start) * sizeof(Id)); + trans->transaction_installed = solv_memdup2(srctrans->transaction_installed, installed->end - installed->start, sizeof(Id)); } map_init_clone(&trans->transactsmap, &srctrans->transactsmap); - map_init_clone(&trans->noobsmap, &srctrans->noobsmap); + map_init_clone(&trans->multiversionmap, &srctrans->multiversionmap); if (srctrans->orderdata) { struct _TransactionOrderdata *od = srctrans->orderdata; - trans->orderdata = sat_calloc(1, sizeof(*trans->orderdata)); - trans->orderdata->tes = sat_malloc2(od->ntes, sizeof(*od->tes)); - memcpy(trans->orderdata->tes, od->tes, od->ntes * sizeof(*od->tes)); + trans->orderdata = solv_calloc(1, sizeof(*trans->orderdata)); + trans->orderdata->tes = solv_memdup2(od->tes, od->ntes, sizeof(*od->tes)); trans->orderdata->ntes = od->ntes; - trans->orderdata->invedgedata = sat_malloc2(od->ninvedgedata, sizeof(Id)); - memcpy(trans->orderdata->invedgedata, od->invedgedata, od->ninvedgedata * sizeof(Id)); + trans->orderdata->invedgedata = solv_memdup2(od->invedgedata, od->ninvedgedata, sizeof(Id)); trans->orderdata->ninvedgedata = od->ninvedgedata; } + return trans; } void @@ -828,10 +907,11 @@ transaction_free(Transaction *trans) { queue_free(&trans->steps); queue_free(&trans->transaction_info); - trans->transaction_installed = sat_free(trans->transaction_installed); + trans->transaction_installed = solv_free(trans->transaction_installed); map_free(&trans->transactsmap); - map_free(&trans->noobsmap); + map_free(&trans->multiversionmap); transaction_free_orderdata(trans); + free(trans); } void @@ -840,9 +920,9 @@ transaction_free_orderdata(Transaction *trans) if (trans->orderdata) { struct _TransactionOrderdata *od = trans->orderdata; - od->tes = sat_free(od->tes); - od->invedgedata = sat_free(od->invedgedata); - trans->orderdata = sat_free(trans->orderdata); + od->tes = solv_free(od->tes); + od->invedgedata = solv_free(od->invedgedata); + trans->orderdata = solv_free(trans->orderdata); } } @@ -868,7 +948,7 @@ addteedge(struct orderdata *od, int from, int to, int type) if (from == to) return 0; - /* printf("edge %d(%s) -> %d(%s) type %x\n", from, solvid2str(pool, od->tes[from].p), to, solvid2str(pool, od->tes[to].p), type); */ + /* printf("edge %d(%s) -> %d(%s) type %x\n", from, pool_solvid2str(pool, od->tes[from].p), to, pool_solvid2str(pool, od->tes[to].p), type); */ te = od->tes + from; for (i = te->edges; od->edgedata[i]; i += 2) @@ -887,12 +967,12 @@ addteedge(struct orderdata *od, int from, int to, int type) /* printf("tail add %d\n", i - te->edges); */ if (!i) te->edges = ++i; - od->edgedata = sat_extend(od->edgedata, od->nedgedata, 3, sizeof(Id), EDGEDATA_BLOCK); + od->edgedata = solv_extend(od->edgedata, od->nedgedata, 3, sizeof(Id), EDGEDATA_BLOCK); } else { /* printf("extend %d\n", i - te->edges); */ - od->edgedata = sat_extend(od->edgedata, od->nedgedata, 3 + (i - te->edges), sizeof(Id), EDGEDATA_BLOCK); + od->edgedata = solv_extend(od->edgedata, od->nedgedata, 3 + (i - te->edges), sizeof(Id), EDGEDATA_BLOCK); if (i > te->edges) memcpy(od->edgedata + od->nedgedata, od->edgedata + te->edges, sizeof(Id) * (i - te->edges)); i = od->nedgedata + (i - te->edges); @@ -914,7 +994,7 @@ addedge(struct orderdata *od, Id from, Id to, int type) struct _TransactionElement *te; int i; - // printf("addedge %d %d type %d\n", from, to, type); + /* printf("addedge %d %d type %d\n", from, to, type); */ s = pool->solvables + from; if (s->repo == pool->installed && trans->transaction_installed[from - pool->installed->start]) { @@ -973,48 +1053,6 @@ addedge(struct orderdata *od, Id from, Id to, int type) return addteedge(od, i, to, type); } -#if 1 -static int -havechoice(struct orderdata *od, Id p, Id q1, Id q2) -{ - Transaction *trans = od->trans; - Pool *pool = trans->pool; - Id ti1buf[5], ti2buf[5]; - Queue ti1, ti2; - int i, j; - - /* both q1 and q2 are uninstalls. check if their TEs intersect */ - /* common case: just one TE for both packages */ -#if 0 - printf("havechoice %d %d %d\n", p, q1, q2); -#endif - if (trans->transaction_installed[q1 - pool->installed->start] == 0) - return 1; - if (trans->transaction_installed[q2 - pool->installed->start] == 0) - return 1; - if (trans->transaction_installed[q1 - pool->installed->start] == trans->transaction_installed[q2 - pool->installed->start]) - return 0; - if (trans->transaction_installed[q1 - pool->installed->start] > 0 && trans->transaction_installed[q2 - pool->installed->start] > 0) - return 1; - queue_init_buffer(&ti1, ti1buf, sizeof(ti1buf)/sizeof(*ti1buf)); - transaction_all_obs_pkgs(trans, q1, &ti1); - queue_init_buffer(&ti2, ti2buf, sizeof(ti2buf)/sizeof(*ti2buf)); - transaction_all_obs_pkgs(trans, q2, &ti2); - for (i = 0; i < ti1.count; i++) - for (j = 0; j < ti2.count; j++) - if (ti1.elements[i] == ti2.elements[j]) - { - /* found a common edge */ - queue_free(&ti1); - queue_free(&ti2); - return 0; - } - queue_free(&ti1); - queue_free(&ti2); - return 1; -} -#endif - static inline int havescripts(Pool *pool, Id solvid) { @@ -1034,7 +1072,7 @@ havescripts(Pool *pool, Id solvid) } if (!inpre) continue; - dep = id2str(pool, req); + dep = pool_id2str(pool, req); if (*dep == '/' && strcmp(dep, "/sbin/ldconfig") != 0) return 1; } @@ -1056,7 +1094,7 @@ addsolvableedges(struct orderdata *od, Solvable *s) int provbyinst; #if 0 - printf("addsolvableedges %s\n", solvable2str(pool, s)); + printf("addsolvableedges %s\n", pool_solvable2str(pool, s)); #endif p = s - pool->solvables; queue_init(&reqq); @@ -1094,7 +1132,7 @@ addsolvableedges(struct orderdata *od, Solvable *s) { provbyinst = 1; #if 0 - printf("IGNORE inst provides %s by %s\n", dep2str(pool, req), solvable2str(pool, s2)); + printf("IGNORE inst provides %s by %s\n", pool_dep2str(pool, req), pool_solvable2str(pool, s2)); reqq.count = 0; /* provided by package that stays installed */ break; #else @@ -1103,7 +1141,7 @@ addsolvableedges(struct orderdata *od, Solvable *s) } if (s2->repo != installed && !MAPTST(&trans->transactsmap, p2)) continue; /* package stays uninstalled */ - + if (s->repo == installed) { /* s gets uninstalled */ @@ -1142,7 +1180,7 @@ addsolvableedges(struct orderdata *od, Solvable *s) if (trans->transaction_installed[reqq.elements[i] - pool->installed->start] == reqq.elements[j]) continue; /* no self edge */ #if 0 - printf("add interrreq uninst->inst edge (%s -> %s -> %s)\n", solvid2str(pool, reqq.elements[i]), dep2str(pool, req), solvid2str(pool, reqq.elements[j])); + printf("add interrreq uninst->inst edge (%s -> %s -> %s)\n", pool_solvid2str(pool, reqq.elements[i]), pool_dep2str(pool, req), pool_solvid2str(pool, reqq.elements[j])); #endif addedge(od, reqq.elements[i], reqq.elements[j], pre == TYPE_PREREQ ? TYPE_PREREQ_P : TYPE_REQ_P); } @@ -1160,23 +1198,21 @@ addsolvableedges(struct orderdata *od, Solvable *s) continue; for (i = 0; i < reqq.count; i++) { - int choice = 0; p2 = reqq.elements[i]; if (pool->solvables[p2].repo != installed) { /* all elements of reqq are installs, thus have different TEs */ - choice = reqq.count - 1; if (pool->solvables[p].repo != installed) { #if 0 - printf("add inst->inst edge choice %d (%s -> %s -> %s)\n", choice, solvid2str(pool, p), dep2str(pool, req), solvid2str(pool, p2)); + printf("add inst->inst edge (%s -> %s -> %s)\n", pool_solvid2str(pool, p), pool_dep2str(pool, req), pool_solvid2str(pool, p2)); #endif addedge(od, p, p2, pre); } else { #if 0 - printf("add uninst->inst edge choice %d (%s -> %s -> %s)\n", choice, solvid2str(pool, p), dep2str(pool, req), solvid2str(pool, p2)); + printf("add uninst->inst edge (%s -> %s -> %s)\n", pool_solvid2str(pool, p), pool_dep2str(pool, req), pool_solvid2str(pool, p2)); #endif addedge(od, p, p2, pre == TYPE_PREREQ ? TYPE_PREREQ_P : TYPE_REQ_P); } @@ -1193,18 +1229,8 @@ addsolvableedges(struct orderdata *od, Solvable *s) /* we assume that the obsoletor is good enough to replace p */ continue; } -#if 1 - choice = 0; - for (j = 0; j < reqq.count; j++) - { - if (i == j) - continue; - if (havechoice(od, p, reqq.elements[i], reqq.elements[j])) - choice++; - } -#endif #if 0 - printf("add uninst->uninst edge choice %d (%s -> %s -> %s)\n", choice, solvid2str(pool, p), dep2str(pool, req), solvid2str(pool, p2)); + printf("add uninst->uninst edge (%s -> %s -> %s)\n", pool_solvid2str(pool, p), pool_dep2str(pool, req), pool_solvid2str(pool, p2)); #endif addedge(od, p2, p, pre == TYPE_PREREQ ? TYPE_PREREQ_P : TYPE_REQ_P); } @@ -1229,7 +1255,7 @@ addsolvableedges(struct orderdata *od, Solvable *s) { /* deinstall p before installing p2 */ #if 0 - printf("add conflict uninst->inst edge (%s -> %s -> %s)\n", solvid2str(pool, p2), dep2str(pool, con), solvid2str(pool, p)); + printf("add conflict uninst->inst edge (%s -> %s -> %s)\n", pool_solvid2str(pool, p2), pool_dep2str(pool, con), pool_solvid2str(pool, p)); #endif addedge(od, p2, p, TYPE_CON); } @@ -1240,7 +1266,7 @@ addsolvableedges(struct orderdata *od, Solvable *s) { /* deinstall p2 before installing p */ #if 0 - printf("add conflict uninst->inst edge (%s -> %s -> %s)\n", solvid2str(pool, p), dep2str(pool, con), solvid2str(pool, p2)); + printf("add conflict uninst->inst edge (%s -> %s -> %s)\n", pool_solvid2str(pool, p), pool_dep2str(pool, con), pool_solvid2str(pool, p2)); #endif addedge(od, p, p2, TYPE_CON); } @@ -1269,7 +1295,7 @@ addsolvableedges(struct orderdata *od, Solvable *s) { /* deinstall/update p before installing p2 */ #if 0 - printf("add trigger uninst->inst edge (%s -> %s -> %s)\n", solvid2str(pool, p2), dep2str(pool, tri), solvid2str(pool, p)); + printf("add trigger uninst->inst edge (%s -> %s -> %s)\n", pool_solvid2str(pool, p2), pool_dep2str(pool, tri), pool_solvid2str(pool, p)); #endif addedge(od, p2, p, TYPE_CON); } @@ -1341,17 +1367,17 @@ breakcycle(struct orderdata *od, Id *cycle) /* cycle recorded, print it */ if (ddegmin >= TYPE_REQ && (ddegmax & TYPE_PREREQ) != 0) - POOL_DEBUG(SAT_DEBUG_STATS, "CRITICAL "); - POOL_DEBUG(SAT_DEBUG_STATS, "cycle: --> "); + POOL_DEBUG(SOLV_DEBUG_STATS, "CRITICAL "); + POOL_DEBUG(SOLV_DEBUG_STATS, "cycle: --> "); for (k = 0; cycle[k + 1]; k += 2) { te = od->tes + cycle[k]; if ((od->edgedata[cycle[k + 1] + 1] & TYPE_BROKEN) != 0) - POOL_DEBUG(SAT_DEBUG_STATS, "%s ##%x##> ", solvid2str(pool, te->p), od->edgedata[cycle[k + 1] + 1]); + POOL_DEBUG(SOLV_DEBUG_STATS, "%s ##%x##> ", pool_solvid2str(pool, te->p), od->edgedata[cycle[k + 1] + 1]); else - POOL_DEBUG(SAT_DEBUG_STATS, "%s --%x--> ", solvid2str(pool, te->p), od->edgedata[cycle[k + 1] + 1]); + POOL_DEBUG(SOLV_DEBUG_STATS, "%s --%x--> ", pool_solvid2str(pool, te->p), od->edgedata[cycle[k + 1] + 1]); } - POOL_DEBUG(SAT_DEBUG_STATS, "\n"); + POOL_DEBUG(SOLV_DEBUG_STATS, "\n"); } static inline void @@ -1366,21 +1392,21 @@ dump_tes(struct orderdata *od) for (i = 1, te = od->tes + i; i < od->ntes; i++, te++) { Solvable *s = pool->solvables + te->p; - POOL_DEBUG(SAT_DEBUG_RESULT, "TE %4d: %c%s\n", i, s->repo == pool->installed ? '-' : '+', solvable2str(pool, s)); + POOL_DEBUG(SOLV_DEBUG_RESULT, "TE %4d: %c%s\n", i, s->repo == pool->installed ? '-' : '+', pool_solvable2str(pool, s)); if (s->repo != pool->installed) { queue_empty(&obsq); transaction_all_obs_pkgs(od->trans, te->p, &obsq); for (j = 0; j < obsq.count; j++) - POOL_DEBUG(SAT_DEBUG_RESULT, " -%s\n", solvid2str(pool, obsq.elements[j])); + POOL_DEBUG(SOLV_DEBUG_RESULT, " -%s\n", pool_solvid2str(pool, obsq.elements[j])); } for (j = te->edges; od->edgedata[j]; j += 2) { te2 = od->tes + od->edgedata[j]; if ((od->edgedata[j + 1] & TYPE_BROKEN) == 0) - POOL_DEBUG(SAT_DEBUG_RESULT, " --%x--> TE %4d: %s\n", od->edgedata[j + 1], od->edgedata[j], solvid2str(pool, te2->p)); + POOL_DEBUG(SOLV_DEBUG_RESULT, " --%x--> TE %4d: %s\n", od->edgedata[j + 1], od->edgedata[j], pool_solvid2str(pool, te2->p)); else - POOL_DEBUG(SAT_DEBUG_RESULT, " ##%x##> TE %4d: %s\n", od->edgedata[j + 1], od->edgedata[j], solvid2str(pool, te2->p)); + POOL_DEBUG(SOLV_DEBUG_RESULT, " ##%x##> TE %4d: %s\n", od->edgedata[j + 1], od->edgedata[j], pool_solvid2str(pool, te2->p)); } } } @@ -1427,7 +1453,7 @@ addcycleedges(struct orderdata *od, Id *cycle, Queue *todo) #if 0 printf("addcycleedges\n"); for (i = 0; (j = cycle[i]) != 0; i++) - printf("cycle %s\n", solvid2str(pool, od->tes[j].p)); + printf("cycle %s\n", pool_solvid2str(pool, od->tes[j].p)); #endif /* first add all the tail cycle edges */ @@ -1475,7 +1501,7 @@ addcycleedges(struct orderdata *od, Id *cycle, Queue *todo) /* We found an edge to the cycle. Add an extra edge to the tail */ /* the TE was not reachable, so we're not creating a new cycle! */ #if 0 - printf("adding TO TAIL cycle edge %d->%d %s->%s!\n", i, tail, solvid2str(pool, od->tes[i].p), solvid2str(pool, od->tes[tail].p)); + printf("adding TO TAIL cycle edge %d->%d %s->%s!\n", i, tail, pool_solvid2str(pool, od->tes[i].p), pool_solvid2str(pool, od->tes[tail].p)); #endif j -= te->edges; /* in case we move */ addteedge(od, i, tail, TYPE_CYCLETAIL); @@ -1522,7 +1548,7 @@ addcycleedges(struct orderdata *od, Id *cycle, Queue *todo) if (od->tes[k].mark == -1) { #if 0 - printf("adding FROM HEAD cycle edge %d->%d %s->%s [%s]!\n", head, k, solvid2str(pool, od->tes[head].p), solvid2str(pool, od->tes[k].p), solvid2str(pool, od->tes[cycle[i]].p)); + printf("adding FROM HEAD cycle edge %d->%d %s->%s [%s]!\n", head, k, pool_solvid2str(pool, od->tes[head].p), pool_solvid2str(pool, od->tes[k].p), pool_solvid2str(pool, od->tes[cycle[i]].p)); #endif addteedge(od, head, k, TYPE_CYCLEHEAD); od->tes[k].mark = -2; /* no need to add that one again */ @@ -1552,15 +1578,15 @@ transaction_order(Transaction *trans, int flags) int lastmedia; Id *temedianr; - start = now = sat_timems(0); - POOL_DEBUG(SAT_DEBUG_STATS, "ordering transaction\n"); + start = now = solv_timems(0); + POOL_DEBUG(SOLV_DEBUG_STATS, "ordering transaction\n"); /* free old data if present */ if (trans->orderdata) { struct _TransactionOrderdata *od = trans->orderdata; - od->tes = sat_free(od->tes); - od->invedgedata = sat_free(od->invedgedata); - trans->orderdata = sat_free(trans->orderdata); + od->tes = solv_free(od->tes); + od->invedgedata = solv_free(od->invedgedata); + trans->orderdata = solv_free(trans->orderdata); } /* create a transaction element for every active component */ @@ -1573,7 +1599,7 @@ transaction_order(Transaction *trans, int flags) continue; numte++; } - POOL_DEBUG(SAT_DEBUG_STATS, "transaction elements: %d\n", numte); + POOL_DEBUG(SOLV_DEBUG_STATS, "transaction elements: %d\n", numte); if (!numte) return; /* nothing to do... */ @@ -1581,8 +1607,8 @@ transaction_order(Transaction *trans, int flags) memset(&od, 0, sizeof(od)); od.trans = trans; od.ntes = numte; - od.tes = sat_calloc(numte, sizeof(*od.tes)); - od.edgedata = sat_extend(0, 0, 1, sizeof(Id), EDGEDATA_BLOCK); + od.tes = solv_calloc(numte, sizeof(*od.tes)); + od.edgedata = solv_extend(0, 0, 1, sizeof(Id), EDGEDATA_BLOCK); od.edgedata[0] = 0; od.nedgedata = 1; queue_init(&od.cycles); @@ -1607,14 +1633,14 @@ transaction_order(Transaction *trans, int flags) for (i = 1, te = od.tes + i; i < numte; i++, te++) for (j = te->edges; od.edgedata[j]; j += 2) numedge++; - POOL_DEBUG(SAT_DEBUG_STATS, "edges: %d, edge space: %d\n", numedge, od.nedgedata / 2); - POOL_DEBUG(SAT_DEBUG_STATS, "edge creation took %d ms\n", sat_timems(now)); + POOL_DEBUG(SOLV_DEBUG_STATS, "edges: %d, edge space: %d\n", numedge, od.nedgedata / 2); + POOL_DEBUG(SOLV_DEBUG_STATS, "edge creation took %d ms\n", solv_timems(now)); #if 0 dump_tes(&od); #endif - - now = sat_timems(0); + + now = solv_timems(0); /* kill all cycles */ queue_init(&todo); for (i = numte - 1; i > 0; i--) @@ -1692,10 +1718,10 @@ transaction_order(Transaction *trans, int flags) /* restart with start of cycle */ todo.count = cycstart + 1; } - POOL_DEBUG(SAT_DEBUG_STATS, "cycles broken: %d\n", od.ncycles); - POOL_DEBUG(SAT_DEBUG_STATS, "cycle breaking took %d ms\n", sat_timems(now)); + POOL_DEBUG(SOLV_DEBUG_STATS, "cycles broken: %d\n", od.ncycles); + POOL_DEBUG(SOLV_DEBUG_STATS, "cycle breaking took %d ms\n", solv_timems(now)); - now = sat_timems(0); + now = solv_timems(0); /* now go through all broken cycles and create cycle edges to help the ordering */ for (i = od.cycles.count - 3; i >= 0; i -= 3) @@ -1708,14 +1734,14 @@ transaction_order(Transaction *trans, int flags) if (od.cycles.elements[i + 2] < TYPE_REQ) addcycleedges(&od, od.cyclesdata.elements + od.cycles.elements[i], &todo); } - POOL_DEBUG(SAT_DEBUG_STATS, "cycle edge creation took %d ms\n", sat_timems(now)); + POOL_DEBUG(SOLV_DEBUG_STATS, "cycle edge creation took %d ms\n", solv_timems(now)); #if 0 dump_tes(&od); #endif /* all edges are finally set up and there are no cycles, now the easy part. * Create an ordered transaction */ - now = sat_timems(0); + now = solv_timems(0); /* first invert all edges */ for (i = 1, te = od.tes + i; i < numte; i++, te++) te->mark = 1; /* term 0 */ @@ -1734,8 +1760,8 @@ transaction_order(Transaction *trans, int flags) te->mark += j; j = te->mark; } - POOL_DEBUG(SAT_DEBUG_STATS, "invedge space: %d\n", j + 1); - od.invedgedata = sat_calloc(j + 1, sizeof(Id)); + POOL_DEBUG(SOLV_DEBUG_STATS, "invedge space: %d\n", j + 1); + od.invedgedata = solv_calloc(j + 1, sizeof(Id)); for (i = 1, te = od.tes + i; i < numte; i++, te++) { for (j = te->edges; od.edgedata[j]; j += 2) @@ -1747,7 +1773,7 @@ transaction_order(Transaction *trans, int flags) } for (i = 1, te = od.tes + i; i < numte; i++, te++) te->edges = te->mark; /* edges now points into invedgedata */ - od.edgedata = sat_free(od.edgedata); + od.edgedata = solv_free(od.edgedata); od.nedgedata = j + 1; /* now the final ordering */ @@ -1773,10 +1799,10 @@ transaction_order(Transaction *trans, int flags) queue_empty(tr); queue_init(&obsq); - + lastrepo = 0; lastmedia = 0; - temedianr = sat_calloc(numte, sizeof(Id)); + temedianr = solv_calloc(numte, sizeof(Id)); for (i = 1; i < numte; i++) { Solvable *s = pool->solvables + od.tes[i].p; @@ -1826,7 +1852,7 @@ transaction_order(Transaction *trans, int flags) te = od.tes + i; queue_push(tr, te->p); #if 0 -printf("do %s [%d]\n", solvid2str(pool, te->p), temedianr[i]); +printf("do %s [%d]\n", pool_solvid2str(pool, te->p), temedianr[i]); #endif s = pool->solvables + te->p; for (j = te->edges; od.invedgedata[j]; j++) @@ -1837,7 +1863,7 @@ printf("do %s [%d]\n", solvid2str(pool, te->p), temedianr[i]); { Solvable *s = pool->solvables + te2->p; #if 0 -printf("free %s [%d]\n", solvid2str(pool, te2->p), temedianr[od.invedgedata[j]]); +printf("free %s [%d]\n", pool_solvid2str(pool, te2->p), temedianr[od.invedgedata[j]]); #endif if (installed && s->repo == installed) queue_push(&uninstq, od.invedgedata[j]); @@ -1848,7 +1874,7 @@ printf("free %s [%d]\n", solvid2str(pool, te2->p), temedianr[od.invedgedata[j]]) } } } - sat_free(temedianr); + solv_free(temedianr); queue_free(&todo); queue_free(&samerepoq); queue_free(&uninstq); @@ -1860,12 +1886,12 @@ printf("free %s [%d]\n", solvid2str(pool, te2->p), temedianr[od.invedgedata[j]]) transaction_add_obsoleted(trans); assert(tr->count == oldcount); - POOL_DEBUG(SAT_DEBUG_STATS, "creating new transaction took %d ms\n", sat_timems(now)); - POOL_DEBUG(SAT_DEBUG_STATS, "transaction ordering took %d ms\n", sat_timems(start)); + POOL_DEBUG(SOLV_DEBUG_STATS, "creating new transaction took %d ms\n", solv_timems(now)); + POOL_DEBUG(SOLV_DEBUG_STATS, "transaction ordering took %d ms\n", solv_timems(start)); if ((flags & SOLVER_TRANSACTION_KEEP_ORDERDATA) != 0) { - trans->orderdata = sat_calloc(1, sizeof(*trans->orderdata)); + trans->orderdata = solv_calloc(1, sizeof(*trans->orderdata)); trans->orderdata->tes = od.tes; trans->orderdata->ntes = numte; trans->orderdata->invedgedata = od.invedgedata; @@ -1873,9 +1899,11 @@ printf("free %s [%d]\n", solvid2str(pool, te2->p), temedianr[od.invedgedata[j]]) } else { - sat_free(od.tes); - sat_free(od.invedgedata); + solv_free(od.tes); + solv_free(od.invedgedata); } + queue_free(&od.cycles); + queue_free(&od.cyclesdata); } @@ -1930,7 +1958,7 @@ transaction_add_obsoleted(Transaction *trans) Repo *installed = pool->installed; Id p; Solvable *s; - int i, j, k, max, oldcount; + int i, j, k, max; Map done; Queue obsq, *steps; @@ -1945,8 +1973,7 @@ transaction_add_obsoleted(Transaction *trans) return; /* make room */ steps = &trans->steps; - oldcount = steps->count; - queue_insertn(steps, 0, max); + queue_insertn(steps, 0, max, 0); /* now add em */ map_init(&done, installed->end - installed->start); @@ -1967,6 +1994,8 @@ transaction_add_obsoleted(Transaction *trans) { p = obsq.elements[k]; assert(p >= installed->start && p < installed->end); + if (!MAPTST(&trans->transactsmap, p)) /* just in case */ + continue; if (MAPTST(&done, p - installed->start)) continue; MAPSET(&done, p - installed->start); @@ -1993,7 +2022,7 @@ transaction_check_pkg(Transaction *trans, Id tepkg, Id pkg, Map *ins, Map *seen, MAPSET(seen, pkg); s = pool->solvables + pkg; #if 0 - printf("- %*s%c%s\n", depth * 2, "", s->repo == pool->installed ? '-' : '+', solvable2str(pool, s)); + printf("- %*s%c%s\n", depth * 2, "", s->repo == pool->installed ? '-' : '+', pool_solvable2str(pool, s)); #endif if (s->requires) { @@ -2009,7 +2038,7 @@ transaction_check_pkg(Transaction *trans, Id tepkg, Id pkg, Map *ins, Map *seen, } if (onlyprereq && !inpre) continue; - if (!strncmp(id2str(pool, req), "rpmlib(", 7)) + if (!strncmp(pool_id2str(pool, req), "rpmlib(", 7)) continue; good = 0; /* first check kept packages, then freshly installed, then not yet uninstalled */ @@ -2046,7 +2075,7 @@ transaction_check_pkg(Transaction *trans, Id tepkg, Id pkg, Map *ins, Map *seen, } if (!good) { - POOL_DEBUG(SAT_DEBUG_RESULT, " %c%s: nothing provides %s needed by %c%s\n", pool->solvables[tepkg].repo == pool->installed ? '-' : '+', solvid2str(pool, tepkg), dep2str(pool, req), s->repo == pool->installed ? '-' : '+', solvable2str(pool, s)); + POOL_DEBUG(SOLV_DEBUG_RESULT, " %c%s: nothing provides %s needed by %c%s\n", pool->solvables[tepkg].repo == pool->installed ? '-' : '+', pool_solvid2str(pool, tepkg), pool_dep2str(pool, req), s->repo == pool->installed ? '-' : '+', pool_solvable2str(pool, s)); } } } @@ -2061,7 +2090,7 @@ transaction_check_order(Transaction *trans) Map ins, seen; int i; - POOL_DEBUG(SAT_WARN, "\nchecking transaction order...\n"); + POOL_DEBUG(SOLV_DEBUG_RESULT, "\nchecking transaction order...\n"); map_init(&ins, pool->nsolvables); map_init(&seen, pool->nsolvables); if (pool->installed) @@ -2086,5 +2115,5 @@ transaction_check_order(Transaction *trans) } map_free(&seen); map_free(&ins); - POOL_DEBUG(SAT_WARN, "transaction order check done.\n"); + POOL_DEBUG(SOLV_DEBUG_RESULT, "transaction order check done.\n"); }