revert pyhton3 part that was commit by mistake in #ab8b3ded
[platform/upstream/libsolv.git] / tools / patchcheck.c
index 95aab99..6a5c3f7 100644 (file)
 #include "evr.h"
 #include "poolarch.h"
 #include "repo_solv.h"
+#ifdef ENABLE_SUSEREPO
 #include "repo_susetags.h"
+#endif
+#ifdef ENABLE_RPMMD
 #include "repo_updateinfoxml.h"
 #include "repo_rpmmd.h"
+#endif
 #include "solver.h"
 #include "solverdebug.h"
 
-static ssize_t
-cookie_gzread(void *cookie, char *buf, size_t nbytes)
-{
-  return gzread((gzFile *)cookie, buf, nbytes);
-}
-
-static int
-cookie_gzclose(void *cookie)
-{
-  return gzclose((gzFile *)cookie);
-}
-
-FILE *
-myfopen(const char *fn)
-{
-  cookie_io_functions_t cio;
-  char *suf;
-  gzFile *gzf;
-
-  if (!fn)
-    return 0;
-  suf = strrchr(fn, '.');
-  if (!suf || strcmp(suf, ".gz") != 0)
-    return fopen(fn, "r");
-  gzf = gzopen(fn, "r");
-  if (!gzf)
-    return 0;
-  memset(&cio, 0, sizeof(cio));
-  cio.read = cookie_gzread;
-  cio.close = cookie_gzclose;
-  return  fopencookie(gzf, "r", cio);
-}
+#include "solv_xfopen.h"
 
 void
 showproblems(Solver *solv, Solvable *s, Queue *cand, Queue *badguys)
@@ -70,7 +43,7 @@ showproblems(Solver *solv, Solvable *s, Queue *cand, Queue *badguys)
 
   queue_init(&rids);
   queue_init(&rinfo);
