Hello community, here is the log from the commit of package perl-BSSolv for openSUSE:Factory checked in at 2012-10-23 21:25:04 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/perl-BSSolv (Old) and /work/SRC/openSUSE:Factory/.perl-BSSolv.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "perl-BSSolv", Maintainer is "[email protected]" Changes: -------- --- /work/SRC/openSUSE:Factory/perl-BSSolv/perl-BSSolv.changes 2012-05-09 18:32:44.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.perl-BSSolv.new/perl-BSSolv.changes 2012-10-23 21:25:05.000000000 +0200 @@ -1,0 +2,7 @@ +Mon Oct 15 17:46:37 CEST 2012 - [email protected] + +- update libsolv and BSSolv.xs to current version + * export all dependencies + * obey package conflicts when expanding + +------------------------------------------------------------------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ BSSolv.xs ++++++ --- /var/tmp/diff_new_pack.rsy2eJ/_old 2012-10-23 21:25:10.000000000 +0200 +++ /var/tmp/diff_new_pack.rsy2eJ/_new 2012-10-23 21:25:10.000000000 +0200 @@ -69,6 +69,8 @@ return KEY_STORAGE_DROPPED; if (key->name == SOLVABLE_LICENSE) return KEY_STORAGE_DROPPED; + if (key->name == SOLVABLE_PKGID) + return KEY_STORAGE_INCORE; i = repo_write_stdkeyfilter(repo, key, kfdata); if (i == KEY_STORAGE_VERTICAL_OFFSET) return KEY_STORAGE_DROPPED; @@ -181,12 +183,120 @@ return pool_rel2id(pool, id, pool_strn2id(pool, n, s - n, 1), flags, 1); } +static inline Offset +importdeps(HV *hv, const char *key, int keyl, Repo *repo) +{ + Pool *pool = repo->pool; + int i; + AV *av = hvlookupav(hv, key, keyl); + Offset off = 0; + if (av) + { + for (i = 0; i <= av_len(av); i++) + { + char *str = avlookupstr(av, i); + if (str) + off = repo_addid_dep(repo, off, dep2id(pool, str), 0); + } + } + return off; +} + +void +exportdeps(HV *hv, const char *key, int keyl, Repo *repo, Offset off, Id skey) +{ + Pool *pool = repo->pool; + AV *av; + Id id, *pp; + const char *str; + + if (!off || !repo->idarraydata[off]) + return; + pp = repo->idarraydata + off; + av = 0; + while ((id = *pp++)) + { + if (id == SOLVABLE_FILEMARKER) + break; + str = pool_dep2str(pool, id); + if (ISRELDEP(id)) + { + Reldep *rd = GETRELDEP(pool, id); + if (skey == SOLVABLE_CONFLICTS && rd->flags == REL_NAMESPACE && rd->name == NAMESPACE_OTHERPROVIDERS) + { + if (!strncmp(str, "namespace:", 10)) + str += 10; + } + if (skey == SOLVABLE_SUPPLEMENTS) + { + if (rd->flags == REL_NAMESPACE && rd->name == NAMESPACE_FILESYSTEM) + { + if (!strncmp(str, "namespace:", 10)) + str += 10; + } + else if (rd->flags == REL_NAMESPACE && rd->name == NAMESPACE_MODALIAS) + { + if (!strncmp(str, "namespace:", 10)) + str += 10; + } + else if (rd->flags == REL_AND) + { + /* either packageand chain or modalias */ + str = 0; + if (ISRELDEP(rd->evr)) + { + Reldep *mrd = GETRELDEP(pool, rd->evr); + if (mrd->flags == REL_NAMESPACE && mrd->name == NAMESPACE_MODALIAS) + { + str = pool_tmpjoin(pool, "modalias(", pool_dep2str(pool, rd->name), ":"); + str = pool_tmpappend(pool, str, pool_dep2str(pool, mrd->evr), ")"); + } + else if (mrd->flags >= 8) + continue; + } + if (!str) + { + /* must be and chain */ + str = pool_dep2str(pool, rd->evr); + for (;;) + { + id = rd->name; + if (!ISRELDEP(id)) + break; + rd = GETRELDEP(pool, id); + if (rd->flags != REL_AND) + break; + str = pool_tmpjoin(pool, pool_dep2str(pool, rd->evr), ":", str); + } + str = pool_tmpjoin(pool, pool_dep2str(pool, id), ":", str); + str = pool_tmpjoin(pool, "packageand(", str, ")"); + } + } + else if (rd->flags >= 8) + continue; + } + } + if (skey == SOLVABLE_REQUIRES) + { + if (id == SOLVABLE_PREREQMARKER) + continue; + if (*str == 'r' && !strncmp(str, "rpmlib(", 7)) + continue; + } + if (!av) + av = newAV(); + av_push(av, newSVpv(str, 0)); + } + if (av) + (void)hv_store(hv, key, keyl, newRV_noinc((SV*)av), 0); +} + static inline void expander_installed(Expander *xp, Id p, Map *installed, Map *conflicts, Queue *out, Queue *todo) { Pool *pool = xp->pool; Solvable *s = pool->solvables + p; - Id req, id, *reqp; + Id req, id, *reqp, con, *conp; const char *n; MAPSET(installed, p); @@ -246,10 +356,61 @@ queue_push2(todo, req, p); } } + if (s->conflicts) + { + conp = s->repo->idarraydata + s->conflicts; + while ((con = *conp++) != 0) + { + Id p2, pp2; + FOR_PROVIDES(p2, pp2, con) + { + if (p2 == p) + continue; + MAPEXP(conflicts, pool->nsolvables); + MAPSET(conflicts, p2); + } + } + } + if (s->obsoletes) + { + conp = s->repo->idarraydata + s->obsoletes; + while ((con = *conp++) != 0) + { + Id p2, pp2; + FOR_PROVIDES(p2, pp2, con) + { + if (p2 == p || !pool_match_nevr(pool, pool->solvables + p2, con)) + continue; + MAPEXP(conflicts, pool->nsolvables); + MAPSET(conflicts, p2); + } + } + } } -#define ERROR_NOPROVIDER 1 -#define ERROR_CHOICE 2 +static inline int +expander_checkconflicts(Pool *pool, Id p, Map *installed, Id *conflicts, int isobsoletes) +{ + Id con, p2, pp2; + + while ((con = *conflicts++) != 0) + { + FOR_PROVIDES(p2, pp2, con) + { + if (p == p2) + continue; + if (isobsoletes && !pool_match_nevr(pool, pool->solvables + p2, con)) + continue; + if (MAPTST(installed, p2)) + return 1; + } + } + return 0; +} + +#define ERROR_NOPROVIDER 1 +#define ERROR_CHOICE 2 +#define ERROR_CONFLICTINGPROVIDER 3 int @@ -261,7 +422,7 @@ Map conflicts; Solvable *s; Id q, p, pp; - int i, j, nerrors, doamb, ambcnt; + int i, j, nerrors, doamb, ambcnt, conflprov; Id id, who, whon, pn; map_init(&installed, pool->nsolvables); @@ -330,6 +491,7 @@ // fflush(stdout); whon = pool->solvables[who].name; queue_empty(&qq); + conflprov = 0; FOR_PROVIDES(p, pp, id) { Id pn; @@ -345,14 +507,27 @@ break; } if (conflicts.size && MAPTST(&conflicts, p)) - continue; + { + conflprov = 1; + continue; + } + if (pool->solvables[p].conflicts && expander_checkconflicts(pool, p, &installed, pool->solvables[p].repo->idarraydata + pool->solvables[p].conflicts, 0)) + { + conflprov = 1; + continue; + } + if (pool->solvables[p].obsoletes && expander_checkconflicts(pool, p, &installed, pool->solvables[p].repo->idarraydata + pool->solvables[p].obsoletes, 1)) + { + conflprov = 1; + continue; + } queue_push(&qq, p); } if (p) continue; if (qq.count == 0) { - queue_push(&errors, ERROR_NOPROVIDER); + queue_push(&errors, conflprov ? ERROR_CONFLICTINGPROVIDER : ERROR_NOPROVIDER); queue_push2(&errors, id, who); continue; } @@ -1247,8 +1422,6 @@ Repodata *data; SV *sv; HV *hv; - AV *av; - int i; char *str, *key; I32 keyl; Id p; @@ -1296,26 +1469,14 @@ str = hvlookupstr(hv, "hdrmd5", 6); if (str && strlen(str) == 32) repodata_set_checksum(data, p, SOLVABLE_PKGID, REPOKEY_TYPE_MD5, str); - av = hvlookupav(hv, "provides", 8); - if (av) - { - for (i = 0; i <= av_len(av); i++) - { - str = avlookupstr(av, i); - if (str) - s->provides = repo_addid_dep(repo, s->provides, dep2id(pool, str), 0); - } - } - av = hvlookupav(hv, "requires", 8); - if (av) - { - for (i = 0; i <= av_len(av); i++) - { - str = avlookupstr(av, i); - if (str) - s->requires = repo_addid_dep(repo, s->requires, dep2id(pool, str), 0); - } - } + s->provides = importdeps(hv, "provides", 8, repo); + s->obsoletes = importdeps(hv, "obsoletes", 9, repo); + s->conflicts = importdeps(hv, "conflicts", 9, repo); + s->requires = importdeps(hv, "requires", 8, repo); + s->recommends = importdeps(hv, "recommends", 10, repo); + s->suggests = importdeps(hv, "suggests", 8, repo); + s->supplements = importdeps(hv, "supplements", 11, repo); + s->enhances = importdeps(hv, "enhances", 8, repo); if (!s->evr && s->provides) { /* look for self provides */ @@ -1498,7 +1659,6 @@ CODE: { Solvable *s = pool->solvables + p; - AV *av; Id id; const char *ss, *se; unsigned int medianr; @@ -1526,35 +1686,14 @@ else (void)hv_store(RETVAL, "version", 7, newSVpv(ss, 0), 0); (void)hv_store(RETVAL, "arch", 4, newSVpv(pool_id2str(pool, s->arch), 0), 0); - av = newAV(); - if (s->provides) - { - Id *pp = s->repo->idarraydata + s->provides; - while ((id = *pp++)) - { - if (id == SOLVABLE_FILEMARKER) - break; - av_push(av, newSVpv(pool_dep2str(pool, id), 0)); - } - } - (void)hv_store(RETVAL, "provides", 8, newRV_noinc((SV*)av), 0); - av = newAV(); - if (s->requires) - { - Id *pp = s->repo->idarraydata + s->requires; - while ((id = *pp++)) - { - if (id == SOLVABLE_PREREQMARKER) - continue; - ss = pool_dep2str(pool, id); - if (*ss == '/') - continue; - if (*ss == 'r' && !strncmp(ss, "rpmlib(", 7)) - continue; - av_push(av, newSVpv(ss, 0)); - } - } - (void)hv_store(RETVAL, "requires", 8, newRV_noinc((SV*)av), 0); + exportdeps(RETVAL, "provides", 8, s->repo, s->provides, SOLVABLE_PROVIDES); + exportdeps(RETVAL, "obsoletes", 9, s->repo, s->obsoletes, SOLVABLE_OBSOLETES); + exportdeps(RETVAL, "conflicts", 9, s->repo, s->conflicts, SOLVABLE_CONFLICTS); + exportdeps(RETVAL, "requires", 8, s->repo, s->requires, SOLVABLE_REQUIRES); + exportdeps(RETVAL, "recommends", 10, s->repo, s->recommends, SOLVABLE_RECOMMENDS); + exportdeps(RETVAL, "suggests", 8, s->repo, s->suggests, SOLVABLE_SUGGESTS); + exportdeps(RETVAL, "supplements", 11, s->repo, s->supplements, SOLVABLE_SUPPLEMENTS); + exportdeps(RETVAL, "enhances", 8, s->repo, s->enhances, SOLVABLE_ENHANCES); if (solvable_lookup_void(s, SOLVABLE_SOURCENAME)) ss = pool_id2str(pool, s->name); else @@ -2148,6 +2287,16 @@ sv = newSVpvf("nothing provides %s", pool_dep2str(pool, id)); i += 3; } + else if (type == ERROR_CONFLICTINGPROVIDER) + { + id = out.elements[i + 1]; + who = out.elements[i + 2]; + if (who) + sv = newSVpvf("conflict for all providers of %s needed by %s", pool_dep2str(pool, id), pool_id2str(pool, pool->solvables[who].name)); + else + sv = newSVpvf("conflict for all providers of %s", pool_dep2str(pool, id)); + i += 3; + } else if (type == ERROR_CHOICE) { int j; ++++++ libsolv-0.1.0.tar.bz2 ++++++ ++++ 2887 lines of diff (skipped) -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
