Hello community, here is the log from the commit of package libsolv for openSUSE:Factory checked in at 2013-01-20 07:57:59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libsolv (Old) and /work/SRC/openSUSE:Factory/.libsolv.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libsolv", Maintainer is "" Changes: -------- --- /work/SRC/openSUSE:Factory/libsolv/libsolv.changes 2012-12-21 10:15:47.000000000 +0100 +++ /work/SRC/openSUSE:Factory/.libsolv.new/libsolv.changes 2013-01-20 07:58:01.000000000 +0100 @@ -1,0 +2,8 @@ +Mon Jan 14 16:01:04 CET 2013 - [email protected] + +- trivial_installable: check vendor of affected package to see if + a patch should be ignored [bnc#736100] +- fix trivial installable requires handling +- bump version to 0.2.4 + +------------------------------------------------------------------- Old: ---- libsolv-0.2.3.tar.bz2 New: ---- libsolv-0.2.4.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libsolv.spec ++++++ --- /var/tmp/diff_new_pack.pLe9Gb/_old 2013-01-20 07:58:03.000000000 +0100 +++ /var/tmp/diff_new_pack.pLe9Gb/_new 2013-01-20 07:58:03.000000000 +0100 @@ -16,7 +16,7 @@ # Name: libsolv -Version: 0.2.3 +Version: 0.2.4 Release: 0 Url: git://gitorious.org/opensuse/libsolv.git Source: libsolv-%{version}.tar.bz2 ++++++ libsolv-0.2.3.tar.bz2 -> libsolv-0.2.4.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.3/README new/libsolv-0.2.4/README --- old/libsolv-0.2.3/README 2012-12-19 15:41:18.000000000 +0100 +++ new/libsolv-0.2.4/README 2013-01-14 16:06:16.000000000 +0100 @@ -1,5 +1,5 @@ This is libsolv, a free package dependency solver using a satisfiability -algorihtm. +algorithm. This code is based on two major, but independent, blocks: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.3/VERSION.cmake new/libsolv-0.2.4/VERSION.cmake --- old/libsolv-0.2.3/VERSION.cmake 2012-12-19 15:41:18.000000000 +0100 +++ new/libsolv-0.2.4/VERSION.cmake 2013-01-14 16:06:16.000000000 +0100 @@ -49,5 +49,5 @@ SET(LIBSOLV_MAJOR "0") SET(LIBSOLV_MINOR "2") -SET(LIBSOLV_PATCH "3") +SET(LIBSOLV_PATCH "4") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.3/bindings/solv.i new/libsolv-0.2.4/bindings/solv.i --- old/libsolv-0.2.3/bindings/solv.i 2012-12-19 15:41:18.000000000 +0100 +++ new/libsolv-0.2.4/bindings/solv.i 2013-01-14 16:06:16.000000000 +0100 @@ -1329,6 +1329,49 @@ sel->flags = selection_make($self, &sel->q, name, flags); return sel; } + + void setpooljobs_helper(Queue jobs) { + queue_free(&$self->pooljobs); + queue_init_clone(&$self->pooljobs, &jobs); + } + %typemap(out) Queue getpooljobs Queue2Array(Job *, 2, new_Job(arg1, id, idp[1])); + %newobject getpooljobs; + Queue getpooljobs() { + Queue q; + queue_init_clone(&q, &$self->pooljobs); + return q; + } + +#if defined(SWIGPYTHON) + %pythoncode { + def setpooljobs(self, jobs): + j = [] + for job in jobs: j += [job.how, job.what] + self.setpooljobs_helper(j) + } +#endif +#if defined(SWIGPERL) + %perlcode { + sub solv::Solver::setpooljobs { + my ($self, $jobs) = @_; + my @j = map {($_->{'how'}, $_->{'what'})} @$jobs; + return $self->setpooljobs_helper(\@j); + } + } +#endif +#if defined(SWIGRUBY) +%init %{ +rb_eval_string( + "class Solv::Pool\n" + " def setpooljobs(jobs)\n" + " jl = []\n" + " jobs.each do |j| ; jl << j.how << j.what ; end\n" + " setpooljobs_helper(jl)\n" + " end\n" + "end\n" + ); +%} +#endif } %extend Repo { @@ -2466,6 +2509,7 @@ static const int SOLVER_RULE_LEARNT = SOLVER_RULE_LEARNT; static const int SOLVER_SOLUTION_JOB = SOLVER_SOLUTION_JOB; + static const int SOLVER_SOLUTION_POOLJOB = SOLVER_SOLUTION_POOLJOB; static const int SOLVER_SOLUTION_INFARCH = SOLVER_SOLUTION_INFARCH; static const int SOLVER_SOLUTION_DISTUPGRADE = SOLVER_SOLUTION_DISTUPGRADE; static const int SOLVER_SOLUTION_BEST = SOLVER_SOLUTION_BEST; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.3/examples/solv.c new/libsolv-0.2.4/examples/solv.c --- old/libsolv-0.2.3/examples/solv.c 2012-12-19 15:41:18.000000000 +0100 +++ new/libsolv-0.2.4/examples/solv.c 2013-01-14 16:06:16.000000000 +0100 @@ -2744,7 +2744,7 @@ } queue_free(&repofilter); - if (!job.count && MODE_PATCH) + if (!job.count && mainmode != MODE_PATCH) { printf("no package matched\n"); exit(1); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.3/ext/CMakeLists.txt new/libsolv-0.2.4/ext/CMakeLists.txt --- old/libsolv-0.2.3/ext/CMakeLists.txt 2012-12-19 15:41:18.000000000 +0100 +++ new/libsolv-0.2.4/ext/CMakeLists.txt 2013-01-14 16:06:16.000000000 +0100 @@ -89,7 +89,7 @@ ADD_LIBRARY (libsolvext STATIC ${libsolvext_SRCS}) ELSE (DISABLE_SHARED) ADD_LIBRARY (libsolvext SHARED ${libsolvext_SRCS}) -TARGET_LINK_LIBRARIES(libsolvext ${SYSTEM_LIBRARIES}) +TARGET_LINK_LIBRARIES(libsolvext libsolv ${SYSTEM_LIBRARIES}) ENDIF (DISABLE_SHARED) SET_TARGET_PROPERTIES(libsolvext PROPERTIES OUTPUT_NAME "solvext") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.3/ext/pool_fileconflicts.c new/libsolv-0.2.4/ext/pool_fileconflicts.c --- old/libsolv-0.2.3/ext/pool_fileconflicts.c 2012-12-19 15:41:18.000000000 +0100 +++ new/libsolv-0.2.4/ext/pool_fileconflicts.c 2013-01-14 16:06:16.000000000 +0100 @@ -152,7 +152,7 @@ return; dhx = strnhash(fn, dp + 1 - fn); if (!dhx) - dhx = 1 + dp + 1 - fn; + dhx = dp + 1 - fn + 1; /* mirrors the "if (!hx) hx = strlen(fn) + 1" in finddirs_cb */ #if 1 if (!isindirmap(cbdata, dhx)) return; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.3/ext/repo_rpmdb.c new/libsolv-0.2.4/ext/repo_rpmdb.c --- old/libsolv-0.2.3/ext/repo_rpmdb.c 2012-12-19 15:41:18.000000000 +0100 +++ new/libsolv-0.2.4/ext/repo_rpmdb.c 2013-01-14 16:06:16.000000000 +0100 @@ -720,6 +720,8 @@ unsigned int *di; int bnc, dnc, dic; int i; + Id lastdid = 0; + int lastdii = -1; #ifdef USE_FILEFILTER int j; struct filefilter *ff; @@ -804,18 +806,22 @@ #endif if (data) { - Id handle, did; + Id did; char *b = bn[i]; - handle = s - pool->solvables; - did = repodata_str2dir(data, dn[di[i]], 1); - if (!did) + if (di[i] == lastdii) + did = lastdid; + else { - did = repodata_str2dir(data, "/", 1); - if (b && b[0] == '/') - b++; /* work around rpm bug */ + did = repodata_str2dir(data, dn[di[i]], 1); + if (!did) + did = repodata_str2dir(data, "/", 1); + lastdid = did; + lastdii = di[i]; } - repodata_add_dirstr(data, handle, SOLVABLE_FILELIST, did, b); + if (b && *b == '/') /* work around rpm bug */ + b++; + repodata_add_dirstr(data, s - pool->solvables, SOLVABLE_FILELIST, did, b); } } #if 0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.3/package/libsolv.changes new/libsolv-0.2.4/package/libsolv.changes --- old/libsolv-0.2.3/package/libsolv.changes 2012-12-19 15:41:18.000000000 +0100 +++ new/libsolv-0.2.4/package/libsolv.changes 2013-01-14 16:06:16.000000000 +0100 @@ -1,4 +1,12 @@ ------------------------------------------------------------------- +Mon Jan 14 16:01:04 CET 2013 - [email protected] + +- trivial_installable: check vendor of affected package to see if + a patch should be ignored [bnc#736100] +- fix trivial installable requires handling +- bump version to 0.2.4 + +------------------------------------------------------------------- Tue Dec 18 19:20:19 CET 2012 - [email protected] - fix potential access to freed memory diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.3/src/pool.c new/libsolv-0.2.4/src/pool.c --- old/libsolv-0.2.3/src/pool.c 2012-12-19 15:41:18.000000000 +0100 +++ new/libsolv-0.2.4/src/pool.c 2013-01-14 16:06:16.000000000 +0100 @@ -103,6 +103,7 @@ solv_free(pool->rels); pool_setvendorclasses(pool, 0); queue_free(&pool->vendormap); + queue_free(&pool->pooljobs); for (i = 0; i < POOL_TMPSPACEBUF; i++) solv_free(pool->tmpspace.buf[i]); for (i = 0; i < pool->nlanguages; i++) @@ -1911,9 +1912,12 @@ { /* decided and miss */ map[p] = 2; + did = 0; break; } - m |= r; /* 1 | 9 | 16 | 17 */ + if (r == 16) + break; /* undecided */ + m |= r; /* 1 | 9 | 17 */ } if (req) continue; @@ -1932,6 +1936,7 @@ if ((providedbyinstalled(pool, map, con, ispatch, noobsoletesmap) & 1) != 0) { map[p] = 2; + did = 0; break; } if ((m == 1 || m == 17) && ISRELDEP(con)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.3/src/pool.h new/libsolv-0.2.4/src/pool.h --- old/libsolv-0.2.3/src/pool.h 2012-12-19 15:41:18.000000000 +0100 +++ new/libsolv-0.2.4/src/pool.h 2013-01-14 16:06:16.000000000 +0100 @@ -119,6 +119,8 @@ /* search position */ Datapos pos; + Queue pooljobs; /* fixed jobs, like USERINSTALLED/NOOBSOLETES */ + #ifdef LIBSOLV_INTERNAL /* flags to tell the library how the installed package manager works */ int promoteepoch; /* true: missing epoch is replaced by epoch of dependency */ @@ -263,6 +265,8 @@ int solvable_trivial_installable_map(Solvable *s, Map *installedmap, Map *conflictsmap, Map *noobsoletesmap); int solvable_trivial_installable_repo(Solvable *s, struct _Repo *installed, Map *noobsoletesmap); int solvable_trivial_installable_queue(Solvable *s, Queue *installed, Map *noobsoletesmap); +struct _Solver; /* argh, needed for vendorchange callback FIXME */ +int solvable_is_irrelevant_patch(Solvable *s, Map *installedmap, struct _Solver *solv); void pool_create_state_maps(Pool *pool, Queue *installed, Map *installedmap, Map *conflictsmap); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.3/src/problems.c new/libsolv-0.2.4/src/problems.c --- old/libsolv-0.2.3/src/problems.c 2012-12-19 15:41:18.000000000 +0100 +++ new/libsolv-0.2.4/src/problems.c 2013-01-14 16:06:16.000000000 +0100 @@ -260,7 +260,7 @@ nupdate++; else { - if (!essentialok && (solv->job.elements[-v -1] & SOLVER_ESSENTIAL) != 0) + if (!essentialok && (solv->job.elements[-v - 1] & SOLVER_ESSENTIAL) != 0) continue; /* not that one! */ njob++; } @@ -382,8 +382,17 @@ Pool *pool = solv->pool; if (why < 0) { - queue_push(solutionq, 0); - queue_push(solutionq, -why); + why = -why; + if (why < solv->pooljobcnt) + { + queue_push(solutionq, SOLVER_SOLUTION_POOLJOB); + queue_push(solutionq, why); + } + else + { + queue_push(solutionq, SOLVER_SOLUTION_JOB); + queue_push(solutionq, why - solv->pooljobcnt); + } return; } if (why >= solv->infarchrules && why < solv->infarchrules_end) @@ -775,6 +784,8 @@ * -> add (SOLVER_INSTALL|SOLVER_SOLVABLE, rp) to the job * SOLVER_SOLUTION_JOB jobidx * -> remove job (jobidx - 1, jobidx) from job queue + * SOLVER_SOLUTION_POOLJOB jobidx + * -> remove job (jobidx - 1, jobidx) from pool job queue * pkgid (> 0) 0 * -> add (SOLVER_ERASE|SOLVER_SOLVABLE, p) to the job * pkgid (> 0) pkgid (> 0) @@ -807,6 +818,12 @@ { int i; + if (p == SOLVER_SOLUTION_POOLJOB) + { + solv->pool->pooljobs.elements[rp - 1] = SOLVER_NOOP; + solv->pool->pooljobs.elements[rp] = 0; + return; + } if (p == SOLVER_SOLUTION_JOB) { job->elements[rp - 1] = SOLVER_NOOP; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.3/src/problems.h new/libsolv-0.2.4/src/problems.h --- old/libsolv-0.2.3/src/problems.h 2012-12-19 15:41:18.000000000 +0100 +++ new/libsolv-0.2.4/src/problems.h 2013-01-14 16:06:16.000000000 +0100 @@ -24,6 +24,7 @@ #define SOLVER_SOLUTION_DISTUPGRADE (-1) #define SOLVER_SOLUTION_INFARCH (-2) #define SOLVER_SOLUTION_BEST (-3) +#define SOLVER_SOLUTION_POOLJOB (-4) void solver_disableproblem(struct _Solver *solv, Id v); void solver_enableproblem(struct _Solver *solv, Id v); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.3/src/solvable.c new/libsolv-0.2.4/src/solvable.c --- old/libsolv-0.2.3/src/solvable.c 2012-12-19 15:41:18.000000000 +0100 +++ new/libsolv-0.2.4/src/solvable.c 2013-01-14 16:06:16.000000000 +0100 @@ -20,6 +20,8 @@ #include "pool.h" #include "repo.h" #include "util.h" +#include "policy.h" +#include "poolvendor.h" #include "chksum.h" const char * @@ -459,7 +461,11 @@ while ((con = *conp++) != 0) { if (providedbyinstalled(pool, installedmap, con, ispatch, noobsoletesmap)) - return 0; + { + if (ispatch && solvable_is_irrelevant_patch(s, installedmap, 0)) + return -1; + return 0; + } if (!interesting && ISRELDEP(con)) { con = dep2name(pool, con); @@ -467,6 +473,8 @@ interesting = 1; } } + if (ispatch && interesting && solvable_is_irrelevant_patch(s, installedmap, 0)) + interesting = 0; } #if 0 if (s->repo) @@ -568,6 +576,76 @@ } +/* check if this patch is relevant according to the vendor. To bad that patches + * don't have a vendor, so we need to do some careful repo testing. */ +int +solvable_is_irrelevant_patch(Solvable *s, Map *installedmap, Solver *solv) +{ + Pool *pool = s->repo->pool; + Id con, *conp; + int hadpatchpackage = 0; + + if (!s->conflicts) + return 0; + conp = s->repo->idarraydata + s->conflicts; + while ((con = *conp++) != 0) + { + Reldep *rd; + Id p, pp, p2, pp2; + if (!ISRELDEP(con)) + continue; + rd = GETRELDEP(pool, con); + if (rd->flags != REL_LT) + continue; + FOR_PROVIDES(p, pp, con) + { + Solvable *si; + if (!MAPTST(installedmap, p)) + continue; + si = pool->solvables + p; + if (!pool_match_nevr(pool, si, con)) + continue; + FOR_PROVIDES(p2, pp2, rd->name) + { + Solvable *s2 = pool->solvables + p2; + if (!pool_match_nevr(pool, s2, rd->name)) + continue; + if (pool_match_nevr(pool, s2, con)) + continue; /* does not fulfill patch */ + if (s2->repo == s->repo) + { + hadpatchpackage = 1; + /* ok, we have a package from the patch repo that solves the conflict. check vendor */ + if (si->vendor == s2->vendor) + return 0; + /* FIXME: solv is only needed for the vendorchange callback */ + if (solv) + { + if (!policy_illegal_vendorchange(solv, si, s2)) + return 0; + } + else + { + Id v1 = si->vendor ? si->vendor : ID_EMPTY; + Id v2 = s2->vendor ? s2->vendor : ID_EMPTY; + if (v1 == v2) + return 0; + v1 = pool_vendor2mask(pool, v1); + v2 = pool_vendor2mask(pool, v2); + if ((v1 & v2) != 0) + return 0; + } + /* vendor change was illegal, ignore conflict */ + } + } + } + } + /* if we didn't find a patchpackage don't claim that the patch is irrelevant */ + if (!hadpatchpackage) + return 0; + return 1; +} + /*****************************************************************************/ /* diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.3/src/solver.c new/libsolv-0.2.4/src/solver.c --- old/libsolv-0.2.3/src/solver.c 2012-12-19 15:41:18.000000000 +0100 +++ new/libsolv-0.2.4/src/solver.c 2013-01-14 16:06:16.000000000 +0100 @@ -2874,6 +2874,13 @@ /* remember job */ queue_free(&solv->job); queue_init_clone(&solv->job, job); + solv->pooljobcnt = pool->pooljobs.count; + if (pool->pooljobs.count) + { + queue_insertn(&solv->job, 0, pool->pooljobs.count); + memcpy(solv->job.elements, pool->pooljobs.elements, pool->pooljobs.count * sizeof(Id)); + } + job = &solv->job; /* free old stuff */ if (solv->update_targets) @@ -3177,6 +3184,8 @@ { oldnrules = solv->nrules; + if (i && i == solv->pooljobcnt) + POOL_DEBUG(SOLV_DEBUG_JOB, "end of pool jobs\n"); how = job->elements[i]; what = job->elements[i + 1]; weak = how & SOLVER_WEAK; @@ -3346,10 +3355,10 @@ { int j; if (solv->nrules == oldnrules) - POOL_DEBUG(SOLV_DEBUG_JOB, " - no rule created\n"); + POOL_DEBUG(SOLV_DEBUG_JOB, " - no rule created\n"); for (j = oldnrules; j < solv->nrules; j++) { - POOL_DEBUG(SOLV_DEBUG_JOB, " - job "); + POOL_DEBUG(SOLV_DEBUG_JOB, " - job "); solver_printrule(solv, SOLV_DEBUG_JOB, solv->rules + j); } } @@ -3736,9 +3745,18 @@ void solver_trivial_installable(Solver *solv, Queue *pkgs, Queue *res) { + Pool *pool = solv->pool; Map installedmap; - pool_create_state_maps(solv->pool, &solv->decisionq, &installedmap, 0); - pool_trivial_installable_noobsoletesmap(solv->pool, &installedmap, pkgs, res, solv->noobsoletes.size ? &solv->noobsoletes : 0); + int i; + pool_create_state_maps(pool, &solv->decisionq, &installedmap, 0); + pool_trivial_installable_noobsoletesmap(pool, &installedmap, pkgs, res, solv->noobsoletes.size ? &solv->noobsoletes : 0); + for (i = 0; i < res->count; i++) + if (res->elements[i] != -1) + { + Solvable *s = pool->solvables + pkgs->elements[i]; + if (!strncmp("patch:", pool_id2str(pool, s->name), 6) && solvable_is_irrelevant_patch(s, &installedmap, solv)) + res->elements[i] = -1; + } map_free(&installedmap); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.3/src/solver.h new/libsolv-0.2.4/src/solver.h --- old/libsolv-0.2.3/src/solver.h 2012-12-19 15:41:18.000000000 +0100 +++ new/libsolv-0.2.4/src/solver.h 2013-01-14 16:06:16.000000000 +0100 @@ -82,6 +82,8 @@ */ UpdateCandidateCb updateCandidateCb; + int pooljobcnt; /* number of pooljob entries in job queue */ + #ifdef LIBSOLV_INTERNAL Repo *installed; /* copy of pool->installed */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.3/src/solverdebug.c new/libsolv-0.2.4/src/solverdebug.c --- old/libsolv-0.2.3/src/solverdebug.c 2012-12-19 15:41:18.000000000 +0100 +++ new/libsolv-0.2.4/src/solverdebug.c 2013-01-14 16:06:16.000000000 +0100 @@ -656,9 +656,11 @@ element = 0; while ((element = solver_next_solutionelement(solv, problem, solution, element, &p, &rp)) != 0) { - if (p == SOLVER_SOLUTION_JOB) + if (p == SOLVER_SOLUTION_JOB || p == SOLVER_SOLUTION_POOLJOB) { /* job, rp is index into job queue */ + if (p == SOLVER_SOLUTION_JOB) + rp += solv->pooljobcnt; how = solv->job.elements[rp - 1]; what = solv->job.elements[rp]; select = how & SOLVER_SELECTMASK; @@ -1042,10 +1044,13 @@ solver_solutionelement2str(Solver *solv, Id p, Id rp) { Pool *pool = solv->pool; - if (p == SOLVER_SOLUTION_JOB) + if (p == SOLVER_SOLUTION_JOB || p == SOLVER_SOLUTION_POOLJOB) { - Id how = solv->job.elements[rp - 1]; - Id what = solv->job.elements[rp]; + Id how, what; + if (p == SOLVER_SOLUTION_JOB) + rp += solv->pooljobcnt; + how = solv->job.elements[rp - 1]; + what = solv->job.elements[rp]; return pool_tmpjoin(pool, "do not ask to ", pool_job2str(pool, how, what, 0), 0); } else if (p == SOLVER_SOLUTION_INFARCH) -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
