- support '-r' option a bit
authorMichael Schroeder <mls@suse.de>
Wed, 16 Sep 2009 10:19:06 +0000 (12:19 +0200)
committerMichael Schroeder <mls@suse.de>
Wed, 16 Sep 2009 10:19:06 +0000 (12:19 +0200)
examples/solv.c

index 186ea7f..071d2df 100644 (file)
@@ -1740,6 +1740,54 @@ limitevr(Pool *pool, char *evr, Queue *job, Id archid)
   return 0;
 }
 
+int
+limitrepo(Pool *pool, Id repofilter, Queue *job)
+{
+  Queue mq;
+  Id p, pp;
+  int matched = 0;
+  int i;
+  Solvable *s;
+
+  queue_init(&mq);
+  for (i = 0; i < job->count; i += 2)
+    {
+      queue_empty(&mq);
+      FOR_JOB_SELECT(p, pp, job->elements[i], job->elements[i + 1])
+       {
+         s = pool_id2solvable(pool, p);
+         if (s->repo && s->repo->repoid == repofilter)
+            queue_push(&mq, p);
+       }
+      if (mq.count)
+       {
+         if (!matched && i)
+           {
+             queue_deleten(job, 0, i);
+             i = 0;
+           }
+         matched = 1;
+         if (mq.count > 1)
+           {
+             job->elements[i] = SOLVER_SOLVABLE_ONE_OF;
+             job->elements[i + 1] = pool_queuetowhatprovides(pool, &mq);
+           }
+         else
+           {
+             job->elements[i] = SOLVER_SOLVABLE;
+             job->elements[i + 1] = mq.elements[0];
+           }
+       }
+      else if (matched)
+       {
+         queue_deleten(job, i, 2);
+         i -= 2;
+       }
+    }
+  queue_free(&mq);
+  return matched;
+}
+
 void
 mkselect(Pool *pool, int mode, char *name, Queue *job)
 {
@@ -2110,16 +2158,16 @@ usage(int r)
 {
   fprintf(stderr, "Usage: solv COMMAND <select>\n");
   fprintf(stderr, "\n");
-  fprintf(stderr, "    distupgrade: replace installed packages with\n");
-  fprintf(stderr, "                 versions from the repositories\n");
-  fprintf(stderr, "    erase:       erase installed packages\n");
-  fprintf(stderr, "    info:        display package information\n");
-  fprintf(stderr, "    install:     install packages\n");
-  fprintf(stderr, "    list:        list packages\n");
-  fprintf(stderr, "    repos:       list enabled repositories\n");
-  fprintf(stderr, "    search:      search name/summary/description\n");
-  fprintf(stderr, "    update:      update installed packages\n");
-  fprintf(stderr, "    verify:      check dependencies of installed packages\n");
+  fprintf(stderr, "    dist-upgrade: replace installed packages with\n");
+  fprintf(stderr, "                  versions from the repositories\n");
+  fprintf(stderr, "    erase:        erase installed packages\n");
+  fprintf(stderr, "    info:         display package information\n");
+  fprintf(stderr, "    install:      install packages\n");
+  fprintf(stderr, "    list:         list packages\n");
+  fprintf(stderr, "    repos:        list enabled repositories\n");
+  fprintf(stderr, "    search:       search name/summary/description\n");
+  fprintf(stderr, "    update:       update installed packages\n");
+  fprintf(stderr, "    verify:       check dependencies of installed packages\n");
   fprintf(stderr, "\n");
   exit(r);
 }
@@ -2143,6 +2191,7 @@ main(int argc, char **argv)
   FILE **newpkgsfps;
   struct fcstate fcstate;
   Id *addedfileprovides = 0;
+  Id repofilter = 0;
 
   argc--;
   argv++;
@@ -2226,6 +2275,43 @@ main(int argc, char **argv)
 
   read_repos(pool, repoinfos, nrepoinfos);
 
+  if (argc > 2 && !strcmp(argv[1], "-r"))
+    {
+      const char *rname = argv[2], *rp;
+      for (rp = rname; *rp; rp++)
+       if (*rp <= '0' || *rp >= '9')
+         break;
+      if (!*rp)
+       {
+         /* repo specified by number */
+         int rnum = atoi(rname);
+         for (i = 0; i < nrepoinfos; i++)
+           {
+             struct repoinfo *cinfo = repoinfos + i;
+             if (!cinfo->enabled)
+               continue;
+             if (--rnum == 0)
+               repofilter = cinfo->repo->repoid;
+           }
+       }
+      else
+       {
+         /* repo specified by alias */
+         Repo *repo;
+         FOR_REPOS(i, repo)
+           {
+             if (!strcasecmp(rname, repo->name))
+               repofilter = repo->repoid;
+           }
+       }
+      if (!repofilter)
+       {
+         fprintf(stderr, "%s: no such repo\n", rname);
+         exit(1);
+       }
+      argc -= 2;
+      argv += 2;
+    }
   if (mainmode == MODE_SEARCH)
     {
       Dataiterator di;
@@ -2306,6 +2392,11 @@ main(int argc, char **argv)
        }
       queue_init(&job2);
       mkselect(pool, mode, argv[i], &job2);
+      if (repofilter && !limitrepo(pool, repofilter, &job2))
+        {
+         fprintf(stderr, "nothing in repo matches '%s'\n", argv[i]);
+         exit(1);
+        }
       for (j = 0; j < job2.count; j++)
        queue_push(&job, job2.elements[j]);
       queue_free(&job2);
@@ -2317,7 +2408,7 @@ main(int argc, char **argv)
       exit(1);
     }
 
-  if (!job.count)
+  if (!job.count && !repofilter)
     allpkgs = 1;
 
   if (mainmode == MODE_LIST || mainmode == MODE_INFO)
@@ -2445,7 +2536,7 @@ rerunsolver:
       solv->updatesystem = allpkgs && (mainmode == MODE_UPDATE || mainmode == MODE_DISTUPGRADE);
       solv->dosplitprovides = solv->updatesystem;
       solv->fixsystem = allpkgs && (mainmode == MODE_VERIFY);
-      if (mainmode == MODE_DISTUPGRADE)
+      if (mainmode == MODE_DISTUPGRADE && allpkgs)
        {
          solv->distupgrade = 1;
           solv->allowdowngrade = 1;
@@ -2455,7 +2546,8 @@ rerunsolver:
       if (mainmode == MODE_ERASE)
        solv->allowuninstall = 1;       /* don't nag */
 
-      // queue_push2(&job, SOLVER_DISTUPGRADE|SOLVER_SOLVABLE_REPO, 3);
+      if (mainmode == MODE_DISTUPGRADE && repofilter)
+        queue_push2(&job, SOLVER_DISTUPGRADE|SOLVER_SOLVABLE_REPO, repofilter);
       solver_solve(solv, &job);
       if (!solv->problems.count)
        break;