From: Michael Schroeder Date: Mon, 7 Jul 2025 11:27:04 +0000 (+0200) Subject: repo_autopattern: support creation of obsoletes for product packages X-Git-Tag: 0.7.34~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=aba891ef741a31a687a0996d6e6f88f674a9b029;p=thirdparty%2Flibsolv.git repo_autopattern: support creation of obsoletes for product packages This adds support for provides of the type "product-obsoletes(name)". We translate this to "Obsoletes: product:" in the generated product pseudo package. We need this because people used "Obsoletes: product:name" in the "release" package, but this is no longer allowed in newer rpm versions. Besides, the obsoletes is kind of wrong in the "release" package anyway, it belongs in the generated "product:" package. --- diff --git a/ext/repo_autopattern.c b/ext/repo_autopattern.c index 40d21128..23dd1733 100644 --- a/ext/repo_autopattern.c +++ b/ext/repo_autopattern.c @@ -404,17 +404,19 @@ repo_add_autopattern(Repo *repo, int flags) while ((prv = *prvp++) != 0) /* go through all provides */ { Id evr = 0; + int flags = 0; if (ISRELDEP(prv)) { Reldep *rd = GETRELDEP(pool, prv); - if (rd->flags != REL_EQ) - continue; prv = rd->name; evr = rd->evr; + flags = rd->flags; } pn = pool_id2str(pool, prv); if (strncmp("product-", pn, 8) != 0) continue; + if (flags && flags != REL_EQ && strncmp(pn, "product-obsoletes(", 18) != 0) + continue; newname = 0; if (evr) { @@ -452,6 +454,18 @@ repo_add_autopattern(Repo *repo, int flags) repodata_add_poolstr_array(data, s2 - pool->solvables, PRODUCT_URL_TYPE, type); repodata_add_poolstr_array(data, s2 - pool->solvables, PRODUCT_URL, newname); } + else if (!strncmp(pn, "product-obsoletes(", 18) && pn[18] && pn[19]) + { + if (newname) + pool_freetmpspace(pool, newname); + newname = pool_tmpjoin(pool, "product:", pn + 18, 0); + newname[strlen(newname) - 1] = 0; /* closing ) */ + unescape(newname); + Id obs = pool_str2id(pool, newname, 1); + if (flags && evr) + obs = pool_rel2id(pool, obs, evr, flags, 1); + s2->obsoletes = repo_addid_dep(s2->repo, s2->obsoletes, obs, 0); + } } } queue_free(&prdq);