Imported Upstream version 0.7.27
[platform/upstream/libsolv.git] / tools / findfileconflicts.c
index 23151c5..2aec4b1 100644 (file)
@@ -1,4 +1,8 @@
-/* vim: sw=2 et
+/*
+ * Copyright (c) 2015, SUSE LLC
+ *
+ * This program is licensed under the BSD license, read LICENSE.BSD
+ * for further information
  */
 
 #include <stdio.h>
@@ -17,13 +21,17 @@ iterate_handle(Pool *pool, Id p, void *cbdata)
 {
   Solvable *s = pool->solvables + p;
   Id rpmdbid;
+  void *handle;
   
   if (!s->repo->rpmdbid)
     return 0;
   rpmdbid = s->repo->rpmdbid[p - s->repo->start];
   if (!rpmdbid)
     return 0;
-  return rpm_byrpmdbid(cbdata, rpmdbid);
+  handle = rpm_byrpmdbid(cbdata, rpmdbid);
+  if (!handle)
+    fprintf(stderr, "rpm_byrpmdbid: %s\n", pool_errstr(pool));
+  return handle;
 }
 
 int main(int argc, char **argv)
@@ -35,12 +43,17 @@ int main(int argc, char **argv)
   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);
-  if (repo_add_rpmdb(installed, 0, 0))
+  if (repo_add_rpmdb(installed, 0, REPO_USE_ROOTDIR))
     {
       fprintf(stderr, "findfileconflicts: %s\n", pool_errstr(pool));
       exit(1);
@@ -49,12 +62,17 @@ int main(int argc, char **argv)
   queue_init(&conflicts);
   FOR_REPO_SOLVABLES(installed, p, s)
     queue_push(&todo, p);
-  state = rpm_state_create(0);
-  pool_findfileconflicts(pool, &todo, 0, &conflicts, &iterate_handle, 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 += 6)
-    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.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;