diff options
| author | Bryce Kwon <bryce@brycekwon.com> | |
|---|---|---|
| committer | Bryce Kwon <bryce@brycekwon.com> | |
| commit | ||
| parent | ||
| tree | ||
| download | ||
Restyle the sources and fix the audit's findings
Diffstat (limited to 'source/ui-commit.c')
| -rw-r--r-- | source/ui-commit.c | 186 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 file changed, 107 insertions, 79 deletions
diff --git a/source/ui-commit.c b/source/ui-commit.c index 4d6d4da..f9051c1 100644 --- a/source/ui-commit.c +++ b/source/ui-commit.c @@ -1,29 +1,93 @@ -/* ui-commit.c: generate commit view - * - * Copyright (C) 2006-2014 cgit Development Team <cgit@lists.zx2c4.com> - * - * Licensed under GNU General Public License v2 - * (see LICENSE.txt for full license text) +/* + * The commit page, which shows one commit on its own and is where the log and + * the ref listings link. It renders the idents, the object ids, the message + * and any note, then hands off to ui-diff.c for the diff against the first + * parent. Free text and addresses are written through the repository's commit + * and email filters, so a site can rewrite either on the way out. */ #define USE_THE_REPOSITORY_VARIABLE #include "cgit.h" -#include "ui-commit.h" +#include "filter.h" #include "html.h" -#include "ui-shared.h" +#include "parsing.h" +#include "shared.h" +#include "ui-commit.h" #include "ui-diff.h" #include "ui-log.h" +#include "ui-shared.h" -void cgit_print_commit(char *hex, const char *prefix) +// The diff below the message is always taken against the first parent alone, +// which says little about a merge of many branches, so a commit with this +// many parents or more is shown without a diff at all. +#define OCTOPUS_PARENTS 3 + +static void print_ident_row(const char *role, const char *name, + const char *email, timestamp_t date, int tz) +{ + htmlf("<tr><th>%s</th><td>", role); + cgit_open_filter(ctx.repo->email_filter, email, "commit"); + html_txt(name); + if (!ctx.cfg.noplainemail) { + html(" "); + html_txt(email); + } + cgit_close_filter(ctx.repo->email_filter); + html("</td><td class='right'>"); + html_txt(show_date(date, tz, cgit_date_mode(DATE_ISO8601))); + html("</td></tr>\n"); +} + +static int print_parent_rows(struct commit *commit, const char *rev, + const char *prefix) { - struct commit *commit, *parent; - struct commitinfo *info, *parent_info; struct commit_list *p; + struct commit *parent; + const char *parent_hex, *label; + int parents = 0; + + for (p = commit->parents; p; p = p->next) { + parent = lookup_commit_reference(the_repository, + &p->item->object.oid); + if (!parent) { + html("<tr><td colspan='3'>"); + cgit_print_error("Error reading parent commit"); + html("</td></tr>"); + continue; + } + html("<tr><th>parent</th>" + "<td colspan='2' class='oid'>"); + parent_hex = label = oid_to_hex(&p->item->object.oid); + if (ctx.repo->enable_subject_links) + label = cgit_parse_commit(parent)->subject; + cgit_commit_link(label, NULL, NULL, ctx.qry.head, parent_hex, + prefix); + html(" ("); + cgit_diff_link("diff", NULL, NULL, ctx.qry.head, rev, + oid_to_hex(&p->item->object.oid), prefix); + html(")</td></tr>"); + parents++; + } + return parents; +} + +static void print_filtered_text(const char *text) +{ + cgit_open_filter(ctx.repo->commit_filter); + html_txt(text); + cgit_close_filter(ctx.repo->commit_filter); +} + +void cgit_print_commit(char *hex, const char *prefix) +{ + struct commit *commit; + struct commitinfo *info; struct strbuf notes = STRBUF_INIT; struct object_id oid; - char *tmp, *tmp2; - int parents = 0; + const char *commit_hex, *first_parent; + char *tree_rev; + int parents; if (!hex) hex = ctx.qry.head; @@ -48,102 +112,66 @@ void cgit_print_commit(char *hex, const char *prefix) ctx.page.title = cgit_fmtalloc("%s - %s", info->subject, ctx.page.title); cgit_print_layout_start(); cgit_print_diff_ctrls(); + html("<table summary='commit info' class='commit-info'>\n"); - html("<tr><th>author</th><td>"); - cgit_open_filter(ctx.repo->email_filter, info->author_email, "commit"); - html_txt(info->author); - if (!ctx.cfg.noplainemail) { - html(" "); - html_txt(info->author_email); - } - cgit_close_filter(ctx.repo->email_filter); - html("</td><td class='right'>"); - html_txt(show_date(info->author_date, info->author_tz, - cgit_date_mode(DATE_ISO8601))); - html("</td></tr>\n"); - html("<tr><th>committer</th><td>"); - cgit_open_filter(ctx.repo->email_filter, info->committer_email, "commit"); - html_txt(info->committer); - if (!ctx.cfg.noplainemail) { - html(" "); - html_txt(info->committer_email); - } - cgit_close_filter(ctx.repo->email_filter); - html("</td><td class='right'>"); - html_txt(show_date(info->committer_date, info->committer_tz, - cgit_date_mode(DATE_ISO8601))); - html("</td></tr>\n"); + print_ident_row("author", info->author, info->author_email, + info->author_date, info->author_tz); + print_ident_row("committer", info->committer, info->committer_email, + info->committer_date, info->committer_tz); + html("<tr><th>commit</th><td colspan='2' class='oid'>"); - tmp = oid_to_hex(&commit->object.oid); - cgit_commit_link(tmp, NULL, NULL, ctx.qry.head, tmp, prefix); + commit_hex = oid_to_hex(&commit->object.oid); + cgit_commit_link(commit_hex, NULL, NULL, ctx.qry.head, commit_hex, + prefix); html(" ("); - cgit_patch_link("patch", NULL, NULL, NULL, tmp, prefix); + cgit_patch_link("patch", NULL, NULL, NULL, commit_hex, prefix); html(")</td></tr>\n"); + html("<tr><th>tree</th><td colspan='2' class='oid'>"); - tmp = xstrdup(hex); + tree_rev = xstrdup(hex); cgit_tree_link(oid_to_hex(get_commit_tree_oid(commit)), NULL, NULL, - ctx.qry.head, tmp, NULL); + ctx.qry.head, tree_rev, NULL); if (prefix) { html(" /"); - cgit_tree_link(prefix, NULL, NULL, ctx.qry.head, tmp, prefix); + cgit_tree_link(prefix, NULL, NULL, ctx.qry.head, tree_rev, + prefix); } - free(tmp); + free(tree_rev); html("</td></tr>\n"); - for (p = commit->parents; p; p = p->next) { - parent = lookup_commit_reference(the_repository, &p->item->object.oid); - if (!parent) { - html("<tr><td colspan='3'>"); - cgit_print_error("Error reading parent commit"); - html("</td></tr>"); - continue; - } - html("<tr><th>parent</th>" - "<td colspan='2' class='oid'>"); - tmp = tmp2 = oid_to_hex(&p->item->object.oid); - if (ctx.repo->enable_subject_links) { - parent_info = cgit_parse_commit(parent); - tmp2 = parent_info->subject; - } - cgit_commit_link(tmp2, NULL, NULL, ctx.qry.head, tmp, prefix); - html(" ("); - cgit_diff_link("diff", NULL, NULL, ctx.qry.head, hex, - oid_to_hex(&p->item->object.oid), prefix); - html(")</td></tr>"); - parents++; - } + + parents = print_parent_rows(commit, hex, prefix); + if (ctx.repo->snapshots) { html("<tr><th>download</th><td colspan='2' class='oid'>"); cgit_print_snapshot_links(ctx.repo, hex, "<br/>"); html("</td></tr>"); } html("</table>\n"); + html("<div class='commit-subject'>"); - cgit_open_filter(ctx.repo->commit_filter); - html_txt(info->subject); - cgit_close_filter(ctx.repo->commit_filter); + print_filtered_text(info->subject); cgit_print_commit_decorations(commit); html("</div>"); html("<div class='commit-msg'>"); - cgit_open_filter(ctx.repo->commit_filter); - html_txt(info->msg); - cgit_close_filter(ctx.repo->commit_filter); + print_filtered_text(info->msg); html("</div>"); if (notes.len != 0) { html("<div class='notes-header'>Notes</div>"); html("<div class='notes'>"); - cgit_open_filter(ctx.repo->commit_filter); - html_txt(notes.buf); - cgit_close_filter(ctx.repo->commit_filter); + print_filtered_text(notes.buf); html("</div>"); html("<div class='notes-footer'></div>"); } - if (parents < 3) { + + if (parents < OCTOPUS_PARENTS) { if (parents) - tmp = oid_to_hex(&commit->parents->item->object.oid); + first_parent = + oid_to_hex(&commit->parents->item->object.oid); else - tmp = NULL; - cgit_print_diff(ctx.qry.oid, tmp, prefix, 0, 0); + first_parent = NULL; + cgit_print_diff(ctx.qry.oid, first_parent, prefix, 0, 0); } + strbuf_release(¬es); cgit_free_commitinfo(info); cgit_print_layout_end(); |
