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>
This commit is contained in:
parent
41df0e307f
commit
e0fd51e1d7
@ -110,6 +110,9 @@ Any corrupt objects you will have to find in backups or other archives
|
||||
(i.e., you can just remove them and do an 'rsync' with some other site in
|
||||
the hopes that somebody else has the object you have corrupted).
|
||||
|
||||
If core.commitGraph is true, the commit-graph file will also be inspected
|
||||
using 'git commit-graph verify'. See linkgit:git-commit-graph[1].
|
||||
|
||||
Extracted Diagnostics
|
||||
---------------------
|
||||
|
||||
|
@ -18,6 +18,7 @@
|
||||
#include "decorate.h"
|
||||
#include "packfile.h"
|
||||
#include "object-store.h"
|
||||
#include "run-command.h"
|
||||
|
||||
#define REACHABLE 0x0001
|
||||
#define SEEN 0x0002
|
||||
@ -47,6 +48,7 @@ static int name_objects;
|
||||
#define ERROR_REACHABLE 02
|
||||
#define ERROR_PACK 04
|
||||
#define ERROR_REFS 010
|
||||
#define ERROR_COMMIT_GRAPH 020
|
||||
|
||||
static const char *describe_object(struct object *obj)
|
||||
{
|
||||
@ -822,5 +824,24 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
|
||||
}
|
||||
|
||||
check_connectivity();
|
||||
|
||||
if (core_commit_graph) {
|
||||
struct child_process commit_graph_verify = CHILD_PROCESS_INIT;
|
||||
const char *verify_argv[] = { "commit-graph", "verify", NULL, NULL, NULL };
|
||||
|
||||
commit_graph_verify.argv = verify_argv;
|
||||
commit_graph_verify.git_cmd = 1;
|
||||
if (run_command(&commit_graph_verify))
|
||||
errors_found |= ERROR_COMMIT_GRAPH;
|
||||
|
||||
prepare_alt_odb(the_repository);
|
||||
for (alt = the_repository->objects->alt_odb_list; alt; alt = alt->next) {
|
||||
verify_argv[2] = "--object-dir";
|
||||
verify_argv[3] = alt->path;
|
||||
if (run_command(&commit_graph_verify))
|
||||
errors_found |= ERROR_COMMIT_GRAPH;
|
||||
}
|
||||
}
|
||||
|
||||
return errors_found;
|
||||
}
|
||||
|
@ -399,4 +399,12 @@ test_expect_success 'detect invalid checksum hash' '
|
||||
"incorrect checksum"
|
||||
'
|
||||
|
||||
test_expect_success 'git fsck (checks commit-graph)' '
|
||||
cd "$TRASH_DIRECTORY/full" &&
|
||||
git fsck &&
|
||||
corrupt_graph_and_verify $GRAPH_BYTE_FOOTER "\00" \
|
||||
"incorrect checksum" &&
|
||||
test_must_fail git fsck
|
||||
'
|
||||
|
||||
test_done
|
||||
|
Loading…
Reference in New Issue
Block a user