pakfire_status_callback status;
void* status_data;
} callbacks;
+
+ // Changes for file conflicts
+ struct pakfire_packagelist* installed_packages;
+ struct pakfire_packagelist* new_packages;
};
enum pakfire_actions {
}
static int pakfire_transaction_import_transaction(struct pakfire_transaction* transaction) {
- int r;
+ struct pakfire_package* pkg = NULL;
+ int new_pkgs;
+ Queue pkgs;
+ int r = 0;
+
+ // For all installed packages after applying this transaction
+ queue_init(&pkgs);
// Clone the transaction to keep a copy of it
transaction->transaction = solver_create_transaction(transaction->solver);
if (!transaction->transaction) {
ERROR(transaction->ctx, "Could not create transaction from solver: %m\n");
- return 1;
+ r = -errno;
+ goto ERROR;
}
// Order the transaction
// Allocate space for packages
transaction->packages = calloc(transaction->num, sizeof(*transaction->packages));
- if (!transaction->packages)
- return 1;
+ if (!transaction->packages) {
+ r = -errno;
+ goto ERROR;
+ }
// Allocate space for archives
transaction->archives = calloc(transaction->num, sizeof(*transaction->archives));
- if (!transaction->archives)
- return 1;
+ if (!transaction->archives) {
+ r = -errno;
+ goto ERROR;
+ }
// Create all packages
for (unsigned int i = 0; i < transaction->num; i++) {
r = pakfire_package_create_from_solvable(&transaction->packages[i],
transaction->pakfire, transaction->transaction->steps.elements[i]);
- if (r)
- return r;
+ if (r < 0)
+ goto ERROR;
}
- return 0;
+ // Fetch a list of all packages that will be installed in the end
+ new_pkgs = transaction_installedresult(transaction->transaction, &pkgs);
+
+ // Store all newly installed and overall all installed packages
+ for (int i = 0; i < pkgs.count; i++) {
+ r = pakfire_package_create_from_solvable(&pkg,
+ transaction->pakfire, pkgs.elements[i]);
+ if (r < 0)
+ goto ERROR;
+
+ // Add the package to the total list of packages
+ r = pakfire_packagelist_push(transaction->installed_packages, pkg);
+ if (r < 0)
+ goto ERROR;
+
+ // If the package is being newly installed, we add it to that list, too
+ if (i < new_pkgs) {
+ r = pakfire_packagelist_push(transaction->new_packages, pkg);
+ if (r < 0)
+ goto ERROR;
+ }
+
+ pakfire_package_unref(pkg);
+ pkg = NULL;
+ }
+
+ERROR:
+ if (pkg)
+ pakfire_package_unref(pkg);
+ queue_free(&pkgs);
+
+ return r;
}
static int pakfire_transaction_import_userinstalled(struct pakfire_transaction* transaction) {
if (r)
goto ERROR;
+ // Setup package lists
+ r = pakfire_packagelist_create(&t->installed_packages, t->ctx);
+ if (r < 0)
+ goto ERROR;
+
+ r = pakfire_packagelist_create(&t->new_packages, t->ctx);
+ if (r < 0)
+ goto ERROR;
+
// Return the transaction
*transaction = pakfire_transaction_ref(t);
static void pakfire_transaction_free(struct pakfire_transaction* transaction) {
pakfire_transaction_free_archives_and_packages(transaction);
+ if (transaction->installed_packages)
+ pakfire_packagelist_unref(transaction->installed_packages);
+ if (transaction->new_packages)
+ pakfire_packagelist_unref(transaction->new_packages);
if (transaction->userinstalled)
pakfire_strings_free(transaction->userinstalled);
if (transaction->transaction)