X-Git-Url: https://gitweb.ps.run/ps-cgit/blobdiff_plain/d1f3bbe9d22029f45a77bb938c176ccc0c827d46..a30453a5d3f6db4d6e055da2112343e054e7e7d5:/ui-shared.c diff --git a/ui-shared.c b/ui-shared.c index b9f487a..c23bc75 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -7,6 +7,8 @@ */ #include "cgit.h" +#include "cmd.h" +#include "html.h" const char cgit_doctype[] = "tm_hour, tm->tm_min, tm->tm_sec); } -static long ttl_seconds(long ttl) -{ - if (ttl<0) - return 60 * 60 * 24 * 365; - else - return ttl * 60; -} - void cgit_print_error(char *msg) { html("
"); @@ -40,6 +34,26 @@ void cgit_print_error(char *msg) html("
\n"); } +char *cgit_hosturl() +{ + char *host, *port; + + host = getenv("HTTP_HOST"); + if (host) { + host = xstrdup(host); + } else { + host = getenv("SERVER_NAME"); + if (!host) + return NULL; + port = getenv("SERVER_PORT"); + if (port && atoi(port) != 80) + host = xstrdup(fmt("%s:%d", host, atoi(port))); + else + host = xstrdup(host); + } + return host; +} + char *cgit_rooturl() { if (ctx.cfg.virtual_root) @@ -120,6 +134,60 @@ char *cgit_currurl() return fmt("%s/", ctx.cfg.virtual_root); } +static void site_url(char *page, char *search, int ofs) +{ + char *delim = "?"; + + if (ctx.cfg.virtual_root) { + html_attr(ctx.cfg.virtual_root); + if (ctx.cfg.virtual_root[strlen(ctx.cfg.virtual_root) - 1] != '/') + html("/"); + } else + html(ctx.cfg.script_name); + + if (page) { + htmlf("?p=%s", page); + delim = "&"; + } + if (search) { + html(delim); + html("q="); + html_attr(search); + delim = "&"; + } + if (ofs) { + html(delim); + htmlf("ofs=%d", ofs); + } +} + +static void site_link(char *page, char *name, char *title, char *class, + char *search, int ofs) +{ + html(""); + html_txt(name); + html(""); +} + +void cgit_index_link(char *name, char *title, char *class, char *pattern, + int ofs) +{ + site_link(NULL, name, title, class, pattern, ofs); +} + static char *repolink(char *title, char *class, char *page, char *head, char *path) { @@ -195,6 +263,12 @@ void cgit_tree_link(char *name, char *title, char *class, char *head, reporevlink("tree", name, title, class, head, rev, path); } +void cgit_plain_link(char *name, char *title, char *class, char *head, + char *rev, char *path) +{ + reporevlink("plain", name, title, class, head, rev, path); +} + void cgit_log_link(char *name, char *title, char *class, char *head, char *rev, char *path, int ofs, char *grep, char *pattern) { @@ -305,14 +379,17 @@ void cgit_object_link(struct object *obj) html_link_close(); } -void cgit_print_date(time_t secs, char *format) +void cgit_print_date(time_t secs, char *format, int local_time) { char buf[64]; struct tm *time; if (!secs) return; - time = gmtime(&secs); + if(local_time) + time = localtime(&secs); + else + time = gmtime(&secs); strftime(buf, sizeof(buf)-1, format, time); html_txt(buf); } @@ -327,7 +404,7 @@ void cgit_print_age(time_t t, time_t max_relative, char *format) secs = now - t; if (secs > max_relative && max_relative >= 0) { - cgit_print_date(t, format); + cgit_print_date(t, format, ctx.cfg.local_time); return; } @@ -360,32 +437,66 @@ void cgit_print_age(time_t t, time_t max_relative, char *format) secs * 1.0 / TM_YEAR); } -void cgit_print_docstart(char *title, struct cacheitem *item) +void cgit_print_http_headers(struct cgit_context *ctx) { - html("Content-Type: text/html; charset=" PAGE_ENCODING "\n"); - htmlf("Last-Modified: %s\n", http_date(item->st.st_mtime)); - htmlf("Expires: %s\n", http_date(item->st.st_mtime + - ttl_seconds(item->ttl))); + if (ctx->page.mimetype && ctx->page.charset) + htmlf("Content-Type: %s; charset=%s\n", ctx->page.mimetype, + ctx->page.charset); + else if (ctx->page.mimetype) + htmlf("Content-Type: %s\n", ctx->page.mimetype); + if (ctx->page.size) + htmlf("Content-Length: %ld\n", ctx->page.size); + if (ctx->page.filename) + htmlf("Content-Disposition: inline; filename=\"%s\"\n", + ctx->page.filename); + htmlf("Last-Modified: %s\n", http_date(ctx->page.modified)); + htmlf("Expires: %s\n", http_date(ctx->page.expires)); html("\n"); +} + +void cgit_print_docstart(struct cgit_context *ctx) +{ + char *host = cgit_hosturl(); html(cgit_doctype); html("\n"); html("\n"); html(""); - html_txt(title); + html_txt(ctx->page.title); html("\n"); htmlf("\n", cgit_version); - if (ctx.cfg.robots && *ctx.cfg.robots) - htmlf("\n", ctx.cfg.robots); + if (ctx->cfg.robots && *ctx->cfg.robots) + htmlf("\n", ctx->cfg.robots); html("\n"); + if (ctx->cfg.favicon) { + html("\n"); + } + if (host && ctx->repo) { + html(""); + } html("\n"); html("\n"); } void cgit_print_docend() { - html("\n\n\n\n\n"); + html(""); + if (ctx.cfg.footer) + html_include(ctx.cfg.footer); + else { + html("\n"); + } + html("\n\n"); } int print_branch_option(const char *refname, const unsigned char *sha1, @@ -446,7 +557,8 @@ void add_hidden_formfields(int incl_head, int incl_search, char *page) html_hidden("url", url); } - if (incl_head && strcmp(ctx.qry.head, ctx.repo->defbranch)) + if (incl_head && ctx.qry.head && ctx.repo->defbranch && + strcmp(ctx.qry.head, ctx.repo->defbranch)) html_hidden("h", ctx.qry.head); if (ctx.qry.sha1) @@ -462,109 +574,139 @@ void add_hidden_formfields(int incl_head, int incl_search, char *page) } } -void cgit_print_pageheader(char *title, int show_search) +char *hc(struct cgit_cmd *cmd, const char *page) { - static const char *default_info = "This is cgit, a fast webinterface for git repositories"; - int header = 0; - char *url; + return (strcmp(cmd->name, page) ? NULL : "active"); +} - html("\n"); - html("