diff options
-rw-r--r-- | builtin/commit-graph.c | 10 | ||||
-rw-r--r-- | commit-graph.c | 7 | ||||
-rw-r--r-- | commit-graph.h | 3 | ||||
-rwxr-xr-x | t/t5324-split-commit-graph.sh | 32 |
4 files changed, 45 insertions, 7 deletions
diff --git a/builtin/commit-graph.c b/builtin/commit-graph.c index 50c15d9bfe..f5e66e9969 100644 --- a/builtin/commit-graph.c +++ b/builtin/commit-graph.c @@ -74,6 +74,7 @@ static int graph_verify(int argc, const char **argv, const char *prefix) int fd; struct stat st; int flags = 0; + int incomplete_chain = 0; int ret; static struct option builtin_commit_graph_verify_options[] = { @@ -122,13 +123,20 @@ static int graph_verify(int argc, const char **argv, const char *prefix) else if (opened == OPENED_GRAPH) graph = load_commit_graph_one_fd_st(the_repository, fd, &st, odb); else - graph = load_commit_graph_chain_fd_st(the_repository, fd, &st); + graph = load_commit_graph_chain_fd_st(the_repository, fd, &st, + &incomplete_chain); if (!graph) return 1; ret = verify_commit_graph(the_repository, graph, flags); free_commit_graph(graph); + + if (incomplete_chain) { + error("one or more commit-graph chain files could not be loaded"); + ret |= 1; + } + return ret; } diff --git a/commit-graph.c b/commit-graph.c index b1d3e5bf94..1a56efcf69 100644 --- a/commit-graph.c +++ b/commit-graph.c @@ -563,7 +563,8 @@ int open_commit_graph_chain(const char *chain_file, } struct commit_graph *load_commit_graph_chain_fd_st(struct repository *r, - int fd, struct stat *st) + int fd, struct stat *st, + int *incomplete_chain) { struct commit_graph *graph_chain = NULL; struct strbuf line = STRBUF_INIT; @@ -618,6 +619,7 @@ struct commit_graph *load_commit_graph_chain_fd_st(struct repository *r, fclose(fp); strbuf_release(&line); + *incomplete_chain = !valid; return graph_chain; } @@ -630,8 +632,9 @@ static struct commit_graph *load_commit_graph_chain(struct repository *r, struct commit_graph *g = NULL; if (open_commit_graph_chain(chain_file, &fd, &st)) { + int incomplete; /* ownership of fd is taken over by load function */ - g = load_commit_graph_chain_fd_st(r, fd, &st); + g = load_commit_graph_chain_fd_st(r, fd, &st, &incomplete); } free(chain_file); diff --git a/commit-graph.h b/commit-graph.h index 3b662fd2b5..20ada7e891 100644 --- a/commit-graph.h +++ b/commit-graph.h @@ -107,7 +107,8 @@ struct commit_graph *load_commit_graph_one_fd_st(struct repository *r, int fd, struct stat *st, struct object_directory *odb); struct commit_graph *load_commit_graph_chain_fd_st(struct repository *r, - int fd, struct stat *st); + int fd, struct stat *st, + int *incomplete_chain); struct commit_graph *read_commit_graph_one(struct repository *r, struct object_directory *odb); diff --git a/t/t5324-split-commit-graph.sh b/t/t5324-split-commit-graph.sh index be58545810..06bb897f02 100755 --- a/t/t5324-split-commit-graph.sh +++ b/t/t5324-split-commit-graph.sh @@ -285,6 +285,32 @@ test_expect_success 'verify hashes along chain, even in shallow' ' ) ' +test_expect_success 'verify notices chain slice which is bogus (base)' ' + git clone --no-hardlinks . verify-chain-bogus-base && + ( + cd verify-chain-bogus-base && + git commit-graph verify && + base_file=$graphdir/graph-$(sed -n 1p $graphdir/commit-graph-chain).graph && + echo "garbage" >$base_file && + test_must_fail git commit-graph verify 2>test_err && + grep -v "^+" test_err >err && + grep "commit-graph file is too small" err + ) +' + +test_expect_success 'verify notices chain slice which is bogus (tip)' ' + git clone --no-hardlinks . verify-chain-bogus-tip && + ( + cd verify-chain-bogus-tip && + git commit-graph verify && + tip_file=$graphdir/graph-$(sed -n 2p $graphdir/commit-graph-chain).graph && + echo "garbage" >$tip_file && + test_must_fail git commit-graph verify 2>test_err && + grep -v "^+" test_err >err && + grep "commit-graph file is too small" err + ) +' + test_expect_success 'verify --shallow does not check base contents' ' git clone --no-hardlinks . verify-shallow && ( @@ -306,7 +332,7 @@ test_expect_success 'warn on base graph chunk incorrect' ' git commit-graph verify && base_file=$graphdir/graph-$(tail -n 1 $graphdir/commit-graph-chain).graph && corrupt_file "$base_file" $(test_oid base) "\01" && - git commit-graph verify --shallow 2>test_err && + test_must_fail git commit-graph verify --shallow 2>test_err && grep -v "^+" test_err >err && test_i18ngrep "commit-graph chain does not match" err ) @@ -332,11 +358,11 @@ test_expect_success 'verify after commit-graph-chain corruption (tip)' ' ( cd verify-chain-tip && corrupt_file "$graphdir/commit-graph-chain" 70 "G" && - git commit-graph verify 2>test_err && + test_must_fail git commit-graph verify 2>test_err && grep -v "^+" test_err >err && test_i18ngrep "invalid commit-graph chain" err && corrupt_file "$graphdir/commit-graph-chain" 70 "A" && - git commit-graph verify 2>test_err && + test_must_fail git commit-graph verify 2>test_err && grep -v "^+" test_err >err && test_i18ngrep "unable to find all commit-graph files" err ) |