$ git diff --patch-with-stat --summary c02d350dee4ef753b88658527ec763213ac74931..1d86c7fc78ab90a64d6073b386c6f099bdf1c574
.abf.yml | 2 +-
...se-the-patch-status-in-the-updateinfo-xml.patch | 45 --
0002-Add-UPDATE_STATUS-to-knownids.patch | 26 -
...c-move-Packages-string-into-backend-imple.patch | 87 ---
...und-to-stat_database-to-find-other-databa.patch | 60 --
0005-Add-solvable_matchessolvable-function.patch | 145 -----
...rker-argument-in-solvable_matchessolvable.patch | 40 --
0007-Add-support-for-blacklisted-packages.patch | 617 ---------------------
...mental-support-for-self-destruct-packages.patch | 83 ---
libsolv.spec | 14 +-
10 files changed, 3 insertions(+), 1116 deletions(-)
delete mode 100644 0001-Parse-the-patch-status-in-the-updateinfo-xml.patch
delete mode 100644 0002-Add-UPDATE_STATUS-to-knownids.patch
delete mode 100644 0003-repo_rpmdb.c-move-Packages-string-into-backend-imple.patch
delete mode 100644 0004-Add-workaround-to-stat_database-to-find-other-databa.patch
delete mode 100644 0005-Add-solvable_matchessolvable-function.patch
delete mode 100644 0006-Move-marker-argument-in-solvable_matchessolvable.patch
delete mode 100644 0007-Add-support-for-blacklisted-packages.patch
delete mode 100644 0008-Add-experimental-support-for-self-destruct-packages.patch
diff --git a/.abf.yml b/.abf.yml
index 45d0707..aea2917 100644
--- a/.abf.yml
+++ b/.abf.yml
@@ -1,2 +1,2 @@
sources:
- libsolv-0.7.7.tar.gz: be93515a4fca86e76c1dfd2f2cb99950de0f42a4
+ libsolv-0.7.8.tar.gz: 5e80bb880cd0d0af4e6c4fd0bb9c70d6a10811d4
diff --git a/0001-Parse-the-patch-status-in-the-updateinfo-xml.patch b/0001-Parse-the-patch-status-in-the-updateinfo-xml.patch
deleted file mode 100644
index c1491dd..0000000
--- a/0001-Parse-the-patch-status-in-the-updateinfo-xml.patch
+++ /dev/null
@@ -1,45 +0,0 @@
-From 6596f2e3281891e880446d481f98f81a6d2b377c Mon Sep 17 00:00:00 2001
-From: Michael Schroeder <mls@suse.de>
-Date: Fri, 18 Oct 2019 11:04:36 +0200
-Subject: [PATCH 1/8] Parse the patch status in the updateinfo xml
-
-The status is usually 'stable', but can also be things like
-'testing' or 'retracted'
----
- ext/repo_updateinfoxml.c | 6 +++++-
- 1 file changed, 5 insertions(+), 1 deletion(-)
-
-diff --git a/ext/repo_updateinfoxml.c b/ext/repo_updateinfoxml.c
-index f3757272..984f491b 100644
---- a/ext/repo_updateinfoxml.c
-+++ b/ext/repo_updateinfoxml.c
-@@ -220,7 +220,7 @@ startElement(struct solv_xmlparser *xmlp, int state, const char *name, const cha
- */
- case STATE_UPDATE:
- {
-- const char *from = 0, *type = 0, *version = 0;
-+ const char *from = 0, *type = 0, *version = 0, *status = 0;
- for (; *atts; atts += 2)
- {
- if (!strcmp(*atts, "from"))
-@@ -229,6 +229,8 @@ startElement(struct solv_xmlparser *xmlp, int state, const char *name, const cha
- type = atts[1];
- else if (!strcmp(*atts, "version"))
- version = atts[1];
-+ else if (!strcmp(*atts, "status"))
-+ status = atts[1];
- }
- solvable = pd->solvable = pool_id2solvable(pool, repo_add_solvable(pd->repo));
- pd->handle = pd->solvable - pool->solvables;
-@@ -238,6 +240,8 @@ startElement(struct solv_xmlparser *xmlp, int state, const char *name, const cha
- solvable->arch = ARCH_NOARCH;
- if (type)
- repodata_set_str(pd->data, pd->handle, SOLVABLE_PATCHCATEGORY, type);
-+ if (status)
-+ repodata_set_poolstr(pd->data, pd->handle, UPDATE_STATUS, status);
- pd->buildtime = (time_t)0;
- }
- break;
---
-2.24.0
-
diff --git a/0002-Add-UPDATE_STATUS-to-knownids.patch b/0002-Add-UPDATE_STATUS-to-knownids.patch
deleted file mode 100644
index f4617d8..0000000
--- a/0002-Add-UPDATE_STATUS-to-knownids.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-From ee27eee6318a2cb4f99bc66b3ec4d86d377a4467 Mon Sep 17 00:00:00 2001
-From: Michael Schroeder <mls@suse.de>
-Date: Fri, 18 Oct 2019 13:30:21 +0200
-Subject: [PATCH 2/8] Add UPDATE_STATUS to knownids
-
-Should have been in last commit.
----
- src/knownid.h | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/src/knownid.h b/src/knownid.h
-index 9d7f157e..7da12396 100644
---- a/src/knownid.h
-+++ b/src/knownid.h
-@@ -261,6 +261,8 @@ KNOWNID(UPDATE_MODULE_ARCH, "update:module:arch"), /* architecture */
- KNOWNID(SOLVABLE_BUILDVERSION, "solvable:buildversion"), /* conda */
- KNOWNID(SOLVABLE_BUILDFLAVOR, "solvable:buildflavor"), /* conda */
-
-+KNOWNID(UPDATE_STATUS, "update:status"), /* "stable", "testing", ...*/
-+
- KNOWNID(ID_NUM_INTERNAL, 0)
-
- #ifdef KNOWNID_INITIALIZE
---
-2.24.0
-
diff --git a/0003-repo_rpmdb.c-move-Packages-string-into-backend-imple.patch b/0003-repo_rpmdb.c-move-Packages-string-into-backend-imple.patch
deleted file mode 100644
index e4110c8..0000000
--- a/0003-repo_rpmdb.c-move-Packages-string-into-backend-imple.patch
+++ /dev/null
@@ -1,87 +0,0 @@
-From 94df5d6bf2eec3fc555550307342e250e2b842c6 Mon Sep 17 00:00:00 2001
-From: Michael Schroeder <mls@suse.de>
-Date: Mon, 21 Oct 2019 13:17:29 +0200
-Subject: [PATCH 3/8] repo_rpmdb.c: move "Packages" string into backend
- implementations
-
-Other rpm database implementations like "ndb" use different names.
----
- ext/repo_rpmdb.c | 2 +-
- ext/repo_rpmdb_bdb.h | 11 +++++++++--
- ext/repo_rpmdb_librpm.h | 7 +++----
- 3 files changed, 13 insertions(+), 7 deletions(-)
-
-diff --git a/ext/repo_rpmdb.c b/ext/repo_rpmdb.c
-index fb1491b1..e49188db 100644
---- a/ext/repo_rpmdb.c
-+++ b/ext/repo_rpmdb.c
-@@ -1605,7 +1605,7 @@ repo_add_rpmdb(Repo *repo, Repo *ref, int flags)
- }
-
- /* XXX: should get ro lock of Packages database! */
-- if (stat_database(&state, "Packages", &packagesstat, 1))
-+ if (stat_database(&state, &packagesstat))
- {
- freestate(&state);
- return -1;
-diff --git a/ext/repo_rpmdb_bdb.h b/ext/repo_rpmdb_bdb.h
-index ae477f76..574e9a8d 100644
---- a/ext/repo_rpmdb_bdb.h
-+++ b/ext/repo_rpmdb_bdb.h
-@@ -57,7 +57,7 @@ struct rpmdbstate {
-
-
- static int
--stat_database(struct rpmdbstate *state, char *dbname, struct stat *statbuf, int seterror)
-+stat_database_name(struct rpmdbstate *state, char *dbname, struct stat *statbuf, int seterror)
- {
- char *dbpath;
- dbpath = solv_dupjoin(state->rootdir, state->is_ostree ? "/usr/share/rpm/" : "/var/lib/rpm/", dbname);
-@@ -72,6 +72,13 @@ stat_database(struct rpmdbstate *state, char *dbname, struct stat *statbuf, int
- return 0;
- }
-
-+static int
-+stat_database(struct rpmdbstate *state, struct stat *statbuf)
-+{
-+ return stat_database_name(state, "Packages", statbuf, 1);
-+}
-+
-+
- static inline Id
- db2rpmdbid(unsigned char *db, int byteswapped)
- {
-@@ -426,7 +433,7 @@ count_headers(struct rpmdbstate *state)
- DBT dbkey;
- DBT dbdata;
-
-- if (stat_database(state, "Name", &statbuf, 0))
-+ if (stat_database_name(state, "Name", &statbuf, 0))
- return 0;
- memset(&dbkey, 0, sizeof(dbkey));
- memset(&dbdata, 0, sizeof(dbdata));
-diff --git a/ext/repo_rpmdb_librpm.h b/ext/repo_rpmdb_librpm.h
-index 79983d3a..64e795d2 100644
---- a/ext/repo_rpmdb_librpm.h
-+++ b/ext/repo_rpmdb_librpm.h
-@@ -31,14 +31,13 @@ struct rpmdbstate {
- };
-
- static int
--stat_database(struct rpmdbstate *state, char *dbname, struct stat *statbuf, int seterror)
-+stat_database(struct rpmdbstate *state, struct stat *statbuf)
- {
- char *dbpath;
-- dbpath = solv_dupjoin(state->rootdir, state->is_ostree ? "/usr/share/rpm/" : "/var/lib/rpm/", dbname);
-+ dbpath = solv_dupjoin(state->rootdir, state->is_ostree ? "/usr/share/rpm/" : "/var/lib/rpm/", "Packages");
- if (stat(dbpath, statbuf))
- {
-- if (seterror)
-- pool_error(state->pool, -1, "%s: %s", dbpath, strerror(errno));
-+ pool_error(state->pool, -1, "%s: %s", dbpath, strerror(errno));
- free(dbpath);
- return -1;
- }
---
-2.24.0
-
diff --git a/0004-Add-workaround-to-stat_database-to-find-other-databa.patch b/0004-Add-workaround-to-stat_database-to-find-other-databa.patch
deleted file mode 100644
index 48dadae..0000000
--- a/0004-Add-workaround-to-stat_database-to-find-other-databa.patch
+++ /dev/null
@@ -1,60 +0,0 @@
-From ea037722b0f2a1afc8416e08b36fd498a8bb14c4 Mon Sep 17 00:00:00 2001
-From: Michael Schroeder <mls@suse.de>
-Date: Mon, 21 Oct 2019 14:52:31 +0200
-Subject: [PATCH 4/8] Add workaround to stat_database() to find other database
- backends
-
-This is pretty horrible. Rpm upstream wants to add a function
-that stats the database for us, so we may use that in some future
-version.
----
- ext/repo_rpmdb_librpm.h | 31 ++++++++++++++++++++++++-------
- 1 file changed, 24 insertions(+), 7 deletions(-)
-
-diff --git a/ext/repo_rpmdb_librpm.h b/ext/repo_rpmdb_librpm.h
-index 64e795d2..6fdcfb0d 100644
---- a/ext/repo_rpmdb_librpm.h
-+++ b/ext/repo_rpmdb_librpm.h
-@@ -33,15 +33,32 @@ struct rpmdbstate {
- static int
- stat_database(struct rpmdbstate *state, struct stat *statbuf)
- {
-- char *dbpath;
-- dbpath = solv_dupjoin(state->rootdir, state->is_ostree ? "/usr/share/rpm/" : "/var/lib/rpm/", "Packages");
-- if (stat(dbpath, statbuf))
-+ static const char *dbname[] = {
-+ "Packages",
-+ "Packages.db",
-+ "rpmdb.sqlite",
-+ "data.mdb",
-+ "Packages", /* for error reporting */
-+ 0,
-+ };
-+ int i;
-+
-+ for (i = 0; ; i++)
- {
-- pool_error(state->pool, -1, "%s: %s", dbpath, strerror(errno));
-- free(dbpath);
-- return -1;
-+ char *dbpath = solv_dupjoin(state->rootdir, state->is_ostree ? "/usr/share/rpm/" : "/var/lib/rpm/", dbname[i]);
-+ if (!stat(dbpath, statbuf))
-+ {
-+ free(dbpath);
-+ return 0;
-+ }
-+ if (errno != ENOENT || !dbname[i + 1])
-+ {
-+ pool_error(state->pool, -1, "%s: %s", dbpath, strerror(errno));
-+ solv_free(dbpath);
-+ return -1;
-+ }
-+ solv_free(dbpath);
- }
-- free(dbpath);
- return 0;
- }
-
---
-2.24.0
-
diff --git a/0005-Add-solvable_matchessolvable-function.patch b/0005-Add-solvable_matchessolvable-function.patch
deleted file mode 100644
index 7823b4e..0000000
--- a/0005-Add-solvable_matchessolvable-function.patch
+++ /dev/null
@@ -1,145 +0,0 @@
-From f5a6b1656360fed253480ff112c40b8e0e94ffe4 Mon Sep 17 00:00:00 2001
-From: Michael Schroeder <mls@suse.de>
-Date: Tue, 22 Oct 2019 14:08:23 +0200
-Subject: [PATCH 5/8] Add solvable_matchessolvable() function
-
-Checks if one of the dependencies of a solvable is matched by
-the provides of another solvable. It is also possible to get
-the list of matching dependencies.
----
- src/libsolv.ver | 1 +
- src/pool.c | 2 +-
- src/selection.c | 2 +-
- src/solvable.c | 41 +++++++++++++++++++++++++++++++++++++----
- src/solvable.h | 3 ++-
- 5 files changed, 42 insertions(+), 7 deletions(-)
-
-diff --git a/src/libsolv.ver b/src/libsolv.ver
-index eafe3e68..ee40d0ad 100644
---- a/src/libsolv.ver
-+++ b/src/libsolv.ver
-@@ -325,6 +325,7 @@ SOLV_1.0 {
- solvable_lookup_type;
- solvable_lookup_void;
- solvable_matchesdep;
-+ solvable_matchessolvable;
- solvable_selfprovidedep;
- solvable_set_deparray;
- solvable_set_id;
-diff --git a/src/pool.c b/src/pool.c
-index 76636a78..0b4b9ddc 100644
---- a/src/pool.c
-+++ b/src/pool.c
-@@ -1542,7 +1542,7 @@ pool_whatmatchessolvable(Pool *pool, Id keyname, Id solvid, Queue *q, int marker
- continue;
- if (s->repo != pool->installed && !pool_installable(pool, s))
- continue;
-- if (solvable_matchessolvable_int(s, keyname, marker, solvid, 0, &qq, &missc, reloff))
-+ if (solvable_matchessolvable_int(s, keyname, marker, solvid, 0, &qq, &missc, reloff, 0))
- queue_push(q, p);
- }
- map_free(&missc);
-diff --git a/src/selection.c b/src/selection.c
-index e58d731a..5f01e2b5 100644
---- a/src/selection.c
-+++ b/src/selection.c
-@@ -1502,7 +1502,7 @@ selection_make_matchsolvable_common(Pool *pool, Queue *selection, Queue *solvidq
- continue;
- if (!solvable_matches_selection_flags(pool, s, flags))
- continue;
-- if (solvable_matchessolvable_int(s, keyname, marker, solvid, solvidq ? &m : 0, &q, &missc, reloff))
-+ if (solvable_matchessolvable_int(s, keyname, marker, solvid, solvidq ? &m : 0, &q, &missc, reloff, 0))
- queue_push(selection, p);
- }
- queue_free(&q);
-diff --git a/src/solvable.c b/src/solvable.c
-index d3d2d31d..332e6747 100644
---- a/src/solvable.c
-+++ b/src/solvable.c
-@@ -645,7 +645,7 @@ solvable_matchesdep(Solvable *s, Id keyname, Id dep, int marker)
- }
-
- int
--solvable_matchessolvable_int(Solvable *s, Id keyname, int marker, Id solvid, Map *solvidmap, Queue *depq, Map *missc, int reloff)
-+solvable_matchessolvable_int(Solvable *s, Id keyname, int marker, Id solvid, Map *solvidmap, Queue *depq, Map *missc, int reloff, Queue *outdepq)
- {
- Pool *pool = s->repo->pool;
- int i, boff;
-@@ -653,6 +653,8 @@ solvable_matchessolvable_int(Solvable *s, Id keyname, int marker, Id solvid, Map
-
- if (depq->count)
- queue_empty(depq);
-+ if (outdepq && outdepq->count)
-+ queue_empty(outdepq);
- solvable_lookup_deparray(s, keyname, depq, marker);
- for (i = 0; i < depq->count; i++)
- {
-@@ -695,15 +697,46 @@ solvable_matchessolvable_int(Solvable *s, Id keyname, int marker, Id solvid, Map
- {
- for (; *wp; wp++)
- if (MAPTST(solvidmap, *wp))
-- return 1;
-+ break;
- }
- else
- {
- for (; *wp; wp++)
- if (*wp == solvid)
-- return 1;
-+ break;
-+ }
-+ if (*wp)
-+ {
-+ if (outdepq)
-+ {
-+ queue_pushunique(outdepq, dep);
-+ continue;
-+ }
-+ return 1;
- }
- MAPSET(missc, boff);
- }
-- return 0;
-+ return outdepq && outdepq->count ? 1 : 0;
-+}
-+
-+int
-+solvable_matchessolvable(Solvable *s, Id keyname, int marker, Id solvid, Queue *depq)
-+{
-+ Pool *pool = s->repo->pool;
-+ Map missc; /* cache for misses */
-+ int res, reloff;
-+ Queue qq;
-+
-+ if (depq && depq->count)
-+ queue_empty(depq);
-+ if (s - pool->solvables == solvid)
-+ return 0; /* no self-matches */
-+
-+ queue_init(&qq);
-+ reloff = pool->ss.nstrings;
-+ map_init(&missc, reloff + pool->nrels);
-+ res = solvable_matchessolvable_int(s, keyname, marker, solvid, 0, &qq, &missc, reloff, depq);
-+ map_free(&missc);
-+ queue_free(&qq);
-+ return res;
- }
-diff --git a/src/solvable.h b/src/solvable.h
-index bf92a000..d5258f2c 100644
---- a/src/solvable.h
-+++ b/src/solvable.h
-@@ -81,9 +81,10 @@ int solvable_identical(Solvable *s1, Solvable *s2);
- Id solvable_selfprovidedep(Solvable *s);
-
- int solvable_matchesdep(Solvable *s, Id keyname, Id dep, int marker);
-+int solvable_matchessolvable(Solvable *s, Id keyname, int marker, Id solvid, Queue *depq);
-
- /* internal */
--int solvable_matchessolvable_int(Solvable *s, Id keyname, int marker, Id solvid, Map *solvidmap, Queue *depq, Map *missc, int reloff);
-+int solvable_matchessolvable_int(Solvable *s, Id keyname, int marker, Id solvid, Map *solvidmap, Queue *depq, Map *missc, int reloff, Queue *outdepq);
-
-
- /* weird suse stuff */
---
-2.24.0
-
diff --git a/0006-Move-marker-argument-in-solvable_matchessolvable.patch b/0006-Move-marker-argument-in-solvable_matchessolvable.patch
deleted file mode 100644
index 2b01920..0000000
--- a/0006-Move-marker-argument-in-solvable_matchessolvable.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-From cea2f345d653f161961876a3d5fdeb0b498758ad Mon Sep 17 00:00:00 2001
-From: Michael Schroeder <mls@suse.de>
-Date: Tue, 22 Oct 2019 14:16:11 +0200
-Subject: [PATCH 6/8] Move marker argument in solvable_matchessolvable()
-
-This makes it similar to the pool_whatmatchessolvable() function.
----
- src/solvable.c | 2 +-
- src/solvable.h | 2 +-
- 2 files changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/src/solvable.c b/src/solvable.c
-index 332e6747..474e6f5b 100644
---- a/src/solvable.c
-+++ b/src/solvable.c
-@@ -720,7 +720,7 @@ solvable_matchessolvable_int(Solvable *s, Id keyname, int marker, Id solvid, Map
- }
-
- int
--solvable_matchessolvable(Solvable *s, Id keyname, int marker, Id solvid, Queue *depq)
-+solvable_matchessolvable(Solvable *s, Id keyname, Id solvid, Queue *depq, int marker)
- {
- Pool *pool = s->repo->pool;
- Map missc; /* cache for misses */
-diff --git a/src/solvable.h b/src/solvable.h
-index d5258f2c..7788e7c7 100644
---- a/src/solvable.h
-+++ b/src/solvable.h
-@@ -81,7 +81,7 @@ int solvable_identical(Solvable *s1, Solvable *s2);
- Id solvable_selfprovidedep(Solvable *s);
-
- int solvable_matchesdep(Solvable *s, Id keyname, Id dep, int marker);
--int solvable_matchessolvable(Solvable *s, Id keyname, int marker, Id solvid, Queue *depq);
-+int solvable_matchessolvable(Solvable *s, Id keyname, Id solvid, Queue *depq, int marker);
-
- /* internal */
- int solvable_matchessolvable_int(Solvable *s, Id keyname, int marker, Id solvid, Map *solvidmap, Queue *depq, Map *missc, int reloff, Queue *outdepq);
---
-2.24.0
-
diff --git a/0007-Add-support-for-blacklisted-packages.patch b/0007-Add-support-for-blacklisted-packages.patch
deleted file mode 100644
index ebd7b09..0000000
--- a/0007-Add-support-for-blacklisted-packages.patch
+++ /dev/null
@@ -1,617 +0,0 @@
-From 4120051be87d2cccc2146a30c5128edd5c78d76d Mon Sep 17 00:00:00 2001
-From: Michael Schroeder <mls@suse.de>
-Date: Fri, 8 Nov 2019 14:34:18 +0100
-Subject: [PATCH 7/8] Add support for blacklisted packages
-
-This will be used in SUSE's ptf packages and also to retract
-released updates. The idea is that it is not possible to pull in
-a blacklisted package via a dependency, they can only be installed
-by a job that directly addresses them (the SETEVR bit is set).
----
- ext/libsolvext.ver | 1 +
- ext/repo_updateinfoxml.c | 89 ++++++++++++++++++++++
- ext/repo_updateinfoxml.h | 3 +
- ext/testcase.c | 2 +
- src/problems.c | 15 ++++
- src/problems.h | 11 +--
- src/rules.c | 118 +++++++++++++++++++++++++++++
- src/rules.h | 6 +-
- src/solver.c | 13 ++++
- src/solver.h | 4 +
- src/solverdebug.c | 2 +
- test/testcases/blacklist/ptf | 52 +++++++++++++
- test/testcases/blacklist/retracted | 22 ++++++
- tools/repo2solv.c | 1 +
- 14 files changed, 333 insertions(+), 6 deletions(-)
- create mode 100644 test/testcases/blacklist/ptf
- create mode 100644 test/testcases/blacklist/retracted
-
-diff --git a/ext/libsolvext.ver b/ext/libsolvext.ver
-index ef028f0f..02cf6d14 100644
---- a/ext/libsolvext.ver
-+++ b/ext/libsolvext.ver
-@@ -42,6 +42,7 @@ SOLV_1.0 {
- repo_add_zyppdb_products;
- repo_find_all_pubkeys;
- repo_find_pubkey;
-+ repo_mark_retracted_packages;
- repo_verify_sigdata;
- rpm_byfp;
- rpm_byrpmdbid;
-diff --git a/ext/repo_updateinfoxml.c b/ext/repo_updateinfoxml.c
-index 984f491b..51c3f5ab 100644
---- a/ext/repo_updateinfoxml.c
-+++ b/ext/repo_updateinfoxml.c
-@@ -490,3 +490,92 @@ repo_add_updateinfoxml(Repo *repo, FILE *fp, int flags)
- return pd.ret;
- }
-
-+#ifdef SUSE
-+
-+static int
-+repo_mark_retracted_packages_cmp(const void *ap, const void *bp, void *dp)
-+{
-+ Id *a = (Id *)ap;
-+ Id *b = (Id *)bp;
-+ if (a[1] != b[1])
-+ return a[1] - b[1];
-+ if (a[2] != b[2])
-+ return a[2] - b[2];
-+ if (a[0] != b[0])
-+ return a[0] - b[0];
-+ return 0;
-+}
-+
-+
-+void
-+repo_mark_retracted_packages(Repo *repo, Id retractedmarker)
-+{
-+ Pool *pool = repo->pool;
-+ int i, p;
-+ Solvable *s;
-+ Id con, *conp;
-+ Id retractedname, retractedevr;
-+
-+ Queue q;
-+ queue_init(&q);
-+ for (p = 1; p < pool->nsolvables; p++)
-+ {
-+ const char *status;
-+ s = pool->solvables + p;
-+ if (strncmp(pool_id2str(pool, s->name), "patch:", 6) != 0)
-+ {
-+ if (s->arch == ARCH_SRC || s->arch == ARCH_NOSRC)
-+ continue;
-+ queue_push2(&q, p, s->name);
-+ queue_push2(&q, s->evr, s->arch);
-+ continue;
-+ }
-+ status = solvable_lookup_str(s, UPDATE_STATUS);
-+ if (!status || strcmp(status, "retracted") != 0)
-+ continue;
-+ if (!s->conflicts)
-+ continue;
-+ conp = s->repo->idarraydata + s->conflicts;
-+ while ((con = *conp++) != 0)
-+ {
-+ Reldep *rd;
-+ Id name, evr, arch;
-+ if (!ISRELDEP(con))
-+ continue;
-+ rd = GETRELDEP(pool, con);
-+ if (rd->flags != REL_LT)
-+ continue;
-+ name = rd->name;
-+ evr = rd->evr;
-+ arch = 0;
-+ if (ISRELDEP(name))
-+ {
-+ rd = GETRELDEP(pool, name);
-+ name = rd->name;
-+ if (rd->flags == REL_ARCH)
-+ arch = rd->evr;
-+ }
-+ queue_push2(&q, 0, name);
-+ queue_push2(&q, evr, arch);
-+ }
-+ }
-+ if (q.count)
-+ solv_sort(q.elements, q.count / 4, sizeof(Id) * 4, repo_mark_retracted_packages_cmp, repo->pool);
-+ retractedname = retractedevr = 0;
-+ for (i = 0; i < q.count; i += 4)
-+ {
-+ if (!q.elements[i])
-+ {
-+ retractedname = q.elements[i + 1];
-+ retractedevr = q.elements[i + 2];
-+ }
-+ else if (q.elements[i + 1] == retractedname && q.elements[i + 2] == retractedevr)
-+ {
-+ s = pool->solvables + q.elements[i];
-+ s->provides = repo_addid_dep(repo, s->provides, retractedmarker, 0);
-+ }
-+ }
-+ queue_free(&q);
-+}
-+
-+#endif
-diff --git a/ext/repo_updateinfoxml.h b/ext/repo_updateinfoxml.h
-index bd0a61b6..c3da0f67 100644
---- a/ext/repo_updateinfoxml.h
-+++ b/ext/repo_updateinfoxml.h
-@@ -6,3 +6,6 @@
- */
-
- extern int repo_add_updateinfoxml(Repo *repo, FILE *fp, int flags);
-+
-+extern void repo_mark_retracted_packages(Repo *repo, Id retractedmarker);
-+
-diff --git a/ext/testcase.c b/ext/testcase.c
-index bd0643a8..d6c4a577 100644
---- a/ext/testcase.c
-+++ b/ext/testcase.c
-@@ -59,6 +59,7 @@ static struct job2str {
- { SOLVER_ALLOWUNINSTALL, "allowuninstall" },
- { SOLVER_FAVOR, "favor" },
- { SOLVER_DISFAVOR, "disfavor" },
-+ { SOLVER_BLACKLIST, "blacklist" },
- { 0, 0 }
- };
-
-@@ -1190,6 +1191,7 @@ static struct rclass2str {
- { SOLVER_RULE_LEARNT, "learnt" },
- { SOLVER_RULE_BEST, "best" },
- { SOLVER_RULE_YUMOBS, "yumobs" },
-+ { SOLVER_RULE_BLACK, "black" },
- { SOLVER_RULE_RECOMMENDS, "recommends" },
- { 0, 0 }
- };
-diff --git a/src/problems.c b/src/problems.c
-index 6f2ad4b1..b46d6249 100644
---- a/src/problems.c
-+++ b/src/problems.c
-@@ -719,6 +719,12 @@ convertsolution(Solver *solv, Id why, Queue *solutionq)
- }
- return;
- }
-+ if (why >= solv->blackrules && why < solv->blackrules_end)
-+ {
-+ queue_push(solutionq, SOLVER_SOLUTION_BLACK);
-+ assert(solv->rules[why].p < 0);
-+ queue_push(solutionq, -solv->rules[why].p);
-+ }
- }
-
- /*
-@@ -981,6 +987,8 @@ solver_solutionelement_extrajobflags(Solver *solv, Id problem, Id solution)
- * -> add (SOLVER_INSTALL|SOLVER_SOLVABLE, rp) to the job
- * SOLVER_SOLUTION_BEST pkgid
- * -> add (SOLVER_INSTALL|SOLVER_SOLVABLE, rp) to the job
-+ * SOLVER_SOLUTION_BLACK pkgid
-+ * -> add (SOLVER_INSTALL|SOLVER_SOLVABLE, rp) to the job
- * SOLVER_SOLUTION_JOB jobidx
- * -> remove job (jobidx - 1, jobidx) from job queue
- * SOLVER_SOLUTION_POOLJOB jobidx
-@@ -1331,6 +1339,8 @@ solver_problemruleinfo2str(Solver *solv, SolverRuleinfo type, Id source, Id targ
- s = pool_tmpjoin(pool, "both package ", pool_solvid2str(pool, source), " and ");
- s = pool_tmpjoin(pool, s, pool_solvid2str(pool, target), " obsolete ");
- return pool_tmpappend(pool, s, pool_dep2str(pool, dep), 0);
-+ case SOLVER_RULE_BLACK:
-+ return pool_tmpjoin(pool, "package ", pool_solvid2str(pool, source), " can only be installed by a direct request");
- default:
- return "bad problem rule type";
- }
-@@ -1385,6 +1395,11 @@ solver_solutionelement2str(Solver *solv, Id p, Id rp)
- else
- return pool_tmpjoin(pool, "install ", pool_solvable2str(pool, s), " despite the old version");
- }
-+ else if (p == SOLVER_SOLUTION_BLACK)
-+ {
-+ Solvable *s = pool->solvables + rp;
-+ return pool_tmpjoin(pool, "install ", pool_solvable2str(pool, s), 0);
-+ }
- else if (p > 0 && rp == 0)
- return pool_tmpjoin(pool, "allow deinstallation of ", pool_solvid2str(pool, p), 0);
- else if (p > 0 && rp > 0)
-diff --git a/src/problems.h b/src/problems.h
-index 37021e1d..45e4e7c6 100644
---- a/src/problems.h
-+++ b/src/problems.h
-@@ -22,11 +22,12 @@ extern "C" {
-
- struct s_Solver;
-
--#define SOLVER_SOLUTION_JOB (0)
--#define SOLVER_SOLUTION_DISTUPGRADE (-1)
--#define SOLVER_SOLUTION_INFARCH (-2)
--#define SOLVER_SOLUTION_BEST (-3)
--#define SOLVER_SOLUTION_POOLJOB (-4)
-+#define SOLVER_SOLUTION_JOB (0)
-+#define SOLVER_SOLUTION_DISTUPGRADE (-1)
-+#define SOLVER_SOLUTION_INFARCH (-2)
-+#define SOLVER_SOLUTION_BEST (-3)
-+#define SOLVER_SOLUTION_POOLJOB (-4)
-+#define SOLVER_SOLUTION_BLACK (-5)
-
- void solver_recordproblem(struct s_Solver *solv, Id rid);
- void solver_fixproblem(struct s_Solver *solv, Id rid);
-diff --git a/src/rules.c b/src/rules.c
-index 57895c01..611029e3 100644
---- a/src/rules.c
-+++ b/src/rules.c
-@@ -2101,6 +2101,97 @@ reenableduprule(Solver *solv, Id name)
- }
- }
-
-+/***********************************************************************
-+ ***
-+ *** Black rule part
-+ ***/
-+
-+static inline void
-+disableblackrule(Solver *solv, Id p)
-+{
-+ Rule *r;
-+ int i;
-+ for (i = solv->blackrules, r = solv->rules + i; i < solv->blackrules_end; i++, r++)
-+ if (r->p == -p)
-+ solver_disablerule(solv, r);
-+}
-+
-+static inline void
-+reenableblackrule(Solver *solv, Id p)
-+{
-+ Pool *pool = solv->pool;
-+ Rule *r;
-+ int i;
-+ for (i = solv->blackrules, r = solv->rules + i; i < solv->blackrules_end; i++, r++)
-+ if (r->p == -p)
-+ {
-+ solver_enablerule(solv, r);
-+ IF_POOLDEBUG (SOLV_DEBUG_SOLUTIONS)
-+ {
-+ POOL_DEBUG(SOLV_DEBUG_SOLUTIONS, "@@@ re-enabling ");
-+ solver_printruleclass(solv, SOLV_DEBUG_SOLUTIONS, r);
-+ }
-+ }
-+}
-+
-+void
-+solver_addblackrules(Solver *solv)
-+{
-+ int i;
-+ Id how, select, what, p, pp;
-+ Queue *job = &solv->job;
-+ Pool *pool = solv->pool;
-+ Repo *installed = solv->installed;
-+ Map updatemap;
-+
-+ map_init(&updatemap, 0);
-+ solv->blackrules = solv->nrules;
-+ if (installed)
-+ {
-+ for (i = 0; i < job->count; i += 2)
-+ {
-+ how = job->elements[i];
-+ select = job->elements[i] & SOLVER_SELECTMASK;
-+ what = job->elements[i + 1];
-+ switch (how & SOLVER_JOBMASK)
-+ {
-+ case SOLVER_BLACKLIST:
-+ FOR_JOB_SELECT(p, pp, select, what)
-+ {
-+ Solvable *s = pool->solvables + p;
-+ if (s->repo != installed)
-+ continue;
-+ if (!updatemap.size)
-+ map_grow(&updatemap, pool->ss.nstrings);
-+ if (s->name > 0 && s->name < pool->ss.nstrings)
-+ MAPSET(&updatemap, s->name);
-+ }
-+ }
-+ }
-+ }
-+ for (i = 0; i < job->count; i += 2)
-+ {
-+ how = job->elements[i];
-+ select = job->elements[i] & SOLVER_SELECTMASK;
-+ what = job->elements[i + 1];
-+ switch (how & SOLVER_JOBMASK)
-+ {
-+ case SOLVER_BLACKLIST:
-+ FOR_JOB_SELECT(p, pp, select, what)
-+ {
-+ Solvable *s = pool->solvables + p;
-+ if (s->repo == installed)
-+ continue;
-+ if (updatemap.size && s->name > 0 && s->name < pool->ss.nstrings && MAPTST(&updatemap, s->name))
-+ continue; /* installed package with same name is already blacklisted */
-+ solver_addrule(solv, -p, 0, 0);
-+ }
-+ break;
-+ }
-+ }
-+ map_free(&updatemap);
-+ solv->blackrules_end = solv->nrules;
-+}
-
- /***********************************************************************
- ***
-@@ -2114,6 +2205,7 @@ reenableduprule(Solver *solv, Id name)
- #define DISABLE_UPDATE 1
- #define DISABLE_INFARCH 2
- #define DISABLE_DUP 3
-+#define DISABLE_BLACK 4
-
- static void
- jobtodisablelist(Solver *solv, Id how, Id what, Queue *q)
-@@ -2213,6 +2305,16 @@ jobtodisablelist(Solver *solv, Id how, Id what, Queue *q)
- }
- }
- }
-+ if ((set & SOLVER_SETEVR) != 0 && solv->blackrules != solv->blackrules_end)
-+ {
-+ if (select == SOLVER_SOLVABLE)
-+ queue_push2(q, DISABLE_BLACK, what);
-+ else
-+ {
-+ FOR_JOB_SELECT(p, pp, select, what)
-+ queue_push2(q, DISABLE_BLACK, p);
-+ }
-+ }
- if (!installed || installed->end == installed->start)
- return;
- /* now the hard part: disable some update rules */
-@@ -2386,6 +2488,9 @@ solver_disablepolicyrules(Solver *solv)
- case DISABLE_DUP:
- disableduprule(solv, arg);
- break;
-+ case DISABLE_BLACK:
-+ disableblackrule(solv, arg);
-+ break;
- default:
- break;
- }
-@@ -2489,6 +2594,9 @@ solver_reenablepolicyrules(Solver *solv, int jobidx)
- case DISABLE_DUP:
- reenableduprule(solv, arg);
- break;
-+ case DISABLE_BLACK:
-+ reenableblackrule(solv, arg);
-+ break;
- }
- }
- queue_free(&q);
-@@ -2815,6 +2923,12 @@ solver_ruleinfo(Solver *solv, Id rid, Id *fromp, Id *top, Id *depp)
- *depp = solv->yumobsrules_info[rid - solv->yumobsrules];
- return SOLVER_RULE_YUMOBS;
- }
-+ if (rid >= solv->blackrules && rid < solv->blackrules_end)
-+ {
-+ if (fromp)
-+ *fromp = -r->p;
-+ return SOLVER_RULE_BLACK;
-+ }
- if (rid >= solv->choicerules && rid < solv->choicerules_end)
- return SOLVER_RULE_CHOICE;
- if (rid >= solv->recommendsrules && rid < solv->recommendsrules_end)
-@@ -2845,10 +2959,14 @@ solver_ruleclass(Solver *solv, Id rid)
- return SOLVER_RULE_BEST;
- if (rid >= solv->yumobsrules && rid < solv->yumobsrules_end)
- return SOLVER_RULE_YUMOBS;
-+ if (rid >= solv->blackrules && rid < solv->blackrules_end)
-+ return SOLVER_RULE_BLACK;
- if (rid >= solv->choicerules && rid < solv->choicerules_end)
- return SOLVER_RULE_CHOICE;
- if (rid >= solv->recommendsrules && rid < solv->recommendsrules_end)
- return SOLVER_RULE_RECOMMENDS;
-+ if (rid >= solv->blackrules && rid < solv->blackrules_end)
-+ return SOLVER_RULE_BLACK;
- if (rid >= solv->learntrules && rid < solv->nrules)
- return SOLVER_RULE_LEARNT;
- return SOLVER_RULE_UNKNOWN;
-diff --git a/src/rules.h b/src/rules.h
-index 6b8511f7..92860908 100644
---- a/src/rules.h
-+++ b/src/rules.h
-@@ -72,7 +72,8 @@ typedef enum {
- SOLVER_RULE_LEARNT = 0x800,
- SOLVER_RULE_BEST = 0x900,
- SOLVER_RULE_YUMOBS = 0xa00,
-- SOLVER_RULE_RECOMMENDS = 0xb00
-+ SOLVER_RULE_RECOMMENDS = 0xb00,
-+ SOLVER_RULE_BLACK = 0xc00
- } SolverRuleinfo;
-
- #define SOLVER_RULE_TYPEMASK 0xff00
-@@ -134,6 +135,9 @@ extern void solver_addbestrules(struct s_Solver *solv, int havebestinstalljobs,
- /* yumobs rules */
- extern void solver_addyumobsrules(struct s_Solver *solv);
-
-+/* black rules */
-+extern void solver_addblackrules(struct s_Solver *solv);
-+
- /* recommends rules */
- extern void solver_addrecommendsrules(struct s_Solver *solv);
-
-diff --git a/src/solver.c b/src/solver.c
-index 45f9dbfd..6a9d66e6 100644
---- a/src/solver.c
-+++ b/src/solver.c
-@@ -3377,6 +3377,7 @@ solver_solve(Solver *solv, Queue *job)
- int hasbestinstalljob = 0;
- int hasfavorjob = 0;
- int haslockjob = 0;
-+ int hasblacklistjob = 0;
-
- solve_start = solv_timems(0);
-
-@@ -3987,6 +3988,10 @@ solver_solve(Solver *solv, Queue *job)
- POOL_DEBUG(SOLV_DEBUG_JOB, "job: %s %s\n", (how & SOLVER_JOBMASK) == SOLVER_FAVOR ? "favor" : "disfavor", solver_select2str(pool, select, what));
- hasfavorjob = 1;
- break;
-+ case SOLVER_BLACKLIST:
-+ POOL_DEBUG(SOLV_DEBUG_JOB, "job: blacklist %s\n", solver_select2str(pool, select, what));
-+ hasblacklistjob = 1;
-+ break;
- default:
- POOL_DEBUG(SOLV_DEBUG_JOB, "job: unknown job\n");
- break;
-@@ -4040,6 +4045,11 @@ solver_solve(Solver *solv, Queue *job)
- else
- solv->yumobsrules = solv->yumobsrules_end = solv->nrules;
-
-+ if (hasblacklistjob)
-+ solver_addblackrules(solv);
-+ else
-+ solv->blackrules = solv->blackrules_end = solv->nrules;
-+
- if (solv->havedisfavored && solv->strongrecommends && solv->recommendsruleq)
- solver_addrecommendsrules(solv);
- else
-@@ -4851,6 +4861,9 @@ pool_job2str(Pool *pool, Id how, Id what, Id flagmask)
- case SOLVER_DISFAVOR:
- strstart = "disfavor ";
- break;
-+ case SOLVER_BLACKLIST:
-+ strstart = "blacklist ";
-+ break;
- default:
- strstart = "unknown job ";
- break;
-diff --git a/src/solver.h b/src/solver.h
-index daf4f636..2dec2590 100644
---- a/src/solver.h
-+++ b/src/solver.h
-@@ -76,6 +76,9 @@ struct s_Solver {
- Id yumobsrules_end;
- Id *yumobsrules_info; /* the dependency for each rule */
-
-+ Id blackrules; /* rules from blacklisted packages */
-+ Id blackrules_end;
-+
- Id choicerules; /* choice rules (always weak) */
- Id choicerules_end;
- Id *choicerules_info; /* the rule we used to generate the choice rule */
-@@ -244,6 +247,7 @@ typedef struct s_Solver Solver;
- #define SOLVER_ALLOWUNINSTALL 0x0b00
- #define SOLVER_FAVOR 0x0c00
- #define SOLVER_DISFAVOR 0x0d00
-+#define SOLVER_BLACKLIST 0x0e00
-
- #define SOLVER_JOBMASK 0xff00
-
-diff --git a/src/solverdebug.c b/src/solverdebug.c
-index b1b55f48..0b2879b0 100644
---- a/src/solverdebug.c
-+++ b/src/solverdebug.c
-@@ -128,6 +128,8 @@ solver_printruleclass(Solver *solv, int type, Rule *r)
- POOL_DEBUG(type, "FEATURE ");
- else if (p >= solv->yumobsrules && p < solv->yumobsrules_end)
- POOL_DEBUG(type, "YUMOBS ");
-+ else if (p >= solv->blackrules && p < solv->blackrules_end)
-+ POOL_DEBUG(type, "BLACK ");
- else if (p >= solv->recommendsrules && p < solv->recommendsrules_end)
- POOL_DEBUG(type, "RECOMMENDS ");
- solver_printrule(solv, type, r);
-diff --git a/test/testcases/blacklist/ptf b/test/testcases/blacklist/ptf
-new file mode 100644
-index 00000000..b8765d05
---- /dev/null
-+++ b/test/testcases/blacklist/ptf
-@@ -0,0 +1,52 @@
-+repo system 0 testtags <inline>
-+#>=Pkg: ptf-2 1 1 noarch
-+#>=Prv: ptf-package()
-+repo available 0 testtags <inline>
-+#>=Pkg: ptf-1 1 1 noarch
-+#>=Prv: ptf-package()
-+#>=Pkg: ptf-2 2 1 noarch
-+#>=Prv: ptf-package()
-+#>=Pkg: A 1 1 noarch
-+#>=Req: ptf-1
-+
-+system i686 * system
-+
-+#
-+# test 1: a ptf package cannot be pulled in via a dependency
-+#
-+job blacklist provides ptf-package()
-+job install name A
-+result transaction,problems <inline>
-+#>problem 78613afb info package A-1-1.noarch requires ptf-1, but none of the providers can be installed
-+#>problem 78613afb solution 23f73f5b deljob install name A
-+#>problem 78613afb solution b79aeb6f allow ptf-1-1-1.noarch@available
-+
-+#
-+# test 2: a ptf package cannot be pulled in via a unspecific job
-+#
-+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 solution 932a6c2f deljob install name ptf-1
-+#>problem 021b17e2 solution b79aeb6f allow ptf-1-1-1.noarch@available
-+
-+#
-+# test 3: a ptf package can be pulled in via a specific job
-+#
-+nextjob
-+job blacklist provides ptf-package()
-+job install name ptf-1 [setevr]
-+result transaction,problems <inline>
-+#>install ptf-1-1-1.noarch@available
-+
-+#
-+# test 4: a ptf package can be updated
-+#
-+nextjob
-+job blacklist provides ptf-package()
-+job update all packages
-+result transaction,problems <inline>
-+#>upgrade ptf-2-1-1.noarch@system ptf-2-2-1.noarch@available
-+
-diff --git a/test/testcases/blacklist/retracted b/test/testcases/blacklist/retracted
-new file mode 100644
-index 00000000..d75f17dd
---- /dev/null
-+++ b/test/testcases/blacklist/retracted
-@@ -0,0 +1,22 @@
-+repo system 0 testtags <inline>
-+#>=Pkg: B 1 1 noarch
-+repo available 0 testtags <inline>
-+#>=Pkg: patch 1 1 noarch
-+#>=Con: B < 2-1
-+#>=Pkg: B 2 1 noarch
-+#>=Prv: retracted-patch-package()
-+
-+system i686 * system
-+
-+job blacklist provides retracted-patch-package()
-+job install name patch
-+#>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
-+#>problem 3a66200a solution 718064ed erase B-1-1.noarch@system
-+
-+nextjob
-+job blacklist provides retracted-patch-package()
-+job install pkg B-2-1.noarch@available
-+result transaction,problems <inline>
-+#>upgrade B-1-1.noarch@system B-2-1.noarch@available
-diff --git a/tools/repo2solv.c b/tools/repo2solv.c
-index 03491a67..b3907439 100644
---- a/tools/repo2solv.c
-+++ b/tools/repo2solv.c
-@@ -868,6 +868,7 @@ main(int argc, char **argv)
- #ifdef SUSE
- if (add_auto)
- repo_add_autopattern(repo, 0);
-+ repo_mark_retracted_packages(repo, pool_str2id(pool, "retracted-patch-package()", 1));
- #endif
- tool_write(repo, stdout);
- pool_free(pool);
---
-2.24.0
-
diff --git a/0008-Add-experimental-support-for-self-destruct-packages.patch b/0008-Add-experimental-support-for-self-destruct-packages.patch
deleted file mode 100644
index 00ef780..0000000
--- a/0008-Add-experimental-support-for-self-destruct-packages.patch
+++ /dev/null
@@ -1,83 +0,0 @@
-From 25356d16b4520d716e64c8f9506ef4d00b343c63 Mon Sep 17 00:00:00 2001
-From: Michael Schroeder <mls@suse.de>
-Date: Fri, 8 Nov 2019 15:09:54 +0100
-Subject: [PATCH 8/8] Add experimental support for self-destruct packages
-
-Self-destruct packages will not be part of the transaction. But
-they still will obsolete packages, thus updating to a self-destruct
-package will lead to the erasure of the old package.
----
- src/knownid.h | 2 ++
- src/transaction.c | 15 ++++++++++++++-
- 2 files changed, 16 insertions(+), 1 deletion(-)
-
-diff --git a/src/knownid.h b/src/knownid.h
-index 7da12396..3a88ee26 100644
---- a/src/knownid.h
-+++ b/src/knownid.h
-@@ -263,6 +263,8 @@ KNOWNID(SOLVABLE_BUILDFLAVOR, "solvable:buildflavor"), /* conda */
-
- KNOWNID(UPDATE_STATUS, "update:status"), /* "stable", "testing", ...*/
-
-+KNOWNID(LIBSOLV_SELF_DESTRUCT_PKG, "libsolv-self-destruct-pkg()"), /* this package will self-destruct on installation */
-+
- KNOWNID(ID_NUM_INTERNAL, 0)
-
- #ifdef KNOWNID_INITIALIZE
-diff --git a/src/transaction.c b/src/transaction.c
-index 4a4189eb..fb2cc9aa 100644
---- a/src/transaction.c
-+++ b/src/transaction.c
-@@ -646,6 +646,8 @@ create_transaction_info(Transaction *trans, Queue *decisionq)
- s = pool->solvables + p;
- if (!s->repo || s->repo == installed)
- continue;
-+ if (!MAPTST(&trans->transactsmap, p))
-+ continue;
- multi = trans->multiversionmap.size && MAPTST(&trans->multiversionmap, p);
- FOR_PROVIDES(p2, pp2, s->name)
- {
-@@ -726,9 +728,10 @@ transaction_create_decisionq(Pool *pool, Queue *decisionq, Map *multiversionmap)
- {
- Repo *installed = pool->installed;
- int i, needmulti;
-- Id p;
-+ Id p, pp;
- Solvable *s;
- Transaction *trans;
-+ Map selfdestructmap;
-
- trans = transaction_create(pool);
- if (multiversionmap && !multiversionmap->size)
-@@ -736,6 +739,13 @@ transaction_create_decisionq(Pool *pool, Queue *decisionq, Map *multiversionmap)
- queue_empty(&trans->steps);
- map_init(&trans->transactsmap, pool->nsolvables);
- needmulti = 0;
-+ map_init(&selfdestructmap, 0);
-+ FOR_PROVIDES(p, pp, LIBSOLV_SELF_DESTRUCT_PKG)
-+ {
-+ if (!selfdestructmap.size)
-+ map_grow(&selfdestructmap, pool->nsolvables);
-+ MAPSET(&selfdestructmap, p);
-+ }
- for (i = 0; i < decisionq->count; i++)
- {
- p = decisionq->elements[i];
-@@ -746,11 +756,14 @@ transaction_create_decisionq(Pool *pool, Queue *decisionq, Map *multiversionmap)
- MAPSET(&trans->transactsmap, -p);
- if (!(installed && s->repo == installed) && p > 0)
- {
-+ if (selfdestructmap.size && MAPTST(&selfdestructmap, p))
-+ continue;
- MAPSET(&trans->transactsmap, p);
- if (multiversionmap && MAPTST(multiversionmap, p))
- needmulti = 1;
- }
- }
-+ map_free(&selfdestructmap);
- MAPCLR(&trans->transactsmap, SYSTEMSOLVABLE);
- if (needmulti)
- map_init_clone(&trans->multiversionmap, multiversionmap);
---
-2.24.0
-
diff --git a/libsolv.spec b/libsolv.spec
index 38327be..e275708 100644
--- a/libsolv.spec
+++ b/libsolv.spec
@@ -5,23 +5,13 @@
Summary: Package dependency solver and repository storage system
Name: libsolv
-Version: 0.7.7
-Release: 2
+Version: 0.7.8
+Release: 1
License: MIT
Group: System/Libraries
# See also: https://github.com/openSUSE/libsolv
URL: http://en.opensuse.org/openSUSE:Libzypp_satsolver
Source0: https://github.com/openSUSE/%{name}/archive/%{version}/%{name}-%{version}.tar.gz
-# Patches from git master
-# libzypp needs solvable_matchessolvable (added in Patch4)
-Patch0: 0001-Parse-the-patch-status-in-the-updateinfo-xml.patch
-Patch1: 0002-Add-UPDATE_STATUS-to-knownids.patch
-Patch2: 0003-repo_rpmdb.c-move-Packages-string-into-backend-imple.patch
-Patch3: 0004-Add-workaround-to-stat_database-to-find-other-databa.patch
-Patch4: 0005-Add-solvable_matchessolvable-function.patch
-Patch5: 0006-Move-marker-argument-in-solvable_matchessolvable.patch
-Patch6: 0007-Add-support-for-blacklisted-packages.patch
-Patch7: 0008-Add-experimental-support-for-self-destruct-packages.patch
# OpenMandriva specific patches
## znver1 support
Patch1001: libsolv-0.6.34-znver1.patch