git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[GSoC PATCH 1/1] diff: improve scaling of filenames in diffstat to handle UTF-8 chars

From
LorenzoPegorari <lorenzo.pegorari2002@gmail.com>
Date
Jan 14, 2026, 22:27 UTC
Message-ID
<aWgYRkv-YsuekdR_@lorenzo-VM>

The `show_stats()` function tries to scale the filenames in the diffstat to ensure they don't exceed the given `name-width`. It does so by calculating the "display width" of the characters to be dropped, but then advances the filename pointer by that number of bytes.

However, the "display width" of a character is not always equal to its byte count. The result is that sometimes, when displaying UTF-8 characters, filenames exceed the given `name-width`, and frequently the bytes of the UTF-8 characters are truncated.

The following is an example of the issue, where the 2 files are "HelloHi" and "Hello你好", and `name-width=6`:

    ...oHi | 0
    ...<BD><A0>好 | 0

Make the filename pointer move by the actual number of bytes of the characters to drop from the filename, rather than their display width, using the `utf8_width()` function.

Signed-off-by: LorenzoPegorari <lorenzo.pegorari2002@gmail.com>
---
 diff.c | 15 ++++-----------
 1 file changed, 4 insertions(+), 11 deletions(-)
diff --git a/diff.c b/diff.c
index a68ddd2168..271ace5728 100644
--- a/diff.c
+++ b/diff.c
@@ -2859,17 +2859,10 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options)
 			char *slash;
 			prefix = "...";
 			len -= 3;
-			/*
-			 * NEEDSWORK: (name_len - len) counts the display
-			 * width, which would be shorter than the byte
-			 * length of the corresponding substring.
-			 * Advancing "name" by that number of bytes does
-			 * *NOT* skip over that many columns, so it is
-			 * very likely that chomping the pathname at the
-			 * slash we will find starting from "name" will
-			 * leave the resulting string still too long.
-			 */
-			name += name_len - len;
+
+			while (name_len > len)
+				name_len -= utf8_width((const char**)&name, NULL);
+
 			slash = strchr(name, '/');
 			if (slash)
 				name = slash;
-- 
2.43.0
Next: Junio C Hamano
Message 1 of 7 in “diff: improve scaling of filenames in diffstat to handle UTF-8 chars”
  1. 1/1 diff: improve scaling of filenames in diffstat to handle UTF-8 charsLorenzoPegorari, Jan 14, 2026
  2. Junio C HamanoJan 14, 2026
  3. Lorenzo PegorariJan 16, 2026
  4. 0/2 diff: improve scaling of filenames in diffstat to handle UTF-8 charsLorenzoPegorari, Jan 16, 2026
  5. 1/2 diff: improve scaling of filenames in diffstat to handle UTF-8 charsLorenzoPegorari, Jan 16, 2026
  6. 2/2 t4073: add test for diffstat paths length when containing UTF-8 charsLorenzoPegorari, Jan 16, 2026
  7. Junio C HamanoJan 17, 2026

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.