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

[PATCH 3/3] Add "%w" to pretty formats, which rewraps the commit message

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
Sep 23, 2009, 20:34 UTC
Message-ID
<alpine.DEB.1.00.0909232233590.4985@pacific.mpi-cbg.de>
In-Reply-To
<alpine.DEB.1.00.0909232233330.4985@pacific.mpi-cbg.de>

Some repositories contain commit messages that are insanely long. And not always is it an option to rewrite the commits with rewrapped commit messages; just think of cvsimports or some such.

Now here is a remedy.

With "--pretty=format:%w(8,6,70)" you will get the commit messages reformatted to width 70 where the first line has indent 8 and the subsequent lines have indent 6.

The following command will output something similar to plain "git log --color", except that the commit bodies will be rewrapped to fit inside 80 columns:

	git log --pretty=format:'%C(yellow)commit %H%C(reset)
	Author: %an <%ae>
	Date: %ad
	%w(4,4,80)'
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 Documentation/pretty-formats.txt |    1 +
 pretty.c                         |   27 +++++++++++++++++++++++++++
 2 files changed, 28 insertions(+), 0 deletions(-)
diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt
index 2a845b1..d727995 100644
--- a/Documentation/pretty-formats.txt
+++ b/Documentation/pretty-formats.txt
@@ -123,6 +123,7 @@ The placeholders are:
 - '%s': subject
 - '%f': sanitized subject line, suitable for a filename
 - '%b': body
+- '%w(indent,indent2,width)': rewrapped subject and body
 - '%Cred': switch color to red
 - '%Cgreen': switch color to green
 - '%Cblue': switch color to blue
diff --git a/pretty.c b/pretty.c
index f5983f8..639469e 100644
--- a/pretty.c
+++ b/pretty.c
@@ -595,6 +595,30 @@ static void format_decoration(struct strbuf *sb, const struct commit *commit)
 		strbuf_addch(sb, ')');
 }
 
+static int rewrap_text(struct strbuf *sb, const char *params, const char *text)
+{
+	int indent = 4, indent2 = 4, width = 80, pacmanned = 1;
+
+	if (params[0] == '(') {
+		char *p;
+
+		indent = strtoul(params + 1, &p, 0);
+		if (*p == ',') {
+			indent2 = strtoul(p + 1, &p, 0);
+			if (*p == ',')
+				width = strtoul(p + 1, &p, 0);
+		}
+		if (*p != ')') {
+			error ("Invalid parameters: %.*s",
+					(int)(p - params), params);
+			return 0;
+		}
+		pacmanned = p + 1 - params;
+	}
+	strbuf_add_wrapped_text(sb, text, indent, indent2, width);
+	return pacmanned;
+}
+
 static size_t format_commit_item(struct strbuf *sb, const char *placeholder,
                                void *context)
 {
@@ -735,6 +759,9 @@ static size_t format_commit_item(struct strbuf *sb, const char *placeholder,
 	case 'b':	/* body */
 		strbuf_addstr(sb, msg + c->body_off);
 		return 1;
+	case 'w':	/* re-wrapped body */
+		return rewrap_text(sb, placeholder + 1,
+				msg + c->subject_off) + 1;
 	}
 	return 0;	/* unknown placeholder */
 }
-- 
1.6.4.297.gcb4cc
Previous: Johannes SchindelinNext: Johannes Gilger
Message 11 of 18 in “git-log --format: Add %B tag with %B(x) option”
  1. git-log --format: Add %B tag with %B(x) optionJohannes Gilger, Sep 17, 2009
  2. Junio C HamanoSep 17, 2009
  3. [PATCHv2] git-log --format: Add %B tag with %B(x) optionJohannes Gilger, Sep 18, 2009
  4. Junio C HamanoSep 18, 2009
  5. [PATCHv3] git-log --format: Add %B tag with %B(x) optionJohannes Gilger, Sep 19, 2009
  6. Junio C HamanoSep 22, 2009
  7. [PATCHv4] git-log --format: Add %B tag with %B(n) optionJohannes Gilger, Sep 22, 2009
  8. 0/3 Add a pretty format to rewrapping/indenting commit messagesJohannes Schindelin, Sep 23, 2009
  9. 1/3 print_wrapped_text(): allow hard newlinesJohannes Schindelin, Sep 23, 2009
  10. 2/3 Add strbuf_add_wrapped_text() to utf8.[ch]Johannes Schindelin, Sep 23, 2009
  11. 3/3 Add "%w" to pretty formats, which rewraps the commit messageJohannes Schindelin, Sep 23, 2009
  12. Johannes GilgerSep 23, 2009
  13. Junio C HamanoSep 23, 2009
  14. Junio C HamanoOct 5, 2009
  15. Linus TorvaldsSep 24, 2009
  16. Johannes SchindelinSep 24, 2009
  17. Johannes SchindelinSep 25, 2009
  18. Junio C HamanoOct 10, 2009

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.