Subject: [PATCH 0/2] line-log: small fixes

From: SZEDER Gábor <[email-masked]>
Date: Mon, 18 Aug 2025 13:13:08 +0200

On Thu, May 02, 2024 at 09:29:04PM +0300, Evgeni Chasnovski wrote:
> Calling `git log` with several `-L` flags can result in an error.
> 
> Steps to reproduce (on Linux):
> - Set up repo with a history:
>     - `mkdir log-line-assert`
>     - `cd log-line-assert`
>     - `git init`
>     - `echo "Line 1\nLine 2" > file`
>     - `git add .`
>     - `git commit -m 'Commit 1'`
>     - `echo "Line 3\nLine 4\nLine 5" >> file`
>     - `git add .`
>     - `git commit -m 'Commit 2'`
> - Execute the following command: `git log -L2,2:file -L4,4:file`
> 
> # What did you expect to happen? (Expected behavior)
> 
> Show log with evolution of lines 2 and 4.
> 
> # What happened instead? (Actual behavior)
> 
> An error with the following text:
> 
> ```
> git: line-log.c:73: range_set_append: Assertion `rs->nr == 0 ||
> rs->ranges[rs->nr-1].end <= a' failed.
> zsh: IOT instruction (core dumped)  git log -L2,2:file -L4,4:file
> ```

Thanks for reporting this issue!

As it turns out, merely specifying more than one line range is
insufficient to trigger this assertion error, we need a rather specific
interaction between the line numbers of two line ranges and a diff range.

The first patch fixes this issue, along with a couple of similar bugs to
make that command really work, because once the assertion error was fixed
we ended up in an endless loop, and once that was fixed the output was
wrong...

The second patch fixes another line-log output issue that I just happened
to stumble upon while testing the fixes in the first patch.

SZEDER Gábor (2):
  line-log: fix assertion error
  line-log: show all line ranges touched by the same diff range

 line-log.c                               | 15 +++-
 t/t4211-line-log.sh                      |  2 +
 t/t4211/sha1/expect.multiple             |  6 ++
 t/t4211/sha1/expect.no-assertion-error   | 90 ++++++++++++++++++++++++
 t/t4211/sha1/expect.two-ranges           |  6 ++
 t/t4211/sha256/expect.multiple           |  6 ++
 t/t4211/sha256/expect.no-assertion-error | 90 ++++++++++++++++++++++++
 t/t4211/sha256/expect.two-ranges         |  6 ++
 8 files changed, 218 insertions(+), 3 deletions(-)
 create mode 100644 t/t4211/sha1/expect.no-assertion-error
 create mode 100644 t/t4211/sha256/expect.no-assertion-error

-- 
2.51.0.rc2.346.g6515629ae9