From 5a36c2a291a00b59b8ec2f112453e117797c2fe5 Mon Sep 17 00:00:00 2001 From: Johan Herland Date: Mon, 15 Nov 2010 18:39:49 +0100 Subject: ui-log: Change display of full commit messages (and notes) When showmsg is enabled, ui-log (in addition to the table row containing the details of the current commit) adds a second table row containing the remainder of the commit message, and yet another table row containing the commit notes (if any). The vertical margins between commit subject, commit message and commit notes are controlled by CSS. In preparation for the commit graph (which will be printed to the left of the commit message/notes) we need to eliminate these vertical margins (as they would produce ugly gaps in the commit graph) and instead achieve them by adding newlines to the commit message/notes. Furthermore, we can no longer print the "Notes:" header in the "Age" column, since the graph will be drawn between the "Age" column and the "Commit message" column. This patch therefore prepares the commit message and commit notes in a single buffer (properly formatting the notes using the NOTES_SHOW_HEADER and NOTES_INDENT flags to format_note()), and then prints the entire buffer into a single table row. Signed-off-by: Johan Herland Signed-off-by: Lars Hjemli --- ui-log.c | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) (limited to 'ui-log.c') diff --git a/ui-log.c b/ui-log.c index 27f5a1a..6d7fcae 100644 --- a/ui-log.c +++ b/ui-log.c @@ -111,29 +111,33 @@ void print_commit(struct commit *commit) } } html("\n"); - if (ctx.qry.showmsg) { - struct strbuf notes = STRBUF_INIT; - format_note(NULL, commit->object.sha1, ¬es, PAGE_ENCODING, 0); + + if (ctx.qry.showmsg) { /* Print message + notes in a second table row */ + /* Concatenate commit message and notes in msgbuf */ + struct strbuf msgbuf = STRBUF_INIT; + if (info->msg && *(info->msg)) { + strbuf_addstr(&msgbuf, info->msg); + strbuf_addch(&msgbuf, '\n'); + } + format_note(NULL, commit->object.sha1, &msgbuf, PAGE_ENCODING, + NOTES_SHOW_HEADER | NOTES_INDENT); + strbuf_addch(&msgbuf, '\n'); + strbuf_ltrim(&msgbuf); if (ctx.repo->enable_log_filecount) { cols++; if (ctx.repo->enable_log_linecount) cols++; } + + /* Create second table row containing msgbuf */ htmlf("", cols); - html_txt(info->msg); + html_txt(msgbuf.buf); html("\n"); - if (notes.len != 0) { - html(""); - html("Notes:"); - htmlf("", - cols); - html_txt(notes.buf); - html("\n"); - } - strbuf_release(¬es); + strbuf_release(&msgbuf); } + cgit_free_commitinfo(info); } -- cgit 1.4.1 From 9a8d39c668b98464bac97d4e5442966de63f97b2 Mon Sep 17 00:00:00 2001 From: Johan Herland Date: Mon, 15 Nov 2010 18:39:50 +0100 Subject: ui-log: Implement support for commit graphs Teach CGit to print an ASCII art commit graph to the left of the commit message, similar to 'git log --graph'. The graph adds extra lines (table rows) to the log when needed to add/remove/shuffle edges in the graph. When 'showmsg' is enabled, the graph is automatically padded to account for the extra lines added by the commit message/notes. This feature is controlled by a new config variable: "enable-commit-graph" (disabled by default), and individual repos can control it by setting "repo.enable-commit-graph". Signed-off-by: Johan Herland Signed-off-by: Lars Hjemli --- cgit.c | 6 ++++ cgit.css | 7 +++- cgit.h | 3 ++ cgitrc.5.txt | 15 ++++++++- shared.c | 1 + ui-log.c | 103 +++++++++++++++++++++++++++++++++++++++++++++++------------ 6 files changed, 112 insertions(+), 23 deletions(-) (limited to 'ui-log.c') diff --git a/cgit.c b/cgit.c index 412fbf0..53ab68d 100644 --- a/cgit.c +++ b/cgit.c @@ -57,6 +57,8 @@ void repo_config(struct cgit_repo *repo, const char *name, const char *value) repo->defbranch = xstrdup(value); else if (!strcmp(name, "snapshots")) repo->snapshots = ctx.cfg.snapshots & cgit_parse_snapshots_mask(value); + else if (!strcmp(name, "enable-commit-graph")) + repo->enable_commit_graph = ctx.cfg.enable_commit_graph * atoi(value); else if (!strcmp(name, "enable-log-filecount")) repo->enable_log_filecount = ctx.cfg.enable_log_filecount * atoi(value); else if (!strcmp(name, "enable-log-linecount")) @@ -141,6 +143,8 @@ void config_cb(const char *name, const char *value) ctx.cfg.enable_gitweb_owner = atoi(value); else if (!strcmp(name, "enable-index-links")) ctx.cfg.enable_index_links = atoi(value); + else if (!strcmp(name, "enable-commit-graph")) + ctx.cfg.enable_commit_graph = atoi(value); else if (!strcmp(name, "enable-log-filecount")) ctx.cfg.enable_log_filecount = atoi(value); else if (!strcmp(name, "enable-log-linecount")) @@ -540,6 +544,8 @@ void print_repo(FILE *f, struct cgit_repo *repo) fprintf(f, "repo.section=%s\n", repo->section); if (repo->clone_url) fprintf(f, "repo.clone-url=%s\n", repo->clone_url); + fprintf(f, "repo.enable-commit-graph=%d\n", + repo->enable_commit_graph); fprintf(f, "repo.enable-log-filecount=%d\n", repo->enable_log_filecount); fprintf(f, "repo.enable-log-linecount=%d\n", diff --git a/cgit.css b/cgit.css index 7a5f423..7600e84 100644 --- a/cgit.css +++ b/cgit.css @@ -153,6 +153,11 @@ table.list td { padding: 0.1em 0.5em 0.1em 0.5em; } +table.list td.commitgraph { + font-family: monospace; + white-space: pre; +} + table.list td.logsubject { font-family: monospace; font-weight: bold; @@ -731,4 +736,4 @@ table.ssdiff td.space { table.ssdiff td.space div { min-height: 3em; -} \ No newline at end of file +} diff --git a/cgit.h b/cgit.h index f5f68ac..bed770b 100644 --- a/cgit.h +++ b/cgit.h @@ -20,6 +20,7 @@ #include #include #include +#include /* @@ -71,6 +72,7 @@ struct cgit_repo { char *section; char *clone_url; int snapshots; + int enable_commit_graph; int enable_log_filecount; int enable_log_linecount; int enable_remote_branches; @@ -188,6 +190,7 @@ struct cgit_config { int enable_filter_overrides; int enable_gitweb_owner; int enable_index_links; + int enable_commit_graph; int enable_log_filecount; int enable_log_linecount; int enable_remote_branches; diff --git a/cgitrc.5.txt b/cgitrc.5.txt index 75b6584..b45c46b 100644 --- a/cgitrc.5.txt +++ b/cgitrc.5.txt @@ -90,7 +90,12 @@ embedded:: Flag which, when set to "1", will make cgit generate a html fragment suitable for embedding in other html pages. Default value: none. See also: "noheader". - + +enable-commit-graph:: + Flag which, when set to "1", will make cgit print an ASCII-art commit + history graph to the left of the commit messages in the repository + log page. Default value: "0". + enable-filter-overrides:: Flag which, when set to "1", allows all filter settings to be overridden in repository-specific cgitrc files. Default value: none. @@ -354,6 +359,10 @@ repo.defbranch:: repo.desc:: The value to show as repository description. Default value: none. +repo.enable-commit-graph:: + A flag which can be used to disable the global setting + `enable-commit-graph'. Default value: none. + repo.enable-log-filecount:: A flag which can be used to disable the global setting `enable-log-filecount'. Default value: none. @@ -441,6 +450,10 @@ css=/css/cgit.css enable-index-links=1 +# Enable ASCII art commit history graph on the log pages +enable-commit-graph=1 + + # Show number of affected files per commit on the log pages enable-log-filecount=1 diff --git a/shared.c b/shared.c index 765cd27..7ec2e19 100644 --- a/shared.c +++ b/shared.c @@ -56,6 +56,7 @@ struct cgit_repo *cgit_add_repo(const char *url) ret->section = ctx.cfg.section; ret->defbranch = "master"; ret->snapshots = ctx.cfg.snapshots; + ret->enable_commit_graph = ctx.cfg.enable_commit_graph; ret->enable_log_filecount = ctx.cfg.enable_log_filecount; ret->enable_log_linecount = ctx.cfg.enable_log_linecount; ret->enable_remote_branches = ctx.cfg.enable_remote_branches; diff --git a/ui-log.c b/ui-log.c index 6d7fcae..0d86fd5 100644 --- a/ui-log.c +++ b/ui-log.c @@ -77,11 +77,30 @@ void show_commit_decorations(struct commit *commit) } } -void print_commit(struct commit *commit) +void print_commit(struct commit *commit, struct rev_info *revs) { struct commitinfo *info; char *tmp; int cols = 2; + struct strbuf graphbuf = STRBUF_INIT; + + if (ctx.repo->enable_log_filecount) { + cols++; + if (ctx.repo->enable_log_linecount) + cols++; + } + + if (revs->graph) { + /* Advance graph until current commit */ + while (!graph_next_line(revs->graph, &graphbuf)) { + /* Print graph segment in otherwise empty table row */ + html(""); + html(graphbuf.buf); + htmlf("\n", cols); + strbuf_setlen(&graphbuf, 0); + } + /* Current commit's graph segment is now ready in graphbuf */ + } info = cgit_parse_commit(commit); htmlf("", @@ -91,8 +110,17 @@ void print_commit(struct commit *commit) html_link_open(tmp, NULL, NULL); cgit_print_age(commit->date, TM_WEEK * 2, FMT_SHORTDATE); html_link_close(); - htmlf("", - ctx.qry.showmsg ? " class='logsubject'" : ""); + html(""); + + if (revs->graph) { + /* Print graph segment for current commit */ + html(""); + html(graphbuf.buf); + html(""); + strbuf_setlen(&graphbuf, 0); + } + + htmlf("", ctx.qry.showmsg ? " class='logsubject'" : ""); cgit_commit_link(info->subject, NULL, NULL, ctx.qry.head, sha1_to_hex(commit->object.sha1), ctx.qry.vpath, 0); show_commit_decorations(commit); @@ -112,32 +140,59 @@ void print_commit(struct commit *commit) } html("\n"); - if (ctx.qry.showmsg) { /* Print message + notes in a second table row */ - /* Concatenate commit message and notes in msgbuf */ + if (revs->graph || ctx.qry.showmsg) { /* Print a second table row */ struct strbuf msgbuf = STRBUF_INIT; - if (info->msg && *(info->msg)) { - strbuf_addstr(&msgbuf, info->msg); + html(""); /* Empty 'Age' column */ + + if (ctx.qry.showmsg) { + /* Concatenate commit message + notes in msgbuf */ + if (info->msg && *(info->msg)) { + strbuf_addstr(&msgbuf, info->msg); + strbuf_addch(&msgbuf, '\n'); + } + format_note(NULL, commit->object.sha1, &msgbuf, + PAGE_ENCODING, + NOTES_SHOW_HEADER | NOTES_INDENT); strbuf_addch(&msgbuf, '\n'); + strbuf_ltrim(&msgbuf); } - format_note(NULL, commit->object.sha1, &msgbuf, PAGE_ENCODING, - NOTES_SHOW_HEADER | NOTES_INDENT); - strbuf_addch(&msgbuf, '\n'); - strbuf_ltrim(&msgbuf); - if (ctx.repo->enable_log_filecount) { - cols++; - if (ctx.repo->enable_log_linecount) - cols++; + if (revs->graph) { + int lines = 0; + + /* Calculate graph padding */ + if (ctx.qry.showmsg) { + /* Count #lines in commit message + notes */ + const char *p = msgbuf.buf; + lines = 1; + while ((p = strchr(p, '\n'))) { + p++; + lines++; + } + } + + /* Print graph padding */ + html(""); + while (lines > 0 || !graph_is_commit_finished(revs->graph)) { + if (graphbuf.len) + html("\n"); + strbuf_setlen(&graphbuf, 0); + graph_next_line(revs->graph, &graphbuf); + html(graphbuf.buf); + lines--; + } + html("\n"); } - /* Create second table row containing msgbuf */ - htmlf("", - cols); + /* Print msgbuf into remainder of table row */ + htmlf("\n", cols, + ctx.qry.showmsg ? " class='logmsg'" : ""); html_txt(msgbuf.buf); html("\n"); strbuf_release(&msgbuf); } + strbuf_release(&graphbuf); cgit_free_commitinfo(info); } @@ -216,6 +271,10 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern } } } + if (ctx.repo->enable_commit_graph) { + static const char *graph_arg = "--graph"; + vector_push(&vec, &graph_arg, 0); + } if (path) { arg = "--"; @@ -242,8 +301,10 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern if (pager) html(""); - html("" - ""); + if (ctx.repo->enable_commit_graph) + html(""); + html("\n"); if (revs->graph || ctx.qry.showmsg) { /* Print a second table row */ - struct strbuf msgbuf = STRBUF_INIT; html("\n"); - strbuf_release(&msgbuf); } + strbuf_release(&msgbuf); strbuf_release(&graphbuf); cgit_free_commitinfo(info); } @@ -246,7 +271,7 @@ static char *next_token(char **src) } 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 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern } } } - 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 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern html("
AgeCommit message"); + html("
AgeCommit message"); if (pager) { html(" ("); cgit_log_link(ctx.qry.showmsg ? "Collapse" : "Expand", NULL, @@ -274,7 +335,7 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern } for (i = 0; i < cnt && (commit = get_revision(&rev)) != NULL; i++) { - print_commit(commit); + print_commit(commit, &rev); free(commit->buffer); commit->buffer = NULL; free_commit_list(commit->parents); -- cgit 1.4.1 From 268b34af23cdcac87aed3300bfe6154cbc65753e Mon Sep 17 00:00:00 2001 From: Johan Herland Date: Mon, 15 Nov 2010 18:39:51 +0100 Subject: ui-log: Colorize commit graph Use the existing coloring logic in Git's graph code to color the lines between commits in the commit graph. Whereas Git normally uses ANSI color escapes to produce colors, we here use graph_set_column_colors() to replace those with HTML color escapes, that embed the graph lines in tags that apply the desired color using CSS. Signed-off-by: Johan Herland Signed-off-by: Lars Hjemli --- cgit.css | 24 ++++++++++++++++++++++++ ui-log.c | 19 +++++++++++++++++++ 2 files changed, 43 insertions(+) (limited to 'ui-log.c') diff --git a/cgit.css b/cgit.css index 7600e84..1ebef55 100644 --- a/cgit.css +++ b/cgit.css @@ -158,6 +158,30 @@ table.list td.commitgraph { white-space: pre; } +table.list td.commitgraph .column1 { + color: #a00; +} + +table.list td.commitgraph .column2 { + color: #0a0; +} + +table.list td.commitgraph .column3 { + color: #aa0; +} + +table.list td.commitgraph .column4 { + color: #00a; +} + +table.list td.commitgraph .column5 { + color: #a0a; +} + +table.list td.commitgraph .column6 { + color: #0aa; +} + table.list td.logsubject { font-family: monospace; font-weight: bold; diff --git a/ui-log.c b/ui-log.c index 0d86fd5..5cf66cb 100644 --- a/ui-log.c +++ b/ui-log.c @@ -13,6 +13,21 @@ int files, add_lines, rem_lines; +/* + * The list of available column colors in the commit graph. + */ +static const char *column_colors_html[] = { + "", + "", + "", + "", + "", + "", + "", +}; + +#define COLUMN_COLORS_HTML_MAX (ARRAY_SIZE(column_colors_html) - 1) + void count_lines(char *line, int size) { if (size <= 0) @@ -273,7 +288,11 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern } if (ctx.repo->enable_commit_graph) { static const char *graph_arg = "--graph"; + static const char *color_arg = "--color"; vector_push(&vec, &graph_arg, 0); + vector_push(&vec, &color_arg, 0); + graph_set_column_colors(column_colors_html, + COLUMN_COLORS_HTML_MAX); } if (path) { -- cgit 1.4.1 From ad230267f8ecae6cb4f0da17d7a5f75ba38203e2 Mon Sep 17 00:00:00 2001 From: Johan Herland Date: Mon, 15 Nov 2010 18:39:52 +0100 Subject: 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 Signed-off-by: Lars Hjemli --- cmd.c | 3 ++- ui-log.c | 35 ++++++++++++++++++++++++++++++----- ui-log.h | 3 ++- ui-summary.c | 2 +- 4 files changed, 35 insertions(+), 8 deletions(-) (limited to 'ui-log.c') diff --git a/cmd.c b/cmd.c index 6dc9f5e..536515b 100644 --- a/cmd.c +++ b/cmd.c @@ -67,7 +67,8 @@ static void info_fn(struct cgit_context *ctx) 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 5cf66cb..05b5c29 100644 --- a/ui-log.c +++ b/ui-log.c @@ -98,6 +98,7 @@ void print_commit(struct commit *commit, struct rev_info *revs) 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 @@ void print_commit(struct commit *commit, struct rev_info *revs) } htmlf("", 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 @@ void print_commit(struct commit *commit, struct rev_info *revs) html("
"); /* Empty 'Age' column */ if (ctx.qry.showmsg) { @@ -204,9 +229,9 @@ void print_commit(struct commit *commit, struct rev_info *revs) ctx.qry.showmsg ? " class='logmsg'" : ""); html_txt(msgbuf.buf); html("
"); html(""); - if (ctx.repo->enable_commit_graph) + if (commit_graph) html(""); html(""); 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); -- cgit 1.4.1 From c2bfd40f8aaaa69a66c6eb729c202e42a43ec166 Mon Sep 17 00:00:00 2001 From: Johan Herland Date: Mon, 15 Nov 2010 18:39:53 +0100 Subject: ui-log: Move 'Age' column when commit graph is present When the commit graph is present, we prefer to draw it along the left edge, and moving the 'Age' column to the right of the 'Author' column, like in gitk. Signed-off-by: Johan Herland Signed-off-by: Lars Hjemli --- ui-log.c | 42 ++++++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 12 deletions(-) (limited to 'ui-log.c') diff --git a/ui-log.c b/ui-log.c index 05b5c29..8add66a 100644 --- a/ui-log.c +++ b/ui-log.c @@ -96,7 +96,7 @@ void print_commit(struct commit *commit, struct rev_info *revs) { struct commitinfo *info; char *tmp; - int cols = 2; + int cols = revs->graph ? 3 : 2; struct strbuf graphbuf = STRBUF_INIT; struct strbuf msgbuf = STRBUF_INIT; @@ -110,7 +110,7 @@ void print_commit(struct commit *commit, struct rev_info *revs) /* Advance graph until current commit */ while (!graph_next_line(revs->graph, &graphbuf)) { /* Print graph segment in otherwise empty table row */ - html("\n", cols); strbuf_setlen(&graphbuf, 0); @@ -119,14 +119,7 @@ void print_commit(struct commit *commit, struct rev_info *revs) } info = cgit_parse_commit(commit); - htmlf(""); + htmlf("", ctx.qry.showmsg ? " class='logheader'" : ""); if (revs->graph) { /* Print graph segment for current commit */ @@ -135,6 +128,15 @@ void print_commit(struct commit *commit, struct rev_info *revs) html(""); strbuf_setlen(&graphbuf, 0); } + else { + html(""); + } htmlf("", ctx.qry.showmsg ? " class='logsubject'" : ""); if (ctx.qry.showmsg) { @@ -167,6 +169,16 @@ void print_commit(struct commit *commit, struct rev_info *revs) show_commit_decorations(commit); html("\n"); if (revs->graph || ctx.qry.showmsg) { /* Print a second table row */ - html(""); if (ctx.qry.showmsg) { /* Concatenate commit message + notes in msgbuf */ @@ -223,6 +235,8 @@ void print_commit(struct commit *commit, struct rev_info *revs) } html("\n"); } + else + html("
AgeCommit message"); if (pager) { diff --git a/ui-log.h b/ui-log.h index 6034055..d0cb779 100644 --- a/ui-log.h +++ b/ui-log.h @@ -2,7 +2,8 @@ #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 b203bcc..5be2545 100644 --- a/ui-summary.c +++ b/ui-summary.c @@ -59,7 +59,7 @@ void cgit_print_summary() if (ctx.cfg.summary_log > 0) { html("
 
"); + html("
"); html(graphbuf.buf); htmlf("
", - ctx.qry.showmsg ? " class='logheader'" : ""); - tmp = fmt("id=%s", sha1_to_hex(commit->object.sha1)); - tmp = cgit_fileurl(ctx.repo->url, "commit", ctx.qry.vpath, tmp); - html_link_open(tmp, NULL, NULL); - cgit_print_age(commit->date, TM_WEEK * 2, FMT_SHORTDATE); - html_link_close(); - html(""); + tmp = fmt("id=%s", sha1_to_hex(commit->object.sha1)); + tmp = cgit_fileurl(ctx.repo->url, "commit", ctx.qry.vpath, tmp); + html_link_open(tmp, NULL, NULL); + cgit_print_age(commit->date, TM_WEEK * 2, FMT_SHORTDATE); + html_link_close(); + html(""); html_txt(info->author); + + if (revs->graph) { + html(""); + tmp = fmt("id=%s", sha1_to_hex(commit->object.sha1)); + tmp = cgit_fileurl(ctx.repo->url, "commit", ctx.qry.vpath, tmp); + html_link_open(tmp, NULL, NULL); + cgit_print_age(commit->date, TM_WEEK * 2, FMT_SHORTDATE); + html_link_close(); + } + if (ctx.repo->enable_log_filecount) { files = 0; add_lines = 0; @@ -182,7 +194,7 @@ void print_commit(struct commit *commit, struct rev_info *revs) html("
"); /* Empty 'Age' column */ + html("
"); /* Empty 'Age' column */ /* Print msgbuf into remainder of table row */ htmlf("\n", cols, @@ -345,9 +359,11 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern if (pager) html(""); - html(""); + html(""); if (commit_graph) html(""); + else + html(""); html(""); + if (commit_graph) + html(""); if (ctx.repo->enable_log_filecount) { html(""); columns++; -- cgit 1.4.1
Age
AgeCommit message"); if (pager) { html(" ("); @@ -358,6 +374,8 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern html(")"); } html("AuthorAgeFiles