#include <pakfire/ctx.h>
#include <pakfire/logging.h>
#include <pakfire/progress.h>
+#include <pakfire/string.h>
struct pakfire_progress {
struct pakfire_ctx* ctx;
char* title;
// Status
- char* status;
+ char** status;
// Flags what to show
int flags;
if (p->parent)
pakfire_progress_unref(p->parent);
if (p->status)
- free(p->status);
+ pakfire_strings_free(p->status);
if (p->title)
free(p->title);
if (p->ctx)
if (r < 0)
return r;
- // If we have a parent, we set this title as their status
- if (p->parent) {
- r = pakfire_progress_set_status(p->parent, "%s", p->title);
- if (r < 0)
- return r;
- }
-
return 0;
}
const char* pakfire_progress_get_status(struct pakfire_progress* p) {
- return p->status;
+ if (!p->status)
+ return NULL;
+
+ size_t length = pakfire_strings_length(p->status);
+ if (!length)
+ return NULL;
+
+ return p->status[length - 1];
}
-int pakfire_progress_set_status(struct pakfire_progress* p, const char* format, ...) {
+int pakfire_progress_push_status(struct pakfire_progress* p, const char* format, ...) {
+ char status[256];
va_list args;
int r;
// Format the status
va_start(args, format);
- r = vasprintf(&p->status, format, args);
+ r = pakfire_string_vformat(status, format, args);
va_end(args);
// Fail
if (r < 0)
return r;
- return 0;
+ // Append the status
+ return pakfire_strings_append(&p->status, status);
+}
+
+void pakfire_progress_pop_status(struct pakfire_progress* p) {
+ pakfire_strings_pop(&p->status);
}
double pakfire_progress_get_percentage(struct pakfire_progress* p) {
int pakfire_progress_set_title(struct pakfire_progress* p, const char* format, ...)
__attribute__((format(printf, 2, 3)));
const char* pakfire_progress_get_status(struct pakfire_progress* p);
-int pakfire_progress_set_status(struct pakfire_progress* p, const char* format, ...)
+int pakfire_progress_push_status(struct pakfire_progress* p, const char* format, ...)
__attribute__((format(printf, 2, 3)));
+void pakfire_progress_pop_status(struct pakfire_progress* p);
void pakfire_progress_set_max_value(struct pakfire_progress* p, unsigned long int value);
#endif /* PAKFIRE_PROGRESS_H */
const char* nevra = pakfire_package_get_string(pkg, PAKFIRE_PKG_NEVRA);
// Update status
- r = pakfire_progress_set_status(transaction->progress, _("Installing %s..."), nevra);
+ r = pakfire_progress_push_status(transaction->progress, _("Installing %s..."), nevra);
if (r < 0)
return r;
if (r) {
ERROR(transaction->ctx, "Could not extract package %s: %m\n",
nevra);
- return r;
+ goto ERROR;
}
// Is it necessary to call ldconfig?
r = pakfire_archive_get_filelist(archive, &filelist);
if (r < 0)
- return r;
+ goto ERROR;
// Update the runtime linker cache
if (pakfire_filelist_contains(filelist, "*/lib*.so.?"))
if (filelist)
pakfire_filelist_unref(filelist);
+ERROR:
+ pakfire_progress_pop_status(transaction->progress);
+
return 0;
}
const char* nevra = pakfire_package_get_string(pkg, PAKFIRE_PKG_NEVRA);
// Update status
- r = pakfire_progress_set_status(transaction->progress, _("Removing %s..."), nevra);
+ r = pakfire_progress_push_status(transaction->progress, _("Removing %s..."), nevra);
if (r < 0)
- goto ERROR;
+ return r;
// Fetch filelist
r = pakfire_db_package_filelist(db, &filelist, pkg);
pakfire_jail_ldconfig(transaction->pakfire);
ERROR:
+ pakfire_progress_pop_status(transaction->progress);
+
if (filelist)
pakfire_filelist_unref(filelist);
// Update status
switch (action) {
case PAKFIRE_ACTION_VERIFY:
- r = pakfire_progress_set_status(transaction->progress, _("Verifying Packages..."));
+ r = pakfire_progress_push_status(transaction->progress, _("Verifying Packages..."));
if (r < 0)
return r;
break;
case PAKFIRE_ACTION_PRETRANS:
- r = pakfire_progress_set_status(transaction->progress, _("Preparing Installation..."));
+ r = pakfire_progress_push_status(transaction->progress, _("Preparing Installation..."));
if (r < 0)
return r;
break;
case PAKFIRE_ACTION_POSTTRANS:
- r = pakfire_progress_set_status(transaction->progress, _("Finishing Up..."));
+ r = pakfire_progress_push_status(transaction->progress, _("Finishing Up..."));
if (r < 0)
return r;
break;
}
}
+ // Reset the status
+ switch (action) {
+ case PAKFIRE_ACTION_VERIFY:
+ case PAKFIRE_ACTION_PRETRANS:
+ case PAKFIRE_ACTION_POSTTRANS:
+ pakfire_progress_pop_status(transaction->progress);
+ break;
+
+ default:
+ break;
+ }
+
return r;
}