fsck: verify commit-graph

If core.commitGraph is true, verify the contents of the commit-graph during 'git fsck' using the 'git commit-graph verify' subcommand. Run this check on all alternates, as well. We use a new process for two reasons: 1. The subcommand decouples the details of loading and verifying a commit-graph file from the other fsck details. 2. The commit-graph verification requires the commits to be loaded in a specific order to guarantee we parse from the commit-graph file for some objects and from the object database for others. Signed-off-by: Derrick Stolee <dstolee@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Derrick Stolee committed Jun 27, 2018 at 09:24 UTC e0fd51e1d7d3877d4b0b4133c763d46b65d46f7a
3 files changed +32
Documentation/git-fsck.txt
+3
@@ -110,6 +110,9 @@ Any corrupt objects you will have to find in backups or other archives
110 (i.e., you can just remove them and do an 'rsync' with some other site in
111 the hopes that somebody else has the object you have corrupted).
112
113 +If core.commitGraph is true, the commit-graph file will also be inspected
114 +using 'git commit-graph verify'. See linkgit:git-commit-graph[1].
115 +
116 Extracted Diagnostics
117 ---------------------
118
builtin/fsck.c
+21
@@ -18,6 +18,7 @@
18 #include "decorate.h"
19 #include "packfile.h"
20 #include "object-store.h"
21 +#include "run-command.h"
22
23 #define REACHABLE 0x0001
24 #define SEEN 0x0002
@@ -47,6 +48,7 @@ static int name_objects;
48 #define ERROR_REACHABLE 02
49 #define ERROR_PACK 04
50 #define ERROR_REFS 010
51 +#define ERROR_COMMIT_GRAPH 020
52
53 static const char *describe_object(struct object *obj)
54 {
@@ -822,5 +824,24 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
824 }
825
826 check_connectivity();
827 +
828 + if (core_commit_graph) {
829 + struct child_process commit_graph_verify = CHILD_PROCESS_INIT;
830 + const char *verify_argv[] = { "commit-graph", "verify", NULL, NULL, NULL };
831 +
832 + commit_graph_verify.argv = verify_argv;
833 + commit_graph_verify.git_cmd = 1;
834 + if (run_command(&commit_graph_verify))
835 + errors_found |= ERROR_COMMIT_GRAPH;
836 +
837 + prepare_alt_odb(the_repository);
838 + for (alt = the_repository->objects->alt_odb_list; alt; alt = alt->next) {
839 + verify_argv[2] = "--object-dir";
840 + verify_argv[3] = alt->path;
841 + if (run_command(&commit_graph_verify))
842 + errors_found |= ERROR_COMMIT_GRAPH;
843 + }
844 + }
845 +
846 return errors_found;
847 }
t/t5318-commit-graph.sh
+8
@@ -399,4 +399,12 @@ test_expect_success 'detect invalid checksum hash' '
399 "incorrect checksum"
400 '
401
402 +test_expect_success 'git fsck (checks commit-graph)' '
403 + cd "$TRASH_DIRECTORY/full" &&
404 + git fsck &&
405 + corrupt_graph_and_verify $GRAPH_BYTE_FOOTER "\00" \
406 + "incorrect checksum" &&
407 + test_must_fail git fsck
408 +'
409 +
410 test_done