summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt6
-rw-r--r--NEWS11
-rw-r--r--VERSION.cmake2
-rw-r--r--ext/libsolvext.ver2
-rw-r--r--ext/repo_rpmdb.c3
-rw-r--r--ext/repo_rpmmd.c6
-rw-r--r--ext/solv_xfopen.c33
-rw-r--r--ext/solv_xfopen.h1
-rw-r--r--ext/testcase.c70
-rw-r--r--ext/testcase.h2
-rw-r--r--package/libsolv.changes22
-rw-r--r--package/libsolv.spec.in2
-rw-r--r--src/cleandeps.c47
-rw-r--r--src/conda.c2
-rw-r--r--src/policy.c21
-rw-r--r--src/repodata.c2
-rw-r--r--src/selection.c2
-rw-r--r--src/solver.c4
-rw-r--r--test/testcases/blacklist/ptf.t (renamed from test/testcases/blacklist/ptf)4
-rw-r--r--test/testcases/blacklist/retracted.t (renamed from test/testcases/blacklist/retracted)3
-rw-r--r--tools/testsolv.c13
21 files changed, 190 insertions, 68 deletions
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 = "<inline>";
- 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
index b8765d0..0005042 100644
--- a/test/testcases/blacklist/ptf
+++ b/test/testcases/blacklist/ptf.t
@@ -9,7 +9,7 @@ repo available 0 testtags <inline>
#>=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 <inline>
-#>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
index d75f17d..a36e244 100644
--- a/test/testcases/blacklist/retracted
+++ b/test/testcases/blacklist/retracted.t
@@ -6,10 +6,11 @@ repo available 0 testtags <inline>
#>=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 <inline>
#>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);
}