X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=ext%2Frepo_deb.c;h=5af0c70b942b5537410b59f3d9da5c8d12c90296;hb=2d84f3efc00621de607022f3d7bb91f6c109fc69;hp=2e1977bf3fbbe70bdd56b693f8426e7ec0f35ad4;hpb=765ead528d2b791e43e2a90212b5e4a0c2ad1302;p=platform%2Fupstream%2Flibsolv.git diff --git a/ext/repo_deb.c b/ext/repo_deb.c index 2e1977b..5af0c70 100644 --- a/ext/repo_deb.c +++ b/ext/repo_deb.c @@ -122,7 +122,14 @@ parseonedep(Pool *pool, char *p) while (*p == ' ' || *p == '\t' || *p == '\n') p++; } - name = pool_strn2id(pool, n, ne - n, 1); + if (ne - n > 4 && ne[-4] == ':' && !strncmp(ne - 4, ":any", 4)) + { + /* multiarch annotation */ + name = pool_strn2id(pool, n, ne - n - 4, 1); + name = pool_rel2id(pool, name, ARCH_ANY, REL_MULTIARCH, 1); + } + else + name = pool_strn2id(pool, n, ne - n, 1); if (e) { evr = pool_strn2id(pool, e, ee - e, 1); @@ -274,7 +281,7 @@ control2solvable(Solvable *s, Repodata *data, char *control) break; case 'R' << 8 | 'E': if (!strcasecmp(tag, "replaces")) - s->obsoletes = makedeps(repo, q, s->conflicts, 0); + s->obsoletes = makedeps(repo, q, s->obsoletes, 0); else if (!strcasecmp(tag, "recommends")) s->recommends = makedeps(repo, q, s->recommends, 0); break; @@ -329,22 +336,30 @@ control2solvable(Solvable *s, Repodata *data, char *control) if (s->obsoletes) { /* obsoletes only count when the packages also conflict */ + /* XXX: should not transcode here */ int i, j, k; - Id d; + Id d, cid; for (i = j = s->obsoletes; (d = repo->idarraydata[i]) != 0; i++) { - if (s->conflicts) + if (!s->conflicts) + continue; + for (k = s->conflicts; (cid = repo->idarraydata[k]) != 0; k++) { - for (k = s->conflicts; repo->idarraydata[k] != 0; k++) - if (repo->idarraydata[k] == d) - break; - if (repo->idarraydata[k]) + if (repo->idarraydata[k] == cid) + break; + if (ISRELDEP(cid)) { - repo->idarraydata[j++] = d; + Reldep *rd = GETRELDEP(pool, cid); + if (rd->flags < 8 && rd->name == d) + break; /* specialize obsoletes */ } } + if (cid) + repo->idarraydata[j++] = cid; } repo->idarraydata[j] = 0; + if (j == s->obsoletes) + s->obsoletes = 0; } } @@ -509,9 +524,9 @@ repo_add_deb(Repo *repo, const char *deb, int flags) gotpkgid = 0; if (flags & DEBS_ADD_WITH_PKGID) { - void *handle = solv_chksum_create(REPOKEY_TYPE_MD5); - solv_chksum_add(handle, ctgz, clen); - solv_chksum_free(handle, pkgid); + Chksum *chk = solv_chksum_create(REPOKEY_TYPE_MD5); + solv_chksum_add(chk, ctgz, clen); + solv_chksum_free(chk, pkgid); gotpkgid = 1; } if (ctgz[0] != 0x1f || ctgz[1] != 0x8b) @@ -587,7 +602,8 @@ repo_add_deb(Repo *repo, const char *deb, int flags) ctar[l2] = 0; s = pool_id2solvable(pool, repo_add_solvable(repo)); control2solvable(s, data, (char *)ctar); - repodata_set_location(data, s - pool->solvables, 0, 0, deb); + if (!(flags & REPO_NO_LOCATION)) + repodata_set_location(data, s - pool->solvables, 0, 0, deb); if (S_ISREG(stb.st_mode)) repodata_set_num(data, s - pool->solvables, SOLVABLE_DOWNLOADSIZE, (unsigned long long)stb.st_size); if (gotpkgid)