Diffstat (limited to 'ui-summary.c')
| -rw-r--r-- | ui-summary.c | 114 |
1 files changed, 68 insertions, 46 deletions
diff --git a/ui-summary.c b/ui-summary.c index 947812a..5598d08 100644 --- a/ui-summary.c +++ b/ui-summary.c @@ -1,6 +1,7 @@ /* 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 + * Copyright (C) 2010-2013 Jason A. Donenfeld <Jason@zx2c4.com> * * Licensed under GNU General Public License v2 * (see COPYING for full license text) @@ -9,38 +10,68 @@ #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; +#include "ui-blob.h" +#include <libgen.h> -static void print_url(const char *url) +static void print_url(char *base, char *suffix) { int columns = 3; + struct strbuf basebuf = STRBUF_INIT; 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); + if (!base || !*base) + return; + if (suffix && *suffix) { + strbuf_addf(&basebuf, "%s/%s", base, suffix); + base = basebuf.buf; } - - 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); + htmlf("<tr><td colspan='%d'><a href='", columns); + html_url_path(base); + html("'>"); + html_txt(base); html("</a></td></tr>\n"); + strbuf_release(&basebuf); } -void cgit_print_summary(void) +static void print_urls(char *txt, char *suffix) +{ + char *h = txt, *t, c; + int urls = 0; + int columns = 3; + + if (ctx.repo->enable_log_filecount) + columns++; + if (ctx.repo->enable_log_linecount) + columns++; + + + while (h && *h) { + while (h && *h == ' ') + h++; + if (!*h) + break; + t = h; + while (t && *t && *t != ' ') + t++; + c = *t; + *t = 0; + if (urls++ == 0) { + htmlf("<tr class='nohover'><td colspan='%d'> </td></tr>", columns); + htmlf("<tr><th class='left' colspan='%d'>Clone</th></tr>\n", columns); + } + print_url(h, suffix); + *t = c; + h = t; + } +} + +void cgit_print_summary() { int columns = 3; @@ -49,7 +80,6 @@ void cgit_print_summary(void) if (ctx.repo->enable_log_linecount) columns++; - 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); @@ -59,10 +89,11 @@ void cgit_print_summary(void) cgit_print_log(ctx.qry.head, 0, ctx.cfg.summary_log, NULL, NULL, NULL, 0, 0, 0); } - urls = 0; - cgit_add_clone_urls(print_url); + if (ctx.repo->clone_url) + print_urls(expand_macros(ctx.repo->clone_url), NULL); + else if (ctx.cfg.clone_prefix) + print_urls(ctx.cfg.clone_prefix, ctx.repo->url); html("</table>"); - cgit_print_layout_end(); } /* The caller must free the return value. */ @@ -82,11 +113,11 @@ static char* append_readme_path(const char *filename, const char *ref, const cha full_path = xstrdup(path); } else full_path = fmtalloc("%s/%s", base_dir, path); - + 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)) { + if (!resolved_base || !resolved_full || strncmp(resolved_base, resolved_full, strlen(resolved_base))) { free(full_path); full_path = NULL; } @@ -99,25 +130,14 @@ static char* append_readme_path(const char *filename, const char *ref, const cha return full_path; } -void cgit_print_repo_readme(const char *path) +void cgit_print_repo_readme(char *path) { - char *filename, *ref, *mimetype; + char *filename, *ref; int free_filename = 0; - 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; - } - free(mimetype); - - cgit_print_layout_start(); if (ctx.repo->readme.nr == 0) - goto done; - + return; + filename = ctx.repo->readme.items[0].string; ref = ctx.repo->readme.items[0].util; @@ -125,24 +145,26 @@ void cgit_print_repo_readme(const char *path) free_filename = 1; filename = append_readme_path(filename, ref, path); if (!filename) - goto done; + return; } /* 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 (ctx.repo->about_filter) { + ctx.repo->about_filter->argv[1] = filename; + cgit_open_filter(ctx.repo->about_filter); + } if (ref) cgit_print_file(filename, ref, 1); else html_include(filename); - cgit_close_filter(ctx.repo->about_filter); - + if (ctx.repo->about_filter) { + cgit_close_filter(ctx.repo->about_filter); + ctx.repo->about_filter->argv[1] = NULL; + } html("</div>"); if (free_filename) free(filename); - -done: - cgit_print_layout_end(); } |