-  printf("can't install %s:\n", solvable2str(pool, s));
+  printf("can't install %s:\n", pool_solvable2str(pool, s));
   while ((problem = solver_next_problem(solv, problem)) != 0)
     {
       solver_findallproblemrules(solv, problem, &rids);
@@ -89,13 +62,13 @@ showproblems(Solver *solv, Solvable *s, Queue *cand, Queue *badguys)
              dep = rinfo.elements[k + 3];
              switch (rinfo.elements[k])
                {
-               case SOLVER_PROBLEM_DISTUPGRADE_RULE:
+               case SOLVER_RULE_DISTUPGRADE:
                  break;
-               case SOLVER_PROBLEM_INFARCH_RULE:
-                 printf("  %s has inferior architecture\n", solvid2str(pool, source));
+               case SOLVER_RULE_INFARCH:
+                 printf("  %s has inferior architecture\n", pool_solvid2str(pool, source));
                  break;
-               case SOLVER_PROBLEM_UPDATE_RULE:
-                 printf("  update rule for %s\n", solvid2str(pool, source));
+               case SOLVER_RULE_UPDATE:
+                 printf("  update rule for %s\n", pool_solvid2str(pool, source));
                  if (badguys)
                    queue_pushunique(badguys, source);
                  if (!cand)
@@ -119,19 +92,22 @@ showproblems(Solver *solv, Solvable *s, Queue *cand, Queue *badguys)
                        cand->elements[l] = -source;
                      }
                  break;
-               case SOLVER_PROBLEM_JOB_RULE:
+               case SOLVER_RULE_JOB:
+               case SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM:
+               case SOLVER_RULE_JOB_UNKNOWN_PACKAGE:
+               case SOLVER_RULE_JOB_UNSUPPORTED:
                  break;
-               case SOLVER_PROBLEM_RPM_RULE:
+               case SOLVER_RULE_RPM:
                  printf("  some dependency problem\n");
                  break;
-               case SOLVER_PROBLEM_JOB_NOTHING_PROVIDES_DEP:
-                 printf("  nothing provides requested %s\n", dep2str(pool, dep));
+               case SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP:
+                 printf("  nothing provides requested %s\n", pool_dep2str(pool, dep));
                  break;
-               case SOLVER_PROBLEM_NOT_INSTALLABLE:
-                 printf("  package %s is not installable\n", solvid2str(pool, source));
+               case SOLVER_RULE_RPM_NOT_INSTALLABLE:
+                 printf("  package %s is not installable\n", pool_solvid2str(pool, source));
                  break;
-               case SOLVER_PROBLEM_NOTHING_PROVIDES_DEP:
-                 printf("  nothing provides %s needed by %s\n", dep2str(pool, dep), solvid2str(pool, source));
+               case SOLVER_RULE_RPM_NOTHING_PROVIDES_DEP:
+                 printf("  nothing provides %s needed by %s\n", pool_dep2str(pool, dep), pool_solvid2str(pool, source));
                  if (ISRELDEP(dep))
                    {
                      Reldep *rd = GETRELDEP(pool, dep);
@@ -139,24 +115,24 @@ showproblems(Solver *solv, Solvable *s, Queue *cand, Queue *badguys)
                        {
                          Id rp, rpp;
                          FOR_PROVIDES(rp, rpp, rd->name)
-                           printf("    (we have %s)\n", solvid2str(pool, rp));
+                           printf("    (we have %s)\n", pool_solvid2str(pool, rp));
                        }
                    }
                  break;
-               case SOLVER_PROBLEM_SAME_NAME:
-                 printf("  cannot install both %s and %s\n", solvid2str(pool, source), solvid2str(pool, target));
+               case SOLVER_RULE_RPM_SAME_NAME:
+                 printf("  cannot install both %s and %s\n", pool_solvid2str(pool, source), pool_solvid2str(pool, target));
                  break;
-               case SOLVER_PROBLEM_PACKAGE_CONFLICT:
-                 printf("  package %s conflicts with %s provided by %s\n", solvid2str(pool, source), dep2str(pool, dep), solvid2str(pool, target));
+               case SOLVER_RULE_RPM_PACKAGE_CONFLICT:
+                 printf("  package %s conflicts with %s provided by %s\n", pool_solvid2str(pool, source), pool_dep2str(pool, dep), pool_solvid2str(pool, target));
                  break;
-               case SOLVER_PROBLEM_PACKAGE_OBSOLETES:
-                 printf("  package %s obsoletes %s provided by %s\n", solvid2str(pool, source), dep2str(pool, dep), solvid2str(pool, target));
+               case SOLVER_RULE_RPM_PACKAGE_OBSOLETES:
+                 printf("  package %s obsoletes %s provided by %s\n", pool_solvid2str(pool, source), pool_dep2str(pool, dep), pool_solvid2str(pool, target));
                  break;
-               case SOLVER_PROBLEM_DEP_PROVIDERS_NOT_INSTALLABLE:
-                 printf("  package %s requires %s, but none of the providers can be installed\n", solvid2str(pool, source), dep2str(pool, dep));
+               case SOLVER_RULE_RPM_PACKAGE_REQUIRES:
+                 printf("  package %s requires %s, but none of the providers can be installed\n", pool_solvid2str(pool, source), pool_dep2str(pool, dep));
                  break;
-               case SOLVER_PROBLEM_SELF_CONFLICT:
-                 printf("  package %s conflicts with %s provided by itself\n", solvid2str(pool, source), dep2str(pool, dep));
+               case SOLVER_RULE_RPM_SELF_CONFLICT:
+                 printf("  package %s conflicts with %s provided by itself\n", pool_solvid2str(pool, source), pool_dep2str(pool, dep));
                  break;
                }
            }
@@ -170,19 +146,23 @@ void
 toinst(Solver *solv, Repo *repo, Repo *instrepo)
 {
   Pool *pool = solv->pool;
+  Queue q;
   int k;
   Id p;
 
-  for (k = 0; k < solv->decisionq.count; k++)
+  queue_init(&q);
+  solver_get_decisionqueue(solv, &q);
+  for (k = 0; k < q.count; k++)
     {
-      p = solv->decisionq.elements[k];
+      p = q.elements[k];
       if (p < 0 || p == SYSTEMSOLVABLE)
        continue;
 
-     /* printf(" toinstall %s\n", solvid2str(pool, p));*/
+     /* printf(" toinstall %s\n", pool_solvid2str(pool, p));*/
       /* oh my! */
       pool->solvables[p].repo = instrepo;
     }
+  queue_free(&q);
 }
 
 void
@@ -193,7 +173,7 @@ dump_instrepo(Repo *instrepo, Pool *pool)
 
   printf("instrepo..\n");
   FOR_REPO_SOLVABLES(instrepo, p, s)
-    printf("  %s\n", solvable2str(pool, s));
+    printf("  %s\n", pool_solvable2str(pool, s));
   printf("done.\n");
 }
 
@@ -230,7 +210,7 @@ typedef struct {
   Repo *instrepo;
 } context_t;
 
-#define SHOW_PATCH(c) if (!(c)->shown++) printf("%s:\n", solvable2str(pool, s));
+#define SHOW_PATCH(c) if (!(c)->shown++) printf("%s:\n", pool_solvable2str(pool, s));
 #define PERF_DEBUGGING 0
  
 static Pool *pool;
