summaryrefslogtreecommitdiff
path: root/builtin
diff options
context:
space:
mode:
authorDerrick Stolee <derrickstolee@github.com>2023-04-17 16:21:38 +0000
committerJunio C Hamano <gitster@pobox.com>2023-04-17 14:39:04 -0700
commit0d30feef3c55f63f8db1dc1e52071090d16dfaaf (patch)
treee5420913efcb4b5b70d9332b3923804601b55927 /builtin
parent3c63503759136836dee84ea28835b1b4ef8882bf (diff)
downloadgit-0d30feef3c55f63f8db1dc1e52071090d16dfaaf.tar.gz
fsck: create scaffolding for rev-index checks
The 'fsck' builtin checks many of Git's on-disk data structures, but does not currently validate the pack rev-index files (a .rev file to pair with a .pack and .idx file). Before doing a more-involved check process, create the scaffolding within builtin/fsck.c to have a new error type and add that error type when the API method verify_pack_revindex() returns an error. That method does nothing currently, but we will add checks to it in later changes. For now, check that 'git fsck' succeeds without any errors in the normal case. Future checks will be paired with tests that corrupt the .rev file appropriately. Signed-off-by: Derrick Stolee <derrickstolee@github.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin')
-rw-r--r--builtin/fsck.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/builtin/fsck.c b/builtin/fsck.c
index 095b39d398..2ab78129bd 100644
--- a/builtin/fsck.c
+++ b/builtin/fsck.c
@@ -24,6 +24,7 @@
#include "resolve-undo.h"
#include "run-command.h"
#include "worktree.h"
+#include "pack-revindex.h"
#define REACHABLE 0x0001
#define SEEN 0x0002
@@ -53,6 +54,7 @@ static int name_objects;
#define ERROR_REFS 010
#define ERROR_COMMIT_GRAPH 020
#define ERROR_MULTI_PACK_INDEX 040
+#define ERROR_PACK_REV_INDEX 0100
static const char *describe_object(const struct object_id *oid)
{
@@ -856,6 +858,32 @@ static int mark_packed_for_connectivity(const struct object_id *oid,
return 0;
}
+static int check_pack_rev_indexes(struct repository *r, int show_progress)
+{
+ struct progress *progress = NULL;
+ uint32_t pack_count = 0;
+ int res = 0;
+
+ if (show_progress) {
+ for (struct packed_git *p = get_all_packs(the_repository); p; p = p->next)
+ pack_count++;
+ progress = start_delayed_progress("Verifying reverse pack-indexes", pack_count);
+ pack_count = 0;
+ }
+
+ for (struct packed_git *p = get_all_packs(the_repository); p; p = p->next) {
+ if (!load_pack_revindex(the_repository, p) &&
+ verify_pack_revindex(p)) {
+ error(_("invalid rev-index for pack '%s'"), p->pack_name);
+ res = ERROR_PACK_REV_INDEX;
+ }
+ display_progress(progress, ++pack_count);
+ }
+ stop_progress(&progress);
+
+ return res;
+}
+
static char const * const fsck_usage[] = {
N_("git fsck [--tags] [--root] [--unreachable] [--cache] [--no-reflogs]\n"
" [--[no-]full] [--strict] [--verbose] [--lost-found]\n"
@@ -1019,6 +1047,8 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
free_worktrees(worktrees);
}
+ errors_found |= check_pack_rev_indexes(the_repository, show_progress);
+
check_connectivity();
if (the_repository->settings.core_commit_graph) {