Imported Upstream version 0.7.15 upstream/0.7.15
authorDongHun Kwak <dh0128.kwak@samsung.com>
Fri, 27 Nov 2020 05:49:33 +0000 (14:49 +0900)
committerDongHun Kwak <dh0128.kwak@samsung.com>
Fri, 27 Nov 2020 05:49:33 +0000 (14:49 +0900)
21 files changed:
CMakeLists.txt
NEWS
VERSION.cmake
ext/libsolvext.ver
ext/repo_rpmdb.c
ext/repo_rpmmd.c
ext/solv_xfopen.c
ext/solv_xfopen.h
ext/testcase.c
ext/testcase.h
package/libsolv.changes
package/libsolv.spec.in
src/cleandeps.c
src/conda.c
src/policy.c
src/repodata.c
src/selection.c
src/solver.c
test/testcases/blacklist/ptf.t [moved from test/testcases/blacklist/ptf with 92% similarity]
test/testcases/blacklist/retracted.t [moved from test/testcases/blacklist/retracted with 92% similarity]
tools/testsolv.c

index 767aa66..3541f49 100644 (file)
@@ -209,6 +209,12 @@ ENDIF (ENABLE_RPMDB)
 
 INCLUDE (CheckIncludeFile)
 IF (ENABLE_RPMDB OR ENABLE_RPMPKG_LIBRPM)
+  FIND_PATH (RPM_INCLUDE_DIR NAMES rpm/rpmio.h)
+  IF (RPM_INCLUDE_DIR)
+    INCLUDE_DIRECTORIES (${RPM_INCLUDE_DIR})
+    SET (CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} ${RPM_INCLUDE_DIR})
+  ENDIF (RPM_INCLUDE_DIR)
+
   FIND_LIBRARY (RPMDB_LIBRARY NAMES rpmdb)
 
   IF (NOT RPMDB_LIBRARY)
diff --git a/NEWS b/NEWS
index 69a5c4b..7ca7e4b 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,17 @@
 This file contains the major changes between
 libsolv versions:
 
+Version 0.7.15
+- selected bug fixes:
+  * fix deduceq2addedmap clearing bits outside of the map
+  * conda: feature depriorization first
+  * conda: fix startswith implementation
+  * move find_update_seeds() call in cleandeps calculation
+- new features:
+  * set SOLVABLE_BUILDHOST in rpm and rpmmd parsers
+  * new testcase_mangle_repo_names() function
+  * new solv_fmemopen() function
+
 Version 0.7.14
 - added support for ed25519 signatures
 - selected bug fixes:
index 0bf518b..5c9b9e6 100644 (file)
@@ -49,5 +49,5 @@ SET(LIBSOLVEXT_SOVERSION "1")
 
 SET(LIBSOLV_MAJOR "0")
 SET(LIBSOLV_MINOR "7")
-SET(LIBSOLV_PATCH "14")
+SET(LIBSOLV_PATCH "15")
 
