Imported Upstream version 0.6.29
[platform/upstream/libsolv.git] / tools / patchcheck.c
index 90b5ee0..4025f92 100644 (file)
 #include <stdlib.h>
 #include <unistd.h>
 #include <string.h>
-#include <zlib.h>
 
 #include "pool.h"
 #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"
 
-#include "common_myfopen.h"
+#include "solv_xfopen.h"
 
 void
 showproblems(Solver *solv, Solvable *s, Queue *cand, Queue *badguys)
@@ -39,7 +42,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);
@@ -58,13 +61,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)
@@ -88,19 +91,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);
@@ -108,24 +114,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;
                }
            }
@@ -139,19 +145,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
@@ -162,7 +172,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");
 }
 
@@ -199,7 +209,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;
@@ -218,7 +228,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)
@@ -239,16 +249,16 @@ 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));
                }
            }
 
@@ -269,7 +279,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;
@@ -283,15 +293,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");
@@ -315,13 +324,12 @@ test_all_packages_installable(context_t *c, Id pid)
                   queue_push(&job, i);
                 }
             }
-          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_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;
               showproblems(solv, s, 0, 0);
@@ -332,7 +340,7 @@ test_all_packages_installable(context_t *c, Id pid)
     }
 
   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
@@ -352,7 +360,7 @@ test_can_upgrade_all_packages(context_t *c, Id pid)
   queue_init(&cand);
   queue_init(&badguys);
 
-  now = sat_timems(0);
+  now = solv_timems(0);
   solver_runs = 0;
 
   /* Test 3: can we upgrade all packages? */
@@ -361,7 +369,7 @@ test_can_upgrade_all_packages(context_t *c, Id pid)
       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;
@@ -398,7 +406,7 @@ 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);
@@ -415,14 +423,12 @@ test_can_upgrade_all_packages(context_t *c, Id pid)
               queue_push(&job, i);
             }
         }
-      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_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;
           showproblems(solv, s, &cand, &badguys);
@@ -441,7 +447,7 @@ test_can_upgrade_all_packages(context_t *c, Id pid)
       cand.count = j;
     }
   if (PERF_DEBUGGING)
-    printf("  test_can_upgrade_all_packages took %d ms in %d runs\n", sat_timems(now), solver_runs);
+    printf("  test_can_upgrade_all_packages took %d ms in %d runs\n", solv_timems(now), solver_runs);
 }
 
 void
@@ -464,13 +470,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;
             }
         }
@@ -482,12 +488,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;
@@ -499,7 +506,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
@@ -527,30 +533,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)
@@ -565,19 +581,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;
 
@@ -590,7 +606,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;
            }
        }
@@ -599,7 +615,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) {
@@ -612,7 +628,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);