]> git.ipfire.org Git - pakfire.git/commitdiff
transactions: Store a list of all installed and newly installed packages
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 27 Oct 2024 09:33:23 +0000 (09:33 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 27 Oct 2024 11:37:55 +0000 (11:37 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/transaction.c

index fe2d3ffb3291859347f1e798745ee15192fa09a7..5f37ddd68f52780755006366d6a196106bd96003 100644 (file)
@@ -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)