index 6423837..4102301 100644 (file)
@@ -55,6 +55,7 @@ SOLV_1.0 {
                rpm_stat_database;
                rpm_state_create;
                rpm_state_free;
+               solv_fmemopen;
                solv_verify_sig;
                solv_xfopen;
                solv_xfopen_buf;
@@ -66,6 +67,7 @@ SOLV_1.0 {
                testcase_add_testtags;
                testcase_dep2str;
                testcase_job2str;
+               testcase_mangle_repo_names;
                testcase_solvid2str;
                testcase_str2dep;
                testcase_str2job;
index ed98628..67ce81d 100644 (file)
@@ -1189,6 +1189,9 @@ rpmhead2solv(Pool *pool, Repo *repo, Repodata *data, Solvable *s, RpmHead *rpmhe
       u32 = headint32(rpmhead, TAG_BUILDTIME);
       if (u32)
         repodata_set_num(data, handle, SOLVABLE_BUILDTIME, u32);
+      str = headstring(rpmhead, TAG_BUILDHOST);
+      if (str)
+       repodata_set_str(data, handle, SOLVABLE_BUILDHOST, str);
       u32 = headint32(rpmhead, TAG_INSTALLTIME);
       if (u32)
         repodata_set_num(data, handle, SOLVABLE_INSTALLTIME, u32);
index 9bb50a0..1232e43 100644 (file)
@@ -96,6 +96,7 @@ enum state {
   STATE_FRESHENS,
   STATE_SOURCERPM,
   STATE_HEADERRANGE,
+  STATE_BUILDHOST,
 
   STATE_PROVIDESENTRY,
   STATE_REQUIRESENTRY,
@@ -196,6 +197,7 @@ static struct solv_xmlparser_element stateswitches[] = {
   { STATE_SOLVABLE,    "rpm:freshens",    STATE_FRESHENS,     0 },
   { STATE_SOLVABLE,    "rpm:sourcerpm",   STATE_SOURCERPM,    1 },
   { STATE_SOLVABLE,    "rpm:header-range", STATE_HEADERRANGE, 0 },
+  { STATE_SOLVABLE,    "rpm:buildhost",   STATE_BUILDHOST,    1 },
   { STATE_SOLVABLE,    "file",            STATE_FILE, 1 },
   { STATE_SOLVABLE,    "changelog",       STATE_CHANGELOG, 1 },
 
@@ -1036,6 +1038,10 @@ endElement(struct solv_xmlparser *xmlp, int state, char *content)
       if (*content)
        repodata_set_poolstr(pd->data, handle, SOLVABLE_PACKAGER, content);
       break;
+    case STATE_BUILDHOST:
+      if (*content)
+       repodata_set_str(pd->data, handle, SOLVABLE_BUILDHOST, content);
+      break;
     case STATE_SOURCERPM:
       if (*content)
        repodata_set_sourcepkg(pd->data, handle, content);
index 4bb4628..7e974a9 100644 (file)
@@ -798,6 +798,7 @@ struct bufcookie {
   size_t *buflp;
   char *freemem;
   size_t bufl_int;
+  char *buf_int;
 };
 
 static ssize_t cookie_bufread(void *cookie, char *buf, size_t nbytes)
@@ -870,30 +871,48 @@ solv_xfopen_buf(const char *fn, char **bufp, size_t *buflp, const char *mode)
   return fp;
 }
 
+FILE *
+solv_fmemopen(const char *buf, size_t bufl, const char *mode)
+{
+  struct bufcookie *bc;
+  FILE *fp;
+  if (*mode != 'r')
+    return 0;
+  bc = solv_calloc(1, sizeof(*bc));
+  bc->buf_int = (char *)buf;
+  bc->bufl_int = bufl;
+  bc->bufp = &bc->buf_int;
+  bc->buflp = &bc->bufl_int;
+  fp = cookieopen(bc, mode, cookie_bufread, cookie_bufwrite, cookie_bufclose);
+  if (!strcmp(mode, "rf"))     /* auto-free */
+    bc->freemem = bc->buf_int;
+  if (!fp)
+    cookie_bufclose(bc);
+  return fp;
+}
+
 #else
 
 FILE *
-solv_xfopen_buf(const char *fn, char **bufp, size_t *buflp, const char *mode)
+solv_fmemopen(const char *buf, size_t bufl, const char *mode)
 {
   FILE *fp;
-  size_t l;
   if (*mode != 'r')
     return 0;
-  l = buflp ? *buflp : strlen(*bufp);
   if (!strcmp(mode, "rf"))
     {
-      if (!(fp = fmemopen(0, l, "r+")))
+      if (!(fp = fmemopen(0, bufl, "r+")))
        return 0;
-      if (l && fwrite(*bufp, l, 1, fp) != 1)
+      if (bufl && fwrite(buf, bufl, 1, fp) != 1)
        {
          fclose(fp);
          return 0;
        }
-      solv_free(*bufp);
+      solv_free((char *)buf);
       rewind(fp);
     }
   else
-    fp = fmemopen(*bufp, l, "r");
+    fp = fmemopen((char *)buf, bufl, "r");
   return fp;
 }
 
index aa8740e..613f331 100644 (file)
@@ -12,5 +12,6 @@ extern FILE *solv_xfopen(const char *fn, const char *mode);
 extern FILE *solv_xfopen_fd(const char *fn, int fd, const char *mode);
 extern FILE *solv_xfopen_buf(const char *fn, char **bufp, size_t *buflp, const char *mode);
 extern int   solv_xfopen_iscompressed(const char *fn);
+extern FILE *solv_fmemopen(const char *buf, size_t bufl, const char *mode);
 
 #endif
index d6c4a57..bbed5ab 100644 (file)
@@ -1809,49 +1809,65 @@ testcase_write_mangled(Solver *solv, const char *dir, int resultflags, const cha
   return 1;
 }
 
-int
-testcase_write(Solver *solv, const char *dir, int resultflags, const char *testcasename, const char *resultname)
+const char **
+testcase_mangle_repo_names(Pool *pool)
 {
-  Pool *pool = solv->pool;
-  int i, r, repoid;
-  int mangle = 1;
-  const char **orignames;
-
-  /* mangle repo names so that there are no conflicts */
-  orignames = solv_calloc(pool->nrepos, sizeof(char *));
-  for (repoid = 1; repoid < pool->nrepos; repoid++)
+  int i, repoid, mangle = 1;
+  Repo *repo;
+  const char **names = solv_calloc(pool->nrepos, sizeof(char *));
+  FOR_REPOS(repoid, repo)
     {
-      Repo *repo = pool_id2repo(pool, repoid);
-      char *buf = solv_malloc((repo->name ? strlen(repo->name) : 0) + 40);
-      char *mp;
-      orignames[repoid] = repo->name;
+      char *buf, *mp;
+      buf = solv_malloc((repo->name ? strlen(repo->name) : 0) + 40);
       if (!repo->name || !repo->name[0])
         sprintf(buf, "#%d", repoid);
       else
        strcpy(buf, repo->name);
-      for (i = 0; buf[i]; i++)
-       if (buf[i] == ' ' || buf[i] == '\t' || buf[i] == '/')
-         buf[i] = '_';
-      mp = buf + strlen(buf);
+      for (mp = buf; *mp; mp++)
+       if (*mp == ' ' || *mp == '\t' || *mp == '/')
+         *mp = '_';
       for (;;)
        {
          for (i = 1; i < repoid; i++)
-           if (!strcmp(buf, pool_id2repo(pool, i)->name))
+           if (!strcmp(buf, names[i]))
              break;
          if (i == repoid)
            break;
           sprintf(mp, "_%d", mangle++);
        }
-      repo->name = buf;
+      names[repoid] = buf;
     }
-  r = testcase_write_mangled(solv, dir, resultflags, testcasename, resultname);
-  for (repoid = 1; repoid < pool->nrepos; repoid++)
+  return names;
+}
+
+static void
+swap_repo_names(Pool *pool, const char **names)
+{
+  int repoid;
+  Repo *repo;
+  FOR_REPOS(repoid, repo)
     {
-      Repo *repo = pool_id2repo(pool, repoid);
-      solv_free((void *)repo->name);
-      repo->name = orignames[repoid];
+      const char *n = repo->name;
+      repo->name = names[repoid];
+      names[repoid] = n;
     }
-  solv_free(orignames);
+}
+
+int
+testcase_write(Solver *solv, const char *dir, int resultflags, const char *testcasename, const char *resultname)
+{
+  Pool *pool = solv->pool;
+  int r, repoid;
+  const char **names;
+
+  /* mangle repo names so that there are no conflicts */
+  names = testcase_mangle_repo_names(pool);
+  swap_repo_names(pool, names);
+  r = testcase_write_mangled(solv, dir, resultflags, testcasename, resultname);
+  swap_repo_names(pool, names);
+  for (repoid = 1; repoid < pool->nrepos; repoid++)
+    solv_free((void *)names[repoid]);
+  solv_free((void *)names);
   return r;
 }
 
@@ -2071,7 +2087,7 @@ testcase_read(Pool *pool, FILE *fp, const char *testcase, Queue *job, char **res
                {
                  char *idata = read_inline_file(fp, &buf, &bufp, &bufl);
                  rdata = "<inline>";
-                 rfp = solv_xfopen_buf(rdata, &idata, 0, "rf");
+                 rfp = solv_fmemopen(idata, strlen(idata), "rf");
                }
              else
                {
index 997feaf..5b2e573 100644 (file)
@@ -42,3 +42,5 @@ extern char *testcase_solverresult(Solver *solv, int flags);
 extern int testcase_write(Solver *solv, const char *dir, int resultflags, const char *testcasename, const char *resultname);
 extern Solver *testcase_read(Pool *pool, FILE *fp, const char *testcase, Queue *job, char **resultp, int *resultflagsp);
 extern char *testcase_resultdiff(const char *result1, const char *result2);
+extern const char **testcase_mangle_repo_names(Pool *pool);
+
index 52ea164..900490d 100644 (file)
@@ -1,4 +1,26 @@
 -------------------------------------------------------------------
+Fri Sep 11 12:31:27 CEST 2020 - mls@suse.de
+
+- fix deduceq2addedmap clearing bits outside of the map
+- conda: feature depriorization first
+- conda: fix startswith implementation
+- move find_update_seeds() call in cleandeps calculation
+- set SOLVABLE_BUILDHOST in rpm and rpmmd parsers
+- new testcase_mangle_repo_names() function
+- new solv_fmemopen() function
+- bump version to 0.7.15
+
+-------------------------------------------------------------------
+Tue Jun 23 12:43:16 CEST 2020 - ma@suse.de
+
+- Enable zstd compression support for sle15
+
+-------------------------------------------------------------------
+Thu May 28 11:51:27 CEST 2020 - mls@suse.de
+
+- Enable zstd compression support for sle15-sp2
+
+-------------------------------------------------------------------
 Wed May 27 11:48:46 CEST 2020 - mls@suse.de
 
 - Support blacklisted packages in solver_findproblemrule()
index cd56c67..0964ad6 100644 (file)
@@ -24,7 +24,7 @@
 %bcond_with bz2
 %bcond_with xz
 %endif
-%if 0%{?is_opensuse} && (0%{?sle_version} >= 150000 || 0%{?suse_version} >= 1500)
+%if 0%{?sle_version} >= 150000 || 0%{?suse_version} >= 1500
 %bcond_without zstd
 %else
 %bcond_with zstd
index aa83c10..31b1ad9 100644 (file)
@@ -669,6 +669,7 @@ solver_createcleandepsmap(Solver *solv, Map *cleandepsmap, int unneeded)
   queue_init(&iq);
   queue_init(&xsuppq);
 
+  /* setup userinstalled map and search for special namespace cleandeps erases */
   for (i = 0; i < job->count; i += 2)
     {
       how = job->elements[i];
@@ -874,23 +875,38 @@ solver_createcleandepsmap(Solver *solv, Map *cleandepsmap, int unneeded)
     }
   queue_init_clone(&iqcopy, &iq);
 
-  if (!unneeded)
-    {
-      if (solv->cleandeps_updatepkgs)
-       for (i = 0; i < solv->cleandeps_updatepkgs->count; i++)
-         queue_push(&iq, solv->cleandeps_updatepkgs->elements[i]);
-    }
-
   if (unneeded)
     queue_empty(&iq);  /* just in case... */
 
-  /* clear userinstalled bit for the packages we really want to delete/update */
+  /* clear userinstalled bits for the packages we really want to delete */
   for (i = 0; i < iq.count; i++)
     {
       p = iq.elements[i];
-      if (pool->solvables[p].repo != installed)
-       continue;
-      MAPCLR(&userinstalled, p - installed->start);
+      if (pool->solvables[p].repo == installed)
+        MAPCLR(&userinstalled, p - installed->start);
+    }
+  /* set userinstalled bits for all packages not in the considered map */
+  if (pool->considered)
+    {
+      for (p = installed->start; p < installed->end; p++)
+        if (!MAPTST(pool->considered, p))
+         MAPSET(&userinstalled, p - installed->start); /* we may not remove those */
+    }
+  if (!unneeded && solv->cleandeps_updatepkgs)
+    {
+      /* find update seeds */
+      queue_init(&updatepkgs_filtered);
+      find_update_seeds(solv, &updatepkgs_filtered, &userinstalled);
+      /* clear userinstalled bit for the packages we want to update */
+      /* also add them to the erase list */
+      for (i = 0; i < solv->cleandeps_updatepkgs->count; i++)
+       {
+         p = solv->cleandeps_updatepkgs->elements[i];
+         if (pool->considered && !MAPTST(pool->considered, p))
+           continue;
+         queue_push(&iq, p);
+         MAPCLR(&userinstalled, p - installed->start);
+       }
     }
 
   for (p = installed->start; p < installed->end; p++)
@@ -898,8 +914,6 @@ solver_createcleandepsmap(Solver *solv, Map *cleandepsmap, int unneeded)
       if (pool->solvables[p].repo != installed)
        continue;
       MAPSET(&installedm, p);
-      if (pool->considered && !MAPTST(pool->considered, p))
-       MAPSET(&userinstalled, p - installed->start);   /* we may not remove those */
       if (unneeded && !MAPTST(&userinstalled, p - installed->start))
        continue;
       MAPSET(&im, p);
@@ -907,13 +921,6 @@ solver_createcleandepsmap(Solver *solv, Map *cleandepsmap, int unneeded)
   MAPSET(&installedm, SYSTEMSOLVABLE);
   MAPSET(&im, SYSTEMSOLVABLE);
 
-  if (!unneeded && solv->cleandeps_updatepkgs)
-    {
-      /* find update "seeds" */
-      queue_init(&updatepkgs_filtered);
-      find_update_seeds(solv, &updatepkgs_filtered, &userinstalled);
-    }
-
 #ifdef CLEANDEPSDEBUG
   printf("REMOVE PASS\n");
 #endif
index 7f2538a..21ad6bf 100644 (file)
@@ -212,7 +212,7 @@ pool_evrcmp_conda_int(const char *evr1, const char *evr1e, const char *evr2, con
   r = solv_vercmp_conda(evr1, r1 ? r1 : s1, evr2, r2 ? r2 : s2, r2 ? 0 : startswith);
   if (r)
     return r;
-  if (!r1 && !r2)
+  if ((!r2 && startswith) || (!r1 && !r2))
     return 0;
   if (!r1 && r2)
     return -1;
index 6551cbf..c02d237 100644 (file)
@@ -835,14 +835,18 @@ move_installed_to_front(Pool *pool, Queue *plist)
 
 #ifdef ENABLE_CONDA
 static int
-pool_buildversioncmp(Pool *pool, Solvable *s1, Solvable *s2)
+pool_featurecountcmp(Pool *pool, Solvable *s1, Solvable *s2)
 {
-  const char *bv1, *bv2;
   unsigned int cnt1, cnt2;
   cnt1 = solvable_lookup_count(s1, SOLVABLE_TRACK_FEATURES);
   cnt2 = solvable_lookup_count(s2, SOLVABLE_TRACK_FEATURES);
-  if (cnt1 != cnt2)
-    return cnt1 > cnt2 ? -1 : 1;
+  return cnt1 == cnt2 ? 0 : cnt1 > cnt2 ? -1 : 1;
+}
+
+static int
+pool_buildversioncmp(Pool *pool, Solvable *s1, Solvable *s2)
+{
+  const char *bv1, *bv2;
   bv1 = solvable_lookup_str(s1, SOLVABLE_BUILDVERSION);
   bv2 = solvable_lookup_str(s2, SOLVABLE_BUILDVERSION);
   if (!bv1 && !bv2)
@@ -903,7 +907,14 @@ prune_to_best_version(Pool *pool, Queue *plist)
           best = s;            /* take current as new best */
           continue;
         }
-      r = best->evr != s->evr ? pool_evrcmp(pool, best->evr, s->evr, EVRCMP_COMPARE) : 0;
+     
+      r = 0; 
+#ifdef ENABLE_CONDA
+      if (pool->disttype == DISTTYPE_CONDA)
+        r = pool_featurecountcmp(pool, best, s);
+#endif
+      if (r == 0)
+        r = best->evr != s->evr ? pool_evrcmp(pool, best->evr, s->evr, EVRCMP_COMPARE) : 0;
 #ifdef ENABLE_LINKED_PKGS
       if (r == 0 && has_package_link(pool, s))
         r = pool_link_evrcmp(pool, best, s);
index 4e75b6d..72f03d4 100644 (file)
@@ -388,7 +388,7 @@ repodata_dir2str(Repodata *data, Id did, const char *suf)
       comps = stringpool_id2str(data->localpool ? &data->spool : &pool->ss, comp);
       l = strlen(comps);
       p -= l;
-      strncpy(p, comps, l);
+      memcpy(p, comps, l);
       parent = dirpool_parent(&data->dirpool, parent);
       if (parent)
         *--p = '/';
index 5f01e2b..a8e60f7 100644 (file)
@@ -150,6 +150,7 @@ selection_flatten(Pool *pool, Queue *selection)
   if (!q.count)
     {
       queue_empty(selection);
+      queue_free(&q);
       return;
     }
   queue_truncate(selection, 2);
@@ -163,6 +164,7 @@ selection_flatten(Pool *pool, Queue *selection)
       selection->elements[0] = SOLVER_SOLVABLE | SOLVER_NOAUTOSET;
       selection->elements[1] = q.elements[0];
     }
+  queue_free(&q);
 }
 
 /* only supports simple rels plus REL_ARCH */
index 7fcc3fb..686a8af 100644 (file)
@@ -3240,7 +3240,7 @@ addedmap2deduceq(Solver *solv, Map *addedmap)
       p = -r->p;
       if (!MAPTST(addedmap, p))
        {
-         /* should never happen, but... */
+         /* this can happen with complex dependencies that have more than one pos literal */
          if (!solv->addedmap_deduceq.count || solv->addedmap_deduceq.elements[solv->addedmap_deduceq.count - 1] != -p)
             queue_push(&solv->addedmap_deduceq, -p);
          continue;
@@ -3280,7 +3280,7 @@ deduceq2addedmap(Solver *solv, Map *addedmap)
       if (p > 0)
        MAPSET(addedmap, p);
       else
-       MAPCLR(addedmap, p);
+       MAPCLR(addedmap, -p);
     }
 }
 
similarity index 92%
rename from test/testcases/blacklist/ptf
rename to test/testcases/blacklist/ptf.t
index b8765d0..0005042 100644 (file)
@@ -9,7 +9,7 @@ repo available 0 testtags <inline>
 #>=Pkg: A 1 1 noarch
 #>=Req: ptf-1
 
-system i686 * system
+system unset * system
 
 #
 # test 1: a ptf package cannot be pulled in via a dependency
@@ -28,7 +28,7 @@ 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 info package ptf-1-1-1.noarch can 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
 
similarity index 92%
rename from test/testcases/blacklist/retracted
rename to test/testcases/blacklist/retracted.t
index d75f17d..a36e244 100644 (file)
@@ -6,10 +6,11 @@ repo available 0 testtags <inline>
 #>=Pkg: B 2 1 noarch
 #>=Prv: retracted-patch-package()
 
-system i686 * system
+system unset rpm system
 
 job blacklist provides retracted-patch-package()
 job install name patch
+result transaction,problems <inline>
 #>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
index 18dfcfe..a9e67ec 100644 (file)
@@ -66,6 +66,16 @@ reportsolutioncb(Solver *solv, void *cbdata)
   return 0;
 }
 
+static void
+free_considered(Pool *pool)
+{
+  if (pool->considered)
+    {
+      map_free(pool->considered);
+      pool->considered = solv_free(pool->considered);
+    }
+}
+
 int
 main(int argc, char **argv)
 {
@@ -149,7 +159,9 @@ main(int argc, char **argv)
          solv = testcase_read(pool, fp, argv[optind], &job, &result, &resultflags);
          if (!solv)
            {
+             free_considered(pool);
              pool_free(pool);
+             queue_free(&job);
              exit(resultflags == 77 ? 77 : 1);
            }
          if (reusesolv)
@@ -349,6 +361,7 @@ main(int argc, char **argv)
        }
       if (reusesolv)
        solver_free(reusesolv);
+      free_considered(pool);
       pool_free(pool);
       fclose(fp);
     }