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

[PATCH 4/6 v2] Emit a whole line once a time.

From
Bo Yang <struggleyb.nku@gmail.com>
Date
May 20, 2010, 10:25 UTC
Message-ID
<1274351138-11813-5-git-send-email-struggleyb.nku@gmail.com>
In-Reply-To
<1274351138-11813-4-git-send-email-struggleyb.nku@gmail.com>

Use a strbuf to compose the whole line, and then call emit_line to output it once. This make output_prefix callback works well.

Signed-off-by: Bo Yang <struggleyb.nku@gmail.com>
---
 diff.c |   34 +++++++++++++++++++++++++++++-----
 1 files changed, 29 insertions(+), 5 deletions(-)
diff --git a/diff.c b/diff.c
index 5d1b7b5..69c15a6 100644
--- a/diff.c
+++ b/diff.c
@@ -370,6 +370,18 @@ static void emit_hunk_header(struct emit_callback *ecbdata,
 	const char *reset = diff_get_color(ecbdata->color_diff, DIFF_RESET);
 	static const char atat[2] = { '@', '@' };
 	const char *cp, *ep;
+	struct strbuf msgbuf = STRBUF_INIT;
+	int org_len = len;
+
+	/*
+	 * trailing \r\n
+	 */
+	int i = 1;
+	for (; i < 3; i++) {
+		if (line[len - i] == '\r' || line[len - i] == '\n') {
+			len --;
+		}
+	}
 
 	/*
 	 * As a hunk header must begin with "@@ -<old>, +<new> @@",
@@ -384,17 +396,29 @@ static void emit_hunk_header(struct emit_callback *ecbdata,
 	ep += 2; /* skip over @@ */
 
 	/* The hunk header in fraginfo color */
-	emit_line(ecbdata->opt, frag, reset, line, ep - line);
+	strbuf_add(&msgbuf, frag, strlen(frag));
+	strbuf_add(&msgbuf, line, ep - line);
+	strbuf_add(&msgbuf, reset, strlen(reset));
 
 	/* blank before the func header */
 	for (cp = ep; ep - line < len; ep++)
 		if (*ep != ' ' && *ep != '\t')
 			break;
-	if (ep != cp)
-		emit_line(ecbdata->opt, plain, reset, cp, ep - cp);
+	if (ep != cp) {
+		strbuf_add(&msgbuf, plain, strlen(plain));
+		strbuf_add(&msgbuf, cp, ep - cp);
+		strbuf_add(&msgbuf, reset, strlen(reset));
+	}
+
+	if (ep < line + len) {
+		strbuf_add(&msgbuf, func, strlen(func));
+		strbuf_add(&msgbuf, ep, line + len - ep);
+		strbuf_add(&msgbuf, reset, strlen(reset));
+	}
 
-	if (ep < line + len)
-		emit_line(ecbdata->opt, func, reset, ep, line + len - ep);
+	strbuf_add(&msgbuf, line + len, org_len - len);
+	emit_line(ecbdata->opt, "", "", msgbuf.buf, msgbuf.len);
+	strbuf_release(&msgbuf);
 }
 
 static struct diff_tempfile *claim_diff_tempfile(void) {
-- 
1.6.0.4
Previous: Bo YangNext: Bo Yang
Message 5 of 10 in “Make git log --graph looks better with -p and other diff options”
  1. 0/6 Make git log --graph looks better with -p and other diff optionsBo Yang, May 20, 2010
  2. 1/6 Add a prefix output callback to diff output.Bo Yang, May 20, 2010
  3. 2/6 Output the graph columns at the end of the commit message.Bo Yang, May 20, 2010
  4. 3/6 diff.c: Output the text graph padding before each diff line.Bo Yang, May 20, 2010
  5. 4/6 Emit a whole line once a time.Bo Yang, May 20, 2010
  6. 5/6 Register a callback for graph output.Bo Yang, May 20, 2010
  7. 6/6 Make --color-words work well with --graph.Bo Yang, May 20, 2010
  8. Jeff KingMay 20, 2010
  9. Jeff KingMay 20, 2010
  10. Bo YangMay 21, 2010

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.