From: DongHun Kwak Date: Fri, 27 Nov 2020 05:49:33 +0000 (+0900) Subject: Imported Upstream version 0.7.15 X-Git-Tag: upstream/0.7.15^0 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fupstream%2Flibsolv.git;a=commitdiff_plain;h=b712cabb59f7155205489f15a37addb4ac8b0069 Imported Upstream version 0.7.15 --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 767aa66..3541f49 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -209,6 +209,12 @@ ENDIF (ENABLE_RPMDB) INCLUDE (CheckIncludeFile) IF (ENABLE_RPMDB OR ENABLE_RPMPKG_LIBRPM) + FIND_PATH (RPM_INCLUDE_DIR NAMES rpm/rpmio.h) + IF (RPM_INCLUDE_DIR) + INCLUDE_DIRECTORIES (${RPM_INCLUDE_DIR}) + SET (CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} ${RPM_INCLUDE_DIR}) + ENDIF (RPM_INCLUDE_DIR) + FIND_LIBRARY (RPMDB_LIBRARY NAMES rpmdb) IF (NOT RPMDB_LIBRARY) diff --git a/NEWS b/NEWS index 69a5c4b..7ca7e4b 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,17 @@ This file contains the major changes between libsolv versions: +Version 0.7.15 +- selected bug fixes: + * fix deduceq2addedmap clearing bits outside of the map + * conda: feature depriorization first + * conda: fix startswith implementation + * move find_update_seeds() call in cleandeps calculation +- new features: + * set SOLVABLE_BUILDHOST in rpm and rpmmd parsers + * new testcase_mangle_repo_names() function + * new solv_fmemopen() function + Version 0.7.14 - added support for ed25519 signatures - selected bug fixes: diff --git a/VERSION.cmake b/VERSION.cmake index 0bf518b..5c9b9e6 100644 --- a/VERSION.cmake +++ b/VERSION.cmake @@ -49,5 +49,5 @@ SET(LIBSOLVEXT_SOVERSION "1") SET(LIBSOLV_MAJOR "0") SET(LIBSOLV_MINOR "7") -SET(LIBSOLV_PATCH "14") +SET(LIBSOLV_PATCH "15") diff --git a/ext/libsolvext.ver b/ext/libsolvext.ver index 6423837..4102301 100644 --- a/ext/libsolvext.ver +++ b/ext/libsolvext.ver @@ -55,6 +55,7 @@ SOLV_1.0 { rpm_stat_database; rpm_state_create; rpm_state_free; + solv_fmemopen; solv_verify_sig; solv_xfopen; solv_xfopen_buf; @@ -66,6 +67,7 @@ SOLV_1.0 { testcase_add_testtags; testcase_dep2str; testcase_job2str; + testcase_mangle_repo_names; testcase_solvid2str; testcase_str2dep; testcase_str2job; diff --git a/ext/repo_rpmdb.c b/ext/repo_rpmdb.c index ed98628..67ce81d 100644 --- a/ext/repo_rpmdb.c +++ b/ext/repo_rpmdb.c @@ -1189,6 +1189,9 @@ rpmhead2solv(Pool *pool, Repo *repo, Repodata *data, Solvable *s, RpmHead *rpmhe u32 = headint32(rpmhead, TAG_BUILDTIME); if (u32) repodata_set_num(data, handle, SOLVABLE_BUILDTIME, u32); + str = headstring(rpmhead, TAG_BUILDHOST); + if (str) + repodata_set_str(data, handle, SOLVABLE_BUILDHOST, str); u32 = headint32(rpmhead, TAG_INSTALLTIME); if (u32) repodata_set_num(data, handle, SOLVABLE_INSTALLTIME, u32); diff --git a/ext/repo_rpmmd.c b/ext/repo_rpmmd.c index 9bb50a0..1232e43 100644 --- a/ext/repo_rpmmd.c +++ b/ext/repo_rpmmd.c @@ -96,6 +96,7 @@ enum state { STATE_FRESHENS, STATE_SOURCERPM, STATE_HEADERRANGE, + STATE_BUILDHOST, STATE_PROVIDESENTRY, STATE_REQUIRESENTRY, @@ -196,6 +197,7 @@ static struct solv_xmlparser_element stateswitches[] = { { STATE_SOLVABLE, "rpm:freshens", STATE_FRESHENS, 0 }, { STATE_SOLVABLE, "rpm:sourcerpm", STATE_SOURCERPM, 1 }, { STATE_SOLVABLE, "rpm:header-range", STATE_HEADERRANGE, 0 }, + { STATE_SOLVABLE, "rpm:buildhost", STATE_BUILDHOST, 1 }, { STATE_SOLVABLE, "file", STATE_FILE, 1 }, { STATE_SOLVABLE, "changelog", STATE_CHANGELOG, 1 }, @@ -1036,6 +1038,10 @@ endElement(struct solv_xmlparser *xmlp, int state, char *content) if (*content) repodata_set_poolstr(pd->data, handle, SOLVABLE_PACKAGER, content); break; + case STATE_BUILDHOST: + if (*content) + repodata_set_str(pd->data, handle, SOLVABLE_BUILDHOST, content); + break; case STATE_SOURCERPM: if (*content) repodata_set_sourcepkg(pd->data, handle, content); diff --git a/ext/solv_xfopen.c b/ext/solv_xfopen.c index 4bb4628..7e974a9 100644 --- a/ext/solv_xfopen.c +++ b/ext/solv_xfopen.c @@ -798,6 +798,7 @@ struct bufcookie { size_t *buflp; char *freemem; size_t bufl_int; + char *buf_int; }; static ssize_t cookie_bufread(void *cookie, char *buf, size_t nbytes) @@ -870,30 +871,48 @@ solv_xfopen_buf(const char *fn, char **bufp, size_t *buflp, const char *mode) return fp; } +FILE * +solv_fmemopen(const char *buf, size_t bufl, const char *mode) +{ + struct bufcookie *bc; + FILE *fp; + if (*mode != 'r') + return 0; + bc = solv_calloc(1, sizeof(*bc)); + bc->buf_int = (char *)buf; + bc->bufl_int = bufl; + bc->bufp = &bc->buf_int; + bc->buflp = &bc->bufl_int; + fp = cookieopen(bc, mode, cookie_bufread, cookie_bufwrite, cookie_bufclose); + if (!strcmp(mode, "rf")) /* auto-free */ + bc->freemem = bc->buf_int; + if (!fp) + cookie_bufclose(bc); + return fp; +} + #else FILE * -solv_xfopen_buf(const char *fn, char **bufp, size_t *buflp, const char *mode) +solv_fmemopen(const char *buf, size_t bufl, const char *mode) { FILE *fp; - size_t l; if (*mode != 'r') return 0; - l = buflp ? *buflp : strlen(*bufp); if (!strcmp(mode, "rf")) { - if (!(fp = fmemopen(0, l, "r+"))) + if (!(fp = fmemopen(0, bufl, "r+"))) return 0; - if (l && fwrite(*bufp, l, 1, fp) != 1) + if (bufl && fwrite(buf, bufl, 1, fp) != 1) { fclose(fp); return 0; } - solv_free(*bufp); + solv_free((char *)buf); rewind(fp); } else - fp = fmemopen(*bufp, l, "r"); + fp = fmemopen((char *)buf, bufl, "r"); return fp; } diff --git a/ext/solv_xfopen.h b/ext/solv_xfopen.h index aa8740e..613f331 100644 --- a/ext/solv_xfopen.h +++ b/ext/solv_xfopen.h @@ -12,5 +12,6 @@ extern FILE *solv_xfopen(const char *fn, const char *mode); extern FILE *solv_xfopen_fd(const char *fn, int fd, const char *mode); extern FILE *solv_xfopen_buf(const char *fn, char **bufp, size_t *buflp, const char *mode); extern int solv_xfopen_iscompressed(const char *fn); +extern FILE *solv_fmemopen(const char *buf, size_t bufl, const char *mode); #endif diff --git a/ext/testcase.c b/ext/testcase.c index d6c4a57..bbed5ab 100644 --- a/ext/testcase.c +++ b/ext/testcase.c @@ -1809,49 +1809,65 @@ testcase_write_mangled(Solver *solv, const char *dir, int resultflags, const cha return 1; } -int -testcase_write(Solver *solv, const char *dir, int resultflags, const char *testcasename, const char *resultname) +const char ** +testcase_mangle_repo_names(Pool *pool) { - Pool *pool = solv->pool; - int i, r, repoid; - int mangle = 1; - const char **orignames; - - /* mangle repo names so that there are no conflicts */ - orignames = solv_calloc(pool->nrepos, sizeof(char *)); - for (repoid = 1; repoid < pool->nrepos; repoid++) + int i, repoid, mangle = 1; + Repo *repo; + const char **names = solv_calloc(pool->nrepos, sizeof(char *)); + FOR_REPOS(repoid, repo) { - Repo *repo = pool_id2repo(pool, repoid); - char *buf = solv_malloc((repo->name ? strlen(repo->name) : 0) + 40); - char *mp; - orignames[repoid] = repo->name; + char *buf, *mp; + buf = solv_malloc((repo->name ? strlen(repo->name) : 0) + 40); if (!repo->name || !repo->name[0]) sprintf(buf, "#%d", repoid); else strcpy(buf, repo->name); - for (i = 0; buf[i]; i++) - if (buf[i] == ' ' || buf[i] == '\t' || buf[i] == '/') - buf[i] = '_'; - mp = buf + strlen(buf); + for (mp = buf; *mp; mp++) + if (*mp == ' ' || *mp == '\t' || *mp == '/') + *mp = '_'; for (;;) { for (i = 1; i < repoid; i++) - if (!strcmp(buf, pool_id2repo(pool, i)->name)) + if (!strcmp(buf, names[i])) break; if (i == repoid) break; sprintf(mp, "_%d", mangle++); } - repo->name = buf; + names[repoid] = buf; } - r = testcase_write_mangled(solv, dir, resultflags, testcasename, resultname); - for (repoid = 1; repoid < pool->nrepos; repoid++) + return names; +} + +static void +swap_repo_names(Pool *pool, const char **names) +{ + int repoid; + Repo *repo; + FOR_REPOS(repoid, repo) { - Repo *repo = pool_id2repo(pool, repoid); - solv_free((void *)repo->name); - repo->name = orignames[repoid]; + const char *n = repo->name; + repo->name = names[repoid]; + names[repoid] = n; } - solv_free(orignames); +} + +int +testcase_write(Solver *solv, const char *dir, int resultflags, const char *testcasename, const char *resultname) +{ + Pool *pool = solv->pool; + int r, repoid; + const char **names; + + /* mangle repo names so that there are no conflicts */ + names = testcase_mangle_repo_names(pool); + swap_repo_names(pool, names); + r = testcase_write_mangled(solv, dir, resultflags, testcasename, resultname); + swap_repo_names(pool, names); + for (repoid = 1; repoid < pool->nrepos; repoid++) + solv_free((void *)names[repoid]); + solv_free((void *)names); return r; } @@ -2071,7 +2087,7 @@ testcase_read(Pool *pool, FILE *fp, const char *testcase, Queue *job, char **res { char *idata = read_inline_file(fp, &buf, &bufp, &bufl); rdata = ""; - rfp = solv_xfopen_buf(rdata, &idata, 0, "rf"); + rfp = solv_fmemopen(idata, strlen(idata), "rf"); } else { diff --git a/ext/testcase.h b/ext/testcase.h index 997feaf..5b2e573 100644 --- a/ext/testcase.h +++ b/ext/testcase.h @@ -42,3 +42,5 @@ extern char *testcase_solverresult(Solver *solv, int flags); extern int testcase_write(Solver *solv, const char *dir, int resultflags, const char *testcasename, const char *resultname); extern Solver *testcase_read(Pool *pool, FILE *fp, const char *testcase, Queue *job, char **resultp, int *resultflagsp); extern char *testcase_resultdiff(const char *result1, const char *result2); +extern const char **testcase_mangle_repo_names(Pool *pool); + diff --git a/package/libsolv.changes b/package/libsolv.changes index 52ea164..900490d 100644 --- a/package/libsolv.changes +++ b/package/libsolv.changes @@ -1,4 +1,26 @@ ------------------------------------------------------------------- +Fri Sep 11 12:31:27 CEST 2020 - mls@suse.de + +- fix deduceq2addedmap clearing bits outside of the map +- conda: feature depriorization first +- conda: fix startswith implementation +- move find_update_seeds() call in cleandeps calculation +- set SOLVABLE_BUILDHOST in rpm and rpmmd parsers +- new testcase_mangle_repo_names() function +- new solv_fmemopen() function +- bump version to 0.7.15 + +------------------------------------------------------------------- +Tue Jun 23 12:43:16 CEST 2020 - ma@suse.de + +- Enable zstd compression support for sle15 + +------------------------------------------------------------------- +Thu May 28 11:51:27 CEST 2020 - mls@suse.de + +- Enable zstd compression support for sle15-sp2 + +------------------------------------------------------------------- Wed May 27 11:48:46 CEST 2020 - mls@suse.de - Support blacklisted packages in solver_findproblemrule() diff --git a/package/libsolv.spec.in b/package/libsolv.spec.in index cd56c67..0964ad6 100644 --- a/package/libsolv.spec.in +++ b/package/libsolv.spec.in @@ -24,7 +24,7 @@ %bcond_with bz2 %bcond_with xz %endif -%if 0%{?is_opensuse} && (0%{?sle_version} >= 150000 || 0%{?suse_version} >= 1500) +%if 0%{?sle_version} >= 150000 || 0%{?suse_version} >= 1500 %bcond_without zstd %else %bcond_with zstd diff --git a/src/cleandeps.c b/src/cleandeps.c index aa83c10..31b1ad9 100644 --- a/src/cleandeps.c +++ b/src/cleandeps.c @@ -669,6 +669,7 @@ solver_createcleandepsmap(Solver *solv, Map *cleandepsmap, int unneeded) queue_init(&iq); queue_init(&xsuppq); + /* setup userinstalled map and search for special namespace cleandeps erases */ for (i = 0; i < job->count; i += 2) { how = job->elements[i]; @@ -874,23 +875,38 @@ solver_createcleandepsmap(Solver *solv, Map *cleandepsmap, int unneeded) } queue_init_clone(&iqcopy, &iq); - if (!unneeded) - { - if (solv->cleandeps_updatepkgs) - for (i = 0; i < solv->cleandeps_updatepkgs->count; i++) - queue_push(&iq, solv->cleandeps_updatepkgs->elements[i]); - } - if (unneeded) queue_empty(&iq); /* just in case... */ - /* clear userinstalled bit for the packages we really want to delete/update */ + /* clear userinstalled bits for the packages we really want to delete */ for (i = 0; i < iq.count; i++) { p = iq.elements[i]; - if (pool->solvables[p].repo != installed) - continue; - MAPCLR(&userinstalled, p - installed->start); + if (pool->solvables[p].repo == installed) + MAPCLR(&userinstalled, p - installed->start); + } + /* set userinstalled bits for all packages not in the considered map */ + if (pool->considered) + { + for (p = installed->start; p < installed->end; p++) + if (!MAPTST(pool->considered, p)) + MAPSET(&userinstalled, p - installed->start); /* we may not remove those */ + } + if (!unneeded && solv->cleandeps_updatepkgs) + { + /* find update seeds */ + queue_init(&updatepkgs_filtered); + find_update_seeds(solv, &updatepkgs_filtered, &userinstalled); + /* clear userinstalled bit for the packages we want to update */ + /* also add them to the erase list */ + for (i = 0; i < solv->cleandeps_updatepkgs->count; i++) + { + p = solv->cleandeps_updatepkgs->elements[i]; + if (pool->considered && !MAPTST(pool->considered, p)) + continue; + queue_push(&iq, p); + MAPCLR(&userinstalled, p - installed->start); + } } for (p = installed->start; p < installed->end; p++) @@ -898,8 +914,6 @@ solver_createcleandepsmap(Solver *solv, Map *cleandepsmap, int unneeded) if (pool->solvables[p].repo != installed) continue; MAPSET(&installedm, p); - if (pool->considered && !MAPTST(pool->considered, p)) - MAPSET(&userinstalled, p - installed->start); /* we may not remove those */ if (unneeded && !MAPTST(&userinstalled, p - installed->start)) continue; MAPSET(&im, p); @@ -907,13 +921,6 @@ solver_createcleandepsmap(Solver *solv, Map *cleandepsmap, int unneeded) MAPSET(&installedm, SYSTEMSOLVABLE); MAPSET(&im, SYSTEMSOLVABLE); - if (!unneeded && solv->cleandeps_updatepkgs) - { - /* find update "seeds" */ - queue_init(&updatepkgs_filtered); - find_update_seeds(solv, &updatepkgs_filtered, &userinstalled); - } - #ifdef CLEANDEPSDEBUG printf("REMOVE PASS\n"); #endif diff --git a/src/conda.c b/src/conda.c index 7f2538a..21ad6bf 100644 --- a/src/conda.c +++ b/src/conda.c @@ -212,7 +212,7 @@ pool_evrcmp_conda_int(const char *evr1, const char *evr1e, const char *evr2, con r = solv_vercmp_conda(evr1, r1 ? r1 : s1, evr2, r2 ? r2 : s2, r2 ? 0 : startswith); if (r) return r; - if (!r1 && !r2) + if ((!r2 && startswith) || (!r1 && !r2)) return 0; if (!r1 && r2) return -1; diff --git a/src/policy.c b/src/policy.c index 6551cbf..c02d237 100644 --- a/src/policy.c +++ b/src/policy.c @@ -835,14 +835,18 @@ move_installed_to_front(Pool *pool, Queue *plist) #ifdef ENABLE_CONDA static int -pool_buildversioncmp(Pool *pool, Solvable *s1, Solvable *s2) +pool_featurecountcmp(Pool *pool, Solvable *s1, Solvable *s2) { - const char *bv1, *bv2; unsigned int cnt1, cnt2; cnt1 = solvable_lookup_count(s1, SOLVABLE_TRACK_FEATURES); cnt2 = solvable_lookup_count(s2, SOLVABLE_TRACK_FEATURES); - if (cnt1 != cnt2) - return cnt1 > cnt2 ? -1 : 1; + return cnt1 == cnt2 ? 0 : cnt1 > cnt2 ? -1 : 1; +} + +static int +pool_buildversioncmp(Pool *pool, Solvable *s1, Solvable *s2) +{ + const char *bv1, *bv2; bv1 = solvable_lookup_str(s1, SOLVABLE_BUILDVERSION); bv2 = solvable_lookup_str(s2, SOLVABLE_BUILDVERSION); if (!bv1 && !bv2) @@ -903,7 +907,14 @@ prune_to_best_version(Pool *pool, Queue *plist) best = s; /* take current as new best */ continue; } - r = best->evr != s->evr ? pool_evrcmp(pool, best->evr, s->evr, EVRCMP_COMPARE) : 0; + + r = 0; +#ifdef ENABLE_CONDA + if (pool->disttype == DISTTYPE_CONDA) + r = pool_featurecountcmp(pool, best, s); +#endif + if (r == 0) + r = best->evr != s->evr ? pool_evrcmp(pool, best->evr, s->evr, EVRCMP_COMPARE) : 0; #ifdef ENABLE_LINKED_PKGS if (r == 0 && has_package_link(pool, s)) r = pool_link_evrcmp(pool, best, s); diff --git a/src/repodata.c b/src/repodata.c index 4e75b6d..72f03d4 100644 --- a/src/repodata.c +++ b/src/repodata.c @@ -388,7 +388,7 @@ repodata_dir2str(Repodata *data, Id did, const char *suf) comps = stringpool_id2str(data->localpool ? &data->spool : &pool->ss, comp); l = strlen(comps); p -= l; - strncpy(p, comps, l); + memcpy(p, comps, l); parent = dirpool_parent(&data->dirpool, parent); if (parent) *--p = '/'; diff --git a/src/selection.c b/src/selection.c index 5f01e2b..a8e60f7 100644 --- a/src/selection.c +++ b/src/selection.c @@ -150,6 +150,7 @@ selection_flatten(Pool *pool, Queue *selection) if (!q.count) { queue_empty(selection); + queue_free(&q); return; } queue_truncate(selection, 2); @@ -163,6 +164,7 @@ selection_flatten(Pool *pool, Queue *selection) selection->elements[0] = SOLVER_SOLVABLE | SOLVER_NOAUTOSET; selection->elements[1] = q.elements[0]; } + queue_free(&q); } /* only supports simple rels plus REL_ARCH */ diff --git a/src/solver.c b/src/solver.c index 7fcc3fb..686a8af 100644 --- a/src/solver.c +++ b/src/solver.c @@ -3240,7 +3240,7 @@ addedmap2deduceq(Solver *solv, Map *addedmap) p = -r->p; if (!MAPTST(addedmap, p)) { - /* should never happen, but... */ + /* this can happen with complex dependencies that have more than one pos literal */ if (!solv->addedmap_deduceq.count || solv->addedmap_deduceq.elements[solv->addedmap_deduceq.count - 1] != -p) queue_push(&solv->addedmap_deduceq, -p); continue; @@ -3280,7 +3280,7 @@ deduceq2addedmap(Solver *solv, Map *addedmap) if (p > 0) MAPSET(addedmap, p); else - MAPCLR(addedmap, p); + MAPCLR(addedmap, -p); } } diff --git a/test/testcases/blacklist/ptf b/test/testcases/blacklist/ptf.t similarity index 92% rename from test/testcases/blacklist/ptf rename to test/testcases/blacklist/ptf.t index b8765d0..0005042 100644 --- a/test/testcases/blacklist/ptf +++ b/test/testcases/blacklist/ptf.t @@ -9,7 +9,7 @@ repo available 0 testtags #>=Pkg: A 1 1 noarch #>=Req: ptf-1 -system i686 * system +system unset * system # # test 1: a ptf package cannot be pulled in via a dependency @@ -28,7 +28,7 @@ nextjob job blacklist provides ptf-package() job install name ptf-1 result transaction,problems -#>problem 021b17e2 info package ptf-1-1-1.noarch cannot only be installed by a direct request +#>problem 021b17e2 info package ptf-1-1-1.noarch can only be installed by a direct request #>problem 021b17e2 solution 932a6c2f deljob install name ptf-1 #>problem 021b17e2 solution b79aeb6f allow ptf-1-1-1.noarch@available diff --git a/test/testcases/blacklist/retracted b/test/testcases/blacklist/retracted.t similarity index 92% rename from test/testcases/blacklist/retracted rename to test/testcases/blacklist/retracted.t index d75f17d..a36e244 100644 --- a/test/testcases/blacklist/retracted +++ b/test/testcases/blacklist/retracted.t @@ -6,10 +6,11 @@ repo available 0 testtags #>=Pkg: B 2 1 noarch #>=Prv: retracted-patch-package() -system i686 * system +system unset rpm system job blacklist provides retracted-patch-package() job install name patch +result transaction,problems #>problem 3a66200a info package patch-1-1.noarch conflicts with B < 2-1 provided by B-1-1.noarch #>problem 3a66200a solution 14805cf8 deljob install name patch #>problem 3a66200a solution 4a9277b8 allow B-2-1.noarch@available diff --git a/tools/testsolv.c b/tools/testsolv.c index 18dfcfe..a9e67ec 100644 --- a/tools/testsolv.c +++ b/tools/testsolv.c @@ -66,6 +66,16 @@ reportsolutioncb(Solver *solv, void *cbdata) return 0; } +static void +free_considered(Pool *pool) +{ + if (pool->considered) + { + map_free(pool->considered); + pool->considered = solv_free(pool->considered); + } +} + int main(int argc, char **argv) { @@ -149,7 +159,9 @@ main(int argc, char **argv) solv = testcase_read(pool, fp, argv[optind], &job, &result, &resultflags); if (!solv) { + free_considered(pool); pool_free(pool); + queue_free(&job); exit(resultflags == 77 ? 77 : 1); } if (reusesolv) @@ -349,6 +361,7 @@ main(int argc, char **argv) } if (reusesolv) solver_free(reusesolv); + free_considered(pool); pool_free(pool); fclose(fp); }