Compare commits
No commits in common. "17561b3618e6dfc033453ce3d58ba00063454c18" and "5304a229606e0b7d2bad7d9f3724f783cf4be578" have entirely different histories.
17561b3618
...
5304a22960
BIN
0.7.20.tar.gz
Normal file
BIN
0.7.20.tar.gz
Normal file
Binary file not shown.
BIN
0.7.24.tar.gz
BIN
0.7.24.tar.gz
Binary file not shown.
29
Fix-memory-leak-when-using-testsolv-to-execute-cases.patch
Normal file
29
Fix-memory-leak-when-using-testsolv-to-execute-cases.patch
Normal file
@ -0,0 +1,29 @@
|
||||
From 9a361f5248557e032f15890aac54c0db53c52098 Mon Sep 17 00:00:00 2001
|
||||
From: banjiuqingshan <63209634+banjiuqingshan@users.noreply.github.com>
|
||||
Date: Sun, 19 Jun 2022 01:43:51 +0800
|
||||
Subject: [PATCH] Fix memory leak when using testsolv to execute cases
|
||||
|
||||
*resultp will only keep the pointer of the last cycle, which will lead to memory leakage.
|
||||
This solves the first memory leak problem in issue #496 "==255147==error..."
|
||||
---
|
||||
ext/testcase.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/ext/testcase.c b/ext/testcase.c
|
||||
index 035cfdbd..c529057a 100644
|
||||
--- a/ext/testcase.c
|
||||
+++ b/ext/testcase.c
|
||||
@@ -2448,7 +2448,10 @@ testcase_read(Pool *pool, FILE *fp, const char *testcase, Queue *job, char **res
|
||||
}
|
||||
}
|
||||
if (resultp)
|
||||
+ {
|
||||
+ solv_free(*resultp);
|
||||
*resultp = result;
|
||||
+ }
|
||||
else
|
||||
solv_free(result);
|
||||
if (resultflagsp)
|
||||
--
|
||||
2.27.0
|
||||
|
||||
30
Fix-segfault-on-conflict-resolution-when-using-bindi.patch
Normal file
30
Fix-segfault-on-conflict-resolution-when-using-bindi.patch
Normal file
@ -0,0 +1,30 @@
|
||||
From 2b5e6c28be7dffe1a3b5e90a35c5ee425c08aeb0 Mon Sep 17 00:00:00 2001
|
||||
From: niner <nine@detonation.org>
|
||||
Date: Tue, 8 Feb 2022 18:10:54 +0100
|
||||
Subject: [PATCH] Fix segfault on conflict resolution when using bindings
|
||||
|
||||
Solutionelement objects were created with a wrong solutionid (i.e. the
|
||||
solution element id was used for the solutionid field). This led to invalid
|
||||
array indexes when trying to read the extraflags which then escalated
|
||||
into a segfault. Fix by setting solutionid correctly in the Solutionelement
|
||||
constructor.
|
||||
---
|
||||
bindings/solv.i | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/bindings/solv.i b/bindings/solv.i
|
||||
index 3a6bac46..1d35bf61 100644
|
||||
--- a/bindings/solv.i
|
||||
+++ b/bindings/solv.i
|
||||
@@ -3411,7 +3411,7 @@ returnself(matchsolvable)
|
||||
e = solv_calloc(1, sizeof(*e));
|
||||
e->solv = solv;
|
||||
e->problemid = problemid;
|
||||
- e->solutionid = id;
|
||||
+ e->solutionid = solutionid;
|
||||
e->id = id;
|
||||
e->type = type;
|
||||
e->p = p;
|
||||
--
|
||||
2.27.0
|
||||
|
||||
@ -1,26 +0,0 @@
|
||||
From 47734e26d67ad236a29c160ff224fcb1910e3a6f Mon Sep 17 00:00:00 2001
|
||||
From: Michael Schroeder <mls@suse.de>
|
||||
Date: Tue, 18 Apr 2023 12:36:40 +0200
|
||||
Subject: [PATCH] Add testcase for last commit
|
||||
|
||||
---
|
||||
test/testcases/cplxdeps/ifelse_rec.t | 10 ++++++++++
|
||||
1 file changed, 10 insertions(+)
|
||||
create mode 100644 test/testcases/cplxdeps/ifelse_rec.t
|
||||
|
||||
diff --git a/test/testcases/cplxdeps/ifelse_rec.t b/test/testcases/cplxdeps/ifelse_rec.t
|
||||
new file mode 100644
|
||||
index 000000000..ea467027c
|
||||
--- /dev/null
|
||||
+++ b/test/testcases/cplxdeps/ifelse_rec.t
|
||||
@@ -0,0 +1,10 @@
|
||||
+repo appstream 0 testtags <inline>
|
||||
+#>=Pkg: xorg-x11-server-Xorg 1.20.11 18.el9 noarch
|
||||
+#>=Req: missing-req
|
||||
+#>=Pkg: pass 1.7.4 6.el9 noarch
|
||||
+#>=Rec: xclip <IF> (xorg-x11-server-Xorg <ELSE> wl-clipboard)
|
||||
+repo @System 0 empty
|
||||
+system unset * @System
|
||||
+job install pkg pass-1.7.4-6.el9.noarch@appstream
|
||||
+result transaction,problems <inline>
|
||||
+#>install pass-1.7.4-6.el9.noarch@appstream
|
||||
@ -1,69 +0,0 @@
|
||||
From 2c4ee52a948a9ccff2242cd02ac8ce81a0559deb Mon Sep 17 00:00:00 2001
|
||||
From: David Cantrell <dcantrell@redhat.com>
|
||||
Date: Tue, 26 Mar 2024 12:13:55 -0400
|
||||
Subject: [PATCH] Fix a couple small static analysis findings for uninitialized
|
||||
structs
|
||||
|
||||
The memset() on the KeyValue is more explicit even though if you trace
|
||||
the code you will see it fills out the struct. However, it's possible
|
||||
that not every struct member will be initialized and adding the
|
||||
memset() makes things more obvious and appeases the static analyzer.
|
||||
|
||||
Conflict:NA
|
||||
Reference:https://github.com/openSUSE/libsolv/commit/2c4ee52a948a9ccff2242cd02ac8ce81a0559deb.patch
|
||||
|
||||
---
|
||||
ext/repo_rpmmd.c | 2 ++
|
||||
ext/repo_susetags.c | 1 +
|
||||
ext/testcase.c | 3 +++
|
||||
3 files changed, 6 insertions(+)
|
||||
|
||||
diff --git a/ext/repo_rpmmd.c b/ext/repo_rpmmd.c
|
||||
index 1232e43..5d0f5fe 100644
|
||||
--- a/ext/repo_rpmmd.c
|
||||
+++ b/ext/repo_rpmmd.c
|
||||
@@ -609,6 +609,8 @@ fill_cshash_from_new_solvables(struct parsedata *pd)
|
||||
KeyValue kv;
|
||||
Repokey *key;
|
||||
|
||||
+ memset(&kv, 0, sizeof(kv));
|
||||
+
|
||||
for (i = pd->first; i < pool->nsolvables; i++)
|
||||
{
|
||||
if (pool->solvables[i].repo != pd->repo)
|
||||
diff --git a/ext/repo_susetags.c b/ext/repo_susetags.c
|
||||
index dc60aa4..86bb1e9 100644
|
||||
--- a/ext/repo_susetags.c
|
||||
+++ b/ext/repo_susetags.c
|
||||
@@ -339,6 +339,7 @@ lookup_shared_id(Repodata *data, Id p, Id keyname, Id voidid, int uninternalized
|
||||
if (uninternalized)
|
||||
{
|
||||
KeyValue kv;
|
||||
+ memset(&kv, 0, sizeof(kv));
|
||||
Repokey *key = repodata_lookup_kv_uninternalized(data, p, keyname, &kv);
|
||||
if (!key)
|
||||
return 0;
|
||||
diff --git a/ext/testcase.c b/ext/testcase.c
|
||||
index f46f738..3e22546 100644
|
||||
--- a/ext/testcase.c
|
||||
+++ b/ext/testcase.c
|
||||
@@ -1440,6 +1440,7 @@ testcase_solverresult(Solver *solv, int resultflags)
|
||||
{
|
||||
Queue q;
|
||||
|
||||
+
|
||||
queue_init(&q);
|
||||
solver_get_orphaned(solv, &q);
|
||||
for (i = 0; i < q.count; i++)
|
||||
@@ -1497,6 +1498,8 @@ testcase_solverresult(Solver *solv, int resultflags)
|
||||
if ((resultflags & TESTCASE_RESULT_USERINSTALLED) != 0)
|
||||
{
|
||||
Queue q;
|
||||
+
|
||||
+ queue_init(&q);
|
||||
solver_get_userinstalled(solv, &q, 0);
|
||||
for (i = 0; i < q.count; i++)
|
||||
{
|
||||
--
|
||||
2.9.3.windows.1
|
||||
|
||||
@ -1,72 +0,0 @@
|
||||
From bbd1801748e74259f7d8d7d7eee369064961962b Mon Sep 17 00:00:00 2001
|
||||
From: Michael Schroeder <mls@suse.de>
|
||||
Date: Tue, 13 Feb 2024 15:25:47 +0100
|
||||
Subject: [PATCH] Handle installed packages in three passes
|
||||
|
||||
Fixes issue #550
|
||||
|
||||
Conflict:NA
|
||||
Reference:https://github.com/openSUSE/libsolv/commit/bbd1801748e74259f7d8d7d7eee369064961962b
|
||||
---
|
||||
src/solver.c | 21 ++++++++++++++++-----
|
||||
1 file changed, 16 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/src/solver.c b/src/solver.c
|
||||
index 741aa1b2f..a1a41f677 100644
|
||||
--- a/src/solver.c
|
||||
+++ b/src/solver.c
|
||||
@@ -1836,7 +1836,7 @@ resolve_installed(Solver *solv, int level, int disablerules, Queue *dq)
|
||||
{
|
||||
Pool *pool = solv->pool;
|
||||
Repo *installed = solv->installed;
|
||||
- int i, n, pass;
|
||||
+ int i, n, pass, startpass;
|
||||
int installedpos = solv->installedpos;
|
||||
Solvable *s;
|
||||
Id p, pp;
|
||||
@@ -1845,10 +1845,14 @@ resolve_installed(Solver *solv, int level, int disablerules, Queue *dq)
|
||||
POOL_DEBUG(SOLV_DEBUG_SOLVER, "resolving installed packages\n");
|
||||
if (!installedpos)
|
||||
installedpos = installed->start;
|
||||
- /* we use two passes if we need to update packages
|
||||
- * to create a better user experience */
|
||||
- for (pass = !solv->updatemap_all && solv->updatemap.size ? 0 : 1; pass < 2; )
|
||||
+ /* we use passes if we need to update packages to create a better user experience:
|
||||
+ * pass 0: update the packages requested by the user
|
||||
+ * pass 1: keep the installed packages if we can
|
||||
+ * pass 2: update the packages that could not be kept */
|
||||
+ startpass = solv->updatemap_all ? 2 : solv->updatemap.size ? 0 : 1;
|
||||
+ for (pass = startpass; pass < 3; )
|
||||
{
|
||||
+ int needpass2 = 0;
|
||||
int passlevel = level;
|
||||
Id *specialupdaters = solv->specialupdaters;
|
||||
/* start with installedpos, the position that gave us problems the last time */
|
||||
@@ -1880,6 +1884,11 @@ resolve_installed(Solver *solv, int level, int disablerules, Queue *dq)
|
||||
* the installed package and not replace it with a newer version */
|
||||
if (!MAPTST(&solv->noupdate, i - installed->start) && (solv->decisionmap[i] < 0 || solv->updatemap_all || (solv->updatemap.size && MAPTST(&solv->updatemap, i - installed->start))))
|
||||
{
|
||||
+ if (pass == 1)
|
||||
+ {
|
||||
+ needpass2 = 1; /* first do the packages we do not want/need to update */
|
||||
+ continue;
|
||||
+ }
|
||||
if (dq->count)
|
||||
queue_empty(dq);
|
||||
/* find update candidates */
|
||||
@@ -1964,12 +1973,14 @@ resolve_installed(Solver *solv, int level, int disablerules, Queue *dq)
|
||||
if (level < origlevel)
|
||||
break; /* ran into trouble */
|
||||
/* re-run all passes */
|
||||
- pass = !solv->updatemap_all && solv->updatemap.size ? 0 : 1;
|
||||
+ pass = startpass;
|
||||
continue;
|
||||
}
|
||||
/* reset installedpos, advance to next pass */
|
||||
installedpos = installed->start;
|
||||
pass++;
|
||||
+ if (pass == 2 && !needpass2)
|
||||
+ break;
|
||||
}
|
||||
solv->installedpos = installedpos;
|
||||
return level;
|
||||
@ -1,192 +0,0 @@
|
||||
From 4c7ce065280f062c52ae19d75344c49e5f562108 Mon Sep 17 00:00:00 2001
|
||||
From: Michael Schroeder <mls@suse.de>
|
||||
Date: Tue, 13 Feb 2024 14:42:25 +0100
|
||||
Subject: [PATCH] Move special updaters handling into its own function
|
||||
|
||||
Conflict:NA
|
||||
Reference:https://github.com/openSUSE/libsolv/commit/4c7ce065280f062c52ae19d75344c49e5f562108
|
||||
---
|
||||
src/solver.c | 127 ++++++++++++++++++++++++++++-----------------------
|
||||
1 file changed, 71 insertions(+), 56 deletions(-)
|
||||
|
||||
diff --git a/src/solver.c b/src/solver.c
|
||||
index 0c3333d87..741aa1b2f 100644
|
||||
--- a/src/solver.c
|
||||
+++ b/src/solver.c
|
||||
@@ -1788,6 +1788,49 @@ prune_to_update_targets(Solver *solv, Id *cp, Queue *q)
|
||||
queue_truncate(q, j);
|
||||
}
|
||||
|
||||
+static void
|
||||
+get_special_updaters(Solver *solv, int i, Rule *rr, Queue *dq)
|
||||
+{
|
||||
+ Pool *pool = solv->pool;
|
||||
+ Repo *installed = solv->installed;
|
||||
+ int specoff = solv->specialupdaters[i - installed->start];
|
||||
+ int j, d;
|
||||
+ Id p;
|
||||
+
|
||||
+ /* special multiversion handling, make sure best version is chosen */
|
||||
+ if (rr->p == i && solv->decisionmap[i] >= 0)
|
||||
+ queue_push(dq, i);
|
||||
+ for (d = specoff; (p = pool->whatprovidesdata[d]) != 0; d++)
|
||||
+ if (solv->decisionmap[p] >= 0)
|
||||
+ queue_push(dq, p);
|
||||
+ /* if we have installed packages try to find identical ones to get
|
||||
+ * repo priorities. see issue #343 */
|
||||
+ for (j = 0; j < dq->count; j++)
|
||||
+ {
|
||||
+ Id p2 = dq->elements[j];
|
||||
+ if (pool->solvables[p2].repo != installed)
|
||||
+ continue;
|
||||
+ for (d = specoff; (p = pool->whatprovidesdata[d]) != 0; d++)
|
||||
+ {
|
||||
+ if (solv->decisionmap[p] >= 0 || pool->solvables[p].repo == installed)
|
||||
+ continue;
|
||||
+ if (solvable_identical(pool->solvables + p, pool->solvables + p2))
|
||||
+ queue_push(dq, p); /* identical to installed, put it on the list so we have a repo prio */
|
||||
+ }
|
||||
+ }
|
||||
+ if (dq->count && solv->update_targets && solv->update_targets->elements[i - installed->start])
|
||||
+ prune_to_update_targets(solv, solv->update_targets->elements + solv->update_targets->elements[i - installed->start], dq);
|
||||
+ if (dq->count)
|
||||
+ {
|
||||
+ policy_filter_unwanted(solv, dq, POLICY_MODE_CHOOSE);
|
||||
+ p = dq->elements[0];
|
||||
+ if (p != i && solv->decisionmap[p] == 0)
|
||||
+ dq->count = 1;
|
||||
+ else
|
||||
+ dq->count = 0;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static int
|
||||
resolve_installed(Solver *solv, int level, int disablerules, Queue *dq)
|
||||
{
|
||||
@@ -1804,7 +1847,7 @@ resolve_installed(Solver *solv, int level, int disablerules, Queue *dq)
|
||||
installedpos = installed->start;
|
||||
/* we use two passes if we need to update packages
|
||||
* to create a better user experience */
|
||||
- for (pass = solv->updatemap.size ? 0 : 1; pass < 2; )
|
||||
+ for (pass = !solv->updatemap_all && solv->updatemap.size ? 0 : 1; pass < 2; )
|
||||
{
|
||||
int passlevel = level;
|
||||
Id *specialupdaters = solv->specialupdaters;
|
||||
@@ -1812,7 +1855,6 @@ resolve_installed(Solver *solv, int level, int disablerules, Queue *dq)
|
||||
for (i = installedpos, n = installed->start; n < installed->end; i++, n++)
|
||||
{
|
||||
Rule *r, *rr;
|
||||
- Id d;
|
||||
|
||||
if (i == installed->end)
|
||||
i = installed->start;
|
||||
@@ -1836,48 +1878,20 @@ resolve_installed(Solver *solv, int level, int disablerules, Queue *dq)
|
||||
/* check if we should update this package to the latest version
|
||||
* noupdate is set for erase jobs, in that case we want to deinstall
|
||||
* the installed package and not replace it with a newer version */
|
||||
- if (dq->count)
|
||||
- queue_empty(dq);
|
||||
if (!MAPTST(&solv->noupdate, i - installed->start) && (solv->decisionmap[i] < 0 || solv->updatemap_all || (solv->updatemap.size && MAPTST(&solv->updatemap, i - installed->start))))
|
||||
{
|
||||
- if (specialupdaters && (d = specialupdaters[i - installed->start]) != 0)
|
||||
+ if (dq->count)
|
||||
+ queue_empty(dq);
|
||||
+ /* find update candidates */
|
||||
+ if (specialupdaters && specialupdaters[i - installed->start] != 0)
|
||||
{
|
||||
- int j;
|
||||
- /* special multiversion handling, make sure best version is chosen */
|
||||
- if (rr->p == i && solv->decisionmap[i] >= 0)
|
||||
- queue_push(dq, i);
|
||||
- while ((p = pool->whatprovidesdata[d++]) != 0)
|
||||
- if (solv->decisionmap[p] >= 0)
|
||||
- queue_push(dq, p);
|
||||
- for (j = 0; j < dq->count; j++)
|
||||
- {
|
||||
- Id p2 = dq->elements[j];
|
||||
- if (pool->solvables[p2].repo != installed)
|
||||
- continue;
|
||||
- d = specialupdaters[i - installed->start];
|
||||
- while ((p = pool->whatprovidesdata[d++]) != 0)
|
||||
- {
|
||||
- if (solv->decisionmap[p] >= 0 || pool->solvables[p].repo == installed)
|
||||
- continue;
|
||||
- if (solvable_identical(pool->solvables + p, pool->solvables + p2))
|
||||
- queue_push(dq, p); /* identical to installed, put it on the list so we have a repo prio */
|
||||
- }
|
||||
- }
|
||||
- if (dq->count && solv->update_targets && solv->update_targets->elements[i - installed->start])
|
||||
- prune_to_update_targets(solv, solv->update_targets->elements + solv->update_targets->elements[i - installed->start], dq);
|
||||
+ get_special_updaters(solv, i, rr, dq);
|
||||
+ /* if we have an update set rr to the feature rule */
|
||||
if (dq->count)
|
||||
{
|
||||
- policy_filter_unwanted(solv, dq, POLICY_MODE_CHOOSE);
|
||||
- p = dq->elements[0];
|
||||
- if (p != i && solv->decisionmap[p] == 0)
|
||||
- {
|
||||
- rr = solv->rules + solv->featurerules + (i - solv->installed->start);
|
||||
- if (!rr->p) /* update rule == feature rule? */
|
||||
- rr = rr - solv->featurerules + solv->updaterules;
|
||||
- dq->count = 1;
|
||||
- }
|
||||
- else
|
||||
- dq->count = 0;
|
||||
+ rr = solv->rules + solv->featurerules + (i - solv->installed->start);
|
||||
+ if (!rr->p) /* update rule == feature rule? */
|
||||
+ rr = rr - solv->featurerules + solv->updaterules;
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -1894,24 +1908,25 @@ resolve_installed(Solver *solv, int level, int disablerules, Queue *dq)
|
||||
queue_push(dq, p);
|
||||
}
|
||||
}
|
||||
- }
|
||||
- if (dq->count && solv->update_targets && solv->update_targets->elements[i - installed->start])
|
||||
- prune_to_update_targets(solv, solv->update_targets->elements + solv->update_targets->elements[i - installed->start], dq);
|
||||
- /* install best version */
|
||||
- if (dq->count)
|
||||
- {
|
||||
- olevel = level;
|
||||
- level = selectandinstall(solv, level, dq, disablerules, rr - solv->rules, SOLVER_REASON_UPDATE_INSTALLED);
|
||||
- if (level <= olevel)
|
||||
+ if (dq->count && solv->update_targets && solv->update_targets->elements[i - installed->start])
|
||||
+ prune_to_update_targets(solv, solv->update_targets->elements + solv->update_targets->elements[i - installed->start], dq);
|
||||
+ /* install best version */
|
||||
+ if (dq->count)
|
||||
{
|
||||
- if (level < passlevel)
|
||||
- break; /* trouble */
|
||||
- if (level < olevel)
|
||||
- n = installed->start; /* redo all */
|
||||
- i--;
|
||||
- n--;
|
||||
- continue;
|
||||
+ olevel = level;
|
||||
+ level = selectandinstall(solv, level, dq, disablerules, rr - solv->rules, SOLVER_REASON_UPDATE_INSTALLED);
|
||||
+ if (level <= olevel)
|
||||
+ {
|
||||
+ if (level < passlevel)
|
||||
+ break; /* trouble */
|
||||
+ if (level < olevel)
|
||||
+ n = installed->start; /* redo all */
|
||||
+ i--;
|
||||
+ n--;
|
||||
+ continue;
|
||||
+ }
|
||||
}
|
||||
+ /* check original package even if we installed an update */
|
||||
}
|
||||
/* if still undecided keep package */
|
||||
if (solv->decisionmap[i] == 0)
|
||||
@@ -1949,7 +1964,7 @@ resolve_installed(Solver *solv, int level, int disablerules, Queue *dq)
|
||||
if (level < origlevel)
|
||||
break; /* ran into trouble */
|
||||
/* re-run all passes */
|
||||
- pass = solv->updatemap.size ? 0 : 1;
|
||||
+ pass = !solv->updatemap_all && solv->updatemap.size ? 0 : 1;
|
||||
continue;
|
||||
}
|
||||
/* reset installedpos, advance to next pass */
|
||||
|
||||
@ -1,27 +0,0 @@
|
||||
From 1edb35a3bd9abcede3a200471a4d1868f8054c99 Mon Sep 17 00:00:00 2001
|
||||
From: Michael Schroeder <mls@suse.de>
|
||||
Date: Tue, 18 Apr 2023 11:57:50 +0200
|
||||
Subject: [PATCH] Treat condition both as positive and negative literal in
|
||||
pool_add_pos_literals_complex_dep
|
||||
|
||||
That's because (A IF B ELSE C) gets rewritten to (A OR ~B) AND (C OR B) and
|
||||
(A UNLESS B ELSE C) gets rewritten to (A AND ~B) OR (C AND B). In both
|
||||
cases we have A, B, ~B, C.
|
||||
|
||||
This resolves issue #527
|
||||
---
|
||||
src/cplxdeps.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/src/cplxdeps.c b/src/cplxdeps.c
|
||||
index 6c40752e2..26e754d95 100644
|
||||
--- a/src/cplxdeps.c
|
||||
+++ b/src/cplxdeps.c
|
||||
@@ -405,6 +405,7 @@ pool_add_pos_literals_complex_dep(Pool *pool, Id dep, Queue *q, Map *m, int neg)
|
||||
Reldep *rd2 = GETRELDEP(pool, rd->evr);
|
||||
if (rd2->flags == REL_ELSE)
|
||||
{
|
||||
+ pool_add_pos_literals_complex_dep(pool, rd2->name, q, m, !neg);
|
||||
pool_add_pos_literals_complex_dep(pool, rd2->evr, q, m, !neg);
|
||||
dep = rd2->name;
|
||||
}
|
||||
@ -1,50 +0,0 @@
|
||||
From 2c85ed581422e072ad95119f3d7dc19eb45f29ac Mon Sep 17 00:00:00 2001
|
||||
From: Michael Schroeder <mls@suse.de>
|
||||
Date: Fri, 19 May 2023 15:17:53 +0200
|
||||
Subject: [PATCH] choice rules: also do solver_choicerulecheck for package
|
||||
downgrades
|
||||
|
||||
Fixes issue #514
|
||||
---
|
||||
src/rules.c | 13 ++++++++++++-
|
||||
1 file changed, 12 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/rules.c b/src/rules.c
|
||||
index 660656f01..7d57cfdee 100644
|
||||
--- a/src/rules.c
|
||||
+++ b/src/rules.c
|
||||
@@ -3449,6 +3449,7 @@ solver_addchoicerules(Solver *solv)
|
||||
int lastaddedcnt;
|
||||
unsigned int now;
|
||||
int isinstalled;
|
||||
+ int dodowngradecheck = solv->allowdowngrade;
|
||||
|
||||
solv->choicerules = solv->nrules;
|
||||
if (!pool->installed)
|
||||
@@ -3457,6 +3458,8 @@ solver_addchoicerules(Solver *solv)
|
||||
return;
|
||||
}
|
||||
now = solv_timems(0);
|
||||
+ if ((solv->dupinvolvedmap_all || solv->dupinvolvedmap.size) && solv->dup_allowdowngrade)
|
||||
+ dodowngradecheck = 1;
|
||||
queue_init(&q);
|
||||
queue_init(&qi);
|
||||
queue_init(&qcheck);
|
||||
@@ -3532,8 +3535,16 @@ solver_addchoicerules(Solver *solv)
|
||||
/* do extra checking for packages related to installed packages */
|
||||
for (i = j = 0; i < qi.count; i += 2)
|
||||
{
|
||||
+ int isdowngrade = 0;
|
||||
p2 = qi.elements[i];
|
||||
- if (solv->updatemap_all || (solv->updatemap.size && MAPTST(&solv->updatemap, p2 - solv->installed->start)))
|
||||
+ if (dodowngradecheck)
|
||||
+ {
|
||||
+ p = qi.elements[i + 1];
|
||||
+ if (pool->solvables[p2].name == pool->solvables[p].name)
|
||||
+ if (pool_evrcmp(pool, pool->solvables[p2].evr, pool->solvables[p].evr, EVRCMP_COMPARE) > 0)
|
||||
+ isdowngrade = 1;
|
||||
+ }
|
||||
+ if (isdowngrade || solv->updatemap_all || (solv->updatemap.size && MAPTST(&solv->updatemap, p2 - solv->installed->start)))
|
||||
{
|
||||
if (solver_choicerulecheck(solv, p2, r, &m, &qcheck))
|
||||
continue;
|
||||
@ -1,32 +0,0 @@
|
||||
From 553c69b514c1ca85a6311373b48c6096886dcff3 Mon Sep 17 00:00:00 2001
|
||||
From: Michael Schroeder <mls@suse.de>
|
||||
Date: Tue, 13 Feb 2024 12:43:50 +0100
|
||||
Subject: [PATCH] resolve_installed: remove dead code
|
||||
|
||||
Since we simplified our dup handling the update rules always
|
||||
start with the installed package.
|
||||
|
||||
Conflict:NA
|
||||
Reference:https://github.com/openSUSE/libsolv/commit/553c69b514c1ca85a6311373b48c6096886dcff3
|
||||
---
|
||||
src/solver.c | 5 ++---
|
||||
1 file changed, 2 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/solver.c b/src/solver.c
|
||||
index 363d88734..0c3333d87 100644
|
||||
--- a/src/solver.c
|
||||
+++ b/src/solver.c
|
||||
@@ -1835,11 +1835,10 @@ resolve_installed(Solver *solv, int level, int disablerules, Queue *dq)
|
||||
|
||||
/* check if we should update this package to the latest version
|
||||
* noupdate is set for erase jobs, in that case we want to deinstall
|
||||
- * the installed package and not replace it with a newer version
|
||||
- * rr->p != i is for dup jobs where the installed package cannot be kept */
|
||||
+ * the installed package and not replace it with a newer version */
|
||||
if (dq->count)
|
||||
queue_empty(dq);
|
||||
- if (!MAPTST(&solv->noupdate, i - installed->start) && (solv->decisionmap[i] < 0 || solv->updatemap_all || (solv->updatemap.size && MAPTST(&solv->updatemap, i - installed->start)) || (rr->p && rr->p != i)))
|
||||
+ if (!MAPTST(&solv->noupdate, i - installed->start) && (solv->decisionmap[i] < 0 || solv->updatemap_all || (solv->updatemap.size && MAPTST(&solv->updatemap, i - installed->start))))
|
||||
{
|
||||
if (specialupdaters && (d = specialupdaters[i - installed->start]) != 0)
|
||||
{
|
||||
30
ensure-duplinvolvedmap_all-is-reset.patch
Normal file
30
ensure-duplinvolvedmap_all-is-reset.patch
Normal file
@ -0,0 +1,30 @@
|
||||
From dd6e977782816e330a8f60cf78ca3d12fead3b10 Mon Sep 17 00:00:00 2001
|
||||
From: Jon Turney <jon.turney@dronecode.org.uk>
|
||||
Date: Sun, 14 Aug 2022 18:45:20 +0100
|
||||
Subject: [PATCH] Ensure duplinvolvedmap_all is reset when a solver is reused
|
||||
|
||||
Otherwise, if solver is used with a SOLVER_DISTUPGRADE job, then reused
|
||||
without one, this will cause solver_addduprules() to be called, even
|
||||
though needduprules is 0, which will crash trying to dereference
|
||||
solv->dupmap, which is NULL because solver_createdupmaps() hasn't been
|
||||
called.
|
||||
|
||||
Conflict:NA
|
||||
Reference:https://github.com/openSUSE/libsolv/commit/dd6e977782816e330a8f60cf78ca3d12fead3b10
|
||||
|
||||
---
|
||||
src/solver.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/src/solver.c b/src/solver.c
|
||||
index 28341d6d3..e3779e232 100644
|
||||
--- a/src/solver.c
|
||||
+++ b/src/solver.c
|
||||
@@ -3533,6 +3533,7 @@ solver_solve(Solver *solv, Queue *job)
|
||||
map_zerosize(&solv->bestupdatemap);
|
||||
solv->fixmap_all = 0;
|
||||
map_zerosize(&solv->fixmap);
|
||||
+ solv->dupinvolvedmap_all = 0;
|
||||
map_zerosize(&solv->dupmap);
|
||||
map_zerosize(&solv->dupinvolvedmap);
|
||||
solv->process_orphans = 0;
|
||||
35
libsolv.spec
35
libsolv.spec
@ -14,20 +14,16 @@
|
||||
%bcond_without conda
|
||||
|
||||
Name: libsolv
|
||||
Version: 0.7.24
|
||||
Version: 0.7.20
|
||||
Release: 3
|
||||
Summary: Package dependency solver
|
||||
License: BSD
|
||||
URL: https://github.com/openSUSE/libsolv
|
||||
Source: https://github.com/openSUSE/libsolv/archive/refs/tags/%{version}.tar.gz
|
||||
|
||||
Patch6001: backport-Treat-condition-both-as-positive-and-negative-literal-in-pool_add_pos_literals_complex_dep.patch
|
||||
Patch6002: backport-Add-testcase-for-last-commit.patch
|
||||
Patch6003: backport-choice-rules-also-do-solver_choicerulecheck-for-package-downgrades.patch
|
||||
Patch6004: backport-Fix-a-couple-small-static-analysis-findings-for-uninitialized-structs.patch
|
||||
Patch6005: backport-resolve_installed-remove-dead-code.patch
|
||||
Patch6006: backport-Move-special-updaters-handling-into-its-own-function.patch
|
||||
Patch6007: backport-Handle-installed-packages-in-three-passes.patch
|
||||
Patch0: Fix-segfault-on-conflict-resolution-when-using-bindi.patch
|
||||
Patch1: Fix-memory-leak-when-using-testsolv-to-execute-cases.patch
|
||||
Patch2: ensure-duplinvolvedmap_all-is-reset.patch
|
||||
|
||||
BuildRequires: cmake gcc-c++ ninja-build pkgconfig(rpm) zlib-devel
|
||||
BuildRequires: libxml2-devel xz-devel bzip2-devel
|
||||
@ -60,7 +56,7 @@ Development files for %{name}.
|
||||
%package tools
|
||||
Summary: Package dependency solver tools
|
||||
Requires: %{name} = %{version}-%{release}
|
||||
Requires: /usr/bin/find
|
||||
Requires: %{_bindir}/find
|
||||
|
||||
%description tools
|
||||
Package dependency solver tools.
|
||||
@ -221,27 +217,6 @@ Python 3 version.
|
||||
%{_mandir}/man3/%{name}*.3*
|
||||
|
||||
%changelog
|
||||
* Tue Jul 23 2024 LuWu <2398491106@qq.com> - 0.7.24-3
|
||||
- Handle installed packages in three passes
|
||||
|
||||
* Tue Jun 18 2024 guojunding <guojunding@kylinos.cn> - 0.7.24-2
|
||||
- Fix a couple small static analysis findings for uninitialized structs
|
||||
|
||||
* Sun Feb 4 2024 hanhuihui<hanhuihui5@huawei.com> - 0.7.24-1
|
||||
- DESC:update libsolv to 0.7.24-1
|
||||
|
||||
* Sat Aug 19 2023 hanhuihui<hanhuihui5@huawei.com> - 0.7.22-2
|
||||
- Type:bugfix
|
||||
- ID:NA
|
||||
- SUG:NA
|
||||
- DESC:fix requirement error
|
||||
|
||||
* Tue Nov 8 2022 hanhuihui<hanhuihui5@huawei.com> - 0.7.22-1
|
||||
- Type:bugfix
|
||||
- ID:NA
|
||||
- SUG:NA
|
||||
- DESC:update libsolv to 0.7.22-1
|
||||
|
||||
* Fri Oct 21 2022 hanhuihui<hanhuihui5@huawei.com> - 0.7.20-3
|
||||
- Type:bugfix
|
||||
- ID:NA
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user