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

[PATCH 05/15] pretty: extend pretty_print_context with callback

From
Ramkumar Ramachandra <artagnon@gmail.com>
Date
Jun 4, 2013, 12:35 UTC
Message-ID
<1370349337-20938-6-git-send-email-artagnon@gmail.com>
In-Reply-To
<1370349337-20938-1-git-send-email-artagnon@gmail.com>
From: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>

The struct pretty_print_context contains the context in which the placeholders in format_commit_one() should be parsed. Although format_commit_one() primarily acts as a parser, there is no way for a caller to plug in custom callbacks. Now, callers can:

1. Parse a custom placeholder that is not supported by
   format_commit_one(), and act on it independently of the pretty
   machinery.
2. Parse a custom placeholder to substitute the custom placeholder with
   a placeholder that format_commit_one() understands.  This is
   especially useful for supporting %>(*), where * is substituted with a
   length computed by the caller.

To support these two usecases, the interface for the function looks like:

typedef size_t (*format_message_fn)(struct strbuf *sb,
				const char *placeholder,
				void *format_context,
				void *user_data,
				struct strbuf *placeholder_subst)

It is exactly like format_commit_one(), except that there are two additional fields: user_data (to pass custom data to the callback), and placeholder_subst (to set the substitution). The callback should return the length of the original string parsed, and optionally set placeholder_subst.

[rr: commit message, minor modifications]
Signed-off-by: Ramkumar Ramachandra <artagnon@gmail.com>
---
 commit.h |  8 ++++++++
 pretty.c | 25 +++++++++++++++++++++++++
 2 files changed, 33 insertions(+)
diff --git a/commit.h b/commit.h
index 67bd509..04bd935 100644
--- a/commit.h
+++ b/commit.h
@@ -78,6 +78,12 @@ enum cmit_fmt {
 	CMIT_FMT_UNSPECIFIED
 };
 
+typedef size_t (*format_message_fn)(struct strbuf *sb,
+				const char *placeholder,
+				void *format_context,
+				void *user_data,
+				struct strbuf *placeholder_subst);
+
 struct pretty_print_context {
 	enum cmit_fmt fmt;
 	int abbrev;
@@ -92,6 +98,8 @@ struct pretty_print_context {
 	const char *output_encoding;
 	struct string_list *mailmap;
 	int color;
+	format_message_fn format;
+	void *user_data;
 };
 
 struct userformat_want {
diff --git a/pretty.c b/pretty.c
index 9e43154..095e5ba 100644
--- a/pretty.c
+++ b/pretty.c
@@ -1069,6 +1069,31 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
 	struct commit_list *p;
 	int h1, h2;
 
+	if (c->pretty_ctx->format) {
+		struct strbuf subst = STRBUF_INIT;
+		int ret = c->pretty_ctx->format(sb, placeholder, context,
+						c->pretty_ctx->user_data,
+						&subst);
+		if (ret && subst.len) {
+			/*
+			 * Something was parsed by format(), and a
+			 * placeholder-substitution was set.
+			 * Recursion is required to override the
+			 * return value of format_commit_one() with
+			 * ret: the length of the original string
+			 * before substitution.
+			 */
+			ret = format_commit_one(sb, subst.buf, context) ? ret : 0;
+			strbuf_release(&subst);
+			return ret;
+		} else if (ret)
+			/*
+			 * Something was parsed by format(), but
+			 * no placeholder-substitution was set.
+			 */
+			return ret;
+	}
+
 	/* these are independent of the commit */
 	switch (placeholder[0]) {
 	case 'C':
-- 
1.8.3.GIT
Previous: Ramkumar RamachandraNext: Ramkumar Ramachandra
Message 8 of 30 in “Towards a more awesome git-branch”
  1. 00/15 Towards a more awesome git-branchRamkumar Ramachandra, Jun 4, 2013
  2. 01/15 for-each-ref, quote: convert *_quote_print -> *_quote_bufRamkumar Ramachandra, Jun 4, 2013
  3. 02/15 for-each-ref: don't print out elements directlyRamkumar Ramachandra, Jun 4, 2013
  4. Junio C HamanoJun 4, 2013
  5. Duy NguyenJun 4, 2013
  6. 03/15 tar-tree: remove dependency on sq_quote_print()Ramkumar Ramachandra, Jun 4, 2013
  7. 04/15 quote: remove sq_quote_print()Ramkumar Ramachandra, Jun 4, 2013
  8. 05/15 pretty: extend pretty_print_context with callbackRamkumar Ramachandra, Jun 4, 2013
  9. 06/15 pretty: limit recursion in format_commit_one()Ramkumar Ramachandra, Jun 4, 2013
  10. 07/15 pretty: allow passing NULL commit to format_commit_message()Ramkumar Ramachandra, Jun 4, 2013
  11. 08/15 for-each-ref: get --pretty using format_commit_messageRamkumar Ramachandra, Jun 4, 2013
  12. Eric SunshineJun 4, 2013
  13. Duy NguyenJun 5, 2013
  14. Junio C HamanoJun 5, 2013
  15. Duy NguyenJun 6, 2013
  16. 09/15 for-each-ref: teach verify_format() about pretty's syntaxRamkumar Ramachandra, Jun 4, 2013
  17. 10/15 for-each-ref: introduce format specifier %>(*) and %<(*)Ramkumar Ramachandra, Jun 4, 2013
  18. Duy NguyenJun 4, 2013
  19. Ramkumar RamachandraJun 5, 2013
  20. Duy NguyenJun 5, 2013
  21. 11/15 for-each-ref: introduce %(HEAD) markerRamkumar Ramachandra, Jun 4, 2013
  22. 12/15 for-each-ref: introduce %(upstream:track[short])Ramkumar Ramachandra, Jun 4, 2013
  23. Eric SunshineJun 4, 2013
  24. 13/15 for-each-ref: improve responsiveness of %(upstream:track)Ramkumar Ramachandra, Jun 4, 2013
  25. 14/15 pretty: introduce get_pretty_userformatRamkumar Ramachandra, Jun 4, 2013
  26. 15/15 for-each-ref: use get_pretty_userformat in --prettyRamkumar Ramachandra, Jun 4, 2013
  27. Duy NguyenJun 4, 2013
  28. Eric SunshineJun 4, 2013
  29. Duy NguyenJun 4, 2013
  30. Ramkumar RamachandraJun 5, 2013

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.