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"
23 #ifdef ENABLE_SUSEREPO
24 #include "repo_susetags.h"
27 #include "repo_rpmmd.h"
32 #ifdef ENABLE_ARCHREPO
33 #include "repo_arch.h"
36 #include "solv_xfopen.h"
42 printf("Usage:\n%s: <arch> [options..] repo [--nocheck repo]...\n"
43 "\t--exclude <pattern>\twhitespace-separated list of (sub-)"
44 "packagenames to ignore\n"
45 "\t--withobsoletes\t\tCheck for obsoletes on packages contained in repos\n"
46 "\t--nocheck\t\tDo not warn about all following repos (only use them to fulfill dependencies)\n"
47 "\t--withsrc\t\tAlso check dependencies of src.rpm\n\n"
54 main(int argc, char **argv)
62 char *arch, *exclude_pat;
73 int obsoletepkgcheck = 0;
81 pool_setarch(pool, arch);
82 noarchid = pool->solvables[SYSTEMSOLVABLE].arch;
83 for (i = 2; i < argc; i++)
88 if (!strcmp(argv[i], "--withsrc"))
93 if (!strcmp(argv[i], "--withobsoletes"))
98 if (!strcmp(argv[i], "--nocheck"))
101 nocheck = pool->nsolvables;
104 if (!strcmp(argv[i], "--exclude"))
108 printf("--exclude needs a whitespace separated list of substrings as parameter\n");
111 exclude_pat = argv[i + 1];
116 if (!strcmp(argv[i], "-"))
118 else if ((fp = solv_xfopen(argv[i], 0)) == 0)
123 repo = repo_create(pool, argv[i]);
128 #ifdef ENABLE_SUSEREPO
129 else if (l >= 8 && !strcmp(argv[i] + l - 8, "packages"))
131 r = repo_add_susetags(repo, fp, 0, 0, 0);
133 else if (l >= 11 && !strcmp(argv[i] + l - 11, "packages.gz"))
135 r = repo_add_susetags(repo, fp, 0, 0, 0);
139 else if (l >= 14 && !strcmp(argv[i] + l - 14, "primary.xml.gz"))
141 r = repo_add_rpmmd(repo, fp, 0, 0);
145 else if (l >= 8 && !strcmp(argv[i] + l - 8, "Packages"))
147 r = repo_add_debpackages(repo, fp, 0);
149 else if (l >= 11 && !strcmp(argv[i] + l - 11, "Packages.gz"))
151 r = repo_add_debpackages(repo, fp, 0);
154 #ifdef ENABLE_ARCHREPO
155 else if (l >= 10 && (!strcmp(argv[i] + l - 10, ".db.tar.gz") || !strcmp(argv[i] + l - 10, ".db.tar.xz")))
157 r = repo_add_arch_repo(repo, fp, 0);
161 r = repo_add_solv(repo, fp, 0);
164 fprintf(stderr, "could not add repo %s: %s\n", argv[i], pool_errstr(pool));
170 pool_addfileprovides(pool);
171 pool_createwhatprovides(pool);
172 archid = pool_str2id(pool, arch, 0);
174 rpmid = pool_str2id(pool, "rpm", 0);
178 for (p = 1; p < pool->nsolvables; p++)
180 Solvable *s = pool->solvables + p;
181 if (s->name == rpmid && s->arch == archid && pool_installable(pool, s))
184 if (p < pool->nsolvables)
185 rpmrel = pool_rel2id(pool, rpmid, archid, REL_ARCH, 1);
194 for (p = 1; p < (nocheck ? nocheck : pool->nsolvables); p++)
196 Solvable *s = pool->solvables + p;
199 if (withsrc && (s->arch == ARCH_SRC || s->arch == ARCH_NOSRC))
201 queue_push(&cand, p);
204 if (!pool_installable(pool, s))
206 if (archid && s->arch != archid && s->arch != noarchid)
208 /* check if we will conflict with a infarch rule, if yes,
209 * don't bother checking the package */
211 FOR_PROVIDES(rp, rpp, s->name)
213 if (pool->solvables[rp].name != s->name)
215 if (pool->solvables[rp].arch == archid)
221 queue_push(&cand, p);
223 if (obsoletepkgcheck)
225 int obsoleteusesprovides = pool_get_flag(pool, POOL_FLAG_OBSOLETEUSESPROVIDES);
226 int obsoleteusescolors = pool_get_flag(pool, POOL_FLAG_OBSOLETEUSESCOLORS);
228 for (i = 0; i < cand.count; i++)
231 s = pool->solvables + cand.elements[i];
235 Id obs, *obsp = s->repo->idarraydata + s->obsoletes;
237 while ((obs = *obsp++) != 0)
240 FOR_PROVIDES(op, opp, obs)
242 Solvable *os = pool->solvables + op;
243 if (nocheck && op >= nocheck)
245 if (solvable_identical(s, os))
247 if (!obsoleteusesprovides && !pool_match_nevr(pool, os, obs))
249 if (obsoleteusescolors && !pool_colormatch(pool, s, os))
252 printf("can't install %s:\n", pool_solvid2str(pool, op));
253 printf(" package is obsoleted by %s\n", pool_solvable2str(pool, s));
260 solv = solver_create(pool);
262 /* prune cand by doing weak installs */
266 for (i = 0; i < cand.count; i++)
268 p = cand.elements[i];
269 queue_push2(&job, SOLVER_INSTALL|SOLVER_SOLVABLE|SOLVER_WEAK, p);
272 queue_push2(&job, SOLVER_INSTALL|SOLVER_SOLVABLE_NAME, rpmrel);
273 solver_set_flag(solv, SOLVER_FLAG_IGNORE_RECOMMENDED, 1);
274 solver_solve(solv, &job);
276 for (i = j = 0; i < cand.count; i++)
278 p = cand.elements[i];
279 if (solver_get_decisionlevel(solv, p) <= 0)
281 cand.elements[j++] = p;
285 Solvable *s = pool->solvables + p;
286 if (!strcmp(pool_id2str(pool, s->name), "libusb-compat-devel"))
288 cand.elements[j++] = p;
298 /* now check every candidate */
299 for (i = 0; i < cand.count; i++)
304 p = cand.elements[i];
307 char *ptr, *save = 0, *pattern;
309 pattern = solv_strdup(exclude_pat);
311 for (ptr = strtok_r(pattern, " ", &save);
313 ptr = strtok_r(NULL, " ", &save))
315 if (*ptr && strstr(pool_solvid2str(pool, p), ptr))
325 s = pool->solvables + p;
327 queue_push2(&job, SOLVER_INSTALL|SOLVER_SOLVABLE, p);
329 queue_push2(&job, SOLVER_INSTALL|SOLVER_SOLVABLE_NAME, rpmrel);
330 solver_set_flag(solv, SOLVER_FLAG_IGNORE_RECOMMENDED, 1);
331 problemcount = solver_solve(solv, &job);
338 printf("can't install %s:\n", pool_solvable2str(pool, s));
339 while ((problem = solver_next_problem(solv, problem)) != 0)
341 solver_findallproblemrules(solv, problem, &rids);
342 for (j = 0; j < rids.count; j++)
344 Id probr = rids.elements[j];
349 solver_allruleinfos(solv, probr, &rinfo);
350 for (k = 0; k < rinfo.count; k += 4)
352 Id dep, source, target;
353 source = rinfo.elements[k + 1];
354 target = rinfo.elements[k + 2];
355 dep = rinfo.elements[k + 3];
356 switch (rinfo.elements[k])
358 case SOLVER_RULE_DISTUPGRADE:
360 case SOLVER_RULE_INFARCH:
361 s = pool_id2solvable(pool, source);
362 printf(" %s has inferior architecture\n", pool_solvable2str(pool, s));
364 case SOLVER_RULE_UPDATE:
365 s = pool_id2solvable(pool, source);
366 printf(" %s can not be updated\n", pool_solvable2str(pool, s));
368 case SOLVER_RULE_JOB:
369 case SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM:
370 case SOLVER_RULE_JOB_UNKNOWN_PACKAGE:
371 case SOLVER_RULE_JOB_UNSUPPORTED:
373 case SOLVER_RULE_RPM:
374 printf(" some dependency problem\n");
376 case SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP:
377 printf(" nothing provides requested %s\n", pool_dep2str(pool, dep));
379 case SOLVER_RULE_RPM_NOT_INSTALLABLE:
380 s = pool_id2solvable(pool, source);
381 printf(" package %s is not installable\n", pool_solvable2str(pool, s));
383 case SOLVER_RULE_RPM_NOTHING_PROVIDES_DEP:
384 s = pool_id2solvable(pool, source);
385 printf(" nothing provides %s needed by %s\n", pool_dep2str(pool, dep), pool_solvable2str(pool, s));
388 Reldep *rd = GETRELDEP(pool, dep);
389 if (!ISRELDEP(rd->name))
392 FOR_PROVIDES(rp, rpp, rd->name)
393 printf(" (we have %s)\n", pool_solvable2str(pool, pool->solvables + rp));
397 case SOLVER_RULE_RPM_SAME_NAME:
398 s = pool_id2solvable(pool, source);
399 s2 = pool_id2solvable(pool, target);
400 printf(" cannot install both %s and %s\n", pool_solvable2str(pool, s), pool_solvable2str(pool, s2));
402 case SOLVER_RULE_RPM_PACKAGE_CONFLICT:
403 s = pool_id2solvable(pool, source);
404 s2 = pool_id2solvable(pool, target);
405 printf(" package %s conflicts with %s provided by %s\n", pool_solvable2str(pool, s), pool_dep2str(pool, dep), pool_solvable2str(pool, s2));
407 case SOLVER_RULE_RPM_PACKAGE_OBSOLETES:
408 s = pool_id2solvable(pool, source);
409 s2 = pool_id2solvable(pool, target);
410 printf(" package %s obsoletes %s provided by %s\n", pool_solvable2str(pool, s), pool_dep2str(pool, dep), pool_solvable2str(pool, s2));
412 case SOLVER_RULE_RPM_PACKAGE_REQUIRES:
413 s = pool_id2solvable(pool, source);
414 printf(" package %s requires %s, but none of the providers can be installed\n", pool_solvable2str(pool, s), pool_dep2str(pool, dep));
416 case SOLVER_RULE_RPM_SELF_CONFLICT:
417 s = pool_id2solvable(pool, source);
418 printf(" package %s conflicts with %s provided by itself\n", pool_solvable2str(pool, s), pool_dep2str(pool, dep));
428 if (!strcmp(pool_id2str(pool, s->name), "libusb-compat-devel"))
430 solver_printdecisions(solv);