X-Git-Url: https://gitweb.ps.run/ps-cgit/blobdiff_plain/e5da4bca54574522b28f88cab0dc8ebad9e35a73..9f9ede3d924fc363d6b8d59bea5a668569175a23:/ui-shared.c diff --git a/ui-shared.c b/ui-shared.c index 4408969..de77bbf 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -34,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) @@ -186,36 +206,36 @@ static char *repolink(char *title, char *class, char *page, char *head, } html(" href='"); if (ctx.cfg.virtual_root) { - html_attr(ctx.cfg.virtual_root); + html_url_path(ctx.cfg.virtual_root); if (ctx.cfg.virtual_root[strlen(ctx.cfg.virtual_root) - 1] != '/') html("/"); - html_attr(ctx.repo->url); + html_url_path(ctx.repo->url); if (ctx.repo->url[strlen(ctx.repo->url) - 1] != '/') html("/"); if (page) { - html(page); + html_url_path(page); html("/"); if (path) - html_attr(path); + html_url_path(path); } } else { html(ctx.cfg.script_name); html("?url="); - html_attr(ctx.repo->url); + html_url_arg(ctx.repo->url); if (ctx.repo->url[strlen(ctx.repo->url) - 1] != '/') html("/"); if (page) { - html(page); + html_url_arg(page); html("/"); if (path) - html_attr(path); + html_url_arg(path); } delim = "&"; } if (head && strcmp(head, ctx.repo->defbranch)) { html(delim); html("h="); - html_attr(head); + html_url_arg(head); delim = "&"; } return fmt("%s", delim); @@ -230,21 +250,39 @@ static void reporevlink(char *page, char *name, char *title, char *class, if (rev && strcmp(rev, ctx.qry.head)) { html(delim); html("id="); - html_attr(rev); + html_url_arg(rev); } html("'>"); html_txt(name); html(""); } +void cgit_summary_link(char *name, char *title, char *class, char *head) +{ + reporevlink(NULL, name, title, class, head, NULL, NULL); +} + +void cgit_tag_link(char *name, char *title, char *class, char *head, + char *rev) +{ + reporevlink("tag", name, title, class, head, rev, NULL); +} + void cgit_tree_link(char *name, char *title, char *class, char *head, char *rev, char *path) { 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) + char *rev, char *path, int ofs, char *grep, char *pattern, + int showmsg) { char *delim; @@ -252,22 +290,27 @@ void cgit_log_link(char *name, char *title, char *class, char *head, if (rev && strcmp(rev, ctx.qry.head)) { html(delim); html("id="); - html_attr(rev); + html_url_arg(rev); delim = "&"; } if (grep && pattern) { html(delim); html("qt="); - html_attr(grep); + html_url_arg(grep); delim = "&"; html(delim); html("q="); - html_attr(pattern); + html_url_arg(pattern); } if (ofs > 0) { html(delim); html("ofs="); htmlf("%d", ofs); + delim = "&"; + } + if (showmsg) { + html(delim); + html("showmsg=1"); } html("'>"); html_txt(name); @@ -307,13 +350,13 @@ void cgit_diff_link(char *name, char *title, char *class, char *head, if (new_rev && strcmp(new_rev, ctx.qry.head)) { html(delim); html("id="); - html_attr(new_rev); + html_url_arg(new_rev); delim = "&"; } if (old_rev) { html(delim); html("id2="); - html_attr(old_rev); + html_url_arg(old_rev); } html("'>"); html_txt(name); @@ -326,31 +369,31 @@ void cgit_patch_link(char *name, char *title, char *class, char *head, reporevlink("patch", name, title, class, head, rev, NULL); } +void cgit_stats_link(char *name, char *title, char *class, char *head, + char *path) +{ + reporevlink("stats", name, title, class, head, NULL, path); +} + void cgit_object_link(struct object *obj) { - char *page, *arg, *url; + char *page, *shortrev, *fullrev, *name; + fullrev = sha1_to_hex(obj->sha1); + shortrev = xstrdup(fullrev); + shortrev[10] = '\0'; if (obj->type == OBJ_COMMIT) { - cgit_commit_link(fmt("commit %s", sha1_to_hex(obj->sha1)), NULL, NULL, - ctx.qry.head, sha1_to_hex(obj->sha1)); + cgit_commit_link(fmt("commit %s...", shortrev), NULL, NULL, + ctx.qry.head, fullrev); return; - } else if (obj->type == OBJ_TREE) { + } else if (obj->type == OBJ_TREE) page = "tree"; - arg = "id"; - } else if (obj->type == OBJ_TAG) { + else if (obj->type == OBJ_TAG) page = "tag"; - arg = "id"; - } else { + else page = "blob"; - arg = "id"; - } - - url = cgit_pageurl(ctx.qry.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(); + name = fmt("%s %s...", typename(obj->type), shortrev); + reporevlink(page, name, NULL, NULL, ctx.qry.head, fullrev, NULL); } void cgit_print_date(time_t secs, char *format, int local_time) @@ -430,6 +473,7 @@ void cgit_print_http_headers(struct cgit_context *ctx) void cgit_print_docstart(struct cgit_context *ctx) { + char *host = cgit_hosturl(); html(cgit_doctype); html("\n"); html("
\n"); @@ -447,8 +491,17 @@ void cgit_print_docstart(struct cgit_context *ctx) html_attr(ctx->cfg.favicon); html("'/>\n"); } + if (host && ctx->repo) { + html(""); + } html("\n"); html("\n"); + if (ctx->cfg.header) + html_include(ctx->cfg.header); } void cgit_print_docend() @@ -457,9 +510,9 @@ void cgit_print_docend() if (ctx.cfg.footer) html_include(ctx.cfg.footer); else { - html("