mirror of
https://github.com/ostreedev/ostree.git
synced 2025-01-11 09:18:20 +03:00
cmd/fsck: Port to new style
Happened to look at this code too, it's a straightforward port. Closes: #955 Approved by: jlebon
This commit is contained in:
parent
e23071dc39
commit
553b99642c
@ -47,13 +47,12 @@ load_and_fsck_one_object (OstreeRepo *repo,
|
||||
GCancellable *cancellable,
|
||||
GError **error)
|
||||
{
|
||||
gboolean ret = FALSE;
|
||||
gboolean missing = FALSE;
|
||||
g_autoptr(GVariant) metadata = NULL;
|
||||
g_autoptr(GInputStream) input = NULL;
|
||||
g_autoptr(GFileInfo) file_info = NULL;
|
||||
g_autoptr(GVariant) xattrs = NULL;
|
||||
GError *temp_error = NULL;
|
||||
g_autoptr(GError) temp_error = NULL;
|
||||
|
||||
if (OSTREE_OBJECT_TYPE_IS_META (objtype))
|
||||
{
|
||||
@ -69,8 +68,8 @@ load_and_fsck_one_object (OstreeRepo *repo,
|
||||
}
|
||||
else
|
||||
{
|
||||
g_prefix_error (error, "Loading metadata object %s: ", checksum);
|
||||
goto out;
|
||||
g_propagate_error (error, g_steal_pointer (&temp_error));
|
||||
return glnx_prefix_error (error, "Loading metadata object %s", checksum);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -78,28 +77,19 @@ load_and_fsck_one_object (OstreeRepo *repo,
|
||||
if (objtype == OSTREE_OBJECT_TYPE_COMMIT)
|
||||
{
|
||||
if (!ostree_validate_structureof_commit (metadata, error))
|
||||
{
|
||||
g_prefix_error (error, "While validating commit metadata '%s': ", checksum);
|
||||
goto out;
|
||||
}
|
||||
return glnx_prefix_error (error, "While validating commit metadata '%s'", checksum);
|
||||
}
|
||||
else if (objtype == OSTREE_OBJECT_TYPE_DIR_TREE)
|
||||
{
|
||||
if (!ostree_validate_structureof_dirtree (metadata, error))
|
||||
{
|
||||
g_prefix_error (error, "While validating directory tree '%s': ", checksum);
|
||||
goto out;
|
||||
}
|
||||
return glnx_prefix_error (error, "While validating directory tree '%s'", checksum);
|
||||
}
|
||||
else if (objtype == OSTREE_OBJECT_TYPE_DIR_META)
|
||||
{
|
||||
if (!ostree_validate_structureof_dirmeta (metadata, error))
|
||||
{
|
||||
g_prefix_error (error, "While validating directory metadata '%s': ", checksum);
|
||||
goto out;
|
||||
}
|
||||
return glnx_prefix_error (error, "While validating directory metadata '%s'", checksum);
|
||||
}
|
||||
|
||||
|
||||
input = g_memory_input_stream_new_from_data (g_variant_get_data (metadata),
|
||||
g_variant_get_size (metadata),
|
||||
NULL);
|
||||
@ -122,19 +112,15 @@ load_and_fsck_one_object (OstreeRepo *repo,
|
||||
}
|
||||
else
|
||||
{
|
||||
*error = temp_error;
|
||||
g_prefix_error (error, "Loading file object %s: ", checksum);
|
||||
goto out;
|
||||
g_propagate_error (error, g_steal_pointer (&temp_error));
|
||||
return glnx_prefix_error (error, "Loading file object %s", checksum);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
mode = g_file_info_get_attribute_uint32 (file_info, "unix::mode");
|
||||
if (!ostree_validate_structureof_file_mode (mode, error))
|
||||
{
|
||||
g_prefix_error (error, "While validating file '%s': ", checksum);
|
||||
goto out;
|
||||
}
|
||||
return glnx_prefix_error (error, "While validating file '%s'", checksum);
|
||||
}
|
||||
}
|
||||
|
||||
@ -150,8 +136,8 @@ load_and_fsck_one_object (OstreeRepo *repo,
|
||||
if (!ostree_checksum_file_from_input (file_info, xattrs, input,
|
||||
objtype, &computed_csum,
|
||||
cancellable, error))
|
||||
goto out;
|
||||
|
||||
return FALSE;
|
||||
|
||||
tmp_checksum = ostree_checksum_from_bytes (computed_csum);
|
||||
if (strcmp (checksum, tmp_checksum) != 0)
|
||||
{
|
||||
@ -165,16 +151,11 @@ load_and_fsck_one_object (OstreeRepo *repo,
|
||||
*out_found_corruption = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, msg);
|
||||
goto out;
|
||||
}
|
||||
return glnx_throw (error, "%s", msg);
|
||||
}
|
||||
}
|
||||
|
||||
ret = TRUE;
|
||||
out:
|
||||
return ret;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@ -184,16 +165,10 @@ fsck_reachable_objects_from_commits (OstreeRepo *repo,
|
||||
GCancellable *cancellable,
|
||||
GError **error)
|
||||
{
|
||||
gboolean ret = FALSE;
|
||||
g_autoptr(GHashTable) reachable_objects = ostree_repo_traverse_new_reachable ();
|
||||
|
||||
GHashTableIter hash_iter;
|
||||
gpointer key, value;
|
||||
g_autoptr(GHashTable) reachable_objects = NULL;
|
||||
guint i;
|
||||
guint mod;
|
||||
guint count;
|
||||
|
||||
reachable_objects = ostree_repo_traverse_new_reachable ();
|
||||
|
||||
g_hash_table_iter_init (&hash_iter, commits);
|
||||
while (g_hash_table_iter_next (&hash_iter, &key, &value))
|
||||
{
|
||||
@ -207,12 +182,12 @@ fsck_reachable_objects_from_commits (OstreeRepo *repo,
|
||||
|
||||
if (!ostree_repo_traverse_commit_union (repo, checksum, 0, reachable_objects,
|
||||
cancellable, error))
|
||||
goto out;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
count = g_hash_table_size (reachable_objects);
|
||||
mod = count / 10;
|
||||
i = 0;
|
||||
const guint count = g_hash_table_size (reachable_objects);
|
||||
const guint mod = count / 10;
|
||||
guint i = 0;
|
||||
g_hash_table_iter_init (&hash_iter, reachable_objects);
|
||||
while (g_hash_table_iter_next (&hash_iter, &key, &value))
|
||||
{
|
||||
@ -224,44 +199,37 @@ fsck_reachable_objects_from_commits (OstreeRepo *repo,
|
||||
|
||||
if (!load_and_fsck_one_object (repo, checksum, objtype, out_found_corruption,
|
||||
cancellable, error))
|
||||
goto out;
|
||||
return FALSE;
|
||||
|
||||
if (mod == 0 || (i % mod == 0))
|
||||
g_print ("%u/%u objects\n", i + 1, count);
|
||||
i++;
|
||||
}
|
||||
|
||||
ret = TRUE;
|
||||
out:
|
||||
return ret;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
ostree_builtin_fsck (int argc, char **argv, GCancellable *cancellable, GError **error)
|
||||
{
|
||||
gboolean ret = FALSE;
|
||||
g_autoptr(GOptionContext) context = NULL;
|
||||
glnx_unref_object OstreeRepo *repo = NULL;
|
||||
GHashTableIter hash_iter;
|
||||
gpointer key, value;
|
||||
gboolean found_corruption = FALSE;
|
||||
guint n_partial = 0;
|
||||
g_autoptr(GHashTable) all_refs = NULL;
|
||||
g_autoptr(GHashTable) objects = NULL;
|
||||
g_autoptr(GHashTable) commits = NULL;
|
||||
g_autoptr(GPtrArray) tombstones = NULL;
|
||||
context = g_option_context_new ("- Check the repository for consistency");
|
||||
|
||||
g_autoptr(GOptionContext) context = g_option_context_new ("- Check the repository for consistency");
|
||||
if (!ostree_option_context_parse (context, options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error))
|
||||
goto out;
|
||||
return FALSE;
|
||||
|
||||
if (!opt_quiet)
|
||||
g_print ("Validating refs...\n");
|
||||
|
||||
/* Validate that the commit for each ref is available */
|
||||
g_autoptr(GHashTable) all_refs = NULL;
|
||||
if (!ostree_repo_list_refs (repo, NULL, &all_refs,
|
||||
cancellable, error))
|
||||
return FALSE;
|
||||
|
||||
GHashTableIter hash_iter;
|
||||
gpointer key, value;
|
||||
g_hash_table_iter_init (&hash_iter, all_refs);
|
||||
while (g_hash_table_iter_next (&hash_iter, &key, &value))
|
||||
{
|
||||
@ -270,27 +238,27 @@ ostree_builtin_fsck (int argc, char **argv, GCancellable *cancellable, GError **
|
||||
g_autoptr(GVariant) commit = NULL;
|
||||
if (!ostree_repo_load_variant (repo, OSTREE_OBJECT_TYPE_COMMIT,
|
||||
checksum, &commit, error))
|
||||
{
|
||||
g_prefix_error (error, "Loading commit for ref %s: ", refname);
|
||||
goto out;
|
||||
}
|
||||
return glnx_prefix_error (error, "Loading commit for ref %s", refname);
|
||||
}
|
||||
|
||||
if (!opt_quiet)
|
||||
g_print ("Enumerating objects...\n");
|
||||
|
||||
g_autoptr(GHashTable) objects = NULL;
|
||||
if (!ostree_repo_list_objects (repo, OSTREE_REPO_LIST_OBJECTS_ALL,
|
||||
&objects, cancellable, error))
|
||||
goto out;
|
||||
return FALSE;
|
||||
|
||||
commits = g_hash_table_new_full (ostree_hash_object_name, g_variant_equal,
|
||||
(GDestroyNotify)g_variant_unref, NULL);
|
||||
|
||||
g_hash_table_iter_init (&hash_iter, objects);
|
||||
g_autoptr(GHashTable) commits = g_hash_table_new_full (ostree_hash_object_name, g_variant_equal,
|
||||
(GDestroyNotify)g_variant_unref, NULL);
|
||||
|
||||
|
||||
g_autoptr(GPtrArray) tombstones = NULL;
|
||||
if (opt_add_tombstones)
|
||||
tombstones = g_ptr_array_new_with_free_func (g_free);
|
||||
|
||||
guint n_partial = 0;
|
||||
g_hash_table_iter_init (&hash_iter, objects);
|
||||
while (g_hash_table_iter_next (&hash_iter, &key, &value))
|
||||
{
|
||||
GVariant *serialized_key = key;
|
||||
@ -304,7 +272,7 @@ ostree_builtin_fsck (int argc, char **argv, GCancellable *cancellable, GError **
|
||||
if (objtype == OSTREE_OBJECT_TYPE_COMMIT)
|
||||
{
|
||||
if (!ostree_repo_load_commit (repo, checksum, &commit, &commitstate, error))
|
||||
goto out;
|
||||
return FALSE;
|
||||
|
||||
if (opt_add_tombstones)
|
||||
{
|
||||
@ -324,7 +292,7 @@ ostree_builtin_fsck (int argc, char **argv, GCancellable *cancellable, GError **
|
||||
else
|
||||
{
|
||||
g_propagate_error (error, local_error);
|
||||
goto out;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -345,7 +313,7 @@ ostree_builtin_fsck (int argc, char **argv, GCancellable *cancellable, GError **
|
||||
|
||||
if (!fsck_reachable_objects_from_commits (repo, commits, &found_corruption,
|
||||
cancellable, error))
|
||||
goto out;
|
||||
return FALSE;
|
||||
|
||||
if (opt_add_tombstones)
|
||||
{
|
||||
@ -353,14 +321,14 @@ ostree_builtin_fsck (int argc, char **argv, GCancellable *cancellable, GError **
|
||||
if (tombstones->len)
|
||||
{
|
||||
if (!ot_enable_tombstone_commits (repo, error))
|
||||
goto out;
|
||||
return FALSE;
|
||||
}
|
||||
for (i = 0; i < tombstones->len; i++)
|
||||
{
|
||||
const char *checksum = tombstones->pdata[i];
|
||||
g_print ("Adding tombstone for commit %s\n", checksum);
|
||||
if (!ostree_repo_delete_object (repo, OSTREE_OBJECT_TYPE_COMMIT, checksum, cancellable, error))
|
||||
goto out;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else if (n_partial > 0)
|
||||
@ -369,13 +337,7 @@ ostree_builtin_fsck (int argc, char **argv, GCancellable *cancellable, GError **
|
||||
}
|
||||
|
||||
if (found_corruption)
|
||||
{
|
||||
g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||
"Repository corruption encountered");
|
||||
goto out;
|
||||
}
|
||||
return glnx_throw (error, "Repository corruption encountered");
|
||||
|
||||
ret = TRUE;
|
||||
out:
|
||||
return ret;
|
||||
return TRUE;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user