]> git.ipfire.org Git - thirdparty/libsolv.git/commitdiff
Implement getting the releasever from the base product on SUSE
authorMichael Schroeder <mls@suse.de>
Thu, 15 Sep 2022 14:11:38 +0000 (16:11 +0200)
committerMichael Schroeder <mls@suse.de>
Thu, 15 Sep 2022 14:11:38 +0000 (16:11 +0200)
examples/solv/repoinfo_config_yum.c
examples/solv/repoinfo_system_rpm.c

index efccf1e844500c05d5840272bdb743d0a2f2e03b..9a36f9b5f427172238f33675fa8c15a38ad4e94e 100644 (file)
 # define REPOINFO_PATH "/etc/zypp/repos.d"
 #endif
 
+static char *
+find_releaseevr(Pool *pool)
+{
+#ifdef SUSE
+  extern char *suse_find_baseproduct_evr(Pool *);
+#endif
+  void *rpmstate;
+  char *releaseevr = 0;
+  Queue q;
+
+#ifdef SUSE
+  if ((releaseevr = suse_find_baseproduct_evr(pool)) != 0)
+    return releaseevr;
+#endif
+  queue_init(&q);
+  rpmstate = rpm_state_create(pool, pool_get_rootdir(pool));
+  rpm_installedrpmdbids(rpmstate, "Providename", "system-release", &q);
+  if (q.count)
+    {
+      void *handle;
+      char *p;
+      handle = rpm_byrpmdbid(rpmstate, q.elements[0]);
+      releaseevr = handle ? rpm_query(handle, SOLVABLE_EVR) : 0;
+      if (releaseevr && (p = strchr(releaseevr, '-')) != 0)
+       *p = 0;
+    }
+  rpm_state_free(rpmstate);
+  queue_free(&q);
+  return releaseevr;
+}
+
 char *
 yum_substitute(Pool *pool, char *line)
 {
@@ -43,28 +74,15 @@ yum_substitute(Pool *pool, char *line)
        {
          if (!releaseevr)
            {
-             void *rpmstate;
-             Queue q;
-       
-             queue_init(&q);
-             rpmstate = rpm_state_create(pool, pool_get_rootdir(pool));
-             rpm_installedrpmdbids(rpmstate, "Providename", "system-release", &q);
-             if (q.count)
-               {
-                 void *handle;
-                 char *p;
-                 handle = rpm_byrpmdbid(rpmstate, q.elements[0]);
-                 releaseevr = handle ? rpm_query(handle, SOLVABLE_EVR) : 0;
-                 if (releaseevr && (p = strchr(releaseevr, '-')) != 0)
-                   *p = 0;
-               }
-             rpm_state_free(rpmstate);
-             queue_free(&q);
+             releaseevr = find_releaseevr(pool);
              if (!releaseevr)
                {
-                 fprintf(stderr, "no installed package provides 'system-release', cannot determine $releasever\n");
+                 fprintf(stderr, "Cannot determine $releasever\n");
                  exit(1);
                }
+             /* we only need the version */
+             if ((p = strchr(releaseevr, '-')) != 0)
+               *p = 0;
            }
          *p2 = 0;
          p = pool_tmpjoin(pool, line, releaseevr, p2 + 11);
index b556afc5d6b7eb25df157c7d0690c78e5b84124c..b5cfd8a2700833fd7c5ea38db40b3194990a5224 100644 (file)
@@ -161,4 +161,29 @@ commit_transactionelement_rpm(Pool *pool, Id type, Id p, FILE *fp)
     }
 }
 
+#ifdef SUSE
+char *
+suse_find_baseproduct_evr(Pool *pool)
+{
+  char *evrstr = 0;
+  Pool *productspool = pool_create();
+  Repo *productsrepo = repo_create(productspool, "products");
+  Id p;
+  Solvable *s;
+
+  pool_set_rootdir(productspool, pool_get_rootdir(pool));
+  repo_add_products(productsrepo, PRODUCTS_PATH, REPO_USE_ROOTDIR);
+  FOR_REPO_SOLVABLES(productsrepo, p, s)
+    {
+      const char *type = solvable_lookup_str(s, PRODUCT_TYPE);
+      if (!type || strcmp(type, "base") != 0)
+       continue;
+      evrstr = solv_strdup(pool_id2str(productspool, s->evr));
+      break;
+    }
+  pool_free(productspool);
+  return evrstr;
+}
+#endif
+
 #endif