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

[PATCH 09/15] for-each-ref: teach verify_format() about pretty's syntax

From
Ramkumar Ramachandra <artagnon@gmail.com>
Date
Jun 4, 2013, 12:35 UTC
Message-ID
<1370349337-20938-10-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>

Pretty format accepts either ' ', '+' or '-' after '%' and before the placeholder name to modify certain behaviors. Teach verify_format() about this so that it finds atom "upstream" in, for example, '% (upstream)'. This is important because verify_format populates used_atom, which get_value() and populate_value() later rely on.

Signed-off-by: Ramkumar Ramachandra <artagnon@gmail.com>
---
 builtin/for-each-ref.c | 15 +++++++++------
 pretty.c               |  4 ++++
 2 files changed, 13 insertions(+), 6 deletions(-)
diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c
index 576a882..f8a3880 100644
--- a/builtin/for-each-ref.c
+++ b/builtin/for-each-ref.c
@@ -150,7 +150,7 @@ static int parse_atom(const char *atom, const char *ep)
 /*
  * In a format string, find the next occurrence of %(atom).
  */
-static const char *find_next(const char *cp)
+static const char *find_next(const char *cp, int pretty)
 {
 	while (*cp) {
 		if (*cp == '%') {
@@ -160,6 +160,9 @@ static const char *find_next(const char *cp)
 			 */
 			if (cp[1] == '(')
 				return cp;
+			else if (pretty && cp[1] && cp[2] == '(' &&
+				 strchr(" +-", cp[1])) /* see format_commit_item() */
+				return cp + 1;
 			else if (cp[1] == '%')
 				cp++; /* skip over two % */
 			/* otherwise this is a singleton, literal % */
@@ -173,10 +176,10 @@ static const char *find_next(const char *cp)
  * Make sure the format string is well formed, and parse out
  * the used atoms.
  */
-static int verify_format(const char *format)
+static int verify_format(const char *format, int pretty)
 {
 	const char *cp, *sp;
-	for (cp = format; *cp && (sp = find_next(cp)); ) {
+	for (cp = format; *cp && (sp = find_next(cp, pretty)); ) {
 		const char *ep = strchr(sp, ')');
 		if (!ep)
 			return error("malformed format string %s", sp);
@@ -935,7 +938,7 @@ static void show_ref(struct strbuf *sb, struct refinfo *info,
 {
 	const char *cp, *sp, *ep;
 
-	for (cp = format; *cp && (sp = find_next(cp)); cp = ep + 1) {
+	for (cp = format; *cp && (sp = find_next(cp, 0)); cp = ep + 1) {
 		ep = strchr(sp, ')');
 		if (cp < sp)
 			emit(sb, cp, sp);
@@ -1093,8 +1096,8 @@ int cmd_for_each_ref(int argc, const char **argv, const char *prefix)
 	}
 	if (format != default_format && pretty)
 		die("--format and --pretty cannot be used together");
-	if ((pretty && verify_format(pretty)) ||
-	    (!pretty && verify_format(format)))
+	if ((pretty && verify_format(pretty, 1)) ||
+	    (!pretty && verify_format(format, 0)))
 		usage_with_options(for_each_ref_usage, opts);
 
 	if (!sort)
diff --git a/pretty.c b/pretty.c
index 816aa32..28c0a72 100644
--- a/pretty.c
+++ b/pretty.c
@@ -1439,6 +1439,10 @@ static size_t format_commit_item(struct strbuf *sb, /* in UTF-8 */
 		ADD_SP_BEFORE_NON_EMPTY
 	} magic = NO_MAGIC;
 
+	/*
+	 * Note: any modification in what placeholder[0] contains
+	 * should be redone in builtin/for-each-ref.c:find_next().
+	 */
 	switch (placeholder[0]) {
 	case '-':
 		magic = DEL_LF_BEFORE_EMPTY;
-- 
1.8.3.GIT
Previous: Duy NguyenNext: Ramkumar Ramachandra
Message 16 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.