#include <pakfire/package.h>
#include <pakfire/pakfire.h>
#include <pakfire/path.h>
+#include <pakfire/progress.h>
#include <pakfire/repo.h>
#include <pakfire/string.h>
#include <pakfire/transaction.h>
struct pakfire_archive** archives;
struct pakfire_package** packages;
size_t num;
- size_t progress;
+
+ // Progress
+ struct pakfire_progress* progress;
// Callbacks
struct pakfire_transaction_callbacks {
// Allocate a job queue
queue_init(&t->jobs);
+ // Create a progress indicator
+ r = pakfire_progress_create(&t->progress, t->ctx, PAKFIRE_PROGRESS_SHOW_PERCENTAGE, NULL);
+ if (r < 0)
+ goto ERROR;
+
// Set the default status callback
t->callbacks.status = pakfire_transaction_default_status_callback;
pakfire_packagelist_unref(transaction->new_packages);
if (transaction->userinstalled)
pakfire_strings_free(transaction->userinstalled);
+ if (transaction->progress)
+ pakfire_progress_unref(transaction->progress);
if (transaction->transaction)
transaction_free(transaction->transaction);
if (transaction->solver)
return NULL;
}
-static int pakfire_transaction_get_progress(struct pakfire_transaction* transaction) {
- return transaction->progress * 100 / transaction->num;
-}
-
static void pakfire_transaction_status(struct pakfire_transaction* transaction,
const char* message, ...) __attribute__((format(printf, 2, 3)));
+/*
+ Move this into the progress stuff
+*/
static void pakfire_transaction_status(struct pakfire_transaction* transaction,
const char* message, ...) {
char* buffer = NULL;
}
// Fetch progress
- const int progress = pakfire_transaction_get_progress(transaction);
+ const int progress = pakfire_progress_get_percentage(transaction->progress);
// Call the callback
transaction->callbacks.status(transaction->pakfire,
pakfire_transaction_status(transaction, _("Installing %s..."), nevra);
// Extract payload
- r = pakfire_archive_extract(archive, NULL, 0);
+ r = pakfire_archive_extract(archive, NULL, 0, transaction->progress);
if (r) {
ERROR(transaction->ctx, "Could not extract package %s: %m\n",
nevra);
// Execute the action of this script
case PAKFIRE_ACTION_EXECUTE:
// Increment progress
- transaction->progress++;
+ pakfire_progress_increment(transaction->progress, 1);
// Update progress callback
pakfire_transaction_status(transaction, NULL);
return r;
}
-static int pakfire_transaction_open_archives(struct pakfire_transaction* transaction) {
+static int pakfire_transaction_open_archives(
+ struct pakfire_transaction* transaction, size_t* total_size) {
+ struct pakfire_archive* archive = NULL;
int r;
for (unsigned int i = 0; i < transaction->num; i++) {
}
// Open the archive
- r = pakfire_package_get_archive(pkg, &transaction->archives[i]);
+ r = pakfire_package_get_archive(pkg, &archive);
if (r < 0)
return r;
+
+ // Reference the archive
+ transaction->archives[i] = archive;
+
+ // Count the total size if requested
+ if (total_size)
+ *total_size += pakfire_archive_get_size(archive);
}
return 0;
static int pakfire_transaction_perform(struct pakfire_transaction* transaction) {
struct pakfire_repo* repo = NULL;
struct pakfire_db* db;
+ size_t total_size = 0;
int r;
DEBUG(transaction->ctx, "Running Transaction %p\n", transaction);
// Open all archives
- r = pakfire_transaction_open_archives(transaction);
+ r = pakfire_transaction_open_archives(transaction, &total_size);
if (r)
return r;
+ // Set the title
+ r = pakfire_progress_set_title(transaction->progress, "%s", _("Installing Packages..."));
+ if (r < 0)
+ return r;
+
+ // Start the progress...
+ r = pakfire_progress_start(transaction->progress, total_size);
+ if (r < 0)
+ return r;
+
// Open the database
r = pakfire_db_open(&db, transaction->pakfire, PAKFIRE_DB_READWRITE);
if (r) {
if (r)
goto ERROR;
+ // Finish progress
+ r = pakfire_progress_finish(transaction->progress);
+ if (r < 0)
+ goto ERROR;
+
DEBUG(transaction->ctx, "The transaction has finished successfully\n");
// Reload database for next transaction
DEBUG(transaction->ctx, "Writing transaction to %s...\n", path);
// Open all archives
- r = pakfire_transaction_open_archives(transaction);
+ r = pakfire_transaction_open_archives(transaction, NULL);
if (r)
return r;