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