From: Michael Tremer Date: Sun, 27 Oct 2024 09:33:23 +0000 (+0000) Subject: transactions: Store a list of all installed and newly installed packages X-Git-Tag: 0.9.30~795 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=582d3530b24caba65f0cf426b7892f4e7119ca50;p=pakfire.git transactions: Store a list of all installed and newly installed packages Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/transaction.c b/src/libpakfire/transaction.c index fe2d3ffb3..5f37ddd68 100644 --- a/src/libpakfire/transaction.c +++ b/src/libpakfire/transaction.c @@ -73,6 +73,10 @@ struct pakfire_transaction { 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 { @@ -164,13 +168,20 @@ static void pakfire_transaction_free_archives_and_packages( } 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 @@ -187,23 +198,58 @@ static int pakfire_transaction_import_transaction(struct pakfire_transaction* tr // 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) { @@ -330,6 +376,15 @@ PAKFIRE_EXPORT int pakfire_transaction_create(struct pakfire_transaction** trans 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); @@ -343,6 +398,10 @@ ERROR: 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)