@@ -249,7 +229,7 @@ test_all_old_patches_included(context_t *c, Id pid)
 
       if (!s2->conflicts)
         continue;
-      if (evrcmp(pool, s->evr, s2->evr, EVRCMP_COMPARE) <= 0)
+      if (pool_evrcmp(pool, s->evr, s2->evr, EVRCMP_COMPARE) <= 0)
         continue;
       conp2 = s2->repo->idarraydata + s2->conflicts;
       while ((con2 = *conp2++) != 0)
@@ -270,19 +250,19 @@ test_all_old_patches_included(context_t *c, Id pid)
           if (!con)
             {
               SHOW_PATCH(c);
-              printf("  %s contained %s\n", solvable2str(pool, s2), dep2str(pool, rd2->name));
+              printf("  %s contained %s\n", pool_solvable2str(pool, s2), pool_dep2str(pool, rd2->name));
             }
           else
            {
-             if (evrcmp(pool, rd->evr, rd2->evr, EVRCMP_COMPARE) < 0)
+             if (pool_evrcmp(pool, rd->evr, rd2->evr, EVRCMP_COMPARE) < 0)
                {
                  SHOW_PATCH(c);
                  printf("  %s required newer version %s-%s of %s-%s\n",
-                     solvable2str(pool, s2), dep2str(pool, rd2->name), dep2str(pool, rd2->evr),
-                     dep2str(pool, rd->name), dep2str(pool, rd->evr));
+                     pool_solvable2str(pool, s2), pool_dep2str(pool, rd2->name), pool_dep2str(pool, rd2->evr),
+                     pool_dep2str(pool, rd->name), pool_dep2str(pool, rd->evr));
                }
            }
-    
+
         }
     }
 }
@@ -300,7 +280,7 @@ test_all_packages_installable(context_t *c, Id pid)
 
   queue_init(&job);
 
-  now = sat_timems(0);
+  now = solv_timems(0);
   solver_runs = 0;
 
   conp = s->repo->idarraydata + s->conflicts;
@@ -314,15 +294,14 @@ test_all_packages_installable(context_t *c, Id pid)
 
           /* also set up some minimal system */
           queue_push(&job, SOLVER_INSTALL|SOLVER_SOLVABLE_PROVIDES|SOLVER_WEAK);
-          queue_push(&job, str2id(pool, "rpm", 1));
+          queue_push(&job, pool_str2id(pool, "rpm", 1));
           queue_push(&job, SOLVER_INSTALL|SOLVER_SOLVABLE_PROVIDES|SOLVER_WEAK);
-          queue_push(&job, str2id(pool, "aaa_base", 1));
+          queue_push(&job, pool_str2id(pool, "aaa_base", 1));
 
           solv = solver_create(pool);
-          solv->dontinstallrecommended = 0;
+          /* solver_set_flag(solv, SOLVER_FLAG_IGNORE_RECOMMENDED, 1); */
           ++solver_runs;
-          solver_solve(solv, &job);
-          if (solv->problems.count)
+          if (solver_solve(solv, &job))
             {
               c->status = 1;
               printf("error installing original package\n");
@@ -345,25 +324,24 @@ test_all_packages_installable(context_t *c, Id pid)
                   queue_push(&job, SOLVER_ERASE|SOLVER_SOLVABLE);
                   queue_push(&job, i);
                 }
-              queue_push(&job, SOLVER_INSTALL_SOLVABLE);
-              queue_push(&job, pid);
-              solv = solver_create(pool);
-              /*solv->dontinstallrecommended = 1;*/
-              ++solver_runs;
-              solver_solve(solv, &job);
-              if (solv->problems.count)
-                {
-                  c->status = 1;
-                  showproblems(solv, s, 0, 0);
-                }
-              frominst(solv, c->repo, c->instrepo);
-              solver_free(solv);
             }
+          queue_push(&job, SOLVER_INSTALL|SOLVER_SOLVABLE);
+          queue_push(&job, pid);
+          solv = solver_create(pool);
+          /* solver_set_flag(solv, SOLVER_FLAG_IGNORE_RECOMMENDED, 1); */
+          ++solver_runs;
+          if (solver_solve(solv, &job))
+            {
+              c->status = 1;
+              showproblems(solv, s, 0, 0);
+            }
+          frominst(solv, c->repo, c->instrepo);
+          solver_free(solv);
         }
     }
 
   if (PERF_DEBUGGING)
