cgit

commit ad230267f8ecae6cb4f0da17d7a5f75ba38203e2

Author: Johan Herland <johan@herland.net>

ui-log: Line-wrap long commit subjects when showmsg is enabled

When showmsg is disabled ui-log truncates long commit subjects. This is good.
However, the same is not desirable when showmsg is enabled, since you then
end up with a truncated commit subject followed by the rest of the commit
message below.

Instead, when showmsg is enabled (and we're using all this space to display
the entire commit message, anyway), line-wrap the commit subject instead of
truncating it.

Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Lars Hjemli <hjemli@gmail.com>

 cmd.c | 3 ++-
 ui-log.c | 35 ++++++++++++++++++++++++++++++-----
 ui-log.h | 3 ++-
 ui-summary.c | 2 +-


diff --git a/cmd.c b/cmd.c
index 6dc9f5ea0757ff38d7bad5981279ca7ade2eec48..536515b7bb135dafefc5b5ed4e55c0dc7d2eb98a 100644
--- a/cmd.c
+++ b/cmd.c
@@ -67,7 +67,8 @@
 static void log_fn(struct cgit_context *ctx)
 {
 	cgit_print_log(ctx->qry.sha1, ctx->qry.ofs, ctx->cfg.max_commit_count,
-		       ctx->qry.grep, ctx->qry.search, ctx->qry.path, 1);
+		       ctx->qry.grep, ctx->qry.search, ctx->qry.path, 1,
+		       ctx->repo->enable_commit_graph);
 }
 
 static void ls_cache_fn(struct cgit_context *ctx)




diff --git a/ui-log.c b/ui-log.c
index 5cf66cbd0828d764f59a2b6b012e1a80eb9ff622..05b5c297bb9885f0421178eb698558a19d959abd 100644
--- a/ui-log.c
+++ b/ui-log.c
@@ -98,6 +98,7 @@ 	struct commitinfo *info;
 	char *tmp;
 	int cols = 2;
 	struct strbuf graphbuf = STRBUF_INIT;
+	struct strbuf msgbuf = STRBUF_INIT;
 
 	if (ctx.repo->enable_log_filecount) {
 		cols++;
@@ -136,6 +137,31 @@ 		strbuf_setlen(&graphbuf, 0);
 	}
 
 	htmlf("<td%s>", ctx.qry.showmsg ? " class='logsubject'" : "");
+	if (ctx.qry.showmsg) {
+		/* line-wrap long commit subjects instead of truncating them */
+		size_t subject_len = strlen(info->subject);
+
+		if (subject_len > ctx.cfg.max_msg_len &&
+		    ctx.cfg.max_msg_len >= 15) {
+			/* symbol for signaling line-wrap (in PAGE_ENCODING) */
+			const char wrap_symbol[] = { ' ', 0xE2, 0x86, 0xB5, 0 };
+			int i = ctx.cfg.max_msg_len - strlen(wrap_symbol);
+
+			/* Rewind i to preceding space character */
+			while (i > 0 && !isspace(info->subject[i]))
+				--i;
+			if (!i) /* Oops, zero spaces. Reset i */
+				i = ctx.cfg.max_msg_len - strlen(wrap_symbol);
+
+			/* add remainder starting at i to msgbuf */
+			strbuf_add(&msgbuf, info->subject + i, subject_len - i);
+			strbuf_trim(&msgbuf);
+			strbuf_add(&msgbuf, "\n\n", 2);
+
+			/* Place wrap_symbol at position i in info->subject */
+			strcpy(info->subject + i, wrap_symbol);
+		}
+	}
 	cgit_commit_link(info->subject, NULL, NULL, ctx.qry.head,
 			 sha1_to_hex(commit->object.sha1), ctx.qry.vpath, 0);
 	show_commit_decorations(commit);
@@ -156,7 +182,6 @@ 	}
 	html("</td></tr>\n");
 
 	if (revs->graph || ctx.qry.showmsg) { /* Print a second table row */
-		struct strbuf msgbuf = STRBUF_INIT;
 		html("<tr class='nohover'><td/>"); /* Empty 'Age' column */
 
 		if (ctx.qry.showmsg) {
@@ -204,9 +229,9 @@ 		htmlf("\n", cols,
 			ctx.qry.showmsg ? " class='logmsg'" : "");
 		html_txt(msgbuf.buf);
 		html("</td></tr>\n");
-		strbuf_release(&msgbuf);
 	}
 
+	strbuf_release(&msgbuf);
 	strbuf_release(&graphbuf);
 	cgit_free_commitinfo(info);
 }
@@ -246,7 +271,7 @@ 	return result;
 }
 
 void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern,
-		    char *path, int pager)
+		    char *path, int pager, int commit_graph)
 {
 	struct rev_info rev;
 	struct commit *commit;
@@ -286,7 +311,7 @@ 				vector_push(&vec, &arg, 0);
 			}
 		}
 	}
-	if (ctx.repo->enable_commit_graph) {
+	if (commit_graph) {
 		static const char *graph_arg = "--graph";
 		static const char *color_arg = "--color";
 		vector_push(&vec, &graph_arg, 0);
@@ -321,7 +346,7 @@ 	if (pager)
 		html("<table class='list nowrap'>");
 
 	html("<tr class='nohover'><th class='left'>Age</th>");
-	if (ctx.repo->enable_commit_graph)
+	if (commit_graph)
 		html("<th></th>");
 	html("<th class='left'>Commit message");
 	if (pager) {




diff --git a/ui-log.h b/ui-log.h
index 603405569e90de064d5f70c5aa1454952aedde9d..d0cb7790688b2a16cc51284f434f296d6a43ceb3 100644
--- a/ui-log.h
+++ b/ui-log.h
@@ -2,7 +2,8 @@ #ifndef UI_LOG_H
 #define UI_LOG_H
 
 extern void cgit_print_log(const char *tip, int ofs, int cnt, char *grep,
-			   char *pattern, char *path, int pager);
+			   char *pattern, char *path, int pager,
+			   int commit_graph);
 extern void show_commit_decorations(struct commit *commit);
 
 #endif /* UI_LOG_H */




diff --git a/ui-summary.c b/ui-summary.c
index b203bccfabeab67d3e4043d1b26344775aca419c..5be2545c398ca7f7ac715991e58b90b52f32e636 100644
--- a/ui-summary.c
+++ b/ui-summary.c
@@ -59,7 +59,7 @@ 	cgit_print_tags(ctx.cfg.summary_tags);
 	if (ctx.cfg.summary_log > 0) {
 		html("<tr class='nohover'><td colspan='4'>&nbsp;</td></tr>");
 		cgit_print_log(ctx.qry.head, 0, ctx.cfg.summary_log, NULL,
-			       NULL, NULL, 0);
+			       NULL, NULL, 0, 0);
 	}
 	if (ctx.repo->clone_url)
 		print_urls(ctx.repo->clone_url, NULL);