Skip to content

Commit e0fd51e

Browse files
derrickstoleegitster
authored andcommitted
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 <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 41df0e3 commit e0fd51e

File tree

3 files changed

+32
-0
lines changed

3 files changed

+32
-0
lines changed

Documentation/git-fsck.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,9 @@ Any corrupt objects you will have to find in backups or other archives
110110
(i.e., you can just remove them and do an 'rsync' with some other site in
111111
the hopes that somebody else has the object you have corrupted).
112112

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+
113116
Extracted Diagnostics
114117
---------------------
115118

builtin/fsck.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "decorate.h"
1919
#include "packfile.h"
2020
#include "object-store.h"
21+
#include "run-command.h"
2122

2223
#define REACHABLE 0x0001
2324
#define SEEN 0x0002
@@ -47,6 +48,7 @@ static int name_objects;
4748
#define ERROR_REACHABLE 02
4849
#define ERROR_PACK 04
4950
#define ERROR_REFS 010
51+
#define ERROR_COMMIT_GRAPH 020
5052

5153
static const char *describe_object(struct object *obj)
5254
{
@@ -822,5 +824,24 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
822824
}
823825

824826
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+
825846
return errors_found;
826847
}

t/t5318-commit-graph.sh

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,4 +399,12 @@ test_expect_success 'detect invalid checksum hash' '
399399
"incorrect checksum"
400400
'
401401

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+
402410
test_done

0 commit comments

Comments
 (0)