-    printf("  test_all_packages_installable took %d ms in %d runs\n", sat_timems(now), solver_runs);
+    printf("  test_all_packages_installable took %d ms in %d runs\n", solv_timems(now), solver_runs);
 }
 
 void
@@ -376,19 +354,23 @@ test_can_upgrade_all_packages(context_t *c, Id pid)
   Queue cand;
   Queue badguys;
   int i, j;
+  unsigned int now, solver_runs;
   Solvable *s = pool->solvables + pid;
 
   queue_init(&job);
   queue_init(&cand);
   queue_init(&badguys);
 
+  now = solv_timems(0);
+  solver_runs = 0;
+
   /* Test 3: can we upgrade all packages? */
   for (p = 1; p < pool->nsolvables; p++)
     {
       Solvable *s = pool->solvables + p;
       if (!s->repo)
         continue;
-      if (strchr(id2str(pool, s->name), ':'))
+      if (strchr(pool_id2str(pool, s->name), ':'))
         continue;      /* only packages, please */
       if (!pool_installable(pool, s))
         continue;
@@ -415,6 +397,7 @@ test_can_upgrade_all_packages(context_t *c, Id pid)
           queue_push(&job, SOLVER_INSTALL|SOLVER_SOLVABLE|SOLVER_WEAK);
           queue_push(&job, p);
         }
+      ++solver_runs;
       solver_solve(solv, &job);
 #if 0
       solver_printdecisions(solv);
@@ -424,29 +407,29 @@ test_can_upgrade_all_packages(context_t *c, Id pid)
       for (i = 0; i < cand.count; i++)
         {
           p = cand.elements[i];
-          if (p > 0 && solv->decisionmap[p] > 0)
+          if (p > 0 && solver_get_decisionlevel(solv, p) > 0)
             cand.elements[i] = -p;     /* drop candidate */
         }
       solver_free(solv);
 
       /* now the interesting part: test patch */
       queue_empty(&job);
-#if 0
-      for (i = 1; i < updatestart; i++)
+      if (!c->install_available)
         {
-          if (pool->solvables[i].repo != repo || i == pid)
-            continue;
-          queue_push(&job, SOLVER_ERASE|SOLVER_SOLVABLE);
-          queue_push(&job, i);
+          for (i = 1; i < c->updatestart; i++)
+            {
+              if (pool->solvables[i].repo != c->repo || i == pid)
+                continue;
+              queue_push(&job, SOLVER_ERASE|SOLVER_SOLVABLE);
+              queue_push(&job, i);
+            }
         }
-#endif
-      queue_push(&job, SOLVER_INSTALL_SOLVABLE);
+      queue_push(&job, SOLVER_INSTALL|SOLVER_SOLVABLE);
       queue_push(&job, pid);
       solv = solver_create(pool);
-      solv->dontinstallrecommended = 1;
-      solver_solve(solv, &job);
-
-      if (solv->problems.count)
+      solver_set_flag(solv, SOLVER_FLAG_IGNORE_RECOMMENDED, 1);
+      ++solver_runs;
+      if (solver_solve(solv, &job))
         {
           c->status = 1;
           showproblems(solv, s, &cand, &badguys);
@@ -464,6 +447,8 @@ test_can_upgrade_all_packages(context_t *c, Id pid)
         break; /* no progress */
       cand.count = j;
     }
+  if (PERF_DEBUGGING)
+    printf("  test_can_upgrade_all_packages took %d ms in %d runs\n", solv_timems(now), solver_runs);
 }
 
 void
@@ -486,13 +471,13 @@ test_no_ga_package_fulfills_dependency(context_t *c, Id pid)
         {
           Solvable *s2 = pool_id2solvable(pool, rp);
           if (rp < c->updatestart
-              && evrcmp(pool, rd->evr, s2->evr, EVRCMP_COMPARE) < 0
+              && pool_evrcmp(pool, rd->evr, s2->evr, EVRCMP_COMPARE) < 0
               && pool_match_nevr_rel(pool, s2, rd->name)
              )
             {
               SHOW_PATCH(c);
               printf("  conflict %s < %s satisfied by non-updated package %s\n",
-                  dep2str(pool, rd->name), dep2str(pool, rd->evr), solvable2str(pool, s2));
+                  pool_dep2str(pool, rd->name), pool_dep2str(pool, rd->evr), pool_solvable2str(pool, s2));
               break;
             }
         }
