static gboolean fsck_reachable_objects_from_commits (OstreeRepo *repo, GHashTable *commits, gboolean *out_found_corruption, GCancellable *cancellable, GError **error) { g_autoptr(GHashTable) reachable_objects = ostree_repo_traverse_new_reachable (); g_autoptr(GHashTable) object_parents = ostree_repo_traverse_new_parents (); GHashTableIter hash_iter; gpointer key, value; g_hash_table_iter_init (&hash_iter, commits); while (g_hash_table_iter_next (&hash_iter, &key, &value)) { GVariant *serialized_key = key; const char *checksum; OstreeObjectType objtype; ostree_object_name_deserialize (serialized_key, &checksum, &objtype); g_assert (objtype == OSTREE_OBJECT_TYPE_COMMIT); if (!ostree_repo_traverse_commit_union_with_parents (repo, checksum, 0, reachable_objects, object_parents, cancellable, error)) return FALSE; } g_auto(GLnxConsoleRef) console = { 0, }; glnx_console_lock (&console); const guint count = g_hash_table_size (reachable_objects); guint i = 0; g_hash_table_iter_init (&hash_iter, reachable_objects); while (g_hash_table_iter_next (&hash_iter, &key, &value)) { GVariant *serialized_key = key; const char *checksum; OstreeObjectType objtype; ostree_object_name_deserialize (serialized_key, &checksum, &objtype); if (!fsck_one_object (repo, checksum, objtype, object_parents, serialized_key, out_found_corruption, cancellable, error)) return FALSE; i++; glnx_console_progress_n_items ("fsck objects", i, count); } return TRUE; }
void rpmostree_output_default_handler (RpmOstreeOutputType type, void *data, void *opaque) { switch (type) { case RPMOSTREE_OUTPUT_MESSAGE: g_print ("%s\n", ((RpmOstreeOutputMessage*)data)->text); break; case RPMOSTREE_OUTPUT_TASK_BEGIN: /* XXX: move to libglnx spinner once it's implemented */ g_print ("%s... ", ((RpmOstreeOutputTaskBegin*)data)->text); break; case RPMOSTREE_OUTPUT_TASK_END: g_print ("%s\n", ((RpmOstreeOutputTaskEnd*)data)->text); break; case RPMOSTREE_OUTPUT_PROGRESS_PERCENT: if (!console.locked) glnx_console_lock (&console); RpmOstreeOutputProgressPercent *prog = data; /* let's not spam stdout if it's not a tty; see dbus-helpers.c */ if (prog->percentage == 100 || console.is_tty) glnx_console_progress_text_percent (prog->text, prog->percentage); break; case RPMOSTREE_OUTPUT_PROGRESS_N_ITEMS: { RpmOstreeOutputProgressNItems *nitems = data; if (!console.locked) glnx_console_lock (&console); glnx_console_progress_n_items (nitems->text, nitems->current, nitems->total); } break; case RPMOSTREE_OUTPUT_PROGRESS_END: if (console.locked) glnx_console_unlock (&console); break; } }