Imported Upstream version 0.7.19
[platform/upstream/libsolv.git] / tools / findfileconflicts.c
1 /* vim: sw=2 et
2  */
3
4 #include <stdio.h>
5 #include <stdlib.h>
6
7 #include "pool.h"
8 #include "repo.h"
9 #include "solver.h"
10 #include "solverdebug.h"
11 #include "hash.h"
12 #include "repo_rpmdb.h"
13 #include "pool_fileconflicts.h"
14
15 static void *
16 iterate_handle(Pool *pool, Id p, void *cbdata)
17 {
18   Solvable *s = pool->solvables + p;
19   Id rpmdbid;
20   void *handle;
21   
22   if (!s->repo->rpmdbid)
23     return 0;
24   rpmdbid = s->repo->rpmdbid[p - s->repo->start];
25   if (!rpmdbid)
26     return 0;
27   handle = rpm_byrpmdbid(cbdata, rpmdbid);
28   if (!handle)
29     fprintf(stderr, "rpm_byrpmdbid: %s\n", pool_errstr(pool));
30   return handle;
31 }
32
33 int main(int argc, char **argv)
34 {
35   Pool *pool;
36   Repo *installed;
37   Solvable *s;
38   Id p;
39   int i;
40   Queue todo, conflicts;
41   void *state = 0;
42   char *rootdir = 0;
43  
44   if (argc == 3 && !strcmp(argv[1], "--root"))
45     rootdir = argv[2];
46   pool = pool_create();
47   if (rootdir)
48     pool_set_rootdir(pool, rootdir);
49   pool_setdebuglevel(pool, 1);
50   installed = repo_create(pool, "@System");
51   pool_set_installed(pool, installed);
52   if (repo_add_rpmdb(installed, 0, REPO_USE_ROOTDIR))
53     {
54       fprintf(stderr, "findfileconflicts: %s\n", pool_errstr(pool));
55       exit(1);
56     }
57   queue_init(&todo);
58   queue_init(&conflicts);
59   FOR_REPO_SOLVABLES(installed, p, s)
60     queue_push(&todo, p);
61   state = rpm_state_create(pool, pool_get_rootdir(pool));
62   pool_findfileconflicts(pool, &todo, 0, &conflicts, FINDFILECONFLICTS_USE_SOLVABLEFILELIST | FINDFILECONFLICTS_CHECK_DIRALIASING | FINDFILECONFLICTS_USE_ROOTDIR, &iterate_handle, state);
63   rpm_state_free(state);
64   queue_free(&todo);
65   for (i = 0; i < conflicts.count; i += 6)
66     {
67       if (conflicts.elements[i] != conflicts.elements[i + 3])
68         printf("%s - %s: %s[%s] %s[%s]\n", pool_id2str(pool, conflicts.elements[i]), pool_id2str(pool, conflicts.elements[i + 3]), pool_solvid2str(pool, conflicts.elements[i + 1]), pool_id2str(pool, conflicts.elements[i + 2]), pool_solvid2str(pool, conflicts.elements[i + 4]), pool_id2str(pool, conflicts.elements[i + 5]));
69       else
70         printf("%s: %s[%s] %s[%s]\n", pool_id2str(pool, conflicts.elements[i]), pool_solvid2str(pool, conflicts.elements[i + 1]), pool_id2str(pool, conflicts.elements[i + 2]), pool_solvid2str(pool, conflicts.elements[i + 4]), pool_id2str(pool, conflicts.elements[i + 5]));
71     }
72   if (conflicts.count)
73     {
74       Queue job;
75       int problemcnt;
76
77       queue_init(&job);
78       pool_add_fileconflicts_deps(pool, &conflicts);
79       pool_addfileprovides(pool);
80       pool_createwhatprovides(pool);
81       pool_setdebuglevel(pool, 0);
82       Solver *solv = solver_create(pool);
83       queue_push2(&job, SOLVER_VERIFY|SOLVER_SOLVABLE_ALL, 0);
84 #if 0
85       solver_set_flag(solv, SOLVER_FLAG_ALLOW_UNINSTALL, 1);
86 #endif
87       problemcnt = solver_solve(solv, &job);
88       if (problemcnt)
89         solver_printallsolutions(solv);
90       else
91         {
92           Transaction *trans = solver_create_transaction(solv);
93           transaction_print(trans);
94           transaction_free(trans);
95         }
96       queue_free(&job);
97       solver_free(solv);
98     }
99   queue_free(&conflicts);
100   exit(0);
101 }