X-Git-Url: https://gitweb.ps.run/ps-cgit/blobdiff_plain/39c2e224d3c55dfa1a7668399897be295be07dc7..5a36c2a291a00b59b8ec2f112453e117797c2fe5:/ui-log.c diff --git a/ui-log.c b/ui-log.c index 7f38d2a..6d7fcae 100644 --- a/ui-log.c +++ b/ui-log.c @@ -9,6 +9,7 @@ #include "cgit.h" #include "html.h" #include "ui-shared.h" +#include "vector.h" int files, add_lines, rem_lines; @@ -101,7 +102,7 @@ void print_commit(struct commit *commit) files = 0; add_lines = 0; rem_lines = 0; - cgit_diff_commit(commit, inspect_files); + cgit_diff_commit(commit, inspect_files, ctx.qry.vpath); html(""); htmlf("%d", files); if (ctx.repo->enable_log_linecount) { @@ -110,29 +111,33 @@ void print_commit(struct commit *commit) } } html("\n"); - if (ctx.qry.showmsg) { - struct strbuf notes = STRBUF_INIT; - get_commit_notes(commit, ¬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); } @@ -148,38 +153,86 @@ static const char *disambiguate_ref(const char *ref) return ref; } +static char *next_token(char **src) +{ + char *result; + + if (!src || !*src) + return NULL; + while (isspace(**src)) + (*src)++; + if (!**src) + return NULL; + result = *src; + while (**src) { + if (isspace(**src)) { + **src = '\0'; + (*src)++; + break; + } + (*src)++; + } + return result; +} + void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern, char *path, int pager) { struct rev_info rev; struct commit *commit; - const char *argv[] = {NULL, NULL, NULL, NULL, NULL}; - int argc = 2; + struct vector vec = VECTOR_INIT(char *); int i, columns = 3; + char *arg; + + /* First argv is NULL */ + vector_push(&vec, NULL, 0); if (!tip) tip = ctx.qry.head; + tip = disambiguate_ref(tip); + vector_push(&vec, &tip, 0); - argv[1] = disambiguate_ref(tip); - - if (grep && pattern) { + if (grep && pattern && *pattern) { + pattern = xstrdup(pattern); if (!strcmp(grep, "grep") || !strcmp(grep, "author") || - !strcmp(grep, "committer")) - argv[argc++] = fmt("--%s=%s", grep, pattern); - if (!strcmp(grep, "range")) - argv[1] = pattern; + !strcmp(grep, "committer")) { + arg = fmt("--%s=%s", grep, pattern); + vector_push(&vec, &arg, 0); + } + if (!strcmp(grep, "range")) { + /* Split the pattern at whitespace and add each token + * as a revision expression. Do not accept other + * rev-list options. Also, replace the previously + * pushed tip (it's no longer relevant). + */ + vec.count--; + while ((arg = next_token(&pattern))) { + if (*arg == '-') { + fprintf(stderr, "Bad range expr: %s\n", + arg); + break; + } + vector_push(&vec, &arg, 0); + } + } } if (path) { - argv[argc++] = "--"; - argv[argc++] = path; + arg = "--"; + vector_push(&vec, &arg, 0); + vector_push(&vec, &path, 0); } + + /* Make sure the vector is NULL-terminated */ + vector_push(&vec, NULL, 0); + vec.count--; + init_revisions(&rev, NULL); rev.abbrev = DEFAULT_ABBREV; rev.commit_format = CMIT_FMT_DEFAULT; rev.verbose_header = 1; rev.show_root_diff = 0; - setup_revisions(argc, argv, &rev, NULL); + setup_revisions(vec.count, vec.data, &rev, NULL); load_ref_decorations(DECORATE_FULL_REFS); rev.show_decorations = 1; rev.grep_filter.regflags |= REG_ICASE; @@ -228,8 +281,7 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern commit->parents = NULL; } if (pager) { - htmlf("
", - columns); + html("
"); if (ofs > 0) { cgit_log_link("[prev]", NULL, NULL, ctx.qry.head, ctx.qry.sha1, ctx.qry.vpath,