[ostree] main: Add --delete option to fsck
- From: Colin Walters <walters src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [ostree] main: Add --delete option to fsck
- Date: Thu, 18 Jul 2013 16:10:15 +0000 (UTC)
commit f0c5a5f3340fcdee8650fd952c1bfd182fce7854
Author: Colin Walters <walters verbum org>
Date: Thu Jul 18 12:09:44 2013 -0400
main: Add --delete option to fsck
This is useful for clearing out all corrupted objects locally.
src/ostree/ot-builtin-fsck.c | 41 +++++++++++++++++++++++++++++++++--------
tests/test-corruption.sh | 13 +++++++++++--
2 files changed, 44 insertions(+), 10 deletions(-)
---
diff --git a/src/ostree/ot-builtin-fsck.c b/src/ostree/ot-builtin-fsck.c
index 7610729..e0b6499 100644
--- a/src/ostree/ot-builtin-fsck.c
+++ b/src/ostree/ot-builtin-fsck.c
@@ -38,6 +38,7 @@ static gboolean
load_and_fsck_one_object (OstreeRepo *repo,
const char *checksum,
OstreeObjectType objtype,
+ gboolean *out_found_corruption,
GCancellable *cancellable,
GError **error)
{
@@ -131,7 +132,11 @@ load_and_fsck_one_object (OstreeRepo *repo,
}
}
- if (!missing)
+ if (missing)
+ {
+ *out_found_corruption = TRUE;
+ }
+ else
{
gs_free guchar *computed_csum = NULL;
gs_free char *tmp_checksum = NULL;
@@ -144,11 +149,21 @@ load_and_fsck_one_object (OstreeRepo *repo,
tmp_checksum = ostree_checksum_from_bytes (computed_csum);
if (strcmp (checksum, tmp_checksum) != 0)
{
- g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- "corrupted object %s.%s; actual checksum: %s",
- checksum, ostree_object_type_to_string (objtype),
- tmp_checksum);
- goto out;
+ gs_free char *msg = g_strdup_printf ("corrupted object %s.%s; actual checksum: %s",
+ checksum, ostree_object_type_to_string (objtype),
+ tmp_checksum);
+ if (opt_delete)
+ {
+ gs_unref_object GFile *object_path = ostree_repo_get_object_path (repo, checksum, objtype);
+ g_printerr ("%s\n", msg);
+ (void) gs_file_unlink (object_path, cancellable, NULL);
+ *out_found_corruption = TRUE;
+ }
+ else
+ {
+ g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, msg);
+ goto out;
+ }
}
}
@@ -160,6 +175,7 @@ load_and_fsck_one_object (OstreeRepo *repo,
static gboolean
fsck_reachable_objects_from_commits (OstreeRepo *repo,
GHashTable *commits,
+ gboolean *out_found_corruption,
GCancellable *cancellable,
GError **error)
{
@@ -203,7 +219,7 @@ fsck_reachable_objects_from_commits (OstreeRepo *repo,
ostree_object_name_deserialize (serialized_key, &checksum, &objtype);
- if (!load_and_fsck_one_object (repo, checksum, objtype,
+ if (!load_and_fsck_one_object (repo, checksum, objtype, out_found_corruption,
cancellable, error))
goto out;
@@ -224,6 +240,7 @@ ostree_builtin_fsck (int argc, char **argv, GFile *repo_path, GCancellable *canc
GOptionContext *context;
GHashTableIter hash_iter;
gpointer key, value;
+ gboolean found_corruption = FALSE;
gs_unref_object OstreeRepo *repo = NULL;
gs_unref_hashtable GHashTable *objects = NULL;
gs_unref_hashtable GHashTable *commits = NULL;
@@ -268,9 +285,17 @@ ostree_builtin_fsck (int argc, char **argv, GFile *repo_path, GCancellable *canc
g_print ("Verifying content integrity of %u commit objects...\n",
(guint)g_hash_table_size (commits));
- if (!fsck_reachable_objects_from_commits (repo, commits, cancellable, error))
+ if (!fsck_reachable_objects_from_commits (repo, commits, &found_corruption,
+ cancellable, error))
goto out;
+ if (found_corruption)
+ {
+ g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+ "Repository corruption encountered");
+ goto out;
+ }
+
ret = TRUE;
out:
if (context)
diff --git a/tests/test-corruption.sh b/tests/test-corruption.sh
index 258e0bd..9ad6aaf 100755
--- a/tests/test-corruption.sh
+++ b/tests/test-corruption.sh
@@ -19,7 +19,7 @@
set -e
-echo "1..1"
+echo "1..2"
. $(dirname $0)/libtest.sh
@@ -27,8 +27,17 @@ setup_test_repository "bare"
$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)
+$OSTREE fsck -q && (echo 1>&2 "fsck unexpectedly succeeded"; exit 1)
chmod o-x firstfile
$OSTREE fsck -q
echo "ok chmod"
+
+cd ${test_tmpdir}
+rm checkout-test2 -rf
+$OSTREE checkout test2 checkout-test2
+cd checkout-test2
+chmod o+x firstfile
+$OSTREE fsck -q --delete && (echo 1>&2 "fsck unexpectedly succeeded"; exit 1)
+
+echo "ok chmod"
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]