"GOT", but the "O" is a cute, smiling pufferfish. Index | Thread | Search

From:
Mark Jamsek <mark@jamsek.com>
Subject:
Re: got rebase or diff library bug
To:
Mark Jamsek <mark@jamsek.com>
Cc:
Christian Weisgerber <naddy@mips.inka.de>, gameoftrees@openbsd.org
Date:
Mon, 05 Aug 2024 22:26:13 +1000

Download raw body.

Thread
Mark Jamsek <mark@jamsek.com> wrote:
> Christian Weisgerber <naddy@mips.inka.de> wrote:
> > Christian Weisgerber:
> > 
> > > It also fixes my original problem.  I rebased the llvm18 branch in
> > > my repository and the GCNRegPressure.cpp file survived unscathed.
> > 
> > Wait, no, it gained a trailing '\n':
> 
> Thanks, naddy! I was worried about that case.
> 
> I'll see if if I can come up with a minimal repro and a proper fix.

I've not yet managed to produce a minimal reproduction of your llvm case
such that the trailing newline is appended with the previous diff, but
I'm pretty sure I know why it's happening: it's because the ed script is
not necessarily generated in order so we end up unsetting no_eofnl.

If I'm right, the below diff should now work with your llvm merge and
it's still working with the simple hello\nworld\n+fubarEOF case.

Please let me know if GCNRegPressure.cpp still survives your llvm rebase
unscathed and without gaining the trailing '\n', and I'll keep working
on a minimal test case for it too. Thanks, naddy!


diffstat f997e889eb0517a24a28f2f4000d6915683fef86 de493b727770ab0c07070cc9aff938371f4e4132
 M  lib/diff3.c  |  17+  0-

1 file changed, 17 insertions(+), 0 deletions(-)

diff f997e889eb0517a24a28f2f4000d6915683fef86 de493b727770ab0c07070cc9aff938371f4e4132
commit - f997e889eb0517a24a28f2f4000d6915683fef86
commit + de493b727770ab0c07070cc9aff938371f4e4132
blob - c1ca2fdf44d461cda6adb950263ed6a9775971ac
blob + 870a8eac2fb905a8f66de48e38c247aa970d2c5e
--- lib/diff3.c
+++ lib/diff3.c
@@ -155,6 +155,8 @@ struct diff3_state {
 
 	char *buf;
 
+	int no_eofnl;		/* set if the merged file has no eof newline */
+
 	BUF *diffbuf;
 };
 
@@ -417,6 +419,10 @@ out:
 			err = got_error_from_errno("fclose");
 	}
 	if (err == NULL && diffb) {
+		dlen = buf_len(diffb);
+		if (d3s->no_eofnl && dlen > 0 &&
+		    buf_getc(diffb, dlen - 1) == '\n')
+			--diffb->cb_len;
 		if (buf_write_fd(diffb, outfd) < 0)
 			err = got_error_from_errno("buf_write_fd");
 		*overlapcnt = d3s->overlapcnt;
@@ -1063,6 +1069,17 @@ edscript(int n, struct diff3_state *d3s)
 		}
 
 		if (!d3s->overlap[n]) {
+			size_t len;
+
+			len = buf_len(d3s->diffbuf);
+			if (len > 0) {
+				if (buf_getc(d3s->diffbuf, len - 1) != '\n') {
+					err = buf_putc(d3s->diffbuf, '\n');
+					if (err != NULL)
+						goto done;
+					d3s->no_eofnl = 1;
+				}
+			}
 			err = diff_output(d3s->diffbuf, ".\n");
 			if (err)
 				goto done;


-- 
Mark Jamsek <https://bsdbox.org>
GPG: F2FF 13DE 6A06 C471 CA80  E6E2 2930 DC66 86EE CF68