Imported Upstream version 0.7.16
[platform/upstream/libsolv.git] / ext / testcase.c
index fcebcfa..0be7a21 100644 (file)
@@ -59,6 +59,7 @@ static struct job2str {
   { SOLVER_ALLOWUNINSTALL, "allowuninstall" },
   { SOLVER_FAVOR,          "favor" },
   { SOLVER_DISFAVOR,       "disfavor" },
+  { SOLVER_BLACKLIST,      "blacklist" },
   { 0, 0 }
 };
 
@@ -152,6 +153,7 @@ static struct poolflags2str {
   { POOL_FLAG_NOOBSOLETESMULTIVERSION,      "noobsoletesmultiversion", 0 },
   { POOL_FLAG_ADDFILEPROVIDESFILTERED,      "addfileprovidesfiltered", 0 },
   { POOL_FLAG_NOWHATPROVIDESAUX,            "nowhatprovidesaux", 0 },
+  { POOL_FLAG_WHATPROVIDESWITHDISABLED,     "whatprovideswithdisabled", 0 },
   { 0, 0, 0 }
 };
 
@@ -1189,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 }
 };
@@ -1708,7 +1711,7 @@ testcase_write_mangled(Solver *solv, const char *dir, int resultflags, const cha
       for (rid = 1; rid < pool->nrels; rid++)
        {
          Reldep *rd = pool->rels + rid;
-         if (rd->flags != REL_NAMESPACE || rd->name == NAMESPACE_OTHERPROVIDERS)
+         if (rd->flags != REL_NAMESPACE || rd->name == NAMESPACE_OTHERPROVIDERS || rd->name == NAMESPACE_SPLITPROVIDES)
            continue;
          /* evaluate all namespace ids, skip empty results */
          d = pool_whatprovides(pool, MAKERELDEP(rid));
@@ -1806,49 +1809,63 @@ 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 (;;)
-       {
-         for (i = 1; i < repoid; i++)
-           if (!strcmp(buf, pool_id2repo(pool, i)->name))
-             break;
-         if (i == repoid)
-           break;
+      for (mp = buf; *mp; mp++)
+       if (*mp == ' ' || *mp == '\t' || *mp == '/')
+         *mp = '_';
+      for (i = 1; i < repoid; i++)
+        {
+         if (!names[i] || strcmp(buf, names[i]) != 0)
+           continue;
           sprintf(mp, "_%d", mangle++);
+         i = 0;        /* restart conflict check */
        }
-      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;
 }
 
@@ -2068,7 +2085,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
                {