From 2e1740297ccfd62587ce40d46ba2ab686aae8e80 Mon Sep 17 00:00:00 2001 From: Mario Sanchez Prada Date: Fri, 10 Feb 2017 20:36:53 +0000 Subject: [PATCH] Report progress for extra data downloads, as we do for OSTree pulls Otherwise, clients such as GNOME Software won't be able to report any progress once the flatpak application has been downloaded and we enter the stage to download the extra data. --- common/flatpak-dir.c | 1 + lib/flatpak-installation.c | 33 ++++++++++++++++++++++++++++++--- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/common/flatpak-dir.c b/common/flatpak-dir.c index 8ab30be9..7f9bbee6 100644 --- a/common/flatpak-dir.c +++ b/common/flatpak-dir.c @@ -1843,6 +1843,7 @@ flatpak_dir_pull_extra_data (FlatpakDir *self, if (progress) { + ostree_async_progress_set_uint64 (progress, "start-time-extra-data", g_get_monotonic_time ()); ostree_async_progress_set_uint (progress, "outstanding-extra-data", n_extra_data); ostree_async_progress_set_uint (progress, "total-extra-data", n_extra_data); ostree_async_progress_set_uint64 (progress, "total-extra-data-bytes", total_download_size); diff --git a/lib/flatpak-installation.c b/lib/flatpak-installation.c index 69e1f5ce..2ac721f6 100644 --- a/lib/flatpak-installation.c +++ b/lib/flatpak-installation.c @@ -1112,10 +1112,13 @@ progress_cb (OstreeAsyncProgress *progress, gpointer user_data) guint total_delta_parts; guint64 bytes_transferred; guint64 total_delta_part_size; + guint outstanding_extra_data; + guint64 total_extra_data_bytes; + guint64 transferred_extra_data_bytes; guint fetched; guint metadata_fetched; guint requested; - guint64 elapsed_time; + guint64 current_time; guint new_progress = 0; gboolean estimating = FALSE; @@ -1130,10 +1133,13 @@ progress_cb (OstreeAsyncProgress *progress, gpointer user_data) total_delta_parts = ostree_async_progress_get_uint (progress, "total-delta-parts"); total_delta_part_size = ostree_async_progress_get_uint64 (progress, "total-delta-part-size"); bytes_transferred = ostree_async_progress_get_uint64 (progress, "bytes-transferred"); + outstanding_extra_data = ostree_async_progress_get_uint (progress, "outstanding-extra-data"); + total_extra_data_bytes = ostree_async_progress_get_uint64 (progress, "total-extra-data-bytes"); + transferred_extra_data_bytes = ostree_async_progress_get_uint64 (progress, "transferred-extra-data-bytes"); fetched = ostree_async_progress_get_uint (progress, "fetched"); metadata_fetched = ostree_async_progress_get_uint (progress, "metadata-fetched"); requested = ostree_async_progress_get_uint (progress, "requested"); - elapsed_time = (g_get_monotonic_time () - ostree_async_progress_get_uint64 (progress, "start-time")) / G_USEC_PER_SEC; + current_time = g_get_monotonic_time (); if (status) { @@ -1141,7 +1147,9 @@ progress_cb (OstreeAsyncProgress *progress, gpointer user_data) } else if (outstanding_fetches) { - guint64 bytes_sec = bytes_transferred / elapsed_time; + guint64 elapsed_time = + (current_time - ostree_async_progress_get_uint64 (progress, "start-time")) / G_USEC_PER_SEC; + guint64 bytes_sec = (elapsed_time > 0) ? bytes_transferred / elapsed_time : 0; g_autofree char *formatted_bytes_transferred = g_format_size_full (bytes_transferred, 0); g_autofree char *formatted_bytes_sec = NULL; @@ -1182,6 +1190,25 @@ progress_cb (OstreeAsyncProgress *progress, gpointer user_data) fetched, requested, formatted_bytes_sec, formatted_bytes_transferred); } } + else if (outstanding_extra_data) + { + guint64 elapsed_time = + (current_time - ostree_async_progress_get_uint64 (progress, "start-time-extra-data")) / G_USEC_PER_SEC; + guint64 bytes_sec = (elapsed_time > 0) ? transferred_extra_data_bytes / elapsed_time : 0; + g_autofree char *formatted_bytes_transferred = + g_format_size_full (transferred_extra_data_bytes, 0); + g_autofree char *formatted_bytes_sec = NULL; + + if (!bytes_sec) // Ignore first second + formatted_bytes_sec = g_strdup ("-"); + else + formatted_bytes_sec = g_format_size (bytes_sec); + + new_progress = (100 * transferred_extra_data_bytes) / total_extra_data_bytes; + g_string_append_printf (buf, "Downloading extra data: %u%% (%lu/%lu) %s/s %s", + (guint) ((((double) transferred_extra_data_bytes) / total_extra_data_bytes) * 100), + transferred_extra_data_bytes, total_extra_data_bytes, formatted_bytes_sec, formatted_bytes_transferred); + } else if (outstanding_writes) { g_string_append_printf (buf, "Writing objects: %u", outstanding_writes);