+ if (orphaned.count)
+ {
+ POOL_DEBUG(SOLV_DEBUG_RESULT, "orphaned packages:\n");
+ for (i = 0; i < orphaned.count; i++)
+ {
+ s = pool->solvables + orphaned.elements[i];
+ if (solv->decisionmap[solv->orphaned.elements[i]] > 0)
+ POOL_DEBUG(SOLV_DEBUG_RESULT, " %s (kept)\n", pool_solvable2str(pool, s));
+ else
+ POOL_DEBUG(SOLV_DEBUG_RESULT, " %s (erased)\n", pool_solvable2str(pool, s));
+ }
+ POOL_DEBUG(SOLV_DEBUG_RESULT, "\n");
+ }
+ queue_free(&recommendations);
+ queue_free(&suggestions);
+ queue_free(&orphaned);
+ transaction_free(trans);
+}
+
+static inline
+const char *id2strnone(Pool *pool, Id id)
+{
+ return !id || id == 1 ? "(none)" : pool_id2str(pool, id);
+}
+
+void
+transaction_print(Transaction *trans)
+{
+ Pool *pool = trans->pool;
+ Queue classes, pkgs;
+ int i, j, mode, l, linel;
+ char line[76];
+ const char *n;
+
+ queue_init(&classes);
+ queue_init(&pkgs);
+ mode = SOLVER_TRANSACTION_SHOW_OBSOLETES | SOLVER_TRANSACTION_OBSOLETE_IS_UPGRADE;
+ transaction_classify(trans, mode, &classes);
+ for (i = 0; i < classes.count; i += 4)
+ {
+ Id class = classes.elements[i];
+ Id cnt = classes.elements[i + 1];
+ switch(class)
+ {
+ case SOLVER_TRANSACTION_ERASE:
+ POOL_DEBUG(SOLV_DEBUG_RESULT, "%d erased packages:\n", cnt);
+ break;
+ case SOLVER_TRANSACTION_INSTALL:
+ POOL_DEBUG(SOLV_DEBUG_RESULT, "%d installed packages:\n", cnt);
+ break;
+ case SOLVER_TRANSACTION_REINSTALLED:
+ POOL_DEBUG(SOLV_DEBUG_RESULT, "%d reinstalled packages:\n", cnt);
+ break;
+ case SOLVER_TRANSACTION_DOWNGRADED:
+ POOL_DEBUG(SOLV_DEBUG_RESULT, "%d downgraded packages:\n", cnt);
+ break;
+ case SOLVER_TRANSACTION_CHANGED:
+ POOL_DEBUG(SOLV_DEBUG_RESULT, "%d changed packages:\n", cnt);
+ break;
+ case SOLVER_TRANSACTION_UPGRADED:
+ POOL_DEBUG(SOLV_DEBUG_RESULT, "%d upgraded packages:\n", cnt);
+ break;
+ case SOLVER_TRANSACTION_VENDORCHANGE:
+ POOL_DEBUG(SOLV_DEBUG_RESULT, "%d vendor changes from '%s' to '%s':\n", cnt, id2strnone(pool, classes.elements[i + 2]), id2strnone(pool, classes.elements[i + 3]));
+ break;
+ case SOLVER_TRANSACTION_ARCHCHANGE:
+ POOL_DEBUG(SOLV_DEBUG_RESULT, "%d arch changes from %s to %s:\n", cnt, pool_id2str(pool, classes.elements[i + 2]), pool_id2str(pool, classes.elements[i + 3]));
+ break;
+ default:
+ class = SOLVER_TRANSACTION_IGNORE;
+ break;
+ }
+ if (class == SOLVER_TRANSACTION_IGNORE)
+ continue;
+ transaction_classify_pkgs(trans, mode, class, classes.elements[i + 2], classes.elements[i + 3], &pkgs);
+ *line = 0;
+ linel = 0;
+ for (j = 0; j < pkgs.count; j++)
+ {
+ Id p = pkgs.elements[j];
+ Solvable *s = pool->solvables + p;
+ Solvable *s2;
+
+ switch(class)
+ {
+ case SOLVER_TRANSACTION_DOWNGRADED:
+ case SOLVER_TRANSACTION_UPGRADED:
+ s2 = pool->solvables + transaction_obs_pkg(trans, p);
+ POOL_DEBUG(SOLV_DEBUG_RESULT, " - %s -> %s\n", pool_solvable2str(pool, s), pool_solvable2str(pool, s2));
+ break;
+ case SOLVER_TRANSACTION_VENDORCHANGE:
+ case SOLVER_TRANSACTION_ARCHCHANGE:
+ n = pool_id2str(pool, s->name);
+ l = strlen(n);
+ if (l + linel > sizeof(line) - 3)
+ {
+ if (*line)
+ POOL_DEBUG(SOLV_DEBUG_RESULT, " %s\n", line);
+ *line = 0;
+ linel = 0;
+ }
+ if (l + linel > sizeof(line) - 3)
+ POOL_DEBUG(SOLV_DEBUG_RESULT, " %s\n", n);
+ else
+ {
+ if (*line)
+ {
+ strcpy(line + linel, ", ");
+ linel += 2;
+ }
+ strcpy(line + linel, n);
+ linel += l;
+ }
+ break;
+ default:
+ POOL_DEBUG(SOLV_DEBUG_RESULT, " - %s\n", pool_solvable2str(pool, s));
+ break;
+ }
+ }
+ if (*line)
+ POOL_DEBUG(SOLV_DEBUG_RESULT, " %s\n", line);
+ POOL_DEBUG(SOLV_DEBUG_RESULT, "\n");
+ }
+ queue_free(&classes);
+ queue_free(&pkgs);