]> git.ipfire.org Git - thirdparty/git.git/commit - blame.c
blame: only coalesce lines that are adjacent in result
authorJeff King <peff@peff.net>
Thu, 13 Aug 2020 05:25:31 +0000 (01:25 -0400)
committerJunio C Hamano <gitster@pobox.com>
Thu, 13 Aug 2020 17:09:38 +0000 (10:09 -0700)
commitc2ebaa27d63bfb7c50cbbdaba90aee4efdd45d0a
treedd38a6b8ad2d204dd900f0a01fdb6a3b771bee11
parentdd7c6111647ecae2315b4f0ca039b92d32e0cadc
blame: only coalesce lines that are adjacent in result

After blame has finished but before we produce any output, we coalesce
groups of lines that were adjacent in the original suspect (which may
have been split apart by lines in intermediate commits which went away).
However, this can cause incorrect output if the lines are not also
adjacent in the result. For instance, the case in t8003 has:

  ABC
  DEF

which becomes

  ABC
  SPLIT
  DEF

Blaming only lines 1 and 3 in the result yields two blame groups (one
for each line) that were adjacent in the original. That's enough for us
to coalesce them into a single group, but that loses information: our
output routines assume they're adjacent in the result as well, and we
output:

  <oid> 1) ABC
  <oid> 2) SPLIT

This is nonsense for two reasons:

  - we were asked about line 3, not line 2; we should not output the
    SPLIT line at all

  - commit <oid> did not touch the SPLIT line at all! We found the
    correct blame for line 3, but the bug is actually in the output
    stage, which is showing the wrong line number and content from the
    final file.

We can fix this by only coalescing when both the suspect and result
lines are adjacent. That fixes this bug, but keeps coalescing in cases
where want it (e.g., the existing test in t8003 where SPLIT goes away,
and the lines really are adjacent in the result).

Reported-by: Nuthan Munaiah <nm6061@rit.edu>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
blame.c
t/t8003-blame-corner-cases.sh