add a single space
[platform/upstream/libsolv.git] / tools / findfileconflicts.c
index 88833d5..712602d 100644 (file)
@@ -1,3 +1,6 @@
+/* vim: sw=2 et
+ */
+
 #include <stdio.h>
 #include <stdlib.h>
 
@@ -14,21 +17,20 @@ iterate_handle(Pool *pool, Id p, void *cbdata)
 {
   Solvable *s = pool->solvables + p;
   Id rpmdbid;
+  void *handle;
   
-  if (!p)
-    {
-      rpm_byrpmdbid(0, 0, (void **)cbdata);
-      return 0;
-    }
   if (!s->repo->rpmdbid)
     return 0;
   rpmdbid = s->repo->rpmdbid[p - s->repo->start];
   if (!rpmdbid)
     return 0;
-  return rpm_byrpmdbid(rpmdbid, 0, (void **)cbdata);
+  handle = rpm_byrpmdbid(cbdata, rpmdbid);
+  if (!handle)
+    fprintf(stderr, "rpm_byrpmdbid: %s\n", pool_errstr(pool));
+  return handle;
 }
 
-int main()
+int main(int argc, char **argv)
 {
   Pool *pool;
   Repo *installed;
@@ -37,32 +39,60 @@ int main()
   int i;
   Queue todo, conflicts;
   void *state = 0;
+  char *rootdir = 0;
  
+  if (argc == 3 && !strcmp(argv[1], "--root"))
+    rootdir = argv[2];
   pool = pool_create();
+  if (rootdir)
+    pool_set_rootdir(pool, rootdir);
+  pool_setdebuglevel(pool, 1);
   installed = repo_create(pool, "@System");
   pool_set_installed(pool, installed);
-  repo_add_rpmdb(installed, 0, 0, 0);
+  if (repo_add_rpmdb(installed, 0, REPO_USE_ROOTDIR))
+    {
+      fprintf(stderr, "findfileconflicts: %s\n", pool_errstr(pool));
+      exit(1);
+    }
   queue_init(&todo);
   queue_init(&conflicts);
   FOR_REPO_SOLVABLES(installed, p, s)
     queue_push(&todo, p);
-  pool_findfileconflicts(pool, &todo, &conflicts, &iterate_handle, (void *)&state);
+  state = rpm_state_create(pool, pool_get_rootdir(pool));
+  pool_findfileconflicts(pool, &todo, 0, &conflicts, FINDFILECONFLICTS_USE_SOLVABLEFILELIST | FINDFILECONFLICTS_CHECK_DIRALIASING | FINDFILECONFLICTS_USE_ROOTDIR, &iterate_handle, state);
+  rpm_state_free(state);
   queue_free(&todo);
-  for (i = 0; i < conflicts.count; i += 5)
-    printf("%s: %s[%s] %s[%s]\n", id2str(pool, conflicts.elements[i]), solvid2str(pool, conflicts.elements[i + 1]), id2str(pool, conflicts.elements[i + 2]), solvid2str(pool, conflicts.elements[i + 3]), id2str(pool, conflicts.elements[i + 4]));
+  for (i = 0; i < conflicts.count; i += 6)
+    {
+      if (conflicts.elements[i] != conflicts.elements[i + 3])
+        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]));
+      else
+        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]));
+    }
   if (conflicts.count)
     {
       Queue job;
+      int problemcnt;
+
       queue_init(&job);
       pool_add_fileconflicts_deps(pool, &conflicts);
       pool_addfileprovides(pool);
       pool_createwhatprovides(pool);
       pool_setdebuglevel(pool, 0);
       Solver *solv = solver_create(pool);
-      solv->fixsystem = 1;
-      solver_solve(solv, &job);
-      if (solv->problems.count)
+      queue_push2(&job, SOLVER_VERIFY|SOLVER_SOLVABLE_ALL, 0);
+#if 0
+      solver_set_flag(solv, SOLVER_FLAG_ALLOW_UNINSTALL, 1);
+#endif
+      problemcnt = solver_solve(solv, &job);
+      if (problemcnt)
         solver_printallsolutions(solv);
+      else
+       {
+         Transaction *trans = solver_create_transaction(solv);
+          transaction_print(trans);
+          transaction_free(trans);
+       }
       queue_free(&job);
       solver_free(solv);
     }