]> git.ipfire.org Git - thirdparty/libsolv.git/commitdiff
repo_autopattern: support creation of obsoletes for product packages
authorMichael Schroeder <mls@suse.de>
Mon, 7 Jul 2025 11:27:04 +0000 (13:27 +0200)
committerMichael Schroeder <mls@suse.de>
Mon, 7 Jul 2025 11:31:29 +0000 (13:31 +0200)
This adds support for provides of the type "product-obsoletes(name)".
We translate this to "Obsoletes: product:<name>" 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.

ext/repo_autopattern.c

index 40d211289a053337fc8bc92fcf51528b59cff547..23dd1733d828daeb5dc36a39e3e5012c2a5d1336 100644 (file)
@@ -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);