pull: Display download progress of individual objects as we get it

It was kind of annoying at least for rpm-ostree upgrades since /boot
happens to be first and we eat a 21MB initramfs with no download
progress.

https://bugzilla.gnome.org/show_bug.cgi?id=726348
This commit is contained in:
Colin Walters 2014-04-11 01:31:14 -04:00
parent d4d4ef552d
commit d27c78eab5
2 changed files with 17 additions and 9 deletions

View File

@ -22,6 +22,8 @@
#include "config.h" #include "config.h"
#include <gio/gfiledescriptorbased.h>
#include "ostree-fetcher.h" #include "ostree-fetcher.h"
#include "ostree.h" #include "ostree.h"
#include "otutil.h" #include "otutil.h"
@ -240,8 +242,15 @@ on_splice_complete (GObject *object,
goffset filesize; goffset filesize;
GError *local_error = NULL; GError *local_error = NULL;
/* Close it here since we do an async fstat(), where we don't want
* to hit a bad fd.
*/
if (pending->out_stream) if (pending->out_stream)
g_hash_table_remove (pending->self->output_stream_set, pending->out_stream); {
if (!g_output_stream_close (pending->out_stream, pending->cancellable, &local_error))
goto out;
g_hash_table_remove (pending->self->output_stream_set, pending->out_stream);
}
pending->state = OSTREE_FETCHER_STATE_COMPLETE; pending->state = OSTREE_FETCHER_STATE_COMPLETE;
file_info = g_file_query_info (pending->out_tmpfile, OSTREE_GIO_FAST_QUERYINFO, file_info = g_file_query_info (pending->out_tmpfile, OSTREE_GIO_FAST_QUERYINFO,
@ -283,7 +292,7 @@ on_request_sent (GObject *object,
OstreeFetcherPendingURI *pending = user_data; OstreeFetcherPendingURI *pending = user_data;
GError *local_error = NULL; GError *local_error = NULL;
gs_unref_object SoupMessage *msg = NULL; gs_unref_object SoupMessage *msg = NULL;
GOutputStreamSpliceFlags flags = G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET; GOutputStreamSpliceFlags flags = G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE;
pending->state = OSTREE_FETCHER_STATE_COMPLETE; pending->state = OSTREE_FETCHER_STATE_COMPLETE;
pending->request_body = soup_request_send_finish ((SoupRequest*) object, pending->request_body = soup_request_send_finish ((SoupRequest*) object,
@ -571,14 +580,12 @@ ostree_fetcher_bytes_transferred (OstreeFetcher *self)
while (g_hash_table_iter_next (&hiter, &key, &value)) while (g_hash_table_iter_next (&hiter, &key, &value))
{ {
GFileOutputStream *stream = key; GFileOutputStream *stream = key;
GFileInfo *finfo; struct stat stbuf;
finfo = g_file_output_stream_query_info (stream, "standard::size", if (G_IS_FILE_DESCRIPTOR_BASED (stream))
NULL, NULL);
if (finfo)
{ {
ret += g_file_info_get_size (finfo); if (gs_stream_fstat ((GFileDescriptorBased*)stream, &stbuf, NULL, NULL))
g_object_unref (finfo); ret += stbuf.st_size;
} }
} }

View File

@ -229,6 +229,7 @@ run_mainloop_monitor_fetcher (OtPullData *pull_data)
if (pull_data->progress) if (pull_data->progress)
{ {
update_timeout = g_timeout_source_new_seconds (1); update_timeout = g_timeout_source_new_seconds (1);
g_source_set_priority (update_timeout, G_PRIORITY_HIGH);
g_source_set_callback (update_timeout, update_progress, pull_data, NULL); g_source_set_callback (update_timeout, update_progress, pull_data, NULL);
g_source_attach (update_timeout, g_main_loop_get_context (pull_data->loop)); g_source_attach (update_timeout, g_main_loop_get_context (pull_data->loop));
g_source_unref (update_timeout); g_source_unref (update_timeout);