Imported Upstream version 0.6.23
[platform/upstream/libsolv.git] / ext / testcase.c
index 6e2b574..52c139f 100644 (file)
@@ -1264,8 +1264,7 @@ finish_v2_solvable(Pool *pool, Repodata *data, Solvable *s, char *filelist, int
          repodata_add_dirstr(data, s - pool->solvables, SOLVABLE_FILELIST, did, p);
        }
     }
-  s->supplements = repo_fix_supplements(s->repo, s->provides, s->supplements, 0);
-  s->conflicts = repo_fix_conflicts(s->repo, s->conflicts);
+  repo_rewrite_suse_deps(s, 0);
 }
 
 /* stripped down version of susetags parser used for testcases */
@@ -1737,6 +1736,33 @@ testcase_reason2str(Id reason)
   return "?";
 }
 
+static struct rclass2str {
+  Id rclass;
+  const char *str;
+} rclass2str[] = {
+  { SOLVER_RULE_PKG, "pkg" },
+  { SOLVER_RULE_UPDATE, "update" },
+  { SOLVER_RULE_FEATURE, "feature" },
+  { SOLVER_RULE_JOB, "job" },
+  { SOLVER_RULE_DISTUPGRADE, "distupgrade" },
+  { SOLVER_RULE_INFARCH, "infarch" },
+  { SOLVER_RULE_CHOICE, "choice" },
+  { SOLVER_RULE_LEARNT, "learnt" },
+  { SOLVER_RULE_BEST, "best" },
+  { SOLVER_RULE_YUMOBS, "yumobs" },
+  { 0, 0 }
+};
+
+static const char *
+testcase_rclass2str(Id rclass)
+{
+  int i;
+  for (i = 0; rclass2str[i].str; i++)
+    if (rclass == rclass2str[i].rclass)
+      return rclass2str[i].str;
+  return "unknown";
+}
+
 static int
 dump_genid(Pool *pool, Strqueue *sq, Id id, int cnt)
 {
@@ -1981,44 +2007,8 @@ testcase_solverresult(Solver *solv, int resultflags)
       queue_init(&q);
       for (rid = 1; (rclass = solver_ruleclass(solv, rid)) != SOLVER_RULE_UNKNOWN; rid++)
        {
-         char *prefix;
-         switch (rclass)
-           {
-           case SOLVER_RULE_PKG:
-             prefix = "pkg ";
-             break;
-           case SOLVER_RULE_UPDATE:
-             prefix = "update ";
-             break;
-           case SOLVER_RULE_FEATURE:
-             prefix = "feature ";
-             break;
-           case SOLVER_RULE_JOB:
-             prefix = "job ";
-             break;
-           case SOLVER_RULE_DISTUPGRADE:
-             prefix = "distupgrade ";
-             break;
-           case SOLVER_RULE_INFARCH:
-             prefix = "infarch ";
-             break;
-           case SOLVER_RULE_CHOICE:
-             prefix = "choice ";
-             break;
-           case SOLVER_RULE_LEARNT:
-             prefix = "learnt ";
-             break;
-           case SOLVER_RULE_BEST:
-             prefix = "best ";
-             break;
-           case SOLVER_RULE_YUMOBS:
-             prefix = "yumobs ";
-             break;
-           default:
-             prefix = "unknown ";
-             break;
-           }
-         prefix = solv_dupjoin("rule ", prefix, testcase_ruleid(solv, rid));
+         char *prefix = solv_dupjoin("rule ", testcase_rclass2str(rclass), " ");
+         prefix = solv_dupappend(prefix, testcase_ruleid(solv, rid), 0);
          solver_ruleliterals(solv, rid, &q);
          if (rclass == SOLVER_RULE_FEATURE && q.count == 1 && q.elements[0] == -SYSTEMSOLVABLE)
            continue;
@@ -2099,8 +2089,8 @@ testcase_solverresult(Solver *solv, int resultflags)
 }
 
 
-int
-testcase_write(Solver *solv, const char *dir, int resultflags, const char *testcasename, const char *resultname)
+static int
+testcase_write_mangled(Solver *solv, const char *dir, int resultflags, const char *testcasename, const char *resultname)
 {
   Pool *pool = solv->pool;
   Repo *repo;
@@ -2132,6 +2122,9 @@ testcase_write(Solver *solv, const char *dir, int resultflags, const char *testc
       else
        sprintf(priobuf, "%d", repo->priority);
       out = pool_tmpjoin(pool, name, ".repo", ".gz");
+      for (i = 0; out[i]; i++)
+       if (out[i] == '/')
+         out[i] = '_';
       cmd = pool_tmpjoin(pool, "repo ", name, " ");
       cmd = pool_tmpappend(pool, cmd, priobuf, " ");
       cmd = pool_tmpappend(pool, cmd, "testtags ", out);
@@ -2320,6 +2313,52 @@ testcase_write(Solver *solv, const char *dir, int resultflags, const char *testc
   return 1;
 }
 
+int
+testcase_write(Solver *solv, const char *dir, int resultflags, const char *testcasename, const char *resultname)
+{
+  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++)
+    {
+      Repo *repo = pool_id2repo(pool, repoid);
+      char *buf = solv_malloc((repo->name ? strlen(repo->name) : 0) + 40);
+      char *mp;
+      orignames[i] = repo->name;
+      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;
+          sprintf(mp, "_%d", mangle++);
+       }
+      repo->name = buf;
+    }
+  r = testcase_write_mangled(solv, dir, resultflags, testcasename, resultname);
+  for (repoid = 1; repoid < pool->nrepos; repoid++)
+    {
+      Repo *repo = pool_id2repo(pool, repoid);
+      solv_free((void *)repo->name);
+      repo->name = orignames[i];
+    }
+  solv_free(orignames);
+  return r;
+}
+
 static char *
 read_inline_file(FILE *fp, char **bufp, char **bufpp, int *buflp)
 {