X-Git-Url: https://git.cameronkatri.com/cgit.git/blobdiff_plain/31e1f9af1d46bd7dfdb3b2ac580c0d0cc8dbaa63..f32a2da636ffa6eaa6b8d0d3f35a673fa12e404a:/ui-log.c diff --git a/ui-log.c b/ui-log.c index 8add66a..6f1249b 100644 --- a/ui-log.c +++ b/ui-log.c @@ -7,6 +7,7 @@ */ #include "cgit.h" +#include "ui-log.h" #include "html.h" #include "ui-shared.h" #include "vector.h" @@ -28,7 +29,7 @@ static const char *column_colors_html[] = { #define COLUMN_COLORS_HTML_MAX (ARRAY_SIZE(column_colors_html) - 1) -void count_lines(char *line, int size) +static void count_lines(char *line, int size) { if (size <= 0) return; @@ -40,7 +41,7 @@ void count_lines(char *line, int size) rem_lines++; } -void inspect_files(struct diff_filepair *pair) +static void inspect_files(struct diff_filepair *pair) { unsigned long old_size = 0; unsigned long new_size = 0; @@ -60,6 +61,7 @@ void show_commit_decorations(struct commit *commit) buf[sizeof(buf) - 1] = 0; deco = lookup_decoration(&name_decoration, &commit->object); + html(""); while (deco) { if (!prefixcmp(deco->name, "refs/heads/")) { strncpy(buf, deco->name + 11, sizeof(buf) - 1); @@ -76,6 +78,8 @@ void show_commit_decorations(struct commit *commit) cgit_tag_link(buf, NULL, "tag-deco", ctx.qry.head, buf); } else if (!prefixcmp(deco->name, "refs/remotes/")) { + if (!ctx.repo->enable_remote_branches) + goto next; strncpy(buf, deco->name + 13, sizeof(buf) - 1); cgit_log_link(buf, NULL, "remote-deco", NULL, sha1_to_hex(commit->object.sha1), @@ -88,23 +92,23 @@ void show_commit_decorations(struct commit *commit) sha1_to_hex(commit->object.sha1), ctx.qry.vpath, 0); } +next: deco = deco->next; } + html(""); } -void print_commit(struct commit *commit, struct rev_info *revs) +static void print_commit(struct commit *commit, struct rev_info *revs) { struct commitinfo *info; - char *tmp; - int cols = revs->graph ? 3 : 2; + int columns = revs->graph ? 4 : 3; struct strbuf graphbuf = STRBUF_INIT; struct strbuf msgbuf = STRBUF_INIT; - if (ctx.repo->enable_log_filecount) { - cols++; - if (ctx.repo->enable_log_linecount) - cols++; - } + if (ctx.repo->enable_log_filecount) + columns++; + if (ctx.repo->enable_log_linecount) + columns++; if (revs->graph) { /* Advance graph until current commit */ @@ -112,7 +116,7 @@ void print_commit(struct commit *commit, struct rev_info *revs) /* Print graph segment in otherwise empty table row */ html(""); html(graphbuf.buf); - htmlf("\n", cols); + htmlf("\n", columns); strbuf_setlen(&graphbuf, 0); } /* Current commit's graph segment is now ready in graphbuf */ @@ -130,11 +134,7 @@ void print_commit(struct commit *commit, struct rev_info *revs) } else { 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(""); } @@ -172,25 +172,21 @@ void print_commit(struct commit *commit, struct rev_info *revs) 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) { + if (ctx.repo->enable_log_filecount || ctx.repo->enable_log_linecount) { files = 0; add_lines = 0; rem_lines = 0; cgit_diff_commit(commit, inspect_files, ctx.qry.vpath); - html(""); - htmlf("%d", files); - if (ctx.repo->enable_log_linecount) { - html(""); - htmlf("-%d/+%d", rem_lines, add_lines); - } } + + if (ctx.repo->enable_log_filecount) + htmlf("%d", files); + if (ctx.repo->enable_log_linecount) + htmlf("-%d/+%d", rem_lines, add_lines); + html("\n"); if (revs->graph || ctx.qry.showmsg) { /* Print a second table row */ @@ -202,9 +198,8 @@ void print_commit(struct commit *commit, struct rev_info *revs) strbuf_addstr(&msgbuf, info->msg); strbuf_addch(&msgbuf, '\n'); } - format_note(NULL, commit->object.sha1, &msgbuf, - PAGE_ENCODING, - NOTES_SHOW_HEADER | NOTES_INDENT); + format_display_notes(commit->object.sha1, + &msgbuf, PAGE_ENCODING, 0); strbuf_addch(&msgbuf, '\n'); strbuf_ltrim(&msgbuf); } @@ -239,7 +234,7 @@ void print_commit(struct commit *commit, struct rev_info *revs) html(""); /* Empty 'Age' column */ /* Print msgbuf into remainder of table row */ - htmlf("\n", cols, + htmlf("\n", columns - (revs->graph ? 1 : 0), ctx.qry.showmsg ? " class='logmsg'" : ""); html_txt(msgbuf.buf); html("\n"); @@ -250,15 +245,19 @@ void print_commit(struct commit *commit, struct rev_info *revs) cgit_free_commitinfo(info); } -static const char *disambiguate_ref(const char *ref) +static const char *disambiguate_ref(const char *ref, int *must_free_result) { unsigned char sha1[20]; - const char *longref; + struct strbuf longref = STRBUF_INIT; - longref = fmt("refs/heads/%s", ref); - if (get_sha1(longref, sha1) == 0) - return longref; + strbuf_addf(&longref, "refs/heads/%s", ref); + if (get_sha1(longref.buf, sha1) == 0) { + *must_free_result = 1; + return strbuf_detach(&longref, NULL); + } + *must_free_result = 0; + strbuf_release(&longref); return ref; } @@ -285,30 +284,32 @@ 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, int commit_graph) + char *path, int pager, int commit_graph, int commit_sort) { struct rev_info rev; struct commit *commit; struct vector vec = VECTOR_INIT(char *); - int i, columns = 3; - char *arg; + int i, columns = commit_graph ? 4 : 3; + int must_free_tip = 0; + struct strbuf argbuf = STRBUF_INIT; /* First argv is NULL */ vector_push(&vec, NULL, 0); if (!tip) tip = ctx.qry.head; - tip = disambiguate_ref(tip); + tip = disambiguate_ref(tip, &must_free_tip); vector_push(&vec, &tip, 0); if (grep && pattern && *pattern) { pattern = xstrdup(pattern); if (!strcmp(grep, "grep") || !strcmp(grep, "author") || !strcmp(grep, "committer")) { - arg = fmt("--%s=%s", grep, pattern); - vector_push(&vec, &arg, 0); + strbuf_addf(&argbuf, "--%s=%s", grep, pattern); + vector_push(&vec, &argbuf.buf, 0); } if (!strcmp(grep, "range")) { + char *arg; /* Split the pattern at whitespace and add each token * as a revision expression. Do not accept other * rev-list options. Also, replace the previously @@ -334,9 +335,17 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern COLUMN_COLORS_HTML_MAX); } + if (commit_sort == 1) { + static const char *date_order_arg = "--date-order"; + vector_push(&vec, &date_order_arg, 0); + } else if (commit_sort == 2) { + static const char *topo_order_arg = "--topo-order"; + vector_push(&vec, &topo_order_arg, 0); + } + if (path) { - arg = "--"; - vector_push(&vec, &arg, 0); + static const char *double_dash_arg = "--"; + vector_push(&vec, &double_dash_arg, 0); vector_push(&vec, &path, 0); } @@ -379,10 +388,10 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern if (ctx.repo->enable_log_filecount) { html("Files"); columns++; - if (ctx.repo->enable_log_linecount) { - html("Lines"); - columns++; - } + } + if (ctx.repo->enable_log_linecount) { + html("Lines"); + columns++; } html("\n"); @@ -404,25 +413,33 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern commit->parents = NULL; } if (pager) { - html("
"); + html("
"); + html(""); } else if ((commit = get_revision(&rev)) != NULL) { - html(""); + htmlf("", columns); cgit_log_link("[...]", NULL, NULL, ctx.qry.head, NULL, ctx.qry.vpath, 0, NULL, NULL, ctx.qry.showmsg); html("\n"); } + + /* If we allocated tip then it is safe to cast away const. */ + if (must_free_tip) + free((char*) tip); + strbuf_release(&argbuf); }