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)
{
{
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);
}
FILE **newpkgsfps;
struct fcstate fcstate;
Id *addedfileprovides = 0;
+ Id repofilter = 0;
argc--;
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;
}
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);
exit(1);
}
- if (!job.count)
+ if (!job.count && !repofilter)
allpkgs = 1;
if (mainmode == MODE_LIST || mainmode == MODE_INFO)
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;
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;