summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2018-05-17 10:06:24 +0200
committerAtomic Bot <atomic-devel@projectatomic.io>2018-05-24 21:00:52 +0000
commit5f82503a01b715cdc29c033189045712d6cff181 (patch)
treeeb0aff0f4682ab5faf83ac98460bea0c8ebe9e7e
parentef86abe2282325f28a3507076f9124862840da10 (diff)
downloadostree-5f82503a01b715cdc29c033189045712d6cff181.tar.gz
fsck: Add --all to print all corrupted object
Stopping on the first error is nice if you just want to know if everything is ok, but if you want to figure out all that is wrong its nice to be able to continue and print all corruptions. Closes: #1591 Approved by: cgwalters
-rw-r--r--src/ostree/ot-builtin-fsck.c7
-rwxr-xr-xtests/test-corruption.sh25
2 files changed, 31 insertions, 1 deletions
diff --git a/src/ostree/ot-builtin-fsck.c b/src/ostree/ot-builtin-fsck.c
index b3f06e4d..83000c6e 100644
--- a/src/ostree/ot-builtin-fsck.c
+++ b/src/ostree/ot-builtin-fsck.c
@@ -31,6 +31,7 @@
static gboolean opt_quiet;
static gboolean opt_delete;
+static gboolean opt_all;
static gboolean opt_add_tombstones;
static gboolean opt_verify_bindings;
static gboolean opt_verify_back_refs;
@@ -43,6 +44,7 @@ static gboolean opt_verify_back_refs;
static GOptionEntry options[] = {
{ "add-tombstones", 0, 0, G_OPTION_ARG_NONE, &opt_add_tombstones, "Add tombstones for missing commits", NULL },
{ "quiet", 'q', 0, G_OPTION_ARG_NONE, &opt_quiet, "Only print error messages", NULL },
+ { "all", 'a', 0, G_OPTION_ARG_NONE, &opt_all, "Don't stop on first error", NULL },
{ "delete", 0, 0, G_OPTION_ARG_NONE, &opt_delete, "Remove corrupted objects", NULL },
{ "verify-bindings", 0, 0, G_OPTION_ARG_NONE, &opt_verify_bindings, "Verify ref bindings", NULL },
{ "verify-back-refs", 0, 0, G_OPTION_ARG_NONE, &opt_verify_back_refs, "Verify back-references (implies --verify-bindings)", NULL },
@@ -94,6 +96,11 @@ fsck_one_object (OstreeRepo *repo,
(void) ostree_repo_delete_object (repo, objtype, checksum, cancellable, NULL);
object_missing = TRUE;
}
+ else if (opt_all)
+ {
+ *out_found_corruption = TRUE;
+ g_printerr ("%s\n", temp_error->message);
+ }
else
{
g_propagate_error (error, g_steal_pointer (&temp_error));
diff --git a/tests/test-corruption.sh b/tests/test-corruption.sh
index 4994e277..2b5e61bb 100755
--- a/tests/test-corruption.sh
+++ b/tests/test-corruption.sh
@@ -21,7 +21,7 @@
set -euo pipefail
-echo "1..8"
+echo "1..9"
. $(dirname $0)/libtest.sh
@@ -118,6 +118,7 @@ rev=$($OSTREE rev-parse test2)
filechecksum=$(ostree_file_path_to_checksum repo test2 /firstfile)
echo corrupted >> repo/$(ostree_checksum_to_relative_object_path repo $filechecksum)
+unset filechecksum
assert_not_has_file repo/state/${rev}.commitpartial
@@ -129,3 +130,25 @@ assert_file_has_content_literal err.txt "Marking commit as partial: $rev"
assert_has_file repo/state/${rev}.commitpartial
echo "ok corrupt file"
+
+cd ${test_tmpdir}
+rm repo files -rf
+setup_test_repository "bare"
+
+rev=$($OSTREE rev-parse test2)
+firstfilechecksum=$(ostree_file_path_to_checksum repo test2 /firstfile)
+echo corrupted >> repo/$(ostree_checksum_to_relative_object_path repo $firstfilechecksum)
+secondfilechecksum=$(ostree_file_path_to_checksum repo test2 /baz/cow)
+echo corrupted >> repo/$(ostree_checksum_to_relative_object_path repo $secondfilechecksum)
+
+assert_not_has_file repo/state/${rev}.commitpartial
+
+if $OSTREE fsck -a --delete 2>err.txt; then
+ assert_not_reached "fsck unexpectedly succeeded"
+fi
+assert_file_has_content err.txt "Corrupted file object.*${firstfilechecksum}"
+assert_file_has_content err.txt "Corrupted file object.*${secondfilechecksum}"
+assert_file_has_content_literal err.txt "Marking commit as partial: $rev"
+assert_has_file repo/state/${rev}.commitpartial
+
+echo "ok fsck --all"