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

Re: [PATCH 1/3] graph: fix case that hit assert()

From
Jeff King <peff@peff.net>
Date
Jan 7, 2020, 15:30 UTC
Message-ID
<20200107153006.GA20591@coredump.intra.peff.net>
In-Reply-To
<65186f3ded251e0bcf1fcb18160163a3efd97c37.1578408947.git.gitgitgadget@gmail.com>
On Tue, Jan 07, 2020 at 02:55:45PM +0000, Derrick Stolee via GitGitGadget wrote:
Show 11 quoted lines
> From: Derrick Stolee <dstolee@microsoft.com>
> 
> A failure was reported in "git log --graph --all" with the new
> graph-rendering logic. Create a test case that matches the
> topology of that example and uses an explicit ref ordering instead
> of the "--all" option. The test would fail with the following error:
> 
> 	graph.c:1228: graph_output_collapsing_line: Assertion
> 		      `graph->mapping[i - 3] == target' failed.
> 
> The situation is a little complicated, so let's break it down.

First off, thanks for digging into this so promptly. Your solution looks correct to me. Everything else I'll mention here are nits. :)

Your commit message starts off talking about the test, but without describing what's interesting about it. I think the answer is that we have two "skewed" merge parents for the same merge; maybe it would make sense to lead with that. I.e.:

  Subject: graph: drop assert() for merge with two collapsing parents
  When "git log --graph" shows a merge commit that has two collapsing
  lines, like:
    [your diagram]
  we trigger an assert():
    graph.c:1228: graph_output_collapsing_line: Assertion
                  `graph->mapping[i - 3] == target' failed.
  ...and so on...
> The assert was introduced by eaf158f8 ("graph API: Use horizontal
> lines for more compact graphs", 2009-04-21), which is quite old.
> This assert is trying to say that when we complete a horizontal
> line with a single slash, it is because we have reached our target.

Thanks for this final sentence; writing that out in English made the purpose of the assert() much clearer.

That could perhaps be an argument in favor of writing it as a BUG() with a similar human-readable explanation. I guess there was already a comment in the code, but it didn't quite click with me as much as what you wrote above.

> It is actually the _second_ collapsing line that hits this assert.
> The reason we are in this code path is because we are collapsing
> the first line, and it in that case we are hitting our target now
s/it//
Show 5 quoted lines
> that the horizontal line is complete. However, the second line
> cannot be a horizontal line, so it will collapse without horizontal
> lines. In this case, it is inappropriate to assert that we have
> reached our target, as we need to continue for another column
> before reaching the target. Dropping the assert is safe here.

I think that makes sense. My big concern here is that the assert() was preventing us from looking out of bounds in the graph->mapping array, but I don't think that's the case here.

Worth mentioning that this was due to 0f0f389f12 (graph: tidy up display of left-skewed merges, 2019-10-15), in case somebody has to later dig deeper?

Show 5 quoted lines
> Second, the horizontal lines in that first line drop their coloring.
> This is due to a use of graph_line_addch() instead of
> graph_line_write_column(). Using a ternary operator to pick the
> character is nice for compact code, but we actually need a column
> to provide the color.

It seems like this is a totally separate bug, and could be its own commit?

I think it's also caused by 0f0f389f12, which actually introduced the seen_parent mechanism that you're correcting here.

> Helped-by: Jeff King <peff@peff.net>
> Reported-by: Bradley Smith <brad@brad-smith.co.uk>
I don't know that I did much, but OK. :)
Thanks once again Bradley for the reproducible case.
Show 9 quoted lines
> diff --git a/t/t4215-log-skewed-merges.sh b/t/t4215-log-skewed-merges.sh
> index 18709a723e..ddf6f6f5d3 100755
> --- a/t/t4215-log-skewed-merges.sh
> +++ b/t/t4215-log-skewed-merges.sh
> @@ -240,4 +240,46 @@ test_expect_success 'log --graph with octopus merge with column joining its penu
>  	EOF
>  '
>  
> +test_expect_success 'log --graph with multiple tips' '

This nicely covers the assert() problem. Could we check the same case with "--color" and test_decode_color to check the coloring issue (see t4214 for some prior art)?

-Peff
Previous: Derrick Stolee via GitGitGadgetNext: Derrick Stolee
Message 7 of 24 in “Fix two bugs in graph.c”
  1. 0/3 Fix two bugs in graph.cDerrick Stolee via GitGitGadget, Jan 7, 2020
  2. 2/3 graph: replace assert() with graph_assert() macroDerrick Stolee via GitGitGadget, Jan 7, 2020
  3. Jeff KingJan 7, 2020
  4. Eric SunshineJan 7, 2020
  5. Derrick StoleeJan 7, 2020
  6. 1/3 graph: fix case that hit assert()Derrick Stolee via GitGitGadget, Jan 7, 2020
  7. Jeff KingJan 7, 2020
  8. Derrick StoleeJan 7, 2020
  9. Junio C HamanoJan 7, 2020
  10. Jeff KingJan 7, 2020
  11. Junio C HamanoJan 7, 2020
  12. 3/3 t4215: add bigger graph collapse testDerrick Stolee via GitGitGadget, Jan 7, 2020
  13. Jeff KingJan 7, 2020
  14. Junio C HamanoJan 7, 2020
  15. Jeff KingJan 7, 2020
  16. Derrick StoleeJan 7, 2020
  17. Junio C HamanoJan 7, 2020
  18. 0/2 Fix two bugs in graph.cDerrick Stolee via GitGitGadget, Jan 7, 2020
  19. 1/2 graph: fix case that hit assert()Derrick Stolee via GitGitGadget, Jan 7, 2020
  20. Junio C HamanoJan 7, 2020
  21. Junio C HamanoJan 8, 2020
  22. Derrick StoleeJan 8, 2020
  23. 2/2 graph: fix lack of color in horizontal linesDerrick Stolee via GitGitGadget, Jan 7, 2020
  24. Junio C HamanoJan 7, 2020

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.