From: Michael Schroeder Date: Wed, 24 Jun 2009 14:16:29 +0000 (+0200) Subject: - fix bug in take_solution X-Git-Tag: BASE-SuSE-Code-12_1-Branch~210 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e10a98eb7ff8b877c291309b34db2d798105aec4;p=thirdparty%2Flibsolv.git - fix bug in take_solution - add buddy callback support --- diff --git a/examples/solv.c b/examples/solv.c index 96dd40bc..3b3c19b7 100644 --- a/examples/solv.c +++ b/examples/solv.c @@ -487,6 +487,8 @@ fc_cb(Pool *pool, Id p, void *cbdata) if (i == fcstate->newpkgscnt) return 0; fp = fcstate->newpkgsfps[i]; + if (!fp) + return 0; rewind(fp); return rpm_byfp(fp, solvable2str(pool, s), &fcstate->rpmdbstate); } @@ -527,6 +529,33 @@ runrpm(const char *arg, const char *name, int dupfd3) } } +static Id +nscallback(Pool *pool, void *data, Id name, Id evr) +{ + if (name == NAMESPACE_PRODUCTBUDDY) + { + /* SUSE specific hack: each product has an associated rpm */ + Solvable *s = pool->solvables + evr; + Id p, pp, cap; + + cap = str2id(pool, pool_tmpjoin(pool, "product(", id2str(pool, s->name) + 8, ")"), 0); + if (!cap) + return 0; + cap = rel2id(pool, cap, s->evr, REL_EQ, 0); + if (!cap) + return 0; + FOR_PROVIDES(p, pp, cap) + { + Solvable *ps = pool->solvables + p; + if (ps->repo == s->repo && ps->arch == s->arch) + break; + } + return p; + } + return 0; +} + + int main(int argc, char **argv) { @@ -558,6 +587,7 @@ main(int argc, char **argv) } pool = pool_create(); + pool->nscallback = nscallback; // pool_setdebuglevel(pool, 2); setarch(pool); repoinfos = read_repoinfos(pool, ZYPP_REPOINFO_PATH, &nrepoinfos); @@ -703,6 +733,8 @@ rerunsolver: exit(1); } loc = solvable_get_location(s, &medianr); + if (!loc) + continue; if (cinfo->type == TYPE_SUSETAGS) { const char *datadir = repo_lookup_str(cinfo->repo, SOLVID_META, SUSETAGS_DATADIR); @@ -710,7 +742,7 @@ rerunsolver: } if ((newpkgsfps[i] = curlfopen(cinfo->baseurl, loc, 0)) == 0) { - printf("%s: %s not found\n", s->repo->name, loc); + printf("%s: %s not found in repository\n", s->repo->name, loc); exit(1); } } @@ -736,7 +768,8 @@ rerunsolver: if (yesno("Re-run solver (y/n/q)? ")) { for (i = 0; i < newpkgs; i++) - fclose(newpkgsfps[i]); + if (newpkgsfps[i]) + fclose(newpkgsfps[i]); newpkgsfps = sat_free(newpkgsfps); solver_free(solv); pool_add_fileconflicts_deps(pool, &conflicts); @@ -764,6 +797,8 @@ rerunsolver: { case SOLVER_TRANSACTION_ERASE: printf("erase %s\n", solvid2str(pool, p)); + if (!s->repo->rpmdbid || !s->repo->rpmdbid[p - s->repo->start]) + continue; if (strlen(solvid2str(pool, p)) > 255) continue; evr = evrp = id2str(pool, s->evr); @@ -781,6 +816,8 @@ rerunsolver: if (checkq.elements[j] == p) break; fp = j < newpkgs ? newpkgsfps[j] : 0; + if (!fp) + continue; rewind(fp); lseek(fileno(fp), 0, SEEK_SET); runrpm(type == SOLVER_TRANSACTION_MULTIINSTALL ? "-i" : "-U", "/dev/fd/3", fileno(fp)); diff --git a/src/problems.c b/src/problems.c index ccdb54c4..d90dfb75 100644 --- a/src/problems.c +++ b/src/problems.c @@ -707,7 +707,7 @@ solver_take_solutionelement(Solver *solv, Id p, Id rp, Queue *job) p = SOLVER_ERASE|SOLVER_SOLVABLE; } for (i = 0; i < job->count; i += 2) - if (job->elements[i] == p && job->elements[i + 2] == rp) + if (job->elements[i] == p && job->elements[i + 1] == rp) return; queue_push2(job, p, rp); }