fix bugs in fileconflicts code and prepare for aliased dirs
[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   
21   if (!p)
22     {
23       rpm_byrpmdbid(0, 0, (void **)cbdata);
24       return 0;
25     }
26   if (!s->repo->rpmdbid)
27     return 0;
28   rpmdbid = s->repo->rpmdbid[p - s->repo->start];
29   if (!rpmdbid)
30     return 0;
31   return rpm_byrpmdbid(rpmdbid, 0, (void **)cbdata);
32 }
33
34 int main(int argc, char **argv)
35 {
36   Pool *pool;
37   Repo *installed;
38   Solvable *s;
39   Id p;
40   int i;
41   Queue todo, conflicts;
42   void *state = 0;
43  
44   pool = pool_create();
45   pool_setdebuglevel(pool, 1);
46   installed = repo_create(pool, "@System");
47   pool_set_installed(pool, installed);
48   if (repo_add_rpmdb(installed, 0, 0))
49     {
50       fprintf(stderr, "findfileconflicts: %s\n", pool_errstr(pool));
51       exit(1);
52     }
53   queue_init(&todo);
54   queue_init(&conflicts);
55   FOR_REPO_SOLVABLES(installed, p, s)
56     queue_push(&todo, p);
57   pool_findfileconflicts(pool, &todo, 0, &conflicts, &iterate_handle, (void *)&state);
58   queue_free(&todo);
59   for (i = 0; i < conflicts.count; i += 6)
60     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]));
61   if (conflicts.count)
62     {
63       Queue job;
64       int problemcnt;
65
66       queue_init(&job);
67       pool_add_fileconflicts_deps(pool, &conflicts);
68       pool_addfileprovides(pool);
69       pool_createwhatprovides(pool);
70       pool_setdebuglevel(pool, 0);
71       Solver *solv = solver_create(pool);
72       queue_push2(&job, SOLVER_VERIFY|SOLVER_SOLVABLE_ALL, 0);
73 #if 0
74       solver_set_flag(solv, SOLVER_FLAG_ALLOW_UNINSTALL, 1);
75 #endif
76       problemcnt = solver_solve(solv, &job);
77       if (problemcnt)
78         solver_printallsolutions(solv);
79       else
80         {
81           Transaction *trans = solver_create_transaction(solv);
82           transaction_print(trans);
83           transaction_free(trans);
84         }
85       queue_free(&job);
86       solver_free(solv);
87     }
88   queue_free(&conflicts);
89   exit(0);
90 }