fsck: Check for refs missing corresponding commit
Just doing this one quickly since it was easy. Closes: https://github.com/ostreedev/ostree/issues/831 Closes: #841 Approved by: jlebon
This commit is contained in:
parent
052ba81c03
commit
86963334bd
|
|
@ -246,6 +246,7 @@ ostree_builtin_fsck (int argc, char **argv, GCancellable *cancellable, GError **
|
||||||
gpointer key, value;
|
gpointer key, value;
|
||||||
gboolean found_corruption = FALSE;
|
gboolean found_corruption = FALSE;
|
||||||
guint n_partial = 0;
|
guint n_partial = 0;
|
||||||
|
g_autoptr(GHashTable) all_refs = NULL;
|
||||||
g_autoptr(GHashTable) objects = NULL;
|
g_autoptr(GHashTable) objects = NULL;
|
||||||
g_autoptr(GHashTable) commits = NULL;
|
g_autoptr(GHashTable) commits = NULL;
|
||||||
g_autoptr(GPtrArray) tombstones = NULL;
|
g_autoptr(GPtrArray) tombstones = NULL;
|
||||||
|
|
@ -254,6 +255,27 @@ ostree_builtin_fsck (int argc, char **argv, GCancellable *cancellable, GError **
|
||||||
if (!ostree_option_context_parse (context, options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error))
|
if (!ostree_option_context_parse (context, options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
if (!opt_quiet)
|
||||||
|
g_print ("Validating refs...\n");
|
||||||
|
|
||||||
|
/* Validate that the commit for each ref is available */
|
||||||
|
if (!ostree_repo_list_refs (repo, NULL, &all_refs,
|
||||||
|
cancellable, error))
|
||||||
|
return FALSE;
|
||||||
|
g_hash_table_iter_init (&hash_iter, all_refs);
|
||||||
|
while (g_hash_table_iter_next (&hash_iter, &key, &value))
|
||||||
|
{
|
||||||
|
const char *refname = key;
|
||||||
|
const char *checksum = value;
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!opt_quiet)
|
if (!opt_quiet)
|
||||||
g_print ("Enumerating objects...\n");
|
g_print ("Enumerating objects...\n");
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,10 +19,12 @@
|
||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
echo "1..2"
|
echo "1..3"
|
||||||
|
|
||||||
. $(dirname $0)/libtest.sh
|
. $(dirname $0)/libtest.sh
|
||||||
|
|
||||||
|
cd ${test_tmpdir}
|
||||||
|
rm repo files -rf
|
||||||
setup_test_repository "bare"
|
setup_test_repository "bare"
|
||||||
$OSTREE checkout test2 checkout-test2
|
$OSTREE checkout test2 checkout-test2
|
||||||
cd checkout-test2
|
cd checkout-test2
|
||||||
|
|
@ -34,6 +36,8 @@ $OSTREE fsck -q
|
||||||
echo "ok chmod"
|
echo "ok chmod"
|
||||||
|
|
||||||
cd ${test_tmpdir}
|
cd ${test_tmpdir}
|
||||||
|
rm repo files -rf
|
||||||
|
setup_test_repository "bare"
|
||||||
rm checkout-test2 -rf
|
rm checkout-test2 -rf
|
||||||
$OSTREE checkout test2 checkout-test2
|
$OSTREE checkout test2 checkout-test2
|
||||||
cd checkout-test2
|
cd checkout-test2
|
||||||
|
|
@ -41,3 +45,14 @@ chmod o+x firstfile
|
||||||
$OSTREE fsck -q --delete && (echo 1>&2 "fsck unexpectedly succeeded"; exit 1)
|
$OSTREE fsck -q --delete && (echo 1>&2 "fsck unexpectedly succeeded"; exit 1)
|
||||||
|
|
||||||
echo "ok chmod"
|
echo "ok chmod"
|
||||||
|
|
||||||
|
cd ${test_tmpdir}
|
||||||
|
rm repo files -rf
|
||||||
|
setup_test_repository "bare"
|
||||||
|
find repo/ -name '*.commit' -delete
|
||||||
|
if $OSTREE fsck -q 2>err.txt; then
|
||||||
|
assert_not_reached "fsck unexpectedly succeeded"
|
||||||
|
fi
|
||||||
|
assert_file_has_content_literal err.txt "Loading commit for ref test2: No such metadata object"
|
||||||
|
|
||||||
|
echo "ok missing commit"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue