git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: Git Test Coverage Report (Thursday, June 6 2019)

From
Derrick Stolee <stolee@gmail.com>
Date
Jun 7, 2019, 14:43 UTC
Message-ID
<29379827-541e-fe75-f46a-661eb727fc1d@gmail.com>
In-Reply-To
<396091fc-5572-19a5-4f18-61c258590dd5@gmail.com>
On 6/6/2019 9:19 PM, Derrick Stolee wrote:
Show 5 quoted lines
> commit-graph.c
> a53af50b 346) if (!oideq(&oids[n], &cur_g->oid) ||
> a53af50b 347)     !hasheq(oids[n].hash, g->chunk_base_graphs + g->hash_len * n)) {
> a53af50b 348) warning(_("commit-graph chain does not match"));
> a53af50b 349) return 0;

I'm calling myself out that this warning() should be hit by the "verify" checks, as this is a critical behavior check.

> cd556367 353) cur_g = cur_g->base_graph;

Here is an example of a line where I definitely hit this block when I add a die() statement.

I think I figured out the reason the coverage report was reporting coverage incorrectly sometimes: I was accidentally running the test suite in parallel. This causes lots of issues with how gcov tracks coverage as there are lots of race conditions. Running without parallelism takes a LOT longer, so I'll need to use my own machine instead of a hosted build.

> cd556367 396) warning(_("invalid commit-graph chain: line '%s' not a hash"),
I'm lukewarm on how important it is to test this, but I'll give it a try.
> 4ece4fc1 945) if (find_commit_in_graph(parent->item,
> 4ece4fc1 948) edge_value = pos;

This case is triggered by an octopus merge with a not-first parent being in the base graph instead of in the tip file. I'll add a test that covers this situation, as it could be prone to errors.

> 00a8cb54 1523)     (max_commits && num_commits > max_commits))) {
This is a reminder that I forgot to add tests for the '--max-commits' argument.
> c6b73769 1540) ctx->num_commit_graphs_after = 1;
> c6b73769 1541) ctx->new_base_graph = NULL;

This is another subtle case that I should test: we are writing a commit-graph with the --split option and we think we should write a tip graph, but the current file is the old (non-split) commit-graph file _and_ it is in an alternate. This prevents us from trying to move the commit-graph in the alternate, and we must write a single commit-graph file in our object directory.

> 0e2ec504 1617) duplicates++;
> 0e2ec504 1620) ctx->commits.list[last_distinct + 1] = ctx->commits.list[i];
> 0e2ec504 1628) ctx->num_extra_edges += num_parents - 2;

This code in deduplicate_commits() is doing somewhat important work: it takes the combined commit lists from multiple levels of the commit-graph and then de-duplicates the lists. However, if we are writing the commit-graphs properly then they will never have duplicates at this point. I don't think it is valid to have duplicates, either, as then a commit will have ambiguous graph position.

Perhaps deduplicate_commits() should remove the duplicate logic and replace it with a BUG() or die() statement upon finding a duplicate. The sorting and checking for octopus merges is still important.

Thanks, -Stolee

Previous: Derrick StoleeNext: Philip Oakley
Message 2 of 3 in “Git Test Coverage Report (Thursday, June 6 2019)”
  1. Derrick StoleeJun 7, 2019
  2. Derrick StoleeJun 7, 2019
  3. Philip OakleyJun 8, 2019

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.