Subject: [PATCH 7/6] pretty: trim trailing spaces due to padding

From: Nguyễn Thái Ngọc Duy <[email-masked]>
Date: Sat, 22 Sep 2012 11:26:40 +0700

TODO: should only be enabled explicitly to avoid unexpected trimming

Signed-off-by: Nguyễn Thái Ngọc Duy <[email-masked]>
---
 And I did not remember I was in interactive rebase mode when I made
 the series. This patch is for discussion only. My screen seems to
 flash (I think) printing trailing spaces.

 pretty.c          |  1 +
 strbuf.c          | 29 +++++++++++++++++++++++++++++
 strbuf.h          |  1 +
 t/t9010-svn-fe.sh |  2 +-
 4 files changed, 32 insertions(+), 1 deletion(-)

diff --git a/pretty.c b/pretty.c
index 6662f52..70f776b 100644
--- a/pretty.c
+++ b/pretty.c
@@ -1327,6 +1327,7 @@ void format_commit_message(const struct commit *commit,
 
 	strbuf_expand(sb, format, format_commit_item, &context);
 	rewrap_message_tail(sb, &context, 0, 0, 0);
+	delete_trailing_whitespace(sb);
 
 	if (context.message != commit->buffer)
 		free(context.message);
diff --git a/strbuf.c b/strbuf.c
index 0510f76..e001175 100644
--- a/strbuf.c
+++ b/strbuf.c
@@ -488,3 +488,32 @@ int fprintf_ln(FILE *fp, const char *fmt, ...)
 		return -1;
 	return ret + 1;
 }
+
+void delete_trailing_whitespace(struct strbuf *sb)
+{
+	char *src = sb->buf, *dst = sb->buf;
+	char *end = src + sb->len, *anchor = NULL;
+	while (src < end) {
+		if (*src == ' ') {
+			if (anchor)
+				src++;
+			else
+				anchor = src++;
+		} else if (*src == '\n') {
+			if (anchor) {
+				*dst++ = *src++;
+				anchor = NULL;
+			} else
+				*dst++ = *src++;
+		} else {
+			if (anchor) {
+				memcpy(dst, anchor, src - anchor);
+				dst += src - anchor;
+				anchor = NULL;
+			}
+			*dst++ = *src++;
+		}
+	}
+	sb->len = dst - sb->buf;
+	sb->buf[sb->len] = '\0';
+}
diff --git a/strbuf.h b/strbuf.h
index be941ee..75a8908 100644
--- a/strbuf.h
+++ b/strbuf.h
@@ -42,6 +42,7 @@ static inline void strbuf_setlen(struct strbuf *sb, size_t len) {
 extern void strbuf_trim(struct strbuf *);
 extern void strbuf_rtrim(struct strbuf *);
 extern void strbuf_ltrim(struct strbuf *);
+extern void delete_trailing_whitespace(struct strbuf *);
 extern int strbuf_cmp(const struct strbuf *, const struct strbuf *);
 
 extern struct strbuf **strbuf_split_buf(const char *, size_t,
diff --git a/t/t9010-svn-fe.sh b/t/t9010-svn-fe.sh
index b7eed24..b603e70 100755
--- a/t/t9010-svn-fe.sh
+++ b/t/t9010-svn-fe.sh
@@ -96,7 +96,7 @@ test_expect_failure PIPE 'empty revision' '
 
 test_expect_success PIPE 'empty properties' '
 	reinit_git &&
-	printf "rev <nobody, nobody@local>: %s\n" "" "" >expect &&
+	printf "rev <nobody, nobody@local>: %s\n" "" "" | sed "s/ *$//" >expect &&
 	cat >emptyprop.dump <<-\EOF &&
 	SVN-fs-dump-format-version: 3
 
-- 
1.7.12.1.384.g7b808e7