1 /* vim: sw=2 et cino=>4,n-2,{1s
5 * Copyright (c) 2009, Novell Inc.
7 * This program is licensed under the BSD license, read LICENSE.BSD
8 * for further information
22 #include "repo_solv.h"
24 #include "repo_susetags.h"
25 #include "repo_rpmmd.h"
32 cookie_gzread(void *cookie, char *buf, size_t nbytes)
34 return gzread((gzFile *)cookie, buf, nbytes);
38 cookie_gzclose(void *cookie)
40 return gzclose((gzFile *)cookie);
44 myfopen(const char *fn)
46 cookie_io_functions_t cio;
52 suf = strrchr(fn, '.');
53 if (!suf || strcmp(suf, ".gz") != 0)
54 return fopen(fn, "r");
55 gzf = gzopen(fn, "r");
58 memset(&cio, 0, sizeof(cio));
59 cio.read = cookie_gzread;
60 cio.close = cookie_gzclose;
61 return fopencookie(gzf, "r", cio);
67 printf("Usage:\n%s: <arch> repo [--nocheck repo]...\n", argv[0]);
73 main(int argc, char **argv)
81 char *arch, *exclude_pat;
84 Id rpmid, rpmarch, rpmrel, archlock;
96 pool_setarch(pool, arch);
97 for (i = 2; i < argc; i++)
102 if (!strcmp(argv[i], "--withsrc"))
107 if (!strcmp(argv[i], "--nocheck"))
110 nocheck = pool->nsolvables;
113 if (!strcmp(argv[i], "--exclude"))
117 printf("--exclude needs a whitespace separated list of substrings as parameter\n");
120 exclude_pat = argv[i + 1];
125 if (!strcmp(argv[i], "-"))
127 else if ((fp = myfopen(argv[i])) == 0)
132 Repo *repo = repo_create(pool, argv[i]);
134 if (l >= 8 && !strcmp(argv[i] + l - 8, "packages"))
136 repo_add_susetags(repo, fp, 0, 0, 0);
138 else if (l >= 11 && !strcmp(argv[i] + l - 11, "packages.gz"))
140 repo_add_susetags(repo, fp, 0, 0, 0);
142 else if (l >= 14 && !strcmp(argv[i] + l - 14, "primary.xml.gz"))
144 repo_add_rpmmd(repo, fp, 0, 0);
147 if (l >= 8 && !strcmp(argv[i] + l - 8, "Packages"))
149 repo_add_debpackages(repo, fp, 0);
151 else if (l >= 11 && !strcmp(argv[i] + l - 11, "Packages.gz"))
153 repo_add_debpackages(repo, fp, 0);
156 else if (repo_add_solv(repo, fp))
158 fprintf(stderr, "could not add repo %s\n", argv[i]);
164 pool_addfileprovides(pool);
165 pool_createwhatprovides(pool);
166 rpmid = str2id(pool, "rpm", 0);
167 rpmarch = str2id(pool, arch, 0);
170 if (rpmid && rpmarch)
172 for (p = 1; p < pool->nsolvables; p++)
174 Solvable *s = pool->solvables + p;
175 if (s->name == rpmid && s->arch == rpmarch)
178 if (p < pool->nsolvables)
179 rpmrel = rel2id(pool, rpmid, rpmarch, REL_ARCH, 1);
186 queue_init(&archlocks);
187 for (p = 1; p < pool->nsolvables; p++)
189 Solvable *s = pool->solvables + p;
192 if (withsrc && (s->arch == ARCH_SRC || s->arch == ARCH_NOSRC))
194 queue_push(&cand, p);
197 if (!pool_installable(pool, s))
199 if (rpmrel && s->arch != rpmarch)
202 FOR_PROVIDES(rp, rpp, s->name)
204 if (pool->solvables[rp].name != s->name)
206 if (pool->solvables[rp].arch == rpmarch)
211 queue_push(&archlocks, p);
215 queue_push(&cand, p);
220 archlock = pool_queuetowhatprovides(pool, &archlocks);
222 /* prune cand by doing weak installs */
225 solv = solver_create(pool);
227 for (i = 0; i < cand.count; i++)
229 p = cand.elements[i];
230 queue_push(&job, SOLVER_INSTALL|SOLVER_SOLVABLE|SOLVER_WEAK);
235 queue_push(&job, SOLVER_INSTALL|SOLVER_SOLVABLE_NAME);
236 queue_push(&job, rpmrel);
240 queue_push(&job, SOLVER_LOCK|SOLVER_SOLVABLE_ONE_OF);
241 queue_push(&job, archlock);
243 solv->dontinstallrecommended = 1;
244 solver_solve(solv, &job);
246 for (i = j = 0; i < cand.count; i++)
248 p = cand.elements[i];
249 if (solv->decisionmap[p] <= 0)
251 cand.elements[j++] = p;
255 Solvable *s = pool->solvables + p;
256 if (!strcmp(id2str(pool, s->name), "libusb-compat-devel"))
258 cand.elements[j++] = p;
268 /* now check every candidate */
269 for (i = 0; i < cand.count; i++)
273 p = cand.elements[i];
274 if (nocheck && p >= nocheck)
278 char *ptr, *save = 0, *pattern;
280 pattern = strdup(exclude_pat);
282 for (ptr = strtok_r(pattern, " ", &save);
284 ptr = strtok_r(NULL, " ", &save))
286 if (*ptr && strstr(solvid2str(pool, p), ptr))
296 s = pool->solvables + p;
297 solv = solver_create(pool);
299 queue_push(&job, SOLVER_INSTALL|SOLVER_SOLVABLE);
303 queue_push(&job, SOLVER_INSTALL|SOLVER_SOLVABLE_NAME);
304 queue_push(&job, rpmrel);
308 queue_push(&job, SOLVER_LOCK|SOLVER_SOLVABLE_ONE_OF);
309 queue_push(&job, archlock);
311 solv->dontinstallrecommended = 1;
312 solver_solve(solv, &job);
313 if (solv->problems.count)
319 printf("can't install %s:\n", solvable2str(pool, s));
320 while ((problem = solver_next_problem(solv, problem)) != 0)
322 solver_findallproblemrules(solv, problem, &rids);
323 for (j = 0; j < rids.count; j++)
325 Id probr = rids.elements[j];
330 solver_allruleinfos(solv, probr, &rinfo);
331 for (k = 0; k < rinfo.count; k += 4)
333 Id dep, source, target;
334 source = rinfo.elements[k + 1];
335 target = rinfo.elements[k + 2];
336 dep = rinfo.elements[k + 3];
337 switch (rinfo.elements[k])
339 case SOLVER_PROBLEM_DISTUPGRADE_RULE:
341 case SOLVER_PROBLEM_INFARCH_RULE:
342 s = pool_id2solvable(pool, source);
343 printf(" %s has inferior architecture\n", solvable2str(pool, s));
345 case SOLVER_PROBLEM_UPDATE_RULE:
347 case SOLVER_PROBLEM_JOB_RULE:
349 case SOLVER_PROBLEM_RPM_RULE:
350 printf(" some dependency problem\n");
352 case SOLVER_PROBLEM_JOB_NOTHING_PROVIDES_DEP:
353 printf(" nothing provides requested %s\n", dep2str(pool, dep));
355 case SOLVER_PROBLEM_NOT_INSTALLABLE:
356 s = pool_id2solvable(pool, source);
357 printf(" package %s is not installable\n", solvable2str(pool, s));
359 case SOLVER_PROBLEM_NOTHING_PROVIDES_DEP:
360 s = pool_id2solvable(pool, source);
361 printf(" nothing provides %s needed by %s\n", dep2str(pool, dep), solvable2str(pool, s));
364 Reldep *rd = GETRELDEP(pool, dep);
365 if (!ISRELDEP(rd->name))
368 FOR_PROVIDES(rp, rpp, rd->name)
369 printf(" (we have %s)\n", solvable2str(pool, pool->solvables + rp));
373 case SOLVER_PROBLEM_SAME_NAME:
374 s = pool_id2solvable(pool, source);
375 s2 = pool_id2solvable(pool, target);
376 printf(" cannot install both %s and %s\n", solvable2str(pool, s), solvable2str(pool, s2));
378 case SOLVER_PROBLEM_PACKAGE_CONFLICT:
379 s = pool_id2solvable(pool, source);
380 s2 = pool_id2solvable(pool, target);
381 printf(" package %s conflicts with %s provided by %s\n", solvable2str(pool, s), dep2str(pool, dep), solvable2str(pool, s2));
383 case SOLVER_PROBLEM_PACKAGE_OBSOLETES:
384 s = pool_id2solvable(pool, source);
385 s2 = pool_id2solvable(pool, target);
386 printf(" package %s obsoletes %s provided by %s\n", solvable2str(pool, s), dep2str(pool, dep), solvable2str(pool, s2));
388 case SOLVER_PROBLEM_DEP_PROVIDERS_NOT_INSTALLABLE:
389 s = pool_id2solvable(pool, source);
390 printf(" package %s requires %s, but none of the providers can be installed\n", solvable2str(pool, s), dep2str(pool, dep));
392 case SOLVER_PROBLEM_SELF_CONFLICT:
393 s = pool_id2solvable(pool, source);
394 printf(" package %s conflicts with %s provided by itself\n", solvable2str(pool, s), dep2str(pool, dep));
404 if (!strcmp(id2str(pool, s->name), "libusb-compat-devel"))
406 solver_printdecisions(solv);