summaryrefslogtreecommitdiff
path: root/tools/patchcheck.c
diff options
context:
space:
mode:
authorDongHun Kwak <dh0128.kwak@samsung.com>2018-12-04 14:04:28 +0900
committerDongHun Kwak <dh0128.kwak@samsung.com>2018-12-04 14:04:32 +0900
commite679b515eddb3dd340fb25620de0160211f40fdc (patch)
tree93271e0bbd40dba805f8270cfc78a3ac10ab2c8f /tools/patchcheck.c
parentd98199487aa414cb7f965a058c4395235343e20a (diff)
downloadlibsolv-e679b515eddb3dd340fb25620de0160211f40fdc.tar.gz
libsolv-e679b515eddb3dd340fb25620de0160211f40fdc.tar.bz2
libsolv-e679b515eddb3dd340fb25620de0160211f40fdc.zip
Imported Upstream version 0.6.35upstream/0.6.35
Change-Id: Ib7359aa10c08c1469105fbd6a82ea922f46f8b51 Signed-off-by: DongHun Kwak <dh0128.kwak@samsung.com>
Diffstat (limited to 'tools/patchcheck.c')
-rw-r--r--tools/patchcheck.c641
1 files changed, 0 insertions, 641 deletions
diff --git a/tools/patchcheck.c b/tools/patchcheck.c
deleted file mode 100644
index 4025f92..0000000
--- a/tools/patchcheck.c
+++ /dev/null
@@ -1,641 +0,0 @@
-/* vim: sw=2 et
- */
-
-/*
- * Copyright (c) 2009, Novell Inc.
- *
- * This program is licensed under the BSD license, read LICENSE.BSD
- * for further information
- */
-
-#define _GNU_SOURCE
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-
-#include "pool.h"
-#include "evr.h"
-#include "poolarch.h"
-#include "repo_solv.h"
-#ifdef ENABLE_SUSEREPO
-#include "repo_susetags.h"
-#endif
-#ifdef ENABLE_RPMMD
-#include "repo_updateinfoxml.h"
-#include "repo_rpmmd.h"
-#endif
-#include "solver.h"
-#include "solverdebug.h"
-
-#include "solv_xfopen.h"
-
-void
-showproblems(Solver *solv, Solvable *s, Queue *cand, Queue *badguys)
-{
- Pool *pool = solv->pool;
- Queue rids, rinfo;
- Id problem = 0;
- int jj;
- int rerun = 0;
-
- queue_init(&rids);
- queue_init(&rinfo);
- printf("can't install %s:\n", pool_solvable2str(pool, s));
- while ((problem = solver_next_problem(solv, problem)) != 0)
- {
- solver_findallproblemrules(solv, problem, &rids);
- for (jj = 0; jj < rids.count; jj++)
- {
- Id probr = rids.elements[jj];
- int k, l;
-
- queue_empty(&rinfo);
- solver_allruleinfos(solv, probr, &rinfo);
- for (k = 0; k < rinfo.count; k += 4)
- {
- Id dep, source, target;
- source = rinfo.elements[k + 1];
- target = rinfo.elements[k + 2];
- dep = rinfo.elements[k + 3];
- switch (rinfo.elements[k])
- {
- case SOLVER_RULE_DISTUPGRADE:
- break;
- case SOLVER_RULE_INFARCH:
- printf(" %s has inferior architecture\n", pool_solvid2str(pool, source));
- break;
- case SOLVER_RULE_UPDATE:
- printf(" update rule for %s\n", pool_solvid2str(pool, source));
- if (badguys)
- queue_pushunique(badguys, source);
- if (!cand)
- break;
- /* only drop update problem packages from cand so that we see all problems of this patch */
- for (l = 0; l < cand->count; l++)
- if (cand->elements[l] == source || cand->elements[l] == -source)
- break;
- if (l == cand->count)
- break;
- if (!rerun)
- {
- for (l = 0; l < cand->count; l++)
- if (cand->elements[l] < 0)
- cand->elements[l] = -cand->elements[l];
- rerun = 1;
- }
- for (l = 0; l < cand->count; l++)
- if (cand->elements[l] == source)
- {
- cand->elements[l] = -source;
- }
- break;
- case SOLVER_RULE_JOB:
- case SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM:
- case SOLVER_RULE_JOB_UNKNOWN_PACKAGE:
- case SOLVER_RULE_JOB_UNSUPPORTED:
- break;
- case SOLVER_RULE_RPM:
- printf(" some dependency problem\n");
- break;
- case SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP:
- printf(" nothing provides requested %s\n", pool_dep2str(pool, dep));
- break;
- case SOLVER_RULE_RPM_NOT_INSTALLABLE:
- printf(" package %s is not installable\n", pool_solvid2str(pool, source));
- break;
- case SOLVER_RULE_RPM_NOTHING_PROVIDES_DEP:
- printf(" nothing provides %s needed by %s\n", pool_dep2str(pool, dep), pool_solvid2str(pool, source));
- if (ISRELDEP(dep))
- {
- Reldep *rd = GETRELDEP(pool, dep);
- if (!ISRELDEP(rd->name))
- {
- Id rp, rpp;
- FOR_PROVIDES(rp, rpp, rd->name)
- printf(" (we have %s)\n", pool_solvid2str(pool, rp));
- }
- }
- break;
- case SOLVER_RULE_RPM_SAME_NAME:
- printf(" cannot install both %s and %s\n", pool_solvid2str(pool, source), pool_solvid2str(pool, target));
- break;
- case SOLVER_RULE_RPM_PACKAGE_CONFLICT:
- printf(" package %s conflicts with %s provided by %s\n", pool_solvid2str(pool, source), pool_dep2str(pool, dep), pool_solvid2str(pool, target));
- break;
- case SOLVER_RULE_RPM_PACKAGE_OBSOLETES:
- printf(" package %s obsoletes %s provided by %s\n", pool_solvid2str(pool, source), pool_dep2str(pool, dep), pool_solvid2str(pool, target));
- break;
- case SOLVER_RULE_RPM_PACKAGE_REQUIRES:
- printf(" package %s requires %s, but none of the providers can be installed\n", pool_solvid2str(pool, source), pool_dep2str(pool, dep));
- break;
- case SOLVER_RULE_RPM_SELF_CONFLICT:
- printf(" package %s conflicts with %s provided by itself\n", pool_solvid2str(pool, source), pool_dep2str(pool, dep));
- break;
- }
- }
- }
- }
- queue_free(&rids);
- queue_free(&rinfo);
-}
-
-void
-toinst(Solver *solv, Repo *repo, Repo *instrepo)
-{
- Pool *pool = solv->pool;
- Queue q;
- int k;
- Id p;
-
- queue_init(&q);
- solver_get_decisionqueue(solv, &q);
- for (k = 0; k < q.count; k++)
- {
- p = q.elements[k];
- if (p < 0 || p == SYSTEMSOLVABLE)
- continue;
-
- /* printf(" toinstall %s\n", pool_solvid2str(pool, p));*/
- /* oh my! */
- pool->solvables[p].repo = instrepo;
- }
- queue_free(&q);
-}
-
-void
-dump_instrepo(Repo *instrepo, Pool *pool)
-{
- Solvable *s;
- Id p;
-
- printf("instrepo..\n");
- FOR_REPO_SOLVABLES(instrepo, p, s)
- printf(" %s\n", pool_solvable2str(pool, s));
- printf("done.\n");
-}
-
-void
-frominst(Solver *solv, Repo *repo, Repo *instrepo)
-{
- Pool *pool = solv->pool;
- int k;
-
- for (k = 1; k < pool->nsolvables; k++)
- if (pool->solvables[k].repo == instrepo)
- pool->solvables[k].repo = repo;
-}
-
-void
-usage(char** argv)
-{
-
- printf("%s: <arch> <patchnameprefix> [--install-available] [repos] [--updaterepos] [repos]...\n"
- "\t --install-available: installation repository is available during update\n"
- "\t repos: repository ending in\n"
- "\t\tpackages, packages.gz, primary.xml.gz, updateinfo.xml.gz or .solv\n",
- argv[0]);
-
- exit(1);
-}
-
-typedef struct {
- int updatestart;
- int shown;
- int status;
- int install_available;
- Repo *repo;
- Repo *instrepo;
-} context_t;
-
-#define SHOW_PATCH(c) if (!(c)->shown++) printf("%s:\n", pool_solvable2str(pool, s));
-#define PERF_DEBUGGING 0
-
-static Pool *pool;
-
-void
-test_all_old_patches_included(context_t *c, Id pid)
-{
- Id p, pp;
- Id con, *conp;
- Solvable *s = pool->solvables + pid;
- /* Test 1: are all old patches included */
- FOR_PROVIDES(p, pp, s->name)
- {
- Solvable *s2 = pool->solvables + p;
- Id con2, *conp2;
-
- if (!s2->conflicts)
- continue;
- if (pool_evrcmp(pool, s->evr, s2->evr, EVRCMP_COMPARE) <= 0)
- continue;
- conp2 = s2->repo->idarraydata + s2->conflicts;
- while ((con2 = *conp2++) != 0)
- {
- Reldep *rd2, *rd;
- if (!ISRELDEP(con2))
- continue;
- rd2 = GETRELDEP(pool, con2);
- conp = s->repo->idarraydata + s->conflicts;
- while ((con = *conp++) != 0)
- {
- if (!ISRELDEP(con))
- continue;
- rd = GETRELDEP(pool, con);
- if (rd->name == rd2->name)
- break;
- }
- if (!con)
- {
- SHOW_PATCH(c);
- printf(" %s contained %s\n", pool_solvable2str(pool, s2), pool_dep2str(pool, rd2->name));
- }
- else
- {
- if (pool_evrcmp(pool, rd->evr, rd2->evr, EVRCMP_COMPARE) < 0)
- {
- SHOW_PATCH(c);
- printf(" %s required newer version %s-%s of %s-%s\n",
- pool_solvable2str(pool, s2), pool_dep2str(pool, rd2->name), pool_dep2str(pool, rd2->evr),
- pool_dep2str(pool, rd->name), pool_dep2str(pool, rd->evr));
- }
- }
-
- }
- }
-}
-
-void
-test_all_packages_installable(context_t *c, Id pid)
-{
- Solver *solv;
- Queue job;
- Id p, pp;
- Id con, *conp;
- unsigned int now, solver_runs;
- int i;
- Solvable *s = pool->solvables + pid;
-
- queue_init(&job);
-
- now = solv_timems(0);
- solver_runs = 0;
-
- conp = s->repo->idarraydata + s->conflicts;
- while ((con = *conp++) != 0)
- {
- FOR_PROVIDES(p, pp, con)
- {
- queue_empty(&job);
- queue_push(&job, SOLVER_INSTALL|SOLVER_SOLVABLE|SOLVER_WEAK);
- queue_push(&job, p);
-
- /* also set up some minimal system */
- queue_push(&job, SOLVER_INSTALL|SOLVER_SOLVABLE_PROVIDES|SOLVER_WEAK);
- queue_push(&job, pool_str2id(pool, "rpm", 1));
- queue_push(&job, SOLVER_INSTALL|SOLVER_SOLVABLE_PROVIDES|SOLVER_WEAK);
- queue_push(&job, pool_str2id(pool, "aaa_base", 1));
-
- solv = solver_create(pool);
- /* solver_set_flag(solv, SOLVER_FLAG_IGNORE_RECOMMENDED, 1); */
- ++solver_runs;
- if (solver_solve(solv, &job))
- {
- c->status = 1;
- printf("error installing original package\n");
- showproblems(solv, s, 0, 0);
- }
- toinst(solv, c->repo, c->instrepo);
- solver_free(solv);
-
-#if 0
- dump_instrepo(instrepo, pool);
-
-#endif
- if (!c->install_available)
- {
- queue_empty(&job);
- for (i = 1; i < c->updatestart; i++)
- {
- if (pool->solvables[i].repo != c->repo || i == pid)
- continue;
- queue_push(&job, SOLVER_ERASE|SOLVER_SOLVABLE);
- queue_push(&job, i);
- }
- }
- queue_push(&job, SOLVER_INSTALL|SOLVER_SOLVABLE);
- queue_push(&job, pid);
- solv = solver_create(pool);
- /* solver_set_flag(solv, SOLVER_FLAG_IGNORE_RECOMMENDED, 1); */
- ++solver_runs;
- if (solver_solve(solv, &job))
- {
- c->status = 1;
- showproblems(solv, s, 0, 0);
- }
- frominst(solv, c->repo, c->instrepo);
- solver_free(solv);
- }
- }
-
- if (PERF_DEBUGGING)
- printf(" test_all_packages_installable took %d ms in %d runs\n", solv_timems(now), solver_runs);
-}
-
-void
-test_can_upgrade_all_packages(context_t *c, Id pid)
-{
- Solver *solv;
- Id p;
- Id con, *conp;
- Queue job;
- Queue cand;
- Queue badguys;
- int i, j;
- unsigned int now, solver_runs;
- Solvable *s = pool->solvables + pid;
-
- queue_init(&job);
- queue_init(&cand);
- queue_init(&badguys);
-
- now = solv_timems(0);
- solver_runs = 0;
-
- /* Test 3: can we upgrade all packages? */
- for (p = 1; p < pool->nsolvables; p++)
- {
- Solvable *s = pool->solvables + p;
- if (!s->repo)
- continue;
- if (strchr(pool_id2str(pool, s->name), ':'))
- continue; /* only packages, please */
- if (!pool_installable(pool, s))
- continue;
- queue_push(&cand, p);
- }
- while (cand.count)
- {
- solv = solver_create(pool);
- queue_empty(&job);
- for (i = 0; i < badguys.count; i++)
- {
- queue_push(&job, SOLVER_ERASE|SOLVER_SOLVABLE|SOLVER_WEAK);
- queue_push(&job, badguys.elements[i]);
- }
- conp = s->repo->idarraydata + s->conflicts;
- while ((con = *conp++) != 0)
- {
- queue_push(&job, SOLVER_INSTALL|SOLVER_SOLVABLE_PROVIDES|SOLVER_WEAK);
- queue_push(&job, con);
- }
- for (i = 0; i < cand.count; i++)
- {
- p = cand.elements[i];
- queue_push(&job, SOLVER_INSTALL|SOLVER_SOLVABLE|SOLVER_WEAK);
- queue_push(&job, p);
- }
- ++solver_runs;
- solver_solve(solv, &job);
-#if 0
- solver_printdecisions(solv);
-#endif
- /* put packages into installed repo and prune them from cand */
- toinst(solv, c->repo, c->instrepo);
- for (i = 0; i < cand.count; i++)
- {
- p = cand.elements[i];
- if (p > 0 && solver_get_decisionlevel(solv, p) > 0)
- cand.elements[i] = -p; /* drop candidate */
- }
- solver_free(solv);
-
- /* now the interesting part: test patch */
- queue_empty(&job);
- if (!c->install_available)
- {
- for (i = 1; i < c->updatestart; i++)
- {
- if (pool->solvables[i].repo != c->repo || i == pid)
- continue;
- queue_push(&job, SOLVER_ERASE|SOLVER_SOLVABLE);
- queue_push(&job, i);
- }
- }
- queue_push(&job, SOLVER_INSTALL|SOLVER_SOLVABLE);
- queue_push(&job, pid);
- solv = solver_create(pool);
- solver_set_flag(solv, SOLVER_FLAG_IGNORE_RECOMMENDED, 1);
- ++solver_runs;
- if (solver_solve(solv, &job))
- {
- c->status = 1;
- showproblems(solv, s, &cand, &badguys);
- }
- frominst(solv, c->repo, c->instrepo);
- solver_free(solv);
- /* now drop all negative elements from cand */
- for (i = j = 0; i < cand.count; i++)
- {
- if (cand.elements[i] < 0)
- continue;
- cand.elements[j++] = cand.elements[i];
- }
- if (i == j)
- break; /* no progress */
- cand.count = j;
- }
- if (PERF_DEBUGGING)
- printf(" test_can_upgrade_all_packages took %d ms in %d runs\n", solv_timems(now), solver_runs);
-}
-
-void
-test_no_ga_package_fulfills_dependency(context_t *c, Id pid)
-{
- Id con, *conp;
- Solvable *s = pool->solvables + pid;
-
- /* Test 4: no GA package fulfills patch dependency */
- conp = s->repo->idarraydata + s->conflicts;
- while ((con = *conp++) != 0)
- {
- Reldep *rd;
- Id rp, rpp;
-
- if (!ISRELDEP(con))
- continue;
- rd = GETRELDEP(pool, con);
- FOR_PROVIDES(rp, rpp, rd->name)
- {
- Solvable *s2 = pool_id2solvable(pool, rp);
- if (rp < c->updatestart
- && pool_evrcmp(pool, rd->evr, s2->evr, EVRCMP_COMPARE) < 0
- && pool_match_nevr_rel(pool, s2, rd->name)
- )
- {
- SHOW_PATCH(c);
- printf(" conflict %s < %s satisfied by non-updated package %s\n",
- pool_dep2str(pool, rd->name), pool_dep2str(pool, rd->evr), pool_solvable2str(pool, s2));
- break;
- }
- }
- }
-}
-
-int
-main(int argc, char **argv)
-{
- char *arch, *mypatch;
- const char *pname;
- int l, r;
- FILE *fp;
- int i;
- Id pid, p, pp;
- int tests = 0;
- context_t c;
- static const char* langs[] = {"en"};
-
- c.install_available = 0;
- c.updatestart = 0;
- c.status = 0;
-
- if (argc <= 3)
- usage(argv);
-
- arch = argv[1];
- pool = pool_create();
- pool_setarch(pool, arch);
- pool_set_languages(pool, langs, 1);
-
-#if 0
- pool_setdebuglevel(pool, 2);
-#endif
-
- mypatch = argv[2];
-
- c.repo = repo_create(pool, 0);
- c.instrepo = repo_create(pool, 0);
- for (i = 3; i < argc; i++)
- {
- if (!strcmp(argv[i], "--updaterepos"))
- {
- c.updatestart = pool->nsolvables;
- continue;
- }
-
- if (!strcmp(argv[i], "--install-available"))
- {
- c.install_available = 1;
- continue;
- }
-
- l = strlen(argv[i]);
- if (!strcmp(argv[i], "-"))
- fp = stdin;
- else if ((fp = solv_xfopen(argv[i], 0)) == 0)
- {
- perror(argv[i]);
- exit(1);
- }
- r = 0;
- if (0)
- {
- }
-#ifdef ENABLE_SUSEREPO
- else if (l >= 8 && !strcmp(argv[i] + l - 8, "packages"))
- {
- r = repo_add_susetags(c.repo, fp, 0, 0, 0);
- }
- else if (l >= 11 && !strcmp(argv[i] + l - 11, "packages.gz"))
- {
- r = repo_add_susetags(c.repo, fp, 0, 0, 0);
- }
-#endif
-#ifdef ENABLE_RPMMD
- else if (l >= 14 && !strcmp(argv[i] + l - 14, "primary.xml.gz"))
- {
- r = repo_add_rpmmd(c.repo, fp, 0, 0);
- }
- else if (l >= 17 && !strcmp(argv[i] + l - 17, "updateinfo.xml.gz"))
- {
- r = repo_add_updateinfoxml(c.repo, fp, 0);
- }
-#endif
- else
- r = repo_add_solv(c.repo, fp, 0);
- if (r)
- {
- fprintf(stderr, "could not add repo %s: %s\n", argv[i], pool_errstr(pool));
- exit(1);
- }
- if (fp != stdin)
- fclose(fp);
- }
-
- pool_addfileprovides(pool);
-
- /* bad hack ahead: clone repo */
- c.instrepo->idarraydata = c.repo->idarraydata;
- c.instrepo->idarraysize = c.repo->idarraysize;
- c.instrepo->start = c.repo->start;
- c.instrepo->end = c.repo->end;
- c.instrepo->nsolvables = c.repo->nsolvables; /* sic! */
- pool_set_installed(pool, c.instrepo);
- pool_createwhatprovides(pool);
-
- for (pid = 1; pid < pool->nsolvables; pid++)
- {
- Solvable *s;
- c.shown = 0;
- s = pool->solvables + pid;
- if (!s->repo)
- continue;
- if (!pool_installable(pool, s))
- continue;
- pname = pool_id2str(pool, s->name);
- if (strncmp(pname, "patch:", 6) != 0)
- continue;
-
- if (*mypatch)
- {
- if (strncmp(mypatch, pname + 6, strlen(pname + 6)) != 0)
- continue;
- if (strcmp(mypatch, pname + 6) != 0)
- {
- l = strlen(pname + 6);
- if (mypatch[l] != '-')
- continue;
- if (strcmp(mypatch + l + 1, pool_id2str(pool, s->evr)) != 0)
- continue;
- }
- }
- else
- {
- FOR_PROVIDES(p, pp, s->name)
- {
- Solvable *s2 = pool->solvables + p;
- if (pool_evrcmp(pool, s->evr, s2->evr, EVRCMP_COMPARE) < 0)
- break;
- }
- if (p) {
- /* printf("found a newer one for %s\n", pname+6); */
- continue; /* found a newer one */
- }
- }
- tests++;
- if (!s->conflicts)
- continue;
-
-#if 0
- printf("testing patch %s-%s\n", pname + 6, pool_id2str(pool, s->evr));
-#endif
-
- test_all_old_patches_included(&c, pid);
- test_all_packages_installable(&c, pid);
- test_can_upgrade_all_packages(&c, pid);
- test_no_ga_package_fulfills_dependency(&c, pid);
- }
-
- exit(c.status);
-}