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
|
(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).
|
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
|
Extracted Diagnostics
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
#include "decorate.h"
|
#include "decorate.h"
|
||||||
#include "packfile.h"
|
#include "packfile.h"
|
||||||
#include "object-store.h"
|
#include "object-store.h"
|
||||||
|
#include "run-command.h"
|
||||||
|
|
||||||
#define REACHABLE 0x0001
|
#define REACHABLE 0x0001
|
||||||
#define SEEN 0x0002
|
#define SEEN 0x0002
|
||||||
@ -47,6 +48,7 @@ static int name_objects;
|
|||||||
#define ERROR_REACHABLE 02
|
#define ERROR_REACHABLE 02
|
||||||
#define ERROR_PACK 04
|
#define ERROR_PACK 04
|
||||||
#define ERROR_REFS 010
|
#define ERROR_REFS 010
|
||||||
|
#define ERROR_COMMIT_GRAPH 020
|
||||||
|
|
||||||
static const char *describe_object(struct object *obj)
|
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();
|
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;
|
return errors_found;
|
||||||
}
|
}
|
||||||
|
@ -399,4 +399,12 @@ test_expect_success 'detect invalid checksum hash' '
|
|||||||
"incorrect checksum"
|
"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
|
test_done
|
||||||
|
Loading…
x
Reference in New Issue
Block a user