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 <redacted>
---
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