@@ -504,12 +489,13 @@ main(int argc, char **argv)
 {
   char *arch, *mypatch;
   const char *pname;
-  int l;
+  int l, r;
   FILE *fp;
   int i;
   Id pid, p, pp;
   int tests = 0;
   context_t c;
+  static const char* langs[] = {"en"};
 
   c.install_available = 0;
   c.updatestart = 0;
@@ -521,7 +507,6 @@ main(int argc, char **argv)
   arch = argv[1];
   pool = pool_create();
   pool_setarch(pool, arch);
-  static const char* langs[] = {"en"};
   pool_set_languages(pool, langs, 1);
 
 #if 0
@@ -549,30 +534,40 @@ main(int argc, char **argv)
       l = strlen(argv[i]);
       if (!strcmp(argv[i], "-"))
         fp = stdin;
-      else if ((fp = myfopen(argv[i])) == 0)
+      else if ((fp = solv_xfopen(argv[i], 0)) == 0)
         {
           perror(argv[i]);
           exit(1);
         }
-      if (l >= 8 && !strcmp(argv[i] + l - 8, "packages"))
+      r = 0;
+      if (0)
+       {
+       }
+#ifdef ENABLE_SUSEREPO
+      else if (l >= 8 && !strcmp(argv[i] + l - 8, "packages"))
         {
-          repo_add_susetags(c.repo, fp, 0, 0, 0);
+          r = repo_add_susetags(c.repo, fp, 0, 0, 0);
         }
       else if (l >= 11 && !strcmp(argv[i] + l - 11, "packages.gz"))
         {
-          repo_add_susetags(c.repo, fp, 0, 0, 0);
+          r = repo_add_susetags(c.repo, fp, 0, 0, 0);
         }
+#endif
+#ifdef ENABLE_RPMMD
       else if (l >= 14 && !strcmp(argv[i] + l - 14, "primary.xml.gz"))
         {
-          repo_add_rpmmd(c.repo, fp, 0, 0);
+          r = repo_add_rpmmd(c.repo, fp, 0, 0);
         }
       else if (l >= 17 && !strcmp(argv[i] + l - 17, "updateinfo.xml.gz"))
        {
-          repo_add_updateinfoxml(c.repo, fp, 0);
+          r = repo_add_updateinfoxml(c.repo, fp, 0);
        }
-      else if (repo_add_solv(c.repo, fp))
+#endif
+      else
+       r = repo_add_solv(c.repo, fp, 0);
+      if (r)
         {
-          fprintf(stderr, "could not add repo %s\n", argv[i]);
+          fprintf(stderr, "could not add repo %s: %s\n", argv[i], pool_errstr(pool));
           exit(1);
         }
       if (fp != stdin)
@@ -587,19 +582,19 @@ main(int argc, char **argv)
   c.instrepo->start = c.repo->start;
   c.instrepo->end = c.repo->end;
   c.instrepo->nsolvables = c.repo->nsolvables; /* sic! */
-  c.instrepo->lastoff = c.repo->lastoff;       /* sic! */
   pool_set_installed(pool, c.instrepo);
   pool_createwhatprovides(pool);
 
   for (pid = 1; pid < pool->nsolvables; pid++)
     {
+      Solvable *s;
       c.shown = 0;
-      Solvable *s = pool->solvables + pid;
+      s = pool->solvables + pid;
       if (!s->repo)
         continue;
       if (!pool_installable(pool, s))
         continue;
-      pname = id2str(pool, s->name);
+      pname = pool_id2str(pool, s->name);
       if (strncmp(pname, "patch:", 6) != 0)
        continue;
 
@@ -612,7 +607,7 @@ main(int argc, char **argv)
              l = strlen(pname + 6);
              if (mypatch[l] != '-')
                continue;
-             if (strcmp(mypatch + l + 1, id2str(pool, s->evr)) != 0)
+             if (strcmp(mypatch + l + 1, pool_id2str(pool, s->evr)) != 0)
                continue;
            }
        }
@@ -621,7 +616,7 @@ main(int argc, char **argv)
          FOR_PROVIDES(p, pp, s->name)
            {
              Solvable *s2 = pool->solvables + p;
-             if (evrcmp(pool, s->evr, s2->evr, EVRCMP_COMPARE) < 0)
+             if (pool_evrcmp(pool, s->evr, s2->evr, EVRCMP_COMPARE) < 0)
                break;
            }
          if (p) {
@@ -634,7 +629,7 @@ main(int argc, char **argv)
        continue;
 
 #if 0
-      printf("testing patch %s-%s\n", pname + 6, id2str(pool, s->evr));
+      printf("testing patch %s-%s\n", pname + 6, pool_id2str(pool, s->evr));
 #endif
 
       test_all_old_patches_included(&c, pid);