#include "../setup.h"
#include "../strmap.h"
#include "../trace2.h"
+#include "../worktree.h"
#include "../write-or-die.h"
#include "refs-internal.h"
}
static int reftable_be_fsck(struct ref_store *ref_store, struct fsck_options *o,
- struct worktree *wt UNUSED)
+ struct worktree *wt)
{
- struct reftable_ref_store *refs;
- struct strmap_entry *entry;
- struct hashmap_iter iter;
- int ret = 0;
-
- refs = reftable_be_downcast(ref_store, REF_STORE_READ, "fsck");
-
- ret |= reftable_fsck_check(refs->main_backend.stack, reftable_fsck_error_handler,
- reftable_fsck_verbose_handler, o);
+ struct reftable_ref_store *refs =
+ reftable_be_downcast(ref_store, REF_STORE_READ, "fsck");
+ struct reftable_backend *backend;
- strmap_for_each_entry(&refs->worktree_backends, &iter, entry) {
- struct reftable_backend *b = (struct reftable_backend *)entry->value;
- ret |= reftable_fsck_check(b->stack, reftable_fsck_error_handler,
- reftable_fsck_verbose_handler, o);
+ if (is_main_worktree(wt)) {
+ backend = &refs->main_backend;
+ } else {
+ int ret = backend_for_worktree(&backend, refs, wt->id);
+ if (ret < 0)
+ return error(_("reftable stack for worktree '%s' is broken"),
+ wt->id);
}
- return ret;
+ return reftable_fsck_check(backend->stack, reftable_fsck_error_handler,
+ reftable_fsck_verbose_handler, o);
}
struct ref_storage_be refs_be_reftable = {
'
done
+test_expect_success 'worktree stacks can be verified' '
+ test_when_finished "rm -rf repo worktree" &&
+ git init repo &&
+ test_commit -C repo initial &&
+ git -C repo worktree add ../worktree &&
+
+ git -C worktree refs verify 2>err &&
+ test_must_be_empty err &&
+
+ REFTABLE_DIR=$(git -C worktree rev-parse --git-dir)/reftable &&
+ EXISTING_TABLE=$(head -n1 "$REFTABLE_DIR/tables.list") &&
+ mv "$REFTABLE_DIR/$EXISTING_TABLE" "$REFTABLE_DIR/broken.ref" &&
+
+ for d in repo worktree
+ do
+ echo "broken.ref" >"$REFTABLE_DIR/tables.list" &&
+ git -C "$d" refs verify 2>err &&
+ cat >expect <<-EOF &&
+ warning: broken.ref: badReftableTableName: invalid reftable table name
+ EOF
+ test_cmp expect err &&
+
+ echo garbage >"$REFTABLE_DIR/tables.list" &&
+ test_must_fail git -C "$d" refs verify 2>err &&
+ cat >expect <<-EOF &&
+ error: reftable stack for worktree ${SQ}worktree${SQ} is broken
+ EOF
+ test_cmp expect err || return 1
+
+ done
+'
+
test_done