Diffstat (limited to 'ui-summary.c')
| -rw-r--r-- | ui-summary.c | 290 |
1 files changed, 176 insertions, 114 deletions
diff --git a/ui-summary.c b/ui-summary.c index 947812a..e7158cc 100644 --- a/ui-summary.c +++ b/ui-summary.c @@ -1,148 +1,210 @@ /* ui-summary.c: functions for generating repo summary page * - * Copyright (C) 2006-2014 cgit Development Team <cgit@lists.zx2c4.com> + * Copyright (C) 2006 Lars Hjemli * * Licensed under GNU General Public License v2 * (see COPYING for full license text) */ #include "cgit.h" -#include "ui-summary.h" -#include "html.h" -#include "ui-blob.h" -#include "ui-log.h" -#include "ui-plain.h" -#include "ui-refs.h" -#include "ui-shared.h" -static int urls; +static int header; -static void print_url(const char *url) +static int cgit_print_branch_cb(const char *refname, const unsigned char *sha1, + int flags, void *cb_data) { - int columns = 3; + struct commit *commit; + struct commitinfo *info; + char buf[256], *url; - if (ctx.repo->enable_log_filecount) - columns++; - if (ctx.repo->enable_log_linecount) - columns++; - - if (urls++ == 0) { - htmlf("<tr class='nohover'><td colspan='%d'> </td></tr>", columns); - htmlf("<tr class='nohover'><th class='left' colspan='%d'>Clone</th></tr>\n", columns); + strncpy(buf, refname, sizeof(buf)); + commit = lookup_commit(sha1); + if (commit && !parse_commit(commit)){ + info = cgit_parse_commit(commit); + html("<tr><td>"); + url = cgit_pageurl(cgit_query_repo, "log", + fmt("h=%s", refname)); + html_link_open(url, NULL, NULL); + html_txt(buf); + html_link_close(); + html("</td><td>"); + cgit_print_date(commit->date); + html("</td><td>"); + html_txt(info->author); + html("</td><td>"); + url = cgit_pageurl(cgit_query_repo, "commit", + fmt("h=%s", sha1_to_hex(sha1))); + html_link_open(url, NULL, NULL); + html_ntxt(cgit_max_msg_len, info->subject); + html_link_close(); + html("</td></tr>\n"); + cgit_free_commitinfo(info); + } else { + html("<tr><td>"); + html_txt(buf); + html("</td><td colspan='3'>"); + htmlf("*** bad ref %s ***", sha1_to_hex(sha1)); + html("</td></tr>\n"); } - - htmlf("<tr><td colspan='%d'><a rel='vcs-git' href='", columns); - html_url_path(url); - html("' title='"); - html_attr(ctx.repo->name); - html(" Git repository'>"); - html_txt(url); - html("</a></td></tr>\n"); + return 0; } -void cgit_print_summary(void) -{ - int columns = 3; - if (ctx.repo->enable_log_filecount) - columns++; - if (ctx.repo->enable_log_linecount) - columns++; +static void cgit_print_object_ref(struct object *obj) +{ + char *page, *arg, *url; - cgit_print_layout_start(); - html("<table summary='repository info' class='list nowrap'>"); - cgit_print_branches(ctx.cfg.summary_branches); - htmlf("<tr class='nohover'><td colspan='%d'> </td></tr>", columns); - cgit_print_tags(ctx.cfg.summary_tags); - if (ctx.cfg.summary_log > 0) { - htmlf("<tr class='nohover'><td colspan='%d'> </td></tr>", columns); - cgit_print_log(ctx.qry.head, 0, ctx.cfg.summary_log, NULL, - NULL, NULL, 0, 0, 0); + if (obj->type == OBJ_COMMIT) { + page = "commit"; + arg = "h"; + } else if (obj->type == OBJ_TREE) { + page = "tree"; + arg = "id"; + } else { + page = "view"; + arg = "id"; } - urls = 0; - cgit_add_clone_urls(print_url); - html("</table>"); - cgit_print_layout_end(); + + url = cgit_pageurl(cgit_query_repo, page, + fmt("%s=%s", arg, sha1_to_hex(obj->sha1))); + html_link_open(url, NULL, NULL); + htmlf("%s %s", typename(obj->type), + sha1_to_hex(obj->sha1)); + html_link_close(); } -/* The caller must free the return value. */ -static char* append_readme_path(const char *filename, const char *ref, const char *path) +static void print_tag_header() { - char *file, *base_dir, *full_path, *resolved_base = NULL, *resolved_full = NULL; - /* If a subpath is specified for the about page, make it relative - * to the directory containing the configured readme. */ + html("<tr class='nohover'><th class='left'>Tag</th>" + "<th class='left'>Created</th>" + "<th class='left'>Author</th>" + "<th class='left'>Reference</th></tr>\n"); + header = 1; +} - file = xstrdup(filename); - base_dir = dirname(file); - if (!strcmp(base_dir, ".") || !strcmp(base_dir, "..")) { - if (!ref) { - free(file); - return NULL; - } - full_path = xstrdup(path); - } else - full_path = fmtalloc("%s/%s", base_dir, path); +static int cgit_print_tag_cb(const char *refname, const unsigned char *sha1, + int flags, void *cb_data) +{ + struct tag *tag; + struct taginfo *info; + struct object *obj; + char buf[256], *url; - if (!ref) { - resolved_base = realpath(base_dir, NULL); - resolved_full = realpath(full_path, NULL); - if (!resolved_base || !resolved_full || !starts_with(resolved_full, resolved_base)) { - free(full_path); - full_path = NULL; - } + strncpy(buf, refname, sizeof(buf)); + obj = parse_object(sha1); + if (!obj) + return 1; + if (obj->type == OBJ_TAG) { + tag = lookup_tag(sha1); + if (!tag || parse_tag(tag) || !(info = cgit_parse_tag(tag))) + return 2; + if (!header) + print_tag_header(); + html("<tr><td>"); + url = cgit_pageurl(cgit_query_repo, "view", + fmt("id=%s", sha1_to_hex(sha1))); + html_link_open(url, NULL, NULL); + html_txt(buf); + html_link_close(); + html("</td><td>"); + if (info->tagger_date > 0) + cgit_print_date(info->tagger_date); + html("</td><td>"); + if (info->tagger) + html(info->tagger); + html("</td><td>"); + cgit_print_object_ref(tag->tagged); + html("</td></tr>\n"); + } else { + if (!header) + print_tag_header(); + html("<tr><td>"); + html_txt(buf); + html("</td><td colspan='2'/><td>"); + cgit_print_object_ref(obj); + html("</td></tr>\n"); } - - free(file); - free(resolved_base); - free(resolved_full); - - return full_path; + return 0; } -void cgit_print_repo_readme(const char *path) +static int cgit_print_archive_cb(const char *refname, const unsigned char *sha1, + int flags, void *cb_data) { - char *filename, *ref, *mimetype; - int free_filename = 0; + struct tag *tag; + struct taginfo *info; + struct object *obj; + char buf[256], *url; + unsigned char fileid[20]; - mimetype = get_mimetype_for_filename(path); - if (mimetype && (!strncmp(mimetype, "image/", 6) || !strncmp(mimetype, "video/", 6))) { - ctx.page.mimetype = mimetype; - ctx.page.charset = NULL; - cgit_print_plain(); - free(mimetype); - return; + if (prefixcmp(refname, "refs/archives")) + return 0; + strncpy(buf, refname+14, sizeof(buf)); + obj = parse_object(sha1); + if (!obj) + return 1; + if (obj->type == OBJ_TAG) { + tag = lookup_tag(sha1); + if (!tag || parse_tag(tag) || !(info = cgit_parse_tag(tag))) + return 0; + hashcpy(fileid, tag->tagged->sha1); + } else if (obj->type != OBJ_BLOB) { + return 0; + } else { + hashcpy(fileid, sha1); } - free(mimetype); - - cgit_print_layout_start(); - if (ctx.repo->readme.nr == 0) - goto done; - - filename = ctx.repo->readme.items[0].string; - ref = ctx.repo->readme.items[0].util; - - if (path) { - free_filename = 1; - filename = append_readme_path(filename, ref, path); - if (!filename) - goto done; + if (!header) { + html("<table>"); + html("<tr><th>Downloads</th></tr>"); + header = 1; } + html("<tr><td>"); + url = cgit_pageurl(cgit_query_repo, "blob", + fmt("id=%s&path=%s", sha1_to_hex(fileid), + buf)); + html_link_open(url, NULL, NULL); + html_txt(buf); + html_link_close(); + html("</td><tr>"); + return 0; +} - /* Print the calculated readme, either from the git repo or from the - * filesystem, while applying the about-filter. - */ - html("<div id='summary'>"); - cgit_open_filter(ctx.repo->about_filter, filename); - if (ref) - cgit_print_file(filename, ref, 1); - else - html_include(filename); - cgit_close_filter(ctx.repo->about_filter); +static void cgit_print_branches() +{ + html("<tr class='nohover'><th class='left'>Branch</th>" + "<th class='left'>Updated</th>" + "<th class='left'>Author</th>" + "<th class='left'>Head commit</th></tr>\n"); + for_each_branch_ref(cgit_print_branch_cb, NULL); +} - html("</div>"); - if (free_filename) - free(filename); +static void cgit_print_tags() +{ + header = 0; + for_each_tag_ref(cgit_print_tag_cb, NULL); +} -done: - cgit_print_layout_end(); +static void cgit_print_archives() +{ + header = 0; + for_each_ref(cgit_print_archive_cb, NULL); + if (header) + html("</table>"); +} + +void cgit_print_summary() +{ + html("<table class='list nowrap'>"); + html("<tr class='nohover'><td id='summary' colspan='3'>"); + html("<h2>"); + html_txt(cgit_repo->name); + html(" - "); + html_txt(cgit_repo->desc); + html("</h2>"); + html("</td><td id='archivelist'>"); + cgit_print_archives(); + html("</td></tr>"); + cgit_print_branches(); + html("<tr class='nohover'><td colspan='4'> </td></tr>"); + cgit_print_tags(); + html("</table>"); } |