[zypp-commit] r10904 - in /trunk/sat-solver: src/solver.c testsuite/deptestomatic.c
![](https://seccdn.libravatar.org/avatar/5b0432820302562e4bbc2cd15291724f.jpg?s=120&d=mm&r=g)
Author: mlschroe Date: Mon Sep 1 18:26:51 2008 New Revision: 10904 URL: http://svn.opensuse.org/viewcvs/zypp?rev=10904&view=rev Log: - make patches do nevr matching - make patch conflicts work with multiversion Modified: trunk/sat-solver/src/solver.c trunk/sat-solver/testsuite/deptestomatic.c Modified: trunk/sat-solver/src/solver.c URL: http://svn.opensuse.org/viewcvs/zypp/trunk/sat-solver/src/solver.c?rev=10904&r1=10903&r2=10904&view=diff ============================================================================== --- trunk/sat-solver/src/solver.c (original) +++ trunk/sat-solver/src/solver.c Mon Sep 1 18:26:51 2008 @@ -1044,6 +1044,41 @@ } +/* + * special multiversion patch conflict handling: + * a patch conflict is also satisfied, if some other + * version with the same name/arch that doesn't conflict + * get's installed. The generated rule is thus: + * -patch|-cpack|opack1|opack2|... + */ +Id +makemultiversionconflict(Solver *solv, Id n, Id con) +{ + Pool *pool = solv->pool; + Solvable *s, *sn; + Queue q; + Id p, *pp, qbuf[64]; + + sn = pool->solvables + n; + queue_init_buffer(&q, qbuf, sizeof(qbuf)/sizeof(*qbuf)); + queue_push(&q, -n); + FOR_PROVIDES(p, pp, sn->name) + { + if (s->name != sn->name || s->arch != sn->arch) + continue; + if (!MAPTST(&solv->noobsoletes, p)) + continue; + if (pool_match_nevr(pool, pool->solvables + p, con)) + continue; + /* here we have a multiversion solvable that doesn't conflict */ + /* thus we're not in conflict if it is installed */ + queue_push(&q, p); + } + if (q.count == 1) + return -n; /* no other package found, generate normal conflict */ + return pool_queuetowhatprovides(pool, &q); +} + /*------------------------------------------------------------------- * @@ -1223,6 +1258,14 @@ if (s->conflicts) { + int ispatch = 0; + + /* we treat conflicts in patches a bit differen: + * - nevr matching + * - multiversion handling + */ + if (!strncmp("patch:", id2str(pool, s->name), 6)) + ispatch = 1; conp = s->repo->idarraydata + s->conflicts; /* foreach conflicts of 's' */ while ((con = *conp++) != 0) @@ -1230,12 +1273,19 @@ /* foreach providers of a conflict of 's' */ FOR_PROVIDES(p, pp, con) { + if (ispatch && !pool_match_nevr(pool, pool->solvables + p, con)) + continue; /* dontfix: dont care about conflicts with already installed packs */ if (dontfix && pool->solvables[p].repo == installed) continue; /* p == n: self conflict */ if (p == n && !solv->allowselfconflicts) p = 0; /* make it a negative assertion, aka 'uninstallable' */ + if (p && ispatch && solv->noobsoletes.size && MAPTST(&solv->noobsoletes, p) && ISRELDEP(con)) + { + /* our patch conflicts with a noobsoletes (aka multiversion) package */ + p = -makemultiversionconflict(solv, p, con); + } /* rule: -n|-p: either solvable _or_ provider of conflict */ addrule(solv, -n, -p); } @@ -3292,7 +3342,7 @@ Rule *r; Solvable *s; int dontfix = 0; - Id p, d, *pp, req, *reqp, con, *conp, obs, *obsp, *dp; + Id p, d, w2, *pp, req, *reqp, con, *conp, obs, *obsp, *dp; assert(rid > 0); if (rid >= solv->jobrules && rid < solv->jobrules_end) @@ -3370,10 +3420,17 @@ s = pool->solvables - r->p; if (installed && !solv->fixsystem && s->repo == installed) dontfix = 1; - if (d == 0 && r->w2 < 0) + w2 = r->w2; + if (d && pool->whatprovidesdata[d] < 0) + { + /* rule looks like -p|-c|x|x|x..., we only create this for patches with multiversion */ + /* reduce it to -p|-c case */ + w2 = pool->whatprovidesdata[d]; + } + if (d == 0 && w2 < 0) { /* a package conflict */ - Solvable *s2 = pool->solvables - r->w2; + Solvable *s2 = pool->solvables - w2; int dontfix2 = 0; if (installed && !solv->fixsystem && s2->repo == installed) @@ -3386,11 +3443,11 @@ /* also check noobsoletes map */ if ((s->evr == s2->evr && s->arch == s2->arch) || !solv->noobsoletes.size || ((!installed || s->repo != installed) && !MAPTST(&solv->noobsoletes, -r->p)) - || ((!installed || s2->repo != installed) && !MAPTST(&solv->noobsoletes, -r->w2))) + || ((!installed || s2->repo != installed) && !MAPTST(&solv->noobsoletes, -w2))) { *depp = 0; *sourcep = -r->p; - *targetp = -r->w2; + *targetp = -w2; return SOLVER_PROBLEM_SAME_NAME; } } @@ -3405,7 +3462,7 @@ { if (dontfix && pool->solvables[p].repo == installed) continue; - if (p != -r->w2) + if (p != -w2) continue; *depp = con; *sourcep = -r->p; @@ -3426,7 +3483,7 @@ if (p != -r->p) continue; *depp = con; - *sourcep = -r->w2; + *sourcep = -w2; *targetp = p; return SOLVER_PROBLEM_PACKAGE_CONFLICT; } @@ -3440,7 +3497,7 @@ { FOR_PROVIDES(p, pp, obs) { - if (p != -r->w2) + if (p != -w2) continue; if (!solv->obsoleteusesprovides && !pool_match_nevr(pool, pool->solvables + p, obs)) continue; @@ -3451,7 +3508,7 @@ } } } - if ((!installed || s2->repo != installed) && s2->obsoletes && !(solv->noobsoletes.size && MAPTST(&solv->noobsoletes, -r->w2))) + if ((!installed || s2->repo != installed) && s2->obsoletes && !(solv->noobsoletes.size && MAPTST(&solv->noobsoletes, -w2))) { obsp = s2->repo->idarraydata + s2->obsoletes; while ((obs = *obsp++) != 0) @@ -3463,7 +3520,7 @@ if (!solv->obsoleteusesprovides && !pool_match_nevr(pool, pool->solvables + p, obs)) continue; *depp = obs; - *sourcep = -r->w2; + *sourcep = -w2; *targetp = p; return SOLVER_PROBLEM_PACKAGE_OBSOLETES; } @@ -3473,7 +3530,7 @@ { FOR_PROVIDES(p, pp, s->name) { - if (p != -r->w2) + if (p != -w2) continue; *depp = s->name; *sourcep = -r->p; @@ -3481,14 +3538,14 @@ return SOLVER_PROBLEM_PACKAGE_OBSOLETES; } } - if (solv->implicitobsoleteusesprovides && (!installed || s2->repo != installed) && !(solv->noobsoletes.size && MAPTST(&solv->noobsoletes, -r->w2))) + if (solv->implicitobsoleteusesprovides && (!installed || s2->repo != installed) && !(solv->noobsoletes.size && MAPTST(&solv->noobsoletes, -w2))) { FOR_PROVIDES(p, pp, s2->name) { if (p != -r->p) continue; *depp = s2->name; - *sourcep = -r->w2; + *sourcep = -w2; *targetp = p; return SOLVER_PROBLEM_PACKAGE_OBSOLETES; } Modified: trunk/sat-solver/testsuite/deptestomatic.c URL: http://svn.opensuse.org/viewcvs/zypp/trunk/sat-solver/testsuite/deptestomatic.c?rev=10904&r1=10903&r2=10904&view=diff ============================================================================== --- trunk/sat-solver/testsuite/deptestomatic.c (original) +++ trunk/sat-solver/testsuite/deptestomatic.c Mon Sep 1 18:26:51 2008 @@ -118,6 +118,7 @@ STATE_SETUPLOCK, STATE_LOCK, STATE_KEEP, + STATE_MULTIINSTALL, STATE_MEDIAID, STATE_MEDIAORDER, STATE_TRIAL, @@ -191,6 +192,7 @@ { STATE_TRIAL, "instorder", STATE_INSTORDER, 0 }, { STATE_TRIAL, "availablelocales",STATE_AVAILABLELOCALES, 0 }, { STATE_TRIAL, "keep", STATE_KEEP, 0 }, + { STATE_TRIAL, "multiinstall", STATE_MULTIINSTALL, 0 }, { STATE_TRIAL, "dontinstallrecommended", STATE_DONTINSTALLRECOMMENDED, 0 }, { STATE_TRIAL, "ignorealreadyrecommended", STATE_IGNOREALREADYRECOMMENDED, 0 }, @@ -1131,6 +1133,17 @@ } break; + case STATE_MULTIINSTALL: + { + char package[MAXNAMELEN]; + Id id; + getPackageName( atts, package ); + id = str2id(pool, package, 1); + queue_push( &(pd->trials), SOLVER_NOOBSOLETES|SOLVER_SOLVABLE_NAME ); + queue_push( &(pd->trials), id ); + } + break; + case STATE_MEDIAORDER: case STATE_MEDIAID: /* output installation order with media id */ break; -- To unsubscribe, e-mail: zypp-commit+unsubscribe@opensuse.org For additional commands, e-mail: zypp-commit+help@opensuse.org
participants (1)
-
mlschroe@svn.opensuse.org