Hello community, here is the log from the commit of package libsolv for openSUSE:Factory checked in at 2014-09-17 17:41:57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libsolv (Old) and /work/SRC/openSUSE:Factory/.libsolv.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libsolv" Changes: -------- --- /work/SRC/openSUSE:Factory/libsolv/libsolv.changes 2014-07-16 16:49:17.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.libsolv.new/libsolv.changes 2014-09-17 17:42:13.000000000 +0200 @@ -1,0 +2,11 @@ +Thu Sep 11 17:33:04 CEST 2014 - [email protected] + +- support DUCHANGES_ONLYADD flag in diskusage calculation + [bnc#783100] +- add whatmatchesdep to bindings +- support pool->considered in testcases +- always call selection_filelist if SELECTION_FILELIST is set +- support yum style obsolete handling for package splits +- bump version to 0.6.5 + +------------------------------------------------------------------- Old: ---- libsolv-0.6.4.tar.bz2 New: ---- libsolv-0.6.5.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libsolv.spec ++++++ --- /var/tmp/diff_new_pack.T4nOev/_old 2014-09-17 17:42:13.000000000 +0200 +++ /var/tmp/diff_new_pack.T4nOev/_new 2014-09-17 17:42:13.000000000 +0200 @@ -17,7 +17,7 @@ Name: libsolv -Version: 0.6.4 +Version: 0.6.5 Release: 0 Url: git://gitorious.org/opensuse/libsolv.git Source: libsolv-%{version}.tar.bz2 ++++++ libsolv-0.6.4.tar.bz2 -> libsolv-0.6.5.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.6.4/VERSION.cmake new/libsolv-0.6.5/VERSION.cmake --- old/libsolv-0.6.4/VERSION.cmake 2014-07-08 14:16:15.000000000 +0200 +++ new/libsolv-0.6.5/VERSION.cmake 2014-09-16 10:56:09.000000000 +0200 @@ -49,5 +49,5 @@ SET(LIBSOLV_MAJOR "0") SET(LIBSOLV_MINOR "6") -SET(LIBSOLV_PATCH "4") +SET(LIBSOLV_PATCH "5") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.6.4/bindings/solv.i new/libsolv-0.6.5/bindings/solv.i --- old/libsolv-0.6.4/bindings/solv.i 2014-07-01 11:09:49.000000000 +0200 +++ new/libsolv-0.6.5/bindings/solv.i 2014-09-05 15:41:25.000000000 +0200 @@ -1397,6 +1397,15 @@ return pool_queuetowhatprovides($self, &q); } + %typemap(out) Queue whatmatchesdep Queue2Array(XSolvable *, 1, new_XSolvable(arg1, id)); + %newobject whatmatchesdep; + Queue whatmatchesdep(Id keyname, DepId dep, Id marker = -1) { + Queue q; + queue_init(&q); + pool_whatmatchesdep($self, keyname, dep, &q, marker); + return q; + } + #ifdef SWIGRUBY %rename("isknownarch?") isknownarch; #endif @@ -2769,6 +2778,7 @@ static const int SOLVER_FLAG_KEEP_ORPHANS = SOLVER_FLAG_KEEP_ORPHANS; static const int SOLVER_FLAG_BREAK_ORPHANS = SOLVER_FLAG_BREAK_ORPHANS; static const int SOLVER_FLAG_FOCUS_INSTALLED = SOLVER_FLAG_FOCUS_INSTALLED; + static const int SOLVER_FLAG_YUM_OBSOLETES = SOLVER_FLAG_YUM_OBSOLETES; static const int SOLVER_REASON_UNRELATED = SOLVER_REASON_UNRELATED; static const int SOLVER_REASON_UNIT_RULE = SOLVER_REASON_UNIT_RULE; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.6.4/examples/solv.c new/libsolv-0.6.5/examples/solv.c --- old/libsolv-0.6.4/examples/solv.c 2014-07-01 11:09:49.000000000 +0200 +++ new/libsolv-0.6.5/examples/solv.c 2014-09-16 10:56:09.000000000 +0200 @@ -2464,6 +2464,7 @@ int i; /* XXX: use mountpoints here */ + memset(duc, 0, sizeof(duc)); duc[0].path = "/"; duc[1].path = "/usr/share/man"; duc[2].path = "/sbin"; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.6.4/ext/repo_arch.c new/libsolv-0.6.5/ext/repo_arch.c --- old/libsolv-0.6.4/ext/repo_arch.c 2014-07-01 11:09:49.000000000 +0200 +++ new/libsolv-0.6.5/ext/repo_arch.c 2014-07-25 17:56:13.000000000 +0200 @@ -294,13 +294,13 @@ char *p; Id id; - while (*line == ' ' && *line == '\t') + while (*line == ' ' || *line == '\t') line++; p = line; while (*p && *p != ' ' && *p != '\t' && *p != '<' && *p != '=' && *p != '>') p++; id = pool_strn2id(pool, line, p - line, 1); - while (*p == ' ' && *p == '\t') + while (*p == ' ' || *p == '\t') p++; if (*p == '<' || *p == '=' || *p == '>') { @@ -316,7 +316,7 @@ else break; } - while (*p == ' ' && *p == '\t') + while (*p == ' ' || *p == '\t') p++; line = p; while (*p && *p != ' ' && *p != '\t') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.6.4/ext/testcase.c new/libsolv-0.6.5/ext/testcase.c --- old/libsolv-0.6.4/ext/testcase.c 2014-07-01 11:09:49.000000000 +0200 +++ new/libsolv-0.6.5/ext/testcase.c 2014-07-31 16:21:18.000000000 +0200 @@ -105,6 +105,7 @@ { SOLVER_FLAG_KEEP_ORPHANS, "keeporphans", 0 }, { SOLVER_FLAG_BREAK_ORPHANS, "breakorphans", 0 }, { SOLVER_FLAG_FOCUS_INSTALLED, "focusinstalled", 0 }, + { SOLVER_FLAG_YUM_OBSOLETES, "yumobsoletes", 0 }, { 0, 0, 0 } }; @@ -1728,6 +1729,18 @@ } } + /* dump disabled packages (must come before the namespace/job lines) */ + if (pool->considered) + { + Id p; + FOR_POOL_SOLVABLES(p) + if (!MAPTST(pool->considered, p)) + { + cmd = pool_tmpjoin(pool, "disable pkg ", testcase_solvid2str(pool, p), 0); + strqueue_push(&sq, cmd); + } + } + s = testcase_getsolverflags(solv); if (*s) { @@ -2116,7 +2129,7 @@ { char *sp; Id how, what; - if (!prepared) + if (prepared <= 0) { pool_addfileprovides(pool); pool_createwhatprovides(pool); @@ -2162,7 +2175,7 @@ for (i = 2; i < npieces; i++) queue_push(&q, testcase_str2solvid(pool, pieces[i])); /* now do the callback */ - if (!prepared) + if (prepared <= 0) { pool_addfileprovides(pool); pool_createwhatprovides(pool); @@ -2227,6 +2240,29 @@ { break; } + else if (!strcmp(pieces[0], "disable") && npieces == 3) + { + Id p; + if (strcmp(pieces[1], "pkg")) + { + pool_debug(pool, SOLV_ERROR, "testcase_read: bad disable type '%s'\n", pieces[1]); + continue; + } + if (!prepared) + pool_createwhatprovides(pool); + prepared = -1; + if (!pool->considered) + { + pool->considered = solv_calloc(1, sizeof(Map)); + map_init(pool->considered, pool->nsolvables); + map_setall(pool->considered); + } + p = testcase_str2solvid(pool, pieces[2]); + if (p) + MAPCLR(pool->considered, p); + else + pool_debug(pool, SOLV_ERROR, "disable: unknown package '%s'\n", pieces[2]); + } else { pool_debug(pool, SOLV_ERROR, "testcase_read: cannot parse command '%s'\n", pieces[0]); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.6.4/package/libsolv.changes new/libsolv-0.6.5/package/libsolv.changes --- old/libsolv-0.6.4/package/libsolv.changes 2014-07-08 14:16:15.000000000 +0200 +++ new/libsolv-0.6.5/package/libsolv.changes 2014-09-16 10:56:09.000000000 +0200 @@ -1,4 +1,15 @@ ------------------------------------------------------------------- +Thu Sep 11 17:33:04 CEST 2014 - [email protected] + +- support DUCHANGES_ONLYADD flag in diskusage calculation + [bnc#783100] +- add whatmatchesdep to bindings +- support pool->considered in testcases +- always call selection_filelist if SELECTION_FILELIST is set +- support yum style obsolete handling for package splits +- bump version to 0.6.5 + +------------------------------------------------------------------- Tue Jul 8 14:13:40 CEST 2014 - [email protected] - expand solver_identical fix to applications [bnc#885830] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.6.4/src/policy.c new/libsolv-0.6.5/src/policy.c --- old/libsolv-0.6.4/src/policy.c 2014-07-01 11:09:49.000000000 +0200 +++ new/libsolv-0.6.5/src/policy.c 2014-07-25 18:27:17.000000000 +0200 @@ -776,7 +776,7 @@ * sort list of packages (given through plist) by name and evr * return result through plist */ -static void +void prune_to_best_version(Pool *pool, Queue *plist) { int i, j; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.6.4/src/policy.h new/libsolv-0.6.5/src/policy.h --- old/libsolv-0.6.4/src/policy.h 2014-07-01 11:09:49.000000000 +0200 +++ new/libsolv-0.6.5/src/policy.h 2014-07-25 18:27:17.000000000 +0200 @@ -36,6 +36,9 @@ extern void policy_create_obsolete_index(Solver *solv); +/* internal, do not use */ +extern void prune_to_best_version(Pool *pool, Queue *plist); + #ifdef __cplusplus } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.6.4/src/pool.c new/libsolv-0.6.5/src/pool.c --- old/libsolv-0.6.4/src/pool.c 2014-07-01 11:09:49.000000000 +0200 +++ new/libsolv-0.6.5/src/pool.c 2014-09-10 12:41:04.000000000 +0200 @@ -118,7 +118,7 @@ solv_free(pool->tmpspace.buf[i]); for (i = 0; i < pool->nlanguages; i++) free((char *)pool->languages[i]); - solv_free(pool->languages); + solv_free((void *)pool->languages); solv_free(pool->languagecache); solv_free(pool->errstr); solv_free(pool->rootdir); @@ -1674,7 +1674,7 @@ pool->languagecacheother = 0; for (i = 0; i < pool->nlanguages; i++) free((char *)pool->languages[i]); - pool->languages = solv_free(pool->languages); + pool->languages = solv_free((void *)pool->languages); pool->nlanguages = nlanguages; if (!nlanguages) return; @@ -1922,7 +1922,7 @@ cbd->mps[mp].kbytes += value->num; cbd->mps[mp].files += value->num2; } - else + else if (!(cbd->mps[mp].flags & DUCHANGES_ONLYADD)) { cbd->mps[mp].kbytes -= value->num; cbd->mps[mp].files -= value->num2; @@ -2030,13 +2030,17 @@ struct mptree *mptree; struct ducbdata cbd; Solvable *s; - int sp; + int i, sp; Map ignoredu; Repo *oldinstalled = pool->installed; + int haveonlyadd = 0; map_init(&ignoredu, 0); mptree = create_mptree(mps, nmps); + for (i = 0; i < nmps; i++) + if ((mps[i].flags & DUCHANGES_ONLYADD) != 0) + haveonlyadd = 1; cbd.mps = mps; cbd.dirmap = 0; cbd.nmap = 0; @@ -2054,21 +2058,55 @@ if (!cbd.hasdu && oldinstalled) { Id op, opp; + int didonlyadd = 0; /* no du data available, ignore data of all installed solvables we obsolete */ if (!ignoredu.size) map_grow(&ignoredu, oldinstalled->end - oldinstalled->start); + FOR_PROVIDES(op, opp, s->name) + { + Solvable *s2 = pool->solvables + op; + if (!pool->implicitobsoleteusesprovides && s->name != s2->name) + continue; + if (pool->implicitobsoleteusescolors && !pool_colormatch(pool, s, s2)) + continue; + if (op >= oldinstalled->start && op < oldinstalled->end) + { + MAPSET(&ignoredu, op - oldinstalled->start); + if (haveonlyadd && pool->solvables[op].repo == oldinstalled && !didonlyadd) + { + repo_search(oldinstalled, op, SOLVABLE_DISKUSAGE, 0, 0, solver_fill_DU_cb, &cbd); + cbd.addsub = -1; + repo_search(oldinstalled, op, SOLVABLE_DISKUSAGE, 0, 0, solver_fill_DU_cb, &cbd); + cbd.addsub = 1; + didonlyadd = 1; + } + } + } if (s->obsoletes) { Id obs, *obsp = s->repo->idarraydata + s->obsoletes; while ((obs = *obsp++) != 0) FOR_PROVIDES(op, opp, obs) - if (op >= oldinstalled->start && op < oldinstalled->end) - MAPSET(&ignoredu, op - oldinstalled->start); + { + Solvable *s2 = pool->solvables + op; + if (!pool->obsoleteusesprovides && !pool_match_nevr(pool, s2, obs)) + continue; + if (pool->obsoleteusescolors && !pool_colormatch(pool, s, s2)) + continue; + if (op >= oldinstalled->start && op < oldinstalled->end) + { + MAPSET(&ignoredu, op - oldinstalled->start); + if (haveonlyadd && pool->solvables[op].repo == oldinstalled && !didonlyadd) + { + repo_search(oldinstalled, op, SOLVABLE_DISKUSAGE, 0, 0, solver_fill_DU_cb, &cbd); + cbd.addsub = -1; + repo_search(oldinstalled, op, SOLVABLE_DISKUSAGE, 0, 0, solver_fill_DU_cb, &cbd); + cbd.addsub = 1; + didonlyadd = 1; + } + } + } } - FOR_PROVIDES(op, opp, s->name) - if (pool->solvables[op].name == s->name) - if (op >= oldinstalled->start && op < oldinstalled->end) - MAPSET(&ignoredu, op - oldinstalled->start); } } cbd.addsub = -1; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.6.4/src/pool.h new/libsolv-0.6.5/src/pool.h --- old/libsolv-0.6.4/src/pool.h 2014-07-01 11:09:49.000000000 +0200 +++ new/libsolv-0.6.5/src/pool.h 2014-09-10 12:41:04.000000000 +0200 @@ -346,10 +346,13 @@ void pool_clear_pos(Pool *pool); +#define DUCHANGES_ONLYADD 1 + typedef struct _DUChanges { const char *path; int kbytes; int files; + int flags; } DUChanges; void pool_calc_duchanges(Pool *pool, Map *installedmap, DUChanges *mps, int nmps); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.6.4/src/poolid.c new/libsolv-0.6.5/src/poolid.c --- old/libsolv-0.6.4/src/poolid.c 2014-07-01 11:09:49.000000000 +0200 +++ new/libsolv-0.6.5/src/poolid.c 2014-08-29 13:11:37.000000000 +0200 @@ -65,7 +65,7 @@ ran = pool->rels; /* extend hashtable if needed */ - if (pool->nrels * 2 > hashmask) + if ((Hashval)pool->nrels * 2 > hashmask) { solv_free(pool->relhashtbl); pool->relhashmask = hashmask = mkmask(pool->nrels + REL_BLOCK); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.6.4/src/poolvendor.c new/libsolv-0.6.5/src/poolvendor.c --- old/libsolv-0.6.4/src/poolvendor.c 2014-07-01 11:09:49.000000000 +0200 +++ new/libsolv-0.6.5/src/poolvendor.c 2014-08-29 14:01:36.000000000 +0200 @@ -89,7 +89,7 @@ { for (v = pool->vendorclasses; v[0] || v[1]; v++) solv_free((void *)*v); - pool->vendorclasses = solv_free(pool->vendorclasses); + pool->vendorclasses = solv_free((void *)pool->vendorclasses); } if (!vendorclasses || !vendorclasses[0]) return; @@ -120,7 +120,7 @@ if (i) i++; } - pool->vendorclasses = solv_realloc2(pool->vendorclasses, i + j + 2, sizeof(const char *)); + pool->vendorclasses = solv_realloc2((void *)pool->vendorclasses, i + j + 2, sizeof(const char *)); for (j = 0; vendorclass[j]; j++) pool->vendorclasses[i++] = solv_strdup(vendorclass[j]); pool->vendorclasses[i++] = 0; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.6.4/src/problems.c new/libsolv-0.6.5/src/problems.c --- old/libsolv-0.6.4/src/problems.c 2014-07-01 11:09:49.000000000 +0200 +++ new/libsolv-0.6.5/src/problems.c 2014-07-25 18:27:17.000000000 +0200 @@ -918,7 +918,7 @@ 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)) + 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) || (rid >= solv->yumobsrules && rid <= solv->yumobsrules_end)) { if (!*jobrp) *jobrp = rid; @@ -1105,6 +1105,10 @@ 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_BEST: + if (source > 0) + return pool_tmpjoin(pool, "cannot install the best update candidate for package ", pool_solvid2str(pool, source), 0); + return "cannot install the best candidate for the job"; case SOLVER_RULE_RPM_NOT_INSTALLABLE: return pool_tmpjoin(pool, "package ", pool_solvid2str(pool, source), " is not installable"); case SOLVER_RULE_RPM_NOTHING_PROVIDES_DEP: @@ -1135,6 +1139,10 @@ case SOLVER_RULE_RPM_SELF_CONFLICT: s = pool_tmpjoin(pool, "package ", pool_solvid2str(pool, source), " conflicts with "); return pool_tmpappend(pool, s, pool_dep2str(pool, dep), " provided by itself"); + case SOLVER_RULE_YUMOBS: + s = pool_tmpjoin(pool, "both package ", pool_solvid2str(pool, source), " and "); + s = pool_tmpjoin(pool, s, pool_solvid2str(pool, target), " obsolete "); + return pool_tmpappend(pool, s, pool_dep2str(pool, dep), 0); default: return "bad problem rule type"; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.6.4/src/qsort_r.c new/libsolv-0.6.5/src/qsort_r.c --- old/libsolv-0.6.4/src/qsort_r.c 2014-07-01 11:09:49.000000000 +0200 +++ new/libsolv-0.6.5/src/qsort_r.c 2014-08-29 13:11:37.000000000 +0200 @@ -47,7 +47,9 @@ static inline char *med3(char *, char *, char *, cmp_t *, void *); static inline void swapfunc(char *, char *, int, int); +#ifndef min #define min(a, b) (a) < (b) ? a : b +#endif /* * Qsort routine from Bentley & McIlroy's "Engineering a Sort Function". diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.6.4/src/repo.c new/libsolv-0.6.5/src/repo.c --- old/libsolv-0.6.4/src/repo.c 2014-07-01 11:09:49.000000000 +0200 +++ new/libsolv-0.6.5/src/repo.c 2014-08-29 13:11:37.000000000 +0200 @@ -388,10 +388,10 @@ } /* maintain hash and lastmarkerpos */ - if (repo->lastidhash_idarraysize != repo->idarraysize || size * 2 > repo->lastidhash_mask || repo->lastmarker != marker) + if (repo->lastidhash_idarraysize != repo->idarraysize || (Hashval)size * 2 > repo->lastidhash_mask || repo->lastmarker != marker) { repo->lastmarkerpos = 0; - if (size * 2 > repo->lastidhash_mask) + if (size * 2 > (Hashval)repo->lastidhash_mask) { repo->lastidhash_mask = mkmask(size < REPO_ADDID_DEP_HASHMIN ? REPO_ADDID_DEP_HASHMIN : size); repo->lastidhash = solv_realloc2(repo->lastidhash, repo->lastidhash_mask + 1, sizeof(Id)); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.6.4/src/repo.h new/libsolv-0.6.5/src/repo.h --- old/libsolv-0.6.4/src/repo.h 2014-07-01 11:09:49.000000000 +0200 +++ new/libsolv-0.6.5/src/repo.h 2014-08-29 13:11:37.000000000 +0200 @@ -41,7 +41,7 @@ Id *idarraydata; /* array of metadata Ids, solvable dependencies are offsets into this array */ int idarraysize; - unsigned nrepodata; /* number of our stores.. */ + int nrepodata; /* number of our stores.. */ Id *rpmdbid; /* solvable side data: rpm database id */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.6.4/src/repo_solv.c new/libsolv-0.6.5/src/repo_solv.c --- old/libsolv-0.6.4/src/repo_solv.c 2014-07-01 11:09:49.000000000 +0200 +++ new/libsolv-0.6.5/src/repo_solv.c 2014-08-29 13:11:37.000000000 +0200 @@ -113,7 +113,7 @@ if (!(c & 128)) { x = (x << 7) | c; - if (max && x >= max) + if (max && x >= (unsigned int)max) { data->error = pool_error(data->repo->pool, SOLV_ERROR_ID_RANGE, "read_id: id too large (%u/%u)", x, max); return 0; @@ -149,7 +149,7 @@ continue; } x = (x << 6) | (c & 63); - if (max && x >= max) + if (max && x >= (unsigned int)max) { data->error = pool_error(data->repo->pool, SOLV_ERROR_ID_RANGE, "read_idarray: id too large (%u/%u)", x, max); return 0; @@ -217,7 +217,7 @@ continue; } x = (x << 6) | (c & 63); - if (max && x >= max) + if (max && x >= (unsigned int)max) { data->error = pool_error(data->repo->pool, SOLV_ERROR_ID_RANGE, "data_read_idarray: id too large (%u/%u)", x, max); data->error = SOLV_ERROR_ID_RANGE; @@ -261,7 +261,7 @@ } x = old + (x - 1); old = x; - if (max && x >= max) + if (max && x >= (unsigned int)max) { data->error = pool_error(data->repo->pool, SOLV_ERROR_ID_RANGE, "data_read_rel_idarray: id too large (%u/%u)", x, max); break; @@ -360,7 +360,7 @@ static void incore_add_blob(Repodata *data, unsigned char *buf, int len) { - if (data->incoredatafree < len) + if (data->incoredatafree < (unsigned int)len) { data->incoredata = solv_realloc(data->incoredata, data->incoredatalen + INCORE_ADD_CHUNK + len); data->incoredatafree = INCORE_ADD_CHUNK + len; @@ -444,8 +444,8 @@ { Pool *pool = repo->pool; int i, l; - unsigned int numid, numrel, numdir, numsolv; - unsigned int numkeys, numschemata; + int numid, numrel, numdir, numsolv; + int numkeys, numschemata; Offset sizeid; Offset *str; /* map Id -> Offset into string space */ @@ -519,16 +519,26 @@ return pool_error(pool, SOLV_ERROR_UNSUPPORTED, "unsupported SOLV version"); } - numid = read_u32(&data); - numrel = read_u32(&data); - numdir = read_u32(&data); - numsolv = read_u32(&data); - numkeys = read_u32(&data); - numschemata = read_u32(&data); + numid = (int)read_u32(&data); + numrel = (int)read_u32(&data); + numdir = (int)read_u32(&data); + numsolv = (int)read_u32(&data); + numkeys = (int)read_u32(&data); + numschemata = (int)read_u32(&data); solvflags = read_u32(&data); - if (numdir && numdir < 2) + if (numid < 0 || numid >= 0x20000000) + return pool_error(pool, SOLV_ERROR_CORRUPT, "bad number of ids"); + if (numrel < 0 || numrel >= 0x20000000) + return pool_error(pool, SOLV_ERROR_CORRUPT, "bad number of rels"); + if (numdir && (numdir < 2 || numdir >= 0x20000000)) return pool_error(pool, SOLV_ERROR_CORRUPT, "bad number of dirs"); + if (numsolv < 0 || numsolv >= 0x20000000) + return pool_error(pool, SOLV_ERROR_CORRUPT, "bad number of solvables"); + if (numkeys < 0 || numkeys >= 0x20000000) + return pool_error(pool, SOLV_ERROR_CORRUPT, "bad number of keys"); + if (numschemata < 0 || numschemata >= 0x20000000) + return pool_error(pool, SOLV_ERROR_CORRUPT, "bad number of schematas"); if (numrel && (flags & REPO_LOCALPOOL) != 0) return pool_error(pool, SOLV_ERROR_CORRUPT, "relations are forbidden in a local pool"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.6.4/src/repo_write.c new/libsolv-0.6.5/src/repo_write.c --- old/libsolv-0.6.4/src/repo_write.c 2014-07-01 11:09:49.000000000 +0200 +++ new/libsolv-0.6.5/src/repo_write.c 2014-08-29 13:11:37.000000000 +0200 @@ -1568,7 +1568,7 @@ /* remove unused keys */ keyused = solv_calloc(target.nkeys, sizeof(Id)); - for (i = 1; i < target.schemadatalen; i++) + for (i = 1; i < (int)target.schemadatalen; i++) keyused[target.schemadata[i]] = 1; keyused[0] = 0; for (n = i = 1; i < target.nkeys; i++) @@ -1592,7 +1592,7 @@ queue_truncate(keyq, 2 * n - 2); /* update schema data to the new key ids */ - for (i = 1; i < target.schemadatalen; i++) + for (i = 1; i < (int)target.schemadatalen; i++) target.schemadata[i] = keyused[target.schemadata[i]]; /* update keymap to the new key ids */ for (i = 0; i < cbdata.nkeymap; i++) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.6.4/src/repodata.c new/libsolv-0.6.5/src/repodata.c --- old/libsolv-0.6.4/src/repodata.c 2014-07-01 11:09:49.000000000 +0200 +++ new/libsolv-0.6.5/src/repodata.c 2014-08-29 13:11:37.000000000 +0200 @@ -479,11 +479,11 @@ if (off >= data->lastverticaloffset) { off -= data->lastverticaloffset; - if (off + len > data->vincorelen) + if ((unsigned int)off + len > data->vincorelen) return 0; return data->vincore + off; } - if (off + len > key->size) + if ((unsigned int)off + len > key->size) return 0; /* we now have the offset, go into vertical */ off += data->verticaloffset[key - data->keys]; @@ -2928,7 +2928,7 @@ case REPOKEY_TYPE_STR: case REPOKEY_TYPE_BINARY: case_CHKSUM_TYPES: - if (attrs[1] < attrdatastart) + if ((unsigned int)attrs[1] < attrdatastart) attrdatastart = attrs[1]; break; case REPOKEY_TYPE_DIRSTRARRAY: @@ -2938,7 +2938,7 @@ /* FALLTHROUGH */ case REPOKEY_TYPE_IDARRAY: case REPOKEY_TYPE_DIRNUMNUMARRAY: - if (attrs[1] < attriddatastart) + if ((unsigned int)attrs[1] < attriddatastart) attriddatastart = attrs[1]; break; case REPOKEY_TYPE_FIXARRAY: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.6.4/src/rules.c new/libsolv-0.6.5/src/rules.c --- old/libsolv-0.6.4/src/rules.c 2014-07-08 14:16:15.000000000 +0200 +++ new/libsolv-0.6.5/src/rules.c 2014-07-28 14:00:50.000000000 +0200 @@ -434,8 +434,11 @@ queue_push(&q, p); } if (q.count == 1) - return -n; /* no other package found, generate normal conflict */ - return pool_queuetowhatprovides(pool, &q); + n = -n; /* no other package found, generate normal conflict */ + else + n = pool_queuetowhatprovides(pool, &q); + queue_free(&q); + return n; } static inline void @@ -2649,8 +2652,26 @@ } if (rid >= solv->bestrules && rid < solv->bestrules_end) { + if (fromp && solv->bestrules_pkg[rid - solv->bestrules] > 0) + *fromp = solv->bestrules_pkg[rid - solv->bestrules]; return SOLVER_RULE_BEST; } + if (rid >= solv->yumobsrules && rid < solv->yumobsrules_end) + { + if (fromp) + *fromp = -r->p; + if (top) + { + /* first solvable is enough, we just need it for the name */ + if (!r->d || r->d == -1) + *top = r->w2; + else + *top = pool->whatprovidesdata[r->d < 0 ? -r->d : r->d]; + } + if (depp) + *depp = solv->yumobsrules_info[rid - solv->yumobsrules]; + return SOLVER_RULE_YUMOBS; + } if (rid >= solv->choicerules && rid < solv->choicerules_end) { return SOLVER_RULE_CHOICE; @@ -2681,6 +2702,8 @@ return SOLVER_RULE_INFARCH; if (rid >= solv->bestrules && rid < solv->bestrules_end) return SOLVER_RULE_BEST; + if (rid >= solv->yumobsrules && rid < solv->yumobsrules_end) + return SOLVER_RULE_YUMOBS; if (rid >= solv->choicerules && rid < solv->choicerules_end) return SOLVER_RULE_CHOICE; if (rid >= solv->learntrules) @@ -3248,6 +3271,229 @@ queue_free(&r2pkg); } + + + +/* yumobs rule handling */ + +static void +find_obsolete_group(Solver *solv, Id obs, Queue *q) +{ + Pool *pool = solv->pool; + Queue qn; + Id p2, pp2, op, *opp, opp2; + int i, j, qnc, ncnt; + + queue_empty(q); + FOR_PROVIDES(p2, pp2, obs) + { + Solvable *s2 = pool->solvables + p2; + if (s2->repo != pool->installed) + continue; + if (!pool->obsoleteusesprovides && !pool_match_nevr(pool, pool->solvables + p2, obs)) + continue; + /* we obsolete installed package s2 with obs. now find all other packages that have the same dep */ + for (opp = solv->obsoletes_data + solv->obsoletes[p2 - solv->installed->start]; (op = *opp++) != 0;) + { + Solvable *os = pool->solvables + op; + Id obs2, *obsp2; + if (!os->obsoletes) + continue; + if (pool->obsoleteusescolors && !pool_colormatch(pool, s2, os)) + continue; + obsp2 = os->repo->idarraydata + os->obsoletes; + while ((obs2 = *obsp2++) != 0) + if (obs2 == obs) + break; + if (obs2) + queue_pushunique(q, op); + } + /* also search packages with the same name */ + FOR_PROVIDES(op, opp2, s2->name) + { + Solvable *os = pool->solvables + op; + Id obs2, *obsp2; + if (os->name != s2->name) + continue; + if (!os->obsoletes) + continue; + if (pool->obsoleteusescolors && !pool_colormatch(pool, s2, os)) + continue; + obsp2 = os->repo->idarraydata + os->obsoletes; + while ((obs2 = *obsp2++) != 0) + if (obs2 == obs) + break; + if (obs2) + queue_pushunique(q, op); + } + } + /* find names so that we can build groups */ + queue_init_clone(&qn, q); + prune_to_best_version(solv->pool, &qn); +#if 0 +{ + for (i = 0; i < qn.count; i++) + printf(" + %s\n", pool_solvid2str(pool, qn.elements[i])); +} +#endif + /* filter into name groups */ + qnc = qn.count; + if (qnc == 1) + { + queue_free(&qn); + queue_empty(q); + return; + } + ncnt = 0; + for (i = 0; i < qnc; i++) + { + Id n = pool->solvables[qn.elements[i]].name; + int got = 0; + for (j = 0; j < q->count; j++) + { + Id p = q->elements[j]; + if (pool->solvables[p].name == n) + { + queue_push(&qn, p); + got = 1; + } + } + if (got) + { + queue_push(&qn, 0); + ncnt++; + } + } + if (ncnt <= 1) + { + queue_empty(q); + } + else + { + queue_empty(q); + queue_insertn(q, 0, qn.count - qnc, qn.elements + qnc); + } + queue_free(&qn); +} + +void +solver_addyumobsrules(Solver *solv) +{ + Pool *pool = solv->pool; + Repo *installed = solv->installed; + Id p, op, *opp; + Solvable *s; + Queue qo, qq, yumobsinfoq; + int i, j, k; + unsigned int now; + + solv->yumobsrules = solv->nrules; + if (!installed || !solv->obsoletes) + { + solv->yumobsrules_end = solv->nrules; + return; + } + now = solv_timems(0); + queue_init(&qo); + FOR_REPO_SOLVABLES(installed, p, s) + { + if (!solv->obsoletes[p - installed->start]) + continue; +#if 0 +printf("checking yumobs for %s\n", pool_solvable2str(pool, s)); +#endif + queue_empty(&qo); + for (opp = solv->obsoletes_data + solv->obsoletes[p - installed->start]; (op = *opp++) != 0;) + { + Solvable *os = pool->solvables + op; + Id obs, *obsp = os->repo->idarraydata + os->obsoletes; + Id p2, pp2; + while ((obs = *obsp++) != 0) + { + FOR_PROVIDES(p2, pp2, obs) + { + Solvable *s2 = pool->solvables + p2; + if (s2->repo != installed) + continue; + if (!pool->obsoleteusesprovides && !pool_match_nevr(pool, pool->solvables + p2, obs)) + continue; + if (pool->obsoleteusescolors && !pool_colormatch(pool, s, s2)) + continue; + queue_pushunique(&qo, obs); + break; + } + } + } + } + if (!qo.count) + { + queue_free(&qo); + return; + } + queue_init(&yumobsinfoq); + queue_init(&qq); + for (i = 0; i < qo.count; i++) + { + int group, groupk, groupstart; + queue_empty(&qq); +#if 0 +printf("investigating %s\n", pool_dep2str(pool, qo.elements[i])); +#endif + find_obsolete_group(solv, qo.elements[i], &qq); +#if 0 +printf("result:\n"); +for (j = 0; j < qq.count; j++) + if (qq.elements[j] == 0) + printf("---\n"); + else + printf("%s\n", pool_solvid2str(pool, qq.elements[j])); +#endif + + if (!qq.count) + continue; + /* at least two goups, build rules */ + group = 0; + for (j = 0; j < qq.count; j++) + { + p = qq.elements[j]; + if (!p) + { + group++; + continue; + } + if (pool->solvables[p].repo == installed) + continue; + groupk = 0; + groupstart = 0; + for (k = 0; k < qq.count; k++) + { + Id pk = qq.elements[k]; + if (pk) + continue; + if (group != groupk && k > groupstart) + { + /* add the rule */ + Queue qhelper; + memset(&qhelper, 0, sizeof(qhelper)); + qhelper.count = k - groupstart; + qhelper.elements = qq.elements + groupstart; + solver_addrule(solv, -p, pool_queuetowhatprovides(pool, &qhelper)); + queue_push(&yumobsinfoq, qo.elements[i]); + } + groupstart = k + 1; + groupk++; + } + } + } + if (yumobsinfoq.count) + solv->yumobsrules_info = solv_memdup2(yumobsinfoq.elements, yumobsinfoq.count, sizeof(Id)); + queue_free(&yumobsinfoq); + queue_free(&qq); + queue_free(&qo); + solv->yumobsrules_end = solv->nrules; + POOL_DEBUG(SOLV_DEBUG_STATS, "yumobs rule creation took %d ms\n", solv_timems(now)); +} + #undef CLEANDEPSDEBUG /* diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.6.4/src/rules.h new/libsolv-0.6.5/src/rules.h --- old/libsolv-0.6.4/src/rules.h 2014-07-01 11:09:49.000000000 +0200 +++ new/libsolv-0.6.5/src/rules.h 2014-07-25 18:27:17.000000000 +0200 @@ -69,7 +69,8 @@ SOLVER_RULE_INFARCH = 0x600, SOLVER_RULE_CHOICE = 0x700, SOLVER_RULE_LEARNT = 0x800, - SOLVER_RULE_BEST = 0x900 + SOLVER_RULE_BEST = 0x900, + SOLVER_RULE_YUMOBS = 0xa00 } SolverRuleinfo; #define SOLVER_RULE_TYPEMASK 0xff00 @@ -127,6 +128,9 @@ /* best rules */ extern void solver_addbestrules(struct _Solver *solv, int havebestinstalljobs); +/* yumobs rules */ +extern void solver_addyumobsrules(struct _Solver *solv); + /* policy rule disabling/reenabling */ extern void solver_disablepolicyrules(struct _Solver *solv); extern void solver_reenablepolicyrules(struct _Solver *solv, int jobidx); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.6.4/src/selection.c new/libsolv-0.6.5/src/selection.c --- old/libsolv-0.6.4/src/selection.c 2014-07-01 11:09:49.000000000 +0200 +++ new/libsolv-0.6.5/src/selection.c 2014-07-14 13:42:05.000000000 +0200 @@ -551,6 +551,14 @@ Queue q; int type; + /* all files in the file list start with a '/' */ + if (*name != '/') + { + if (!(flags & SELECTION_GLOB)) + return 0; + if (*name != '*' && *name != '[' && *name != '?') + return 0; + } type = !(flags & SELECTION_GLOB) || strpbrk(name, "[*?") == 0 ? SEARCH_STRING : SEARCH_GLOB; if ((flags & SELECTION_NOCASE) != 0) type |= SEARCH_NOCASE; @@ -842,7 +850,7 @@ int ret = 0; queue_empty(selection); - if (*name == '/' && (flags & SELECTION_FILELIST)) + if ((flags & SELECTION_FILELIST) != 0) ret = selection_filelist(pool, selection, name, flags); if (!ret && (flags & SELECTION_REL) != 0 && strpbrk(name, "<=>") != 0) ret = selection_rel(pool, selection, name, flags); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.6.4/src/solver.c new/libsolv-0.6.5/src/solver.c --- old/libsolv-0.6.4/src/solver.c 2014-07-01 11:09:49.000000000 +0200 +++ new/libsolv-0.6.5/src/solver.c 2014-07-25 18:27:17.000000000 +0200 @@ -1681,6 +1681,7 @@ solv_free(solv->specialupdaters); solv_free(solv->choicerules_ref); solv_free(solv->bestrules_pkg); + solv_free(solv->yumobsrules_info); solv_free(solv->instbuddy); solv_free(solv); } @@ -1730,6 +1731,8 @@ return solv->break_orphans; case SOLVER_FLAG_FOCUS_INSTALLED: return solv->focus_installed; + case SOLVER_FLAG_YUM_OBSOLETES: + return solv->do_yum_obsoletes; default: break; } @@ -1802,6 +1805,9 @@ case SOLVER_FLAG_FOCUS_INSTALLED: solv->focus_installed = value; break; + case SOLVER_FLAG_YUM_OBSOLETES: + solv->do_yum_obsoletes = value; + break; default: break; } @@ -3401,6 +3407,7 @@ queuep_free(&solv->cleandeps_updatepkgs); queue_empty(&solv->ruleassertions); solv->bestrules_pkg = solv_free(solv->bestrules_pkg); + solv->yumobsrules_info = solv_free(solv->yumobsrules_info); solv->choicerules_ref = solv_free(solv->choicerules_ref); if (solv->noupdate.size) map_empty(&solv->noupdate); @@ -3963,6 +3970,11 @@ if (hasdupjob) solver_freedupmaps(solv); /* no longer needed */ + if (solv->do_yum_obsoletes) + solver_addyumobsrules(solv); + else + solv->yumobsrules = solv->yumobsrules_end = solv->nrules; + if (1) solver_addchoicerules(solv); else diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.6.4/src/solver.h new/libsolv-0.6.5/src/solver.h --- old/libsolv-0.6.4/src/solver.h 2014-07-01 11:09:49.000000000 +0200 +++ new/libsolv-0.6.5/src/solver.h 2014-07-25 18:27:17.000000000 +0200 @@ -70,6 +70,10 @@ Id bestrules_end; Id *bestrules_pkg; + Id yumobsrules; /* rules from yum obsoletes handling */ + Id yumobsrules_end; + Id *yumobsrules_info; /* the dependency for each rule */ + Id choicerules; /* choice rules (always weak) */ Id choicerules_end; Id *choicerules_ref; @@ -161,6 +165,7 @@ int bestobeypolicy; /* true: stay in policy with the best rules */ int noautotarget; /* true: do not assume targeted for up/dup jobs that contain no installed solvable */ int focus_installed; /* true: resolve update rules first */ + int do_yum_obsoletes; /* true: add special yumobs rules */ Map dupmap; /* dup these packages*/ int dupmap_all; /* dup all packages */ @@ -289,6 +294,7 @@ #define SOLVER_FLAG_KEEP_ORPHANS 18 #define SOLVER_FLAG_BREAK_ORPHANS 19 #define SOLVER_FLAG_FOCUS_INSTALLED 20 +#define SOLVER_FLAG_YUM_OBSOLETES 21 #define GET_USERINSTALLED_NAMES (1 << 0) /* package names instead if ids */ #define GET_USERINSTALLED_INVERTED (1 << 1) /* autoinstalled */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.6.4/src/solverdebug.c new/libsolv-0.6.5/src/solverdebug.c --- old/libsolv-0.6.4/src/solverdebug.c 2014-07-01 11:09:49.000000000 +0200 +++ new/libsolv-0.6.5/src/solverdebug.c 2014-07-25 18:27:17.000000000 +0200 @@ -126,6 +126,8 @@ POOL_DEBUG(type, "UPDATE "); else if (p >= solv->featurerules && p < solv->featurerules_end) POOL_DEBUG(type, "FEATURE "); + else if (p >= solv->yumobsrules && p < solv->yumobsrules_end) + POOL_DEBUG(type, "YUMOBS "); solver_printrule(solv, type, r); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.6.4/src/strpool.c new/libsolv-0.6.5/src/strpool.c --- old/libsolv-0.6.4/src/strpool.c 2014-07-01 11:09:49.000000000 +0200 +++ new/libsolv-0.6.5/src/strpool.c 2014-08-29 13:11:37.000000000 +0200 @@ -93,7 +93,7 @@ hashtbl = ss->stringhashtbl; /* expand hashtable if needed */ - if (ss->nstrings * 2 > hashmask) + if ((Hashval)ss->nstrings * 2 > hashmask) { solv_free(hashtbl); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.6.4/src/transaction.c new/libsolv-0.6.5/src/transaction.c --- old/libsolv-0.6.4/src/transaction.c 2014-07-01 11:09:49.000000000 +0200 +++ new/libsolv-0.6.5/src/transaction.c 2014-09-16 10:56:09.000000000 +0200 @@ -666,7 +666,7 @@ 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; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.6.4/test/testcases/yumobs/split.t new/libsolv-0.6.5/test/testcases/yumobs/split.t --- old/libsolv-0.6.4/test/testcases/yumobs/split.t 1970-01-01 01:00:00.000000000 +0100 +++ new/libsolv-0.6.5/test/testcases/yumobs/split.t 2014-07-29 11:40:49.000000000 +0200 @@ -0,0 +1,24 @@ +repo system 0 testtags <inline> +#>=Ver: 2.0 +#>=Pkg: c 27 1 x86_64 +repo available 0 testtags <inline> +#>=Ver: 2.0 +#>=Pkg: d 28 1 x86_64 +#>=Obs: c +#>=Pkg: e 28 1 x86_64 +#>=Obs: c + +system x86_64 rpm system + +job update all packages +result transaction,problems <inline> +#>erase c-27-1.x86_64@system d-28-1.x86_64@available +#>install d-28-1.x86_64@available + +nextjob +solverflags yumobsoletes +job update all packages +result transaction,problems <inline> +#>erase c-27-1.x86_64@system d-28-1.x86_64@available +#>install d-28-1.x86_64@available +#>install e-28-1.x86_64@available diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.6.4/tools/testsolv.c new/libsolv-0.6.5/tools/testsolv.c --- old/libsolv-0.6.4/tools/testsolv.c 2014-07-01 11:09:49.000000000 +0200 +++ new/libsolv-0.6.5/tools/testsolv.c 2014-07-14 13:26:15.000000000 +0200 @@ -141,8 +141,11 @@ printf("test %d:\n", multijob++); if (list) { + int selflags = SELECTION_NAME|SELECTION_PROVIDES|SELECTION_CANON|SELECTION_DOTARCH|SELECTION_REL|SELECTION_GLOB|SELECTION_FLAT; + if (*list == '/') + selflags |= SELECTION_FILELIST; queue_empty(&job); - selection_make(pool, &job, list, SELECTION_NAME|SELECTION_PROVIDES|SELECTION_FILELIST|SELECTION_CANON|SELECTION_DOTARCH|SELECTION_REL|SELECTION_GLOB|SELECTION_FLAT); + selection_make(pool, &job, list, selflags); if (!job.elements) printf("No match\n"); else -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
