Subject: Re: bug#53343: 29.0.50; assertion failure in diff--iterate-hunks

From: Stephen Berman <[email-masked]>
Date: Tue, 18 Jan 2022 13:20:18 +0100

On Tue, 18 Jan 2022 12:02:17 +0100 Stephen Berman <[email-masked]> wrote:

> Trying to view in Gnus an attached and buttonized diff in a certain
> article raises an assertion failure.  To reproduce:
>
> 0. emacs -Q
> 1. M-x gnus
> 2. Type `y' at prompt
> 3. Type `B RET news.gmane.io RET'
> 4. Type `C-s gmane.emacs.bugs RET RET'
> 5. Type `1 RET' at prompt
> 6. Type `j' and enter `<[email-masked]> RET' at the prompt
> 7. Click on the Options menu and check "Enter Debugger on Error"
> 8. Type `2 b'
> =>
> Debugger entered--Lisp error: (cl-assertion-failed ((looking-at diff-hunk-header-re) nil))
[...]
> The assertion fails when point is at the beginning of the last line in
> the following excerpt from the diff (in buffer " *temp*")
>
>   *** /var/home/janstranik/src/emacs-27.2/lib-src/ebrowse.c~	2021-01-28 11:52:16.000000000 -0600
>   --- /var/home/janstranik/src/emacs-27.2/lib-src/ebrowse.c	2021-09-24 09:31:49.136287028 -0500
>   ***************
>   *** 1924,1931 ****
>
> This happens because diff-beginning-of-hunk calls re-search-forward on
> diff-hunk-header-re, which puts point at the end the line "*** 1924,1931
> ****" and then calls (forward-line 0), putting point at the beginning of
> that line.  But then (looking-at diff-hunk-header-re) returns nil,
> raising the assertion in diff--iterate-hunks.  Replacing (forward-line
> 0) in diff-beginning-of-hunk with (forward-line -1) makes the assertion
> succeed.
>
> I'm not sure if this is a bug or if the diff is malformed.  But evidence
> that the diff is not malformed is that if the diff in the article is
> saved to a file (by typing `2 K o' in the *Summary* buffer), then
> visiting that file in diff-mode with -Q does not raise an assertion
> failure.

On the other hand, I get the assertion failure with the above recipe in
emacs-28 and emacs-27, and it seems unlikely that such a bug in
diff-mode would have gone unnoticed till now, so maybe the diff is
malformed.  (Though if so, why does the failure not happen when visiting
the file containing the diff?)

Steve Berman