Hello community, here is the log from the commit of package libsolv for openSUSE:Factory checked in at 2012-12-21 10:15:45 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 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-07 14:42:06.000000000 +0100 +++ /work/SRC/openSUSE:Factory/.libsolv.new/libsolv.changes 2012-12-21 10:15:47.000000000 +0100 @@ -1,0 +2,8 @@ +Tue Dec 18 19:20:19 CET 2012 - mls@suse.de + +- fix potential access to freed memory +- improve find_problemrule speed +- add support for special namespaceprovides jobs +- bump version to 0.2.3 + +------------------------------------------------------------------- Old: ---- libsolv-0.2.2.tar.bz2 New: ---- libsolv-0.2.3.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libsolv.spec ++++++ --- /var/tmp/diff_new_pack.VIU2iq/_old 2012-12-21 10:15:48.000000000 +0100 +++ /var/tmp/diff_new_pack.VIU2iq/_new 2012-12-21 10:15:48.000000000 +0100 @@ -16,7 +16,7 @@ # Name: libsolv -Version: 0.2.2 +Version: 0.2.3 Release: 0 Url: git://gitorious.org/opensuse/libsolv.git Source: libsolv-%{version}.tar.bz2 @@ -63,11 +63,7 @@ BuildRequires: swig %endif %if %{with ruby_binding} -%if 0%{?fedora_version} || 0%{?rhel_version} >= 600 || 0%{?centos_version} >= 600 -%global ruby_vendorarch %(ruby -rrbconfig -e 'puts Config::CONFIG["sitearchdir"]') -%else -%global ruby_vendorarch %(ruby -rrbconfig -e 'puts Config::CONFIG["vendorarchdir"]') -%endif +%global ruby_vendorarch %(ruby -r rbconfig -e "puts Config::CONFIG['vendorarchdir'].nil? ? Config::CONFIG['sitearchdir'] : Config::CONFIG['vendorarchdir']") BuildRequires: ruby BuildRequires: ruby-devel BuildRequires: swig ++++++ libsolv-0.2.2.tar.bz2 -> libsolv-0.2.3.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.2/VERSION.cmake new/libsolv-0.2.3/VERSION.cmake --- old/libsolv-0.2.2/VERSION.cmake 2012-12-05 14:38:04.000000000 +0100 +++ new/libsolv-0.2.3/VERSION.cmake 2012-12-19 15:41:18.000000000 +0100 @@ -49,5 +49,5 @@ SET(LIBSOLV_MAJOR "0") SET(LIBSOLV_MINOR "2") -SET(LIBSOLV_PATCH "2") +SET(LIBSOLV_PATCH "3") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.2/bindings/solv.i new/libsolv-0.2.3/bindings/solv.i --- old/libsolv-0.2.2/bindings/solv.i 2012-12-05 14:38:04.000000000 +0100 +++ new/libsolv-0.2.3/bindings/solv.i 2012-12-19 15:41:18.000000000 +0100 @@ -2459,6 +2459,7 @@ static const int SOLVER_RULE_FEATURE = SOLVER_RULE_FEATURE; static const int SOLVER_RULE_JOB = SOLVER_RULE_JOB; static const int SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP = SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP; + static const int SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM = SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM; static const int SOLVER_RULE_DISTUPGRADE = SOLVER_RULE_DISTUPGRADE; static const int SOLVER_RULE_INFARCH = SOLVER_RULE_INFARCH; static const int SOLVER_RULE_CHOICE = SOLVER_RULE_CHOICE; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.2/examples/pysolv new/libsolv-0.2.3/examples/pysolv --- old/libsolv-0.2.2/examples/pysolv 2012-12-05 14:38:04.000000000 +0100 +++ new/libsolv-0.2.3/examples/pysolv 2012-12-19 15:41:18.000000000 +0100 @@ -762,7 +762,7 @@ if not problems: break for problem in problems: - print "Problem %d:" % problem.id + print "Problem %d/%d:" % (problem.id, len(problems)) r = problem.findproblemrule() ri = r.info() print ri.problemstr() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.2/examples/rbsolv new/libsolv-0.2.3/examples/rbsolv --- old/libsolv-0.2.2/examples/rbsolv 2012-12-05 14:38:04.000000000 +0100 +++ new/libsolv-0.2.3/examples/rbsolv 2012-12-19 15:41:18.000000000 +0100 @@ -638,7 +638,7 @@ problems = solver.solve(jobs) break if problems.empty? for problem in problems - puts "Problem #{problem.id}:" + puts "Problem #{problem.id}/#{problems.count}:" puts problem.findproblemrule.info.problemstr solutions = problem.solutions for solution in solutions diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.2/examples/solv.c new/libsolv-0.2.3/examples/solv.c --- old/libsolv-0.2.2/examples/solv.c 2012-12-05 14:38:04.000000000 +0100 +++ new/libsolv-0.2.3/examples/solv.c 2012-12-19 15:41:18.000000000 +0100 @@ -2214,6 +2214,19 @@ } return bestp; } +#if 0 + if (name == NAMESPACE_LANGUAGE) + { + if (!strcmp(pool_id2str(pool, evr), "ja")) + return 1; + if (!strcmp(pool_id2str(pool, evr), "de")) + return 1; + if (!strcmp(pool_id2str(pool, evr), "en")) + return 1; + if (!strcmp(pool_id2str(pool, evr), "en_US")) + return 1; + } +#endif return 0; } @@ -2808,6 +2821,10 @@ // queue_push2(&job, SOLVER_NOOBSOLETES|SOLVER_SOLVABLE_NAME, pool_str2id(pool, "kernel-pae", 1)); // queue_push2(&job, SOLVER_NOOBSOLETES|SOLVER_SOLVABLE_NAME, pool_str2id(pool, "kernel-pae-base", 1)); // queue_push2(&job, SOLVER_NOOBSOLETES|SOLVER_SOLVABLE_NAME, pool_str2id(pool, "kernel-pae-extra", 1)); +#if 0 + queue_push2(&job, SOLVER_INSTALL|SOLVER_SOLVABLE_PROVIDES, pool_rel2id(pool, NAMESPACE_LANGUAGE, 0, REL_NAMESPACE, 1)); + queue_push2(&job, SOLVER_ERASE|SOLVER_CLEANDEPS|SOLVER_SOLVABLE_PROVIDES, pool_rel2id(pool, NAMESPACE_LANGUAGE, 0, REL_NAMESPACE, 1)); +#endif #ifdef SOFTLOCKS_PATH addsoftlocks(pool, &job); @@ -2834,7 +2851,7 @@ for (problem = 1; problem <= pcnt; problem++) { int take = 0; - printf("Problem %d:\n", problem); + printf("Problem %d/%d:\n", problem, pcnt); solver_printprobleminfo(solv, problem); printf("\n"); scnt = solver_solution_count(solv, problem); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.2/ext/CMakeLists.txt new/libsolv-0.2.3/ext/CMakeLists.txt --- old/libsolv-0.2.2/ext/CMakeLists.txt 2012-12-05 14:38:04.000000000 +0100 +++ new/libsolv-0.2.3/ext/CMakeLists.txt 2012-12-19 15:41:18.000000000 +0100 @@ -74,10 +74,22 @@ SET (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC") SET (CMAKE_SHARED_LINKER_FLAGS "${LINK_FLAGS} -Wl,--version-script=${CMAKE_SOURCE_DIR}/ext/libsolvext.ver") +SET (SYSTEM_LIBRARIES ${EXPAT_LIBRARY} ${ZLIB_LIBRARY}) +IF (ENABLE_LZMA_COMPRESSION) +SET (SYSTEM_LIBRARIES ${SYSTEM_LIBRARIES} ${LZMA_LIBRARY}) +ENDIF (ENABLE_LZMA_COMPRESSION) +IF (ENABLE_BZIP2_COMPRESSION) +SET (SYSTEM_LIBRARIES ${SYSTEM_LIBRARIES} ${BZIP2_LIBRARIES}) +ENDIF (ENABLE_BZIP2_COMPRESSION) +IF (ENABLE_RPMDB) +SET (SYSTEM_LIBRARIES ${RPMDB_LIBRARY} ${SYSTEM_LIBRARIES}) +ENDIF (ENABLE_RPMDB) + IF (DISABLE_SHARED) ADD_LIBRARY (libsolvext STATIC ${libsolvext_SRCS}) ELSE (DISABLE_SHARED) ADD_LIBRARY (libsolvext SHARED ${libsolvext_SRCS}) +TARGET_LINK_LIBRARIES(libsolvext ${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.2/ext/repo_rpmdb.c new/libsolv-0.2.3/ext/repo_rpmdb.c --- old/libsolv-0.2.2/ext/repo_rpmdb.c 2012-12-05 14:38:04.000000000 +0100 +++ new/libsolv-0.2.3/ext/repo_rpmdb.c 2012-12-19 15:41:18.000000000 +0100 @@ -450,24 +450,19 @@ strong = flags & (MAKEDEPS_FILTER_STRONG|MAKEDEPS_FILTER_WEAK); n = headstringarray(rpmhead, tagn, &nc); - if (!n) + if (!n || !nc) return 0; + vc = fc = 0; v = headstringarray(rpmhead, tagv, &vc); - if (!v) - { - solv_free(n); - return 0; - } f = headint32array(rpmhead, tagf, &fc); - if (!f) + if (!v || !f || nc != vc || nc != fc) { + char *pkgname = rpm_query(rpmhead, 0); + fprintf(stderr, "bad dependency entries for %s: %d %d %d\n", pkgname ? pkgname : "<NULL>", nc, vc, fc); + solv_free(pkgname); solv_free(n); - free(v); - return 0; - } - if (nc != vc || nc != fc) - { - fprintf(stderr, "bad dependency entries\n"); + solv_free(v); + solv_free(f); return 0; } @@ -2269,12 +2264,10 @@ if (!arch) arch = "noarch"; evr = headtoevr(rpmhead); - if (!evr) - break; - l = strlen(name) + 1 + strlen(evr) + 1 + strlen(arch) + 1; + l = strlen(name) + 1 + strlen(evr ? evr : "") + 1 + strlen(arch) + 1; r = solv_malloc(l); - sprintf(r, "%s-%s.%s", name, evr, arch); - free(evr); + sprintf(r, "%s-%s.%s", name, evr ? evr : "", arch); + solv_free(evr); break; case SOLVABLE_NAME: name = headstring(rpmhead, TAG_NAME); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.2/ext/testcase.c new/libsolv-0.2.3/ext/testcase.c --- old/libsolv-0.2.2/ext/testcase.c 2012-12-05 14:38:04.000000000 +0100 +++ new/libsolv-0.2.3/ext/testcase.c 2012-12-19 15:41:18.000000000 +0100 @@ -657,7 +657,25 @@ for (sp = pieces[2]; sp < pieces[npieces - 1]; sp++) if (*sp == 0) *sp = ' '; - what = testcase_str2dep(pool, pieces[2]); + what = 0; + if (pieces[1][0] == 'p' && strncmp(pieces[2], "namespace:", 10) == 0) + { + char *spe = strchr(pieces[2], '('); + int l = strlen(pieces[2]); + if (spe && pieces[2][l - 1] == ')') + { + /* special namespace provides */ + if (strcmp(spe, "(<NULL>)") != 0) + { + pieces[2][l - 1] = 0; + what = testcase_str2dep(pool, spe + 1); + pieces[2][l - 1] = ')'; + } + what = pool_rel2id(pool, pool_strn2id(pool, pieces[2], spe - pieces[2], 1), what, REL_NAMESPACE, 1); + } + } + if (!what) + what = testcase_str2dep(pool, pieces[2]); if (pieces[1][0] == 'n') job |= SOLVER_SOLVABLE_NAME; else diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.2/package/libsolv.changes new/libsolv-0.2.3/package/libsolv.changes --- old/libsolv-0.2.2/package/libsolv.changes 2012-12-05 14:38:04.000000000 +0100 +++ new/libsolv-0.2.3/package/libsolv.changes 2012-12-19 15:41:18.000000000 +0100 @@ -1,4 +1,12 @@ ------------------------------------------------------------------- +Tue Dec 18 19:20:19 CET 2012 - mls@suse.de + +- fix potential access to freed memory +- improve find_problemrule speed +- add support for special namespaceprovides jobs +- bump version to 0.2.3 + +------------------------------------------------------------------- Wed Dec 5 14:37:39 CET 2012 - mls@suse.de - many Selection improvements diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.2/package/libsolv.spec.in new/libsolv-0.2.3/package/libsolv.spec.in --- old/libsolv-0.2.2/package/libsolv.spec.in 2012-12-05 14:38:04.000000000 +0100 +++ new/libsolv-0.2.3/package/libsolv.spec.in 2012-12-19 15:41:18.000000000 +0100 @@ -63,11 +63,7 @@ BuildRequires: swig %endif %if %{with ruby_binding} -%if 0%{?fedora_version} || 0%{?rhel_version} >= 600 || 0%{?centos_version} >= 600 -%global ruby_vendorarch %(ruby -rrbconfig -e 'puts Config::CONFIG["sitearchdir"]') -%else -%global ruby_vendorarch %(ruby -rrbconfig -e 'puts Config::CONFIG["vendorarchdir"]') -%endif +%global ruby_vendorarch %(ruby -r rbconfig -e "puts Config::CONFIG['vendorarchdir'].nil? ? Config::CONFIG['sitearchdir'] : Config::CONFIG['vendorarchdir']") BuildRequires: ruby BuildRequires: ruby-devel BuildRequires: swig diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.2/src/pool.c new/libsolv-0.2.3/src/pool.c --- old/libsolv-0.2.2/src/pool.c 2012-12-05 14:38:04.000000000 +0100 +++ new/libsolv-0.2.3/src/pool.c 2012-12-19 15:41:18.000000000 +0100 @@ -287,7 +287,7 @@ return; sorted = solv_malloc2(pool->ss.nstrings, sizeof(Id)); for (i = id = 0; id < pool->ss.nstrings; id++) - if (pool->whatprovides[id] && pool->whatprovides[id] != 1) + if (pool->whatprovides[id] >= 4) sorted[i++] = id; n = i; solv_sort(sorted, n, sizeof(Id), pool_shrink_whatprovides_sortcmp, pool); @@ -319,11 +319,11 @@ lastid = id; } solv_free(sorted); - dp = pool->whatprovidesdata + 2; + dp = pool->whatprovidesdata + 4; for (id = 1; id < pool->ss.nstrings; id++) { o = pool->whatprovides[id]; - if (o == 0 || o == 1) + if (!o) continue; if ((Id)o < 0) { @@ -333,6 +333,8 @@ pool->whatprovides[id] = pool->whatprovides[i]; continue; } + if (o < 4) + continue; lp = pool->whatprovidesdata + o; if (lp < dp) abort(); @@ -408,7 +410,7 @@ } } - off = 2; /* first entry is undef, second is empty list */ + off = 4; /* first entry is undef, second is empty list, third is system solvable */ np = 0; /* number of names provided */ for (i = 0, idp = whatprovides; i < num; i++, idp++) { @@ -431,6 +433,7 @@ /* alloc space for all providers + extra */ whatprovidesdata = solv_calloc(off + extra, sizeof(Id)); + whatprovidesdata[2] = SYSTEMSOLVABLE; /* now fill data for all provides */ for (i = pool->nsolvables - 1; i > 0; i--) @@ -488,10 +491,9 @@ /* * pool_queuetowhatprovides - add queue contents to whatprovidesdata * - * on-demand filling of provider information - * move queue data into whatprovidesdata - * q: queue of Ids - * returns: Offset into whatprovides + * used for whatprovides, jobs, learnt rules, selections + * input: q: queue of Ids + * returns: Offset into whatprovidesdata * */ Id @@ -502,8 +504,10 @@ if (count == 0) /* queue empty -> 1 */ return 1; + if (count == 1 && q->elements[0] == SYSTEMSOLVABLE) + return 2; - /* extend whatprovidesdata if needed, +1 for ID_NULL-termination */ + /* extend whatprovidesdata if needed, +1 for 0-termination */ if (pool->whatprovidesdataleft < count + 1) { POOL_DEBUG(SOLV_DEBUG_STATS, "growing provides hash data...\n"); @@ -515,9 +519,9 @@ off = pool->whatprovidesdataoff; memcpy(pool->whatprovidesdata + pool->whatprovidesdataoff, q->elements, count * sizeof(Id)); - /* adapt count and ID_NULL-terminate */ + /* adapt count and 0-terminate */ pool->whatprovidesdataoff += count; - pool->whatprovidesdata[pool->whatprovidesdataoff++] = ID_NULL; + pool->whatprovidesdata[pool->whatprovidesdataoff++] = 0; pool->whatprovidesdataleft -= count + 1; return (Id)off; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.2/src/problems.c new/libsolv-0.2.3/src/problems.c --- old/libsolv-0.2.2/src/problems.c 2012-12-05 14:38:04.000000000 +0100 +++ new/libsolv-0.2.3/src/problems.c 2012-12-19 15:41:18.000000000 +0100 @@ -844,7 +844,7 @@ */ static void -findproblemrule_internal(Solver *solv, Id idx, Id *reqrp, Id *conrp, Id *sysrp, Id *jobrp) +findproblemrule_internal(Solver *solv, Id idx, Id *reqrp, Id *conrp, Id *sysrp, Id *jobrp, Map *rseen) { Id rid, d; Id lreqr, lconr, lsysr, ljobr; @@ -873,7 +873,12 @@ { assert(rid > 0); if (rid >= solv->learntrules) - findproblemrule_internal(solv, solv->learnt_why.elements[rid - solv->learntrules], &lreqr, &lconr, &lsysr, &ljobr); + { + if (MAPTST(rseen, rid - solv->learntrules)) + continue; + MAPSET(rseen, rid - solv->learntrules); + findproblemrule_internal(solv, solv->learnt_why.elements[rid - solv->learntrules], &lreqr, &lconr, &lsysr, &ljobr, rseen); + } else if ((rid >= solv->jobrules && rid < solv->jobrules_end) || (rid >= solv->infarchrules && rid < solv->infarchrules_end) || (rid >= solv->duprules && rid < solv->duprules_end) || (rid >= solv->bestrules && rid < solv->bestrules_end)) { if (!*jobrp) @@ -949,8 +954,11 @@ { Id reqr, conr, sysr, jobr; Id idx = solv->problems.elements[2 * problem - 2]; + Map rseen; reqr = conr = sysr = jobr = 0; - findproblemrule_internal(solv, idx, &reqr, &conr, &sysr, &jobr); + map_init(&rseen, solv->learntrules ? solv->nrules - solv->learntrules : 0); + findproblemrule_internal(solv, idx, &reqr, &conr, &sysr, &jobr, &rseen); + map_free(&rseen); if (reqr) return reqr; /* some requires */ if (conr) @@ -966,14 +974,17 @@ /*-------------------------------------------------------------------*/ static void -findallproblemrules_internal(Solver *solv, Id idx, Queue *rules) +findallproblemrules_internal(Solver *solv, Id idx, Queue *rules, Map *rseen) { Id rid; while ((rid = solv->learnt_pool.elements[idx++]) != 0) { if (rid >= solv->learntrules) { - findallproblemrules_internal(solv, solv->learnt_why.elements[rid - solv->learntrules], rules); + if (MAPTST(rseen, rid - solv->learntrules)) + continue; + MAPSET(rseen, rid - solv->learntrules); + findallproblemrules_internal(solv, solv->learnt_why.elements[rid - solv->learntrules], rules, rseen); continue; } queue_pushunique(rules, rid); @@ -991,8 +1002,11 @@ void solver_findallproblemrules(Solver *solv, Id problem, Queue *rules) { + Map rseen; queue_empty(rules); - findallproblemrules_internal(solv, solv->problems.elements[2 * problem - 2], rules); + map_init(&rseen, solv->learntrules ? solv->nrules - solv->learntrules : 0); + findallproblemrules_internal(solv, solv->problems.elements[2 * problem - 2], rules, &rseen); + map_free(&rseen); } /* EOF */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.2/src/rules.c new/libsolv-0.2.3/src/rules.c --- old/libsolv-0.2.2/src/rules.c 2012-12-05 14:38:04.000000000 +0100 +++ new/libsolv-0.2.3/src/rules.c 2012-12-19 15:41:18.000000000 +0100 @@ -35,8 +35,8 @@ /*------------------------------------------------------------------- * Check if dependency is possible * - * mirrors solver_dep_fulfilled but uses map m instead of the decisionmap - * used in solver_addrpmrulesforweak and solver_createcleandepsmap + * mirrors solver_dep_fulfilled but uses map m instead of the decisionmap. + * used in solver_addrpmrulesforweak and solver_createcleandepsmap. */ static inline int @@ -2132,10 +2132,14 @@ *depp = solv->job.elements[jidx + 1]; if ((r->d == 0 || r->d == -1) && r->w2 == 0 && r->p == -SYSTEMSOLVABLE) { - if ((solv->job.elements[jidx] & SOLVER_SELECTMASK) == SOLVER_SOLVABLE_NAME) + if ((solv->job.elements[jidx] & (SOLVER_JOBMASK|SOLVER_SELECTMASK)) == (SOLVER_INSTALL|SOLVER_SOLVABLE_NAME)) return SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP; - if ((solv->job.elements[jidx] & SOLVER_SELECTMASK) == SOLVER_SOLVABLE_PROVIDES) + if ((solv->job.elements[jidx] & (SOLVER_JOBMASK|SOLVER_SELECTMASK)) == (SOLVER_INSTALL|SOLVER_SOLVABLE_PROVIDES)) return SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP; + if ((solv->job.elements[jidx] & (SOLVER_JOBMASK|SOLVER_SELECTMASK)) == (SOLVER_ERASE|SOLVER_SOLVABLE_NAME)) + return SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM; + if ((solv->job.elements[jidx] & (SOLVER_JOBMASK|SOLVER_SELECTMASK)) == (SOLVER_ERASE|SOLVER_SOLVABLE_PROVIDES)) + return SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM; } return SOLVER_RULE_JOB; } @@ -2410,14 +2414,15 @@ if (i == q.count) continue; /* already added that one */ } - d = q.count ? pool_queuetowhatprovides(pool, &q) : 0; - solver_addrule(solv, r->p, d); - queue_push(&solv->weakruleq, solv->nrules - 1); - solv->choicerules_ref[solv->nrules - 1 - solv->choicerules] = rid; + lastaddedp = r->p; lastaddedd = d; lastaddedcnt = q.count; + + solver_addrule(solv, r->p, d); + queue_push(&solv->weakruleq, solv->nrules - 1); + solv->choicerules_ref[solv->nrules - 1 - solv->choicerules] = rid; #if 0 printf("OLD "); solver_printrule(solv, SOLV_DEBUG_RESULT, solv->rules + rid); @@ -2671,6 +2676,59 @@ queue_push(q, p); } +static int +check_xsupp(Solver *solv, Queue *depq, Id dep) +{ + Pool *pool = solv->pool; + Id p, pp; + + if (ISRELDEP(dep)) + { + Reldep *rd = GETRELDEP(pool, dep); + if (rd->flags >= 8) + { + if (rd->flags == REL_AND) + { + if (!check_xsupp(solv, depq, rd->name)) + return 0; + return check_xsupp(solv, depq, rd->evr); + } + if (rd->flags == REL_OR) + { + if (check_xsupp(solv, depq, rd->name)) + return 1; + return check_xsupp(solv, depq, rd->evr); + } + if (rd->flags == REL_NAMESPACE && rd->name == NAMESPACE_SPLITPROVIDES) + return solver_splitprovides(solv, rd->evr); + if (rd->flags == REL_NAMESPACE && rd->name == NAMESPACE_INSTALLED) + return solver_dep_installed(solv, rd->evr); + } + if (depq && rd->flags == REL_NAMESPACE) + { + int i; + for (i = 0; i < depq->count; i++) + if (depq->elements[i] == dep || depq->elements[i] == rd->name) + return 1; + } + } + FOR_PROVIDES(p, pp, dep) + if (p == SYSTEMSOLVABLE || pool->solvables[p].repo == solv->installed) + return 1; + return 0; +} + +static inline int +queue_contains(Queue *q, Id id) +{ + int i; + for (i = 0; i < q->count; i++) + if (q->elements[i] == id) + return 1; + return 0; +} + + /* * Find all installed packages that are no longer * needed regarding the current solver job. @@ -2707,7 +2765,7 @@ Id p, pp, ip, jp; Id req, *reqp, sup, *supp; Solvable *s; - Queue iq, iqcopy; + Queue iq, iqcopy, xsuppq; int i; map_empty(cleandepsmap); @@ -2717,6 +2775,7 @@ map_init(&im, pool->nsolvables); map_init(&installedm, pool->nsolvables); queue_init(&iq); + queue_init(&xsuppq); for (i = 0; i < job->count; i += 2) { @@ -2732,6 +2791,50 @@ if (pool->solvables[p].repo == installed) MAPSET(&userinstalled, p - installed->start); } + if ((how & (SOLVER_JOBMASK | SOLVER_SELECTMASK)) == (SOLVER_ERASE | SOLVER_SOLVABLE_PROVIDES)) + { + what = job->elements[i + 1]; + if (ISRELDEP(what)) + { + Reldep *rd = GETRELDEP(pool, what); + if (rd->flags != REL_NAMESPACE) + continue; + if (rd->evr == 0) + { + queue_pushunique(&iq, rd->name); + continue; + } + FOR_PROVIDES(p, pp, what) + if (p) + break; + if (p) + continue; + queue_pushunique(&iq, what); + } + } + } + + /* have special namespace cleandeps erases */ + if (iq.count) + { + for (ip = solv->installed->start; ip < solv->installed->end; ip++) + { + s = pool->solvables + ip; + if (s->repo != installed) + continue; + if (!s->supplements) + continue; + supp = s->repo->idarraydata + s->supplements; + while ((sup = *supp++) != 0) + if (check_xsupp(solv, &iq, sup) && !check_xsupp(solv, 0, sup)) + { +#ifdef CLEANDEPSDEBUG + printf("xsupp %s from %s\n", pool_dep2str(pool, sup), pool_solvid2str(pool, ip)); +#endif + queue_pushunique(&xsuppq, sup); + } + } + queue_empty(&iq); } /* also add visible patterns to userinstalled for openSUSE */ @@ -2904,6 +3007,8 @@ continue; MAPSET(&im, p); } + MAPSET(&installedm, SYSTEMSOLVABLE); + MAPSET(&im, SYSTEMSOLVABLE); #ifdef CLEANDEPSDEBUG printf("REMOVE PASS\n"); @@ -2916,7 +3021,7 @@ if (unneeded) break; /* supplements pass */ - for (ip = solv->installed->start; ip < solv->installed->end; ip++) + for (ip = installed->start; ip < installed->end; ip++) { if (!MAPTST(&installedm, ip)) continue; @@ -2935,7 +3040,7 @@ { supp = s->repo->idarraydata + s->supplements; while ((sup = *supp++) != 0) - if (dep_possible(solv, sup, &installedm)) + if (dep_possible(solv, sup, &installedm) || (xsuppq.count && queue_contains(&xsuppq, sup))) { /* no longer supplemented, also erase */ int iqcount = iq.count; @@ -2949,14 +3054,14 @@ } queue_truncate(&iq, iqcount); #ifdef CLEANDEPSDEBUG - printf("%s supplemented\n", pool_solvid2str(pool, ip)); + printf("%s supplemented [%s]\n", pool_solvid2str(pool, ip), pool_dep2str(pool, sup)); #endif queue_push(&iq, ip); } } } if (!iq.count) - break; + break; /* no supplementing package found, we're done */ } ip = queue_shift(&iq); s = pool->solvables + ip; @@ -2988,7 +3093,7 @@ #endif FOR_PROVIDES(p, pp, req) { - if (MAPTST(&im, p)) + if (p != SYSTEMSOLVABLE && MAPTST(&im, p)) { #ifdef CLEANDEPSDEBUG printf("%s requires %s\n", pool_solvid2str(pool, ip), pool_solvid2str(pool, p)); @@ -3013,7 +3118,7 @@ #endif FOR_PROVIDES(p, pp, req) { - if (MAPTST(&im, p)) + if (p != SYSTEMSOLVABLE && MAPTST(&im, p)) { #ifdef CLEANDEPSDEBUG printf("%s recommends %s\n", pool_solvid2str(pool, ip), pool_solvid2str(pool, p)); @@ -3037,6 +3142,7 @@ if (pool->solvables[p].repo == installed) MAPSET(&userinstalled, p - installed->start); } + MAPSET(&im, SYSTEMSOLVABLE); /* in case we cleared it above */ for (p = installed->start; p < installed->end; p++) if (MAPTST(&im, p)) queue_push(&iq, p); @@ -3109,6 +3215,11 @@ while ((req = *reqp++) != 0) { FOR_PROVIDES(p, pp, req) + if (MAPTST(&im, p)) + break; + if (p) + continue; + FOR_PROVIDES(p, pp, req) { if (!MAPTST(&im, p) && MAPTST(&installedm, p)) { @@ -3131,6 +3242,11 @@ while ((req = *reqp++) != 0) { FOR_PROVIDES(p, pp, req) + if (MAPTST(&im, p)) + break; + if (p) + continue; + FOR_PROVIDES(p, pp, req) { if (!MAPTST(&im, p) && MAPTST(&installedm, p)) { @@ -3171,6 +3287,7 @@ map_free(&im); map_free(&installedm); map_free(&userinstalled); + queue_free(&xsuppq); #ifdef CLEANDEPSDEBUG printf("=== final cleandeps map:\n"); for (p = installed->start; p < installed->end; p++) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.2/src/rules.h new/libsolv-0.2.3/src/rules.h --- old/libsolv-0.2.2/src/rules.h 2012-12-05 14:38:04.000000000 +0100 +++ new/libsolv-0.2.3/src/rules.h 2012-12-19 15:41:18.000000000 +0100 @@ -62,6 +62,7 @@ SOLVER_RULE_FEATURE = 0x300, SOLVER_RULE_JOB = 0x400, SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP, + SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM, SOLVER_RULE_DISTUPGRADE = 0x500, SOLVER_RULE_INFARCH = 0x600, SOLVER_RULE_CHOICE = 0x700, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.2/src/selection.c new/libsolv-0.2.3/src/selection.c --- old/libsolv-0.2.2/src/selection.c 2012-12-05 14:38:04.000000000 +0100 +++ new/libsolv-0.2.3/src/selection.c 2012-12-19 15:41:18.000000000 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, Novell Inc. + * Copyright (c) 2012, Novell Inc. * * This program is licensed under the BSD license, read LICENSE.BSD * for further information diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.2/src/selection.h new/libsolv-0.2.3/src/selection.h --- old/libsolv-0.2.2/src/selection.h 2012-12-05 14:38:04.000000000 +0100 +++ new/libsolv-0.2.3/src/selection.h 2012-12-19 15:41:18.000000000 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, Novell Inc. + * Copyright (c) 2012, Novell Inc. * * This program is licensed under the BSD license, read LICENSE.BSD * for further information diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.2/src/solver.c new/libsolv-0.2.3/src/solver.c --- old/libsolv-0.2.2/src/solver.c 2012-12-05 14:38:04.000000000 +0100 +++ new/libsolv-0.2.3/src/solver.c 2012-12-19 15:41:18.000000000 +0100 @@ -103,6 +103,64 @@ return 0; } +/* mirrors solver_dep_installed, but returns 2 if a + * dependency listed in solv->installsuppdepq was involved */ +static int +solver_check_installsuppdepq_dep(Solver *solv, Id dep) +{ + Pool *pool = solv->pool; + Id p, pp; + Queue *q; + + if (ISRELDEP(dep)) + { + Reldep *rd = GETRELDEP(pool, dep); + if (rd->flags == REL_AND) + { + int r2, r1 = solver_check_installsuppdepq_dep(solv, rd->name); + if (!r1) + return 0; + r2 = solver_check_installsuppdepq_dep(solv, rd->evr); + if (!r2) + return 0; + return r1 == 2 || r2 == 2 ? 2 : 1; + } + if (rd->flags == REL_OR) + { + int r2, r1 = solver_check_installsuppdepq_dep(solv, rd->name); + r2 = solver_check_installsuppdepq_dep(solv, rd->evr); + if (!r1 && !r2) + return 0; + return r1 == 2 || r2 == 2 ? 2 : 1; + } + if (rd->flags == REL_NAMESPACE && rd->name == NAMESPACE_SPLITPROVIDES) + return solver_splitprovides(solv, rd->evr); + if (rd->flags == REL_NAMESPACE && rd->name == NAMESPACE_INSTALLED) + return solver_dep_installed(solv, rd->evr); + if (rd->flags == REL_NAMESPACE && (q = solv->installsuppdepq) != 0) + { + int i; + for (i = 0; i < q->count; i++) + if (q->elements[i] == dep || q->elements[i] == rd->name) + return 2; + } + } + FOR_PROVIDES(p, pp, dep) + if (solv->decisionmap[p] > 0) + return 1; + return 0; +} + +static int +solver_check_installsuppdepq(Solver *solv, Solvable *s) +{ + Id sup, *supp; + supp = s->repo->idarraydata + s->supplements; + while ((sup = *supp++) != 0) + if (solver_check_installsuppdepq_dep(solv, sup) == 2) + return 1; + return 0; +} static Id autouninstall(Solver *solv, Id *problem) @@ -1430,6 +1488,11 @@ queue_free(solv->update_targets); solv->update_targets = solv_free(solv->update_targets); } + if (solv->installsuppdepq) + { + queue_free(solv->installsuppdepq); + solv->installsuppdepq = solv_free(solv->installsuppdepq); + } map_free(&solv->recommendsmap); map_free(&solv->suggestsmap); @@ -2151,6 +2214,8 @@ continue; if (!solver_is_supplementing(solv, s)) dqs.elements[j++] = p; + else if (s->supplements && solv->installsuppdepq && solver_check_installsuppdepq(solv, s)) + dqs.elements[j++] = p; } dqs.count = j; /* undo turning off */ @@ -3140,6 +3205,21 @@ p = queue_shift(&q); /* get first candidate */ d = !q.count ? 0 : pool_queuetowhatprovides(pool, &q); /* internalize */ } + /* force install of namespace supplements hack */ + if (select == SOLVER_SOLVABLE_PROVIDES && !d && (p == SYSTEMSOLVABLE || p == -SYSTEMSOLVABLE) && ISRELDEP(what)) + { + Reldep *rd = GETRELDEP(pool, what); + if (rd->flags == REL_NAMESPACE) + { + p = SYSTEMSOLVABLE; + if (!solv->installsuppdepq) + { + solv->installsuppdepq = solv_calloc(1, sizeof(Queue)); + queue_init(solv->installsuppdepq); + } + queue_pushunique(solv->installsuppdepq, rd->evr == 0 ? rd->name : what); + } + } solver_addjobrule(solv, p, d, i, weak); if (how & SOLVER_FORCEBEST) hasbestinstalljob = 1; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.2/src/solver.h new/libsolv-0.2.3/src/solver.h --- old/libsolv-0.2.2/src/solver.h 2012-12-05 14:38:04.000000000 +0100 +++ new/libsolv-0.2.3/src/solver.h 2012-12-19 15:41:18.000000000 +0100 @@ -225,6 +225,8 @@ Queue *cleandeps_mistakes; /* mistakes we made */ Queue *update_targets; /* update to specific packages */ + + Queue *installsuppdepq; /* deps from the install namespace provides hack */ #endif /* LIBSOLV_INTERNAL */ }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.2/src/solverdebug.c new/libsolv-0.2.3/src/solverdebug.c --- old/libsolv-0.2.2/src/solverdebug.c 2012-12-05 14:38:04.000000000 +0100 +++ new/libsolv-0.2.3/src/solverdebug.c 2012-12-19 15:41:18.000000000 +0100 @@ -569,6 +569,9 @@ case SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP: POOL_DEBUG(SOLV_DEBUG_RESULT, "nothing provides requested %s\n", pool_dep2str(pool, dep)); return; + case SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM: + POOL_DEBUG(SOLV_DEBUG_RESULT, "%s is provided by the system\n", pool_dep2str(pool, dep)); + return; case SOLVER_RULE_RPM: POOL_DEBUG(SOLV_DEBUG_RESULT, "some dependency problem\n"); return; @@ -996,6 +999,8 @@ return "conflicting requests"; case SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP: return pool_tmpjoin(pool, "nothing provides requested ", pool_dep2str(pool, dep), 0); + case SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM: + return pool_tmpjoin(pool, pool_dep2str(pool, dep), " is provided by the system", 0); case SOLVER_RULE_RPM: return "some dependency problem"; case SOLVER_RULE_RPM_NOT_INSTALLABLE: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.2/src/transaction.c new/libsolv-0.2.3/src/transaction.c --- old/libsolv-0.2.2/src/transaction.c 2012-12-05 14:38:04.000000000 +0100 +++ new/libsolv-0.2.3/src/transaction.c 2012-12-19 15:41:18.000000000 +0100 @@ -77,22 +77,20 @@ 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) 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 +110,8 @@ { 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 +120,11 @@ 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; } @@ -209,6 +207,7 @@ if (!s->repo) return SOLVER_TRANSACTION_IGNORE; + /* XXX: SUSE only? */ if (!(mode & SOLVER_TRANSACTION_KEEP_PSEUDO)) { const char *n = pool_id2str(pool, s->name); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.2/test/testcases/namespace/namespaceprovides.t new/libsolv-0.2.3/test/testcases/namespace/namespaceprovides.t --- old/libsolv-0.2.2/test/testcases/namespace/namespaceprovides.t 1970-01-01 01:00:00.000000000 +0100 +++ new/libsolv-0.2.3/test/testcases/namespace/namespaceprovides.t 2012-12-19 15:41:18.000000000 +0100 @@ -0,0 +1,59 @@ +repo system 0 testtags <inline> +#>=Pkg: B 1 1 noarch +#>=Prv: locale(en) +#>=Pkg: C 1 1 noarch +repo test 0 testtags <inline> +#>=Pkg: A 1 1 noarch +#>=Prv: locale(de) +#>=Pkg: C-de 1 1 noarch +#>=Prv: locale(C:de) +#>=Pkg: C-en 1 1 noarch +#>=Prv: locale(C:en) +system i686 rpm system + +# first test an empty job +namespace namespace:language(de) @SYSTEM +result transaction,problems <inline> + +# then test addalreadyrecommended +nextjob +namespace namespace:language(de) @SYSTEM +solverflags addalreadyrecommended +result transaction,problems <inline> +#>install A-1-1.noarch@test +#>install C-de-1-1.noarch@test + +nextjob +namespace namespace:language(de) @SYSTEM +job install provides namespace:language(de) +result transaction,problems <inline> +#>install A-1-1.noarch@test +#>install C-de-1-1.noarch@test + +nextjob +namespace namespace:language(de) @SYSTEM +job erase provides namespace:language(en) [cleandeps] +result transaction,problems <inline> +#>erase B-1-1.noarch@system + +nextjob +namespace namespace:language(de) @SYSTEM +job install provides namespace:language(<NULL>) +result transaction,problems <inline> +#>install A-1-1.noarch@test +#>install C-de-1-1.noarch@test + +nextjob +namespace namespace:language(de) @SYSTEM +job erase provides namespace:language(<NULL>) [cleandeps] +result transaction,problems <inline> +#>erase B-1-1.noarch@system + +nextjob +namespace namespace:language(de) @SYSTEM +job install provides namespace:language(<NULL>) +job erase provides namespace:language(<NULL>) [cleandeps] +result transaction,problems <inline> +#>erase B-1-1.noarch@system +#>install A-1-1.noarch@test +#>install C-de-1-1.noarch@test diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.2/test/testcases/sat/assert-system.repo new/libsolv-0.2.3/test/testcases/sat/assert-system.repo --- old/libsolv-0.2.2/test/testcases/sat/assert-system.repo 2012-12-05 14:38:04.000000000 +0100 +++ new/libsolv-0.2.3/test/testcases/sat/assert-system.repo 1970-01-01 01:00:00.000000000 +0100 @@ -1,4 +0,0 @@ -=Pkg: A 1 1 x86_64 -=Prv: AA -=Pkg: B 1 1 x86_64 -=Prv: AA diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.2/test/testcases/sat/assert.t new/libsolv-0.2.3/test/testcases/sat/assert.t --- old/libsolv-0.2.2/test/testcases/sat/assert.t 2012-12-05 14:38:04.000000000 +0100 +++ new/libsolv-0.2.3/test/testcases/sat/assert.t 2012-12-19 15:41:18.000000000 +0100 @@ -1,4 +1,8 @@ -repo system 0 testtags assert-system.repo +repo system 0 testtags <inline> +#>=Pkg: A 1 1 x86_64 +#>=Prv: AA +#>=Pkg: B 1 1 x86_64 +#>=Prv: AA system x86_64 rpm system job erase provides AA [weak] job install pkg B-1-1.x86_64@system diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.2/tools/dumpsolv.c new/libsolv-0.2.3/tools/dumpsolv.c --- old/libsolv-0.2.2/tools/dumpsolv.c 2012-12-05 14:38:04.000000000 +0100 +++ new/libsolv-0.2.3/tools/dumpsolv.c 2012-12-19 15:41:18.000000000 +0100 @@ -24,11 +24,11 @@ Repodata *data; if (repo->nrepodata == 0) return; - printf("repo contains %d repodata sections:\n", repo->nrepodata); + printf("repo contains %d repodata sections:\n", repo->nrepodata - 1); FOR_REPODATAS(repo, i, data) { unsigned int j; - printf("\nrepodata %d has %d keys, %d schemata\n", i + 1, data->nkeys - 1, data->nschemata - 1); + printf("\nrepodata %d has %d keys, %d schemata\n", i, data->nkeys - 1, data->nschemata - 1); for (j = 1; j < data->nkeys; j++) printf(" %s (type %s size %d storage %d)\n", pool_id2str(repo->pool, data->keys[j].name), pool_id2str(repo->pool, data->keys[j].type), data->keys[j].size, data->keys[j].storage); if (data->localpool) @@ -178,18 +178,16 @@ static int -loadcallback (Pool *pool, Repodata *data, void *vdata) +loadcallback(Pool *pool, Repodata *data, void *vdata) { FILE *fp = 0; int r; const char *location; -printf("LOADCALLBACK\n"); location = repodata_lookup_str(data, SOLVID_META, REPOSITORY_LOCATION); -printf("loc %s\n", location); if (!location || !with_attr) return 0; - fprintf (stderr, "Loading SOLV file %s\n", location); + fprintf (stderr, "[Loading SOLV file %s]\n", location); fp = fopen (location, "r"); if (!fp) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.2/tools/installcheck.c new/libsolv-0.2.3/tools/installcheck.c --- old/libsolv-0.2.2/tools/installcheck.c 2012-12-05 14:38:04.000000000 +0100 +++ new/libsolv-0.2.3/tools/installcheck.c 2012-12-19 15:41:18.000000000 +0100 @@ -379,6 +379,7 @@ printf(" %s can not be updated\n", pool_solvable2str(pool, s)); break; case SOLVER_RULE_JOB: + case SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM: break; case SOLVER_RULE_RPM: printf(" some dependency problem\n"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.2.2/tools/patchcheck.c new/libsolv-0.2.3/tools/patchcheck.c --- old/libsolv-0.2.2/tools/patchcheck.c 2012-12-05 14:38:04.000000000 +0100 +++ new/libsolv-0.2.3/tools/patchcheck.c 2012-12-19 15:41:18.000000000 +0100 @@ -93,6 +93,7 @@ } break; case SOLVER_RULE_JOB: + case SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM: break; case SOLVER_RULE_RPM: printf(" some dependency problem\n"); -- To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-commit+help@opensuse.org
participants (1)
-
root@hilbert.suse.de