[ostree] core: Actually return an error from fsck



commit 1d23e4b8e88ced8c83590d6faee1fc33b03b6bcf
Author: Colin Walters <walters verbum org>
Date:   Wed Nov 9 08:27:47 2011 -0500

    core: Actually return an error from fsck
    
    And add some tests that fsck reports an error.

 ostree/ot-builtin-fsck.c                     |   18 +++++++++++++-----
 tests/{t0005-pull.sh => t0005-corruption.sh} |   18 ++++++++++--------
 tests/{t0005-pull.sh => t0010-pull.sh}       |    0
 3 files changed, 23 insertions(+), 13 deletions(-)
---
diff --git a/ostree/ot-builtin-fsck.c b/ostree/ot-builtin-fsck.c
index 7c87402..e0da0dc 100644
--- a/ostree/ot-builtin-fsck.c
+++ b/ostree/ot-builtin-fsck.c
@@ -35,10 +35,11 @@ static GOptionEntry options[] = {
 
 typedef struct {
   guint n_objects;
-} HtFsckData;
+  gboolean had_error;
+} OtFsckData;
 
 static gboolean
-checksum_packed_file (HtFsckData   *data,
+checksum_packed_file (OtFsckData   *data,
                       const char   *path,
                       GChecksum   **out_checksum,
                       GError      **error)
@@ -111,7 +112,6 @@ checksum_packed_file (HtFsckData   *data,
     g_variant_unref (xattrs);
   return ret;
 }
-                    
 
 static void
 object_iter_callback (OstreeRepo  *repo,
@@ -119,7 +119,7 @@ object_iter_callback (OstreeRepo  *repo,
                       GFileInfo     *file_info,
                       gpointer       user_data)
 {
-  HtFsckData *data = user_data;
+  OtFsckData *data = user_data;
   struct stat stbuf;
   GChecksum *checksum = NULL;
   GError *error = NULL;
@@ -169,6 +169,7 @@ object_iter_callback (OstreeRepo  *repo,
   
   if (strcmp (checksum_string, g_checksum_get_string (checksum)) != 0)
     {
+      data->had_error = TRUE;
       g_printerr ("ERROR: corrupted object '%s' expected checksum: %s\n",
                   path, g_checksum_get_string (checksum));
     }
@@ -193,7 +194,7 @@ gboolean
 ostree_builtin_fsck (int argc, char **argv, const char *repo_path, GError **error)
 {
   GOptionContext *context;
-  HtFsckData data;
+  OtFsckData data;
   gboolean ret = FALSE;
   OstreeRepo *repo = NULL;
 
@@ -204,6 +205,7 @@ ostree_builtin_fsck (int argc, char **argv, const char *repo_path, GError **erro
     goto out;
 
   data.n_objects = 0;
+  data.had_error = FALSE;
 
   repo = ostree_repo_new (repo_path);
   if (!ostree_repo_check (repo, error))
@@ -212,6 +214,12 @@ ostree_builtin_fsck (int argc, char **argv, const char *repo_path, GError **erro
   if (!ostree_repo_iter_objects (repo, object_iter_callback, &data, error))
     goto out;
 
+  if (data.had_error)
+    {
+      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+                   "Encountered filesystem consistency errors");
+      goto out;
+    }
   if (!quiet)
     g_printerr ("Total Objects: %u\n", data.n_objects);
 
diff --git a/tests/t0005-pull.sh b/tests/t0005-corruption.sh
similarity index 76%
copy from tests/t0005-pull.sh
copy to tests/t0005-corruption.sh
index 9d33b7e..afd5086 100755
--- a/tests/t0005-pull.sh
+++ b/tests/t0005-corruption.sh
@@ -20,14 +20,16 @@
 
 set -e
 
+echo "1..1"
+
 . libtest.sh
 
-echo '1..1'
+setup_test_repository "regular"
+$OSTREE checkout test2 checkout-test2
+cd checkout-test2
+chmod o+x firstfile
+$OSTREE fsck -q 2>/dev/null && (echo 1>&2 "fsck unexpectedly succeeded"; exit 1)
+chmod o-x firstfile
+$OSTREE fsck -q
 
-setup_fake_remote_repo1
-cd ${test_tmpdir}
-mkdir repo
-$OSTREE init
-$OSTREE remote add origin $(cat httpd-address)/ostree/gnomerepo
-$OSTREE pull origin main
-echo "ok pull"
+echo "ok chmod"
diff --git a/tests/t0005-pull.sh b/tests/t0010-pull.sh
similarity index 100%
rename from tests/t0005-pull.sh
rename to tests/t0010-pull.sh



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]