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"
33 #include "solv_xfopen.h"
39 printf("Usage:\n%s: <arch> [options..] repo [--nocheck repo]...\n"
40 "\t--exclude <pattern>\twhitespace-separated list of (sub-)"
41 "packagenames to ignore\n"
42 "\t--withobsoletes\t\tCheck for obsoletes on packages contained in repos\n"
43 "\t--nocheck\t\tDo not warn about all following repos (only use them to fulfill dependencies)\n"
44 "\t--withsrc\t\tAlso check dependencies of src.rpm\n\n"
51 main(int argc, char **argv)
60 char *arch, *exclude_pat;
63 Id rpmid, rpmarch, rpmrel, archlock;
67 int obsoletepkgcheck = 0;
76 pool_setarch(pool, arch);
77 for (i = 2; i < argc; i++)
82 if (!strcmp(argv[i], "--withsrc"))
87 if (!strcmp(argv[i], "--withobsoletes"))
92 if (!strcmp(argv[i], "--nocheck"))
95 nocheck = pool->nsolvables;
98 if (!strcmp(argv[i], "--exclude"))
102 printf("--exclude needs a whitespace separated list of substrings as parameter\n");
105 exclude_pat = argv[i + 1];
110 if (!strcmp(argv[i], "-"))
112 else if ((fp = solv_xfopen(argv[i], 0)) == 0)
117 repo = repo_create(pool, argv[i]);
121 #ifdef ENABLE_SUSEREPO
122 else if (l >= 8 && !strcmp(argv[i] + l - 8, "packages"))
124 repo_add_susetags(repo, fp, 0, 0, 0);
126 else if (l >= 11 && !strcmp(argv[i] + l - 11, "packages.gz"))
128 repo_add_susetags(repo, fp, 0, 0, 0);
132 else if (l >= 14 && !strcmp(argv[i] + l - 14, "primary.xml.gz"))
134 repo_add_rpmmd(repo, fp, 0, 0);
138 else if (l >= 8 && !strcmp(argv[i] + l - 8, "Packages"))
140 repo_add_debpackages(repo, fp, 0);
142 else if (l >= 11 && !strcmp(argv[i] + l - 11, "Packages.gz"))
144 repo_add_debpackages(repo, fp, 0);
147 else if (repo_add_solv(repo, fp))
149 fprintf(stderr, "could not add repo %s\n", argv[i]);
155 pool_addfileprovides(pool);
156 pool_createwhatprovides(pool);
157 rpmid = pool_str2id(pool, "rpm", 0);
158 rpmarch = pool_str2id(pool, arch, 0);
161 if (rpmid && rpmarch)
163 for (p = 1; p < pool->nsolvables; p++)
165 Solvable *s = pool->solvables + p;
166 if (s->name == rpmid && s->arch == rpmarch)
169 if (p < pool->nsolvables)
170 rpmrel = pool_rel2id(pool, rpmid, rpmarch, REL_ARCH, 1);
177 queue_init(&archlocks);
178 for (p = 1; p < pool->nsolvables; p++)
180 Solvable *s = pool->solvables + p;
183 if (withsrc && (s->arch == ARCH_SRC || s->arch == ARCH_NOSRC))
185 queue_push(&cand, p);
188 if (!pool_installable(pool, s))
190 if (rpmrel && s->arch != rpmarch)
193 FOR_PROVIDES(rp, rpp, s->name)
195 if (pool->solvables[rp].name != s->name)
197 if (pool->solvables[rp].arch == rpmarch)
202 queue_push(&archlocks, p);
206 queue_push(&cand, p);
211 archlock = pool_queuetowhatprovides(pool, &archlocks);
215 if (obsoletepkgcheck)
216 for (i = 0; i < cand.count; i++)
219 s = pool->solvables + cand.elements[i];
224 Id obs, *obsp = s->repo->idarraydata + s->obsoletes;
226 while ((obs = *obsp++) != 0)
228 FOR_PROVIDES(op, opp, obs)
230 if (nocheck && op >= nocheck)
233 if (!solvable_identical(s, pool_id2solvable(pool, op))
234 && pool_match_nevr(pool, pool_id2solvable(pool, op), obs))
237 printf("can't install %s:\n", pool_solvid2str(pool, op));
238 printf(" package is obsoleted by %s\n", pool_solvable2str(pool, s));
245 /* prune cand by doing weak installs */
248 solv = solver_create(pool);
250 for (i = 0; i < cand.count; i++)
252 p = cand.elements[i];
253 queue_push(&job, SOLVER_INSTALL|SOLVER_SOLVABLE|SOLVER_WEAK);
258 queue_push(&job, SOLVER_INSTALL|SOLVER_SOLVABLE_NAME);
259 queue_push(&job, rpmrel);
263 queue_push(&job, SOLVER_LOCK|SOLVER_SOLVABLE_ONE_OF);
264 queue_push(&job, archlock);
266 solver_set_flag(solv, SOLVER_FLAG_IGNORE_RECOMMENDED, 1);
267 solver_solve(solv, &job);
269 for (i = j = 0; i < cand.count; i++)
271 p = cand.elements[i];
272 if (solver_get_decisionlevel(solv, p) <= 0)
274 cand.elements[j++] = p;
278 Solvable *s = pool->solvables + p;
279 if (!strcmp(pool_id2str(pool, s->name), "libusb-compat-devel"))
281 cand.elements[j++] = p;
291 /* now check every candidate */
292 for (i = 0; i < cand.count; i++)
297 p = cand.elements[i];
298 if (nocheck && p >= nocheck)
302 char *ptr, *save = 0, *pattern;
304 pattern = strdup(exclude_pat);
306 for (ptr = strtok_r(pattern, " ", &save);
308 ptr = strtok_r(NULL, " ", &save))
310 if (*ptr && strstr(pool_solvid2str(pool, p), ptr))
320 s = pool->solvables + p;
321 solv = solver_create(pool);
323 queue_push(&job, SOLVER_INSTALL|SOLVER_SOLVABLE);
327 queue_push(&job, SOLVER_INSTALL|SOLVER_SOLVABLE_NAME);
328 queue_push(&job, rpmrel);
332 queue_push(&job, SOLVER_LOCK|SOLVER_SOLVABLE_ONE_OF);
333 queue_push(&job, archlock);
335 solver_set_flag(solv, SOLVER_FLAG_IGNORE_RECOMMENDED, 1);
336 problemcount = solver_solve(solv, &job);
343 printf("can't install %s:\n", pool_solvable2str(pool, s));
344 while ((problem = solver_next_problem(solv, problem)) != 0)
346 solver_findallproblemrules(solv, problem, &rids);
347 for (j = 0; j < rids.count; j++)
349 Id probr = rids.elements[j];
354 solver_allruleinfos(solv, probr, &rinfo);
355 for (k = 0; k < rinfo.count; k += 4)
357 Id dep, source, target;
358 source = rinfo.elements[k + 1];
359 target = rinfo.elements[k + 2];
360 dep = rinfo.elements[k + 3];
361 switch (rinfo.elements[k])
363 case SOLVER_RULE_DISTUPGRADE:
365 case SOLVER_RULE_INFARCH:
366 s = pool_id2solvable(pool, source);
367 printf(" %s has inferior architecture\n", pool_solvable2str(pool, s));
369 case SOLVER_RULE_UPDATE:
370 s = pool_id2solvable(pool, source);
371 printf(" %s can not be updated\n", pool_solvable2str(pool, s));
373 case SOLVER_RULE_JOB:
375 case SOLVER_RULE_RPM:
376 printf(" some dependency problem\n");
378 case SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP:
379 printf(" nothing provides requested %s\n", pool_dep2str(pool, dep));
381 case SOLVER_RULE_RPM_NOT_INSTALLABLE:
382 s = pool_id2solvable(pool, source);
383 printf(" package %s is not installable\n", pool_solvable2str(pool, s));
385 case SOLVER_RULE_RPM_NOTHING_PROVIDES_DEP:
386 s = pool_id2solvable(pool, source);
387 printf(" nothing provides %s needed by %s\n", pool_dep2str(pool, dep), pool_solvable2str(pool, s));
390 Reldep *rd = GETRELDEP(pool, dep);
391 if (!ISRELDEP(rd->name))
394 FOR_PROVIDES(rp, rpp, rd->name)
395 printf(" (we have %s)\n", pool_solvable2str(pool, pool->solvables + rp));
399 case SOLVER_RULE_RPM_SAME_NAME:
400 s = pool_id2solvable(pool, source);
401 s2 = pool_id2solvable(pool, target);
402 printf(" cannot install both %s and %s\n", pool_solvable2str(pool, s), pool_solvable2str(pool, s2));
404 case SOLVER_RULE_RPM_PACKAGE_CONFLICT:
405 s = pool_id2solvable(pool, source);
406 s2 = pool_id2solvable(pool, target);
407 printf(" package %s conflicts with %s provided by %s\n", pool_solvable2str(pool, s), pool_dep2str(pool, dep), pool_solvable2str(pool, s2));
409 case SOLVER_RULE_RPM_PACKAGE_OBSOLETES:
410 s = pool_id2solvable(pool, source);
411 s2 = pool_id2solvable(pool, target);
412 printf(" package %s obsoletes %s provided by %s\n", pool_solvable2str(pool, s), pool_dep2str(pool, dep), pool_solvable2str(pool, s2));
414 case SOLVER_RULE_RPM_PACKAGE_REQUIRES:
415 s = pool_id2solvable(pool, source);
416 printf(" package %s requires %s, but none of the providers can be installed\n", pool_solvable2str(pool, s), pool_dep2str(pool, dep));
418 case SOLVER_RULE_RPM_SELF_CONFLICT:
419 s = pool_id2solvable(pool, source);
420 printf(" package %s conflicts with %s provided by itself\n", pool_solvable2str(pool, s), pool_dep2str(pool, dep));
430 if (!strcmp(pool_id2str(pool, s->name), "libusb-compat-devel"))
432 solver_printdecisions(solv);