From f1f4c2886e07d8a376c34cd958eea1534ee5f96e Mon Sep 17 00:00:00 2001 From: Akshay Joshi Date: Mon, 16 Feb 2026 16:39:08 +0530 Subject: [PATCH] Fix pgindent to ensure files end with a trailing newline. If a source file is missing a trailing newline, pg_bsd_indent now adds one. The fill_buffer() function already adds a synthetic newline at EOF; this change ensures that newline is emitted to the output rather than being suppressed. Author: Akshay Joshi Reviewed-by: Andrew Dunstan --- src/tools/pg_bsd_indent/lexi.c | 29 +++++++++++++++---- .../pg_bsd_indent/tests/no_trailing_newline.0 | 4 +++ .../tests/no_trailing_newline.0.stdout | 6 ++++ 3 files changed, 33 insertions(+), 6 deletions(-) create mode 100644 src/tools/pg_bsd_indent/tests/no_trailing_newline.0 create mode 100644 src/tools/pg_bsd_indent/tests/no_trailing_newline.0.stdout diff --git a/src/tools/pg_bsd_indent/lexi.c b/src/tools/pg_bsd_indent/lexi.c index 943bf7ce6b0..b026fef6fca 100644 --- a/src/tools/pg_bsd_indent/lexi.c +++ b/src/tools/pg_bsd_indent/lexi.c @@ -453,12 +453,29 @@ lexi(struct parser_state *state) case '\n': unary_delim = state->last_u_d; state->last_nl = true; /* remember that we just had a newline */ - code = (had_eof ? 0 : newline); - - /* - * if data has been exhausted, the newline is a dummy, and we should - * return code to stop - */ + { + /* + * Ensure we output exactly one newline at EOF: either the file's real + * trailing newline, or the synthetic one added by fill_buffer() if the + * file was missing one. + */ + static bool final_newline_done = false; + + if (had_eof) + { + if (final_newline_done) + code = 0; /* already emitted final newline, stop now */ + else + { + code = newline; + final_newline_done = true; + } + } + else + { + code = newline; + } + } break; case '\'': /* start of quoted character */ diff --git a/src/tools/pg_bsd_indent/tests/no_trailing_newline.0 b/src/tools/pg_bsd_indent/tests/no_trailing_newline.0 new file mode 100644 index 00000000000..3233990e11f --- /dev/null +++ b/src/tools/pg_bsd_indent/tests/no_trailing_newline.0 @@ -0,0 +1,4 @@ +/* Test: file without trailing newline */ +void test(void) { +int x = 1; +} \ No newline at end of file diff --git a/src/tools/pg_bsd_indent/tests/no_trailing_newline.0.stdout b/src/tools/pg_bsd_indent/tests/no_trailing_newline.0.stdout new file mode 100644 index 00000000000..c632d62f16c --- /dev/null +++ b/src/tools/pg_bsd_indent/tests/no_trailing_newline.0.stdout @@ -0,0 +1,6 @@ +/* Test: file without trailing newline */ +void +test(void) +{ + int x = 1; +} -- 2.51.0