X-Git-Url: https://gitweb.ps.run/ps-cgit/blobdiff_plain/6940b23b9e4698ba466a4616e4de77b986560ad3..8f208794318f83826e98168b8b430f2d9a68bcce:/ui-shared.c diff --git a/ui-shared.c b/ui-shared.c index ae29615..945d560 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -7,6 +7,7 @@ */ #include "cgit.h" +#include "ui-shared.h" #include "cmd.h" #include "html.h" @@ -23,7 +24,7 @@ static char *http_date(time_t t) "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; struct tm *tm = gmtime(&t); return fmt("%s, %02d %s %04d %02d:%02d:%02d GMT", day[tm->tm_wday], - tm->tm_mday, month[tm->tm_mon], 1900+tm->tm_year, + tm->tm_mday, month[tm->tm_mon], 1900 + tm->tm_year, tm->tm_hour, tm->tm_min, tm->tm_sec); } @@ -34,7 +35,7 @@ void cgit_print_error(const char *msg) html("\n"); } -char *cgit_httpscheme() +const char *cgit_httpscheme() { if (ctx.env.https && !strcmp(ctx.env.https, "on")) return "https://"; @@ -42,7 +43,7 @@ char *cgit_httpscheme() return "http://"; } -char *cgit_hosturl() +const char *cgit_hosturl() { if (ctx.env.http_host) return ctx.env.http_host; @@ -53,7 +54,7 @@ char *cgit_hosturl() return xstrdup(fmt("%s:%s", ctx.env.server_name, ctx.env.server_port)); } -char *cgit_rooturl() +const char *cgit_rooturl() { if (ctx.cfg.virtual_root) return fmt("%s/", ctx.cfg.virtual_root); @@ -83,7 +84,7 @@ char *cgit_fileurl(const char *reponame, const char *pagename, } else { tmp = fmt("?url=%s/%s/%s", reponame, pagename, (filename ? filename : "")); - delim = "&"; + delim = "&"; } if (query) tmp = fmt("%s%s%s", tmp, delim, query); @@ -93,7 +94,7 @@ char *cgit_fileurl(const char *reponame, const char *pagename, char *cgit_pageurl(const char *reponame, const char *pagename, const char *query) { - return cgit_fileurl(reponame,pagename,0,query); + return cgit_fileurl(reponame, pagename, 0, query); } const char *cgit_repobasename(const char *reponame) @@ -102,38 +103,26 @@ const char *cgit_repobasename(const char *reponame) static char rvbuf[1024]; int p; const char *rv; - strncpy(rvbuf,reponame,sizeof(rvbuf)); - if(rvbuf[sizeof(rvbuf)-1]) + strncpy(rvbuf, reponame, sizeof(rvbuf)); + if (rvbuf[sizeof(rvbuf)-1]) die("cgit_repobasename: truncated repository name '%s'", reponame); p = strlen(rvbuf)-1; /* strip trailing slashes */ - while(p && rvbuf[p]=='/') rvbuf[p--]=0; + while (p && rvbuf[p] == '/') rvbuf[p--] = 0; /* strip trailing .git */ - if(p>=3 && !strncmp(&rvbuf[p-3],".git",4)) { + if (p >= 3 && !strncmp(&rvbuf[p-3], ".git", 4)) { p -= 3; rvbuf[p--] = 0; } /* strip more trailing slashes if any */ - while( p && rvbuf[p]=='/') rvbuf[p--]=0; + while ( p && rvbuf[p] == '/') rvbuf[p--] = 0; /* find last slash in the remaining string */ rv = strrchr(rvbuf,'/'); - if(rv) + if (rv) return ++rv; return rvbuf; } -char *cgit_currurl() -{ - if (!ctx.cfg.virtual_root) - return ctx.cfg.script_name; - else if (ctx.qry.page) - return fmt("%s/%s/%s/", ctx.cfg.virtual_root, ctx.qry.repo, ctx.qry.page); - else if (ctx.qry.repo) - return fmt("%s/%s/", ctx.cfg.virtual_root, ctx.qry.repo); - else - return fmt("%s/", ctx.cfg.virtual_root); -} - -static void site_url(const char *page, const char *search, int ofs) +static void site_url(const char *page, const char *search, const char *sort, int ofs) { char *delim = "?"; @@ -146,13 +135,19 @@ static void site_url(const char *page, const char *search, int ofs) if (page) { htmlf("?p=%s", page); - delim = "&"; + delim = "&"; } if (search) { html(delim); html("q="); html_attr(search); - delim = "&"; + delim = "&"; + } + if (sort) { + html(delim); + html("s="); + html_attr(sort); + delim = "&"; } if (ofs) { html(delim); @@ -161,7 +156,7 @@ static void site_url(const char *page, const char *search, int ofs) } static void site_link(const char *page, const char *name, const char *title, - const char *class, const char *search, int ofs) + const char *class, const char *search, const char *sort, int ofs) { html(""); html_txt(name); html(""); } void cgit_index_link(const char *name, const char *title, const char *class, - const char *pattern, int ofs) + const char *pattern, const char *sort, int ofs) { - site_link(NULL, name, title, class, pattern, ofs); + site_link(NULL, name, title, class, pattern, sort, ofs); } static char *repolink(const char *title, const char *class, const char *page, @@ -288,17 +283,17 @@ void cgit_log_link(const char *name, const char *title, const char *class, char *delim; delim = repolink(title, class, "log", head, path); - if (rev && strcmp(rev, ctx.qry.head)) { + if (rev && ctx.qry.head && strcmp(rev, ctx.qry.head)) { html(delim); html("id="); html_url_arg(rev); - delim = "&"; + delim = "&"; } if (grep && pattern) { html(delim); html("qt="); html_url_arg(grep); - delim = "&"; + delim = "&"; html(delim); html("q="); html_url_arg(pattern); @@ -307,7 +302,7 @@ void cgit_log_link(const char *name, const char *title, const char *class, html(delim); html("ofs="); htmlf("%d", ofs); - delim = "&"; + delim = "&"; } if (showmsg) { html(delim); @@ -332,7 +327,7 @@ void cgit_commit_link(char *name, const char *title, const char *class, char *delim; delim = repolink(title, class, "commit", head, path); - if (rev && strcmp(rev, ctx.qry.head)) { + if (rev && ctx.qry.head && strcmp(rev, ctx.qry.head)) { html(delim); html("id="); html_url_arg(rev); @@ -355,7 +350,10 @@ void cgit_commit_link(char *name, const char *title, const char *class, delim = "&"; } html("'>"); - html_txt(name); + if (name[0] != '\0') + html_txt(name); + else + html_txt("(no commit message)"); html(""); } @@ -424,62 +422,63 @@ void cgit_stats_link(const char *name, const char *title, const char *class, reporevlink("stats", name, title, class, head, NULL, path); } -void cgit_self_link(char *name, const char *title, const char *class, - struct cgit_context *ctx) +static void cgit_self_link(char *name, const char *title, const char *class, + struct cgit_context *ctx) { if (!strcmp(ctx->qry.page, "repolist")) - return cgit_index_link(name, title, class, ctx->qry.search, - ctx->qry.ofs); + cgit_index_link(name, title, class, ctx->qry.search, ctx->qry.sort, + ctx->qry.ofs); else if (!strcmp(ctx->qry.page, "summary")) - return cgit_summary_link(name, title, class, ctx->qry.head); + cgit_summary_link(name, title, class, ctx->qry.head); else if (!strcmp(ctx->qry.page, "tag")) - return cgit_tag_link(name, title, class, ctx->qry.head, - ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL); + cgit_tag_link(name, title, class, ctx->qry.head, + ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL); else if (!strcmp(ctx->qry.page, "tree")) - return cgit_tree_link(name, title, class, ctx->qry.head, - ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, - ctx->qry.path); + cgit_tree_link(name, title, class, ctx->qry.head, + ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, + ctx->qry.path); else if (!strcmp(ctx->qry.page, "plain")) - return cgit_plain_link(name, title, class, ctx->qry.head, - ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, - ctx->qry.path); + cgit_plain_link(name, title, class, ctx->qry.head, + ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, + ctx->qry.path); else if (!strcmp(ctx->qry.page, "log")) - return cgit_log_link(name, title, class, ctx->qry.head, - ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, - ctx->qry.path, ctx->qry.ofs, - ctx->qry.grep, ctx->qry.search, - ctx->qry.showmsg); + cgit_log_link(name, title, class, ctx->qry.head, + ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, + ctx->qry.path, ctx->qry.ofs, + ctx->qry.grep, ctx->qry.search, + ctx->qry.showmsg); else if (!strcmp(ctx->qry.page, "commit")) - return cgit_commit_link(name, title, class, ctx->qry.head, - ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, - ctx->qry.path, 0); + cgit_commit_link(name, title, class, ctx->qry.head, + ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, + ctx->qry.path, 0); else if (!strcmp(ctx->qry.page, "patch")) - return cgit_patch_link(name, title, class, ctx->qry.head, - ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, - ctx->qry.path); + cgit_patch_link(name, title, class, ctx->qry.head, + ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, + ctx->qry.path); else if (!strcmp(ctx->qry.page, "refs")) - return cgit_refs_link(name, title, class, ctx->qry.head, - ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, - ctx->qry.path); + cgit_refs_link(name, title, class, ctx->qry.head, + ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, + ctx->qry.path); else if (!strcmp(ctx->qry.page, "snapshot")) - return cgit_snapshot_link(name, title, class, ctx->qry.head, - ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, - ctx->qry.path); + cgit_snapshot_link(name, title, class, ctx->qry.head, + ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, + ctx->qry.path); else if (!strcmp(ctx->qry.page, "diff")) - return cgit_diff_link(name, title, class, ctx->qry.head, - ctx->qry.sha1, ctx->qry.sha2, - ctx->qry.path, 0); + cgit_diff_link(name, title, class, ctx->qry.head, + ctx->qry.sha1, ctx->qry.sha2, + ctx->qry.path, 0); else if (!strcmp(ctx->qry.page, "stats")) - return cgit_stats_link(name, title, class, ctx->qry.head, - ctx->qry.path); - - /* Don't known how to make link for this page */ - repolink(title, class, ctx->qry.page, ctx->qry.head, ctx->qry.path); - html(">"); - html_txt(name); - html(""); + cgit_stats_link(name, title, class, ctx->qry.head, + ctx->qry.path); + else { + /* Don't known how to make link for this page */ + repolink(title, class, ctx->qry.page, ctx->qry.head, ctx->qry.path); + html(">"); + html_txt(name); + html(""); + } } void cgit_object_link(struct object *obj) @@ -490,7 +489,7 @@ void cgit_object_link(struct object *obj) shortrev = xstrdup(fullrev); shortrev[10] = '\0'; if (obj->type == OBJ_COMMIT) { - cgit_commit_link(fmt("commit %s...", shortrev), NULL, NULL, + cgit_commit_link(fmt("commit %s...", shortrev), NULL, NULL, ctx.qry.head, fullrev, NULL, 0); return; } else if (obj->type == OBJ_TREE) @@ -503,6 +502,64 @@ void cgit_object_link(struct object *obj) reporevlink(page, name, NULL, NULL, ctx.qry.head, fullrev, NULL); } +static struct string_list_item *lookup_path(struct string_list *list, + const char *path) +{ + struct string_list_item *item; + + while (path && path[0]) { + if ((item = string_list_lookup(list, path))) + return item; + if (!(path = strchr(path, '/'))) + break; + path++; + } + return NULL; +} + +void cgit_submodule_link(const char *class, char *path, const char *rev) +{ + struct string_list *list; + struct string_list_item *item; + char tail, *dir; + size_t len; + + len = 0; + tail = 0; + list = &ctx.repo->submodules; + item = lookup_path(list, path); + if (!item) { + len = strlen(path); + tail = path[len - 1]; + if (tail == '/') { + path[len - 1] = 0; + item = lookup_path(list, path); + } + } + html("module_link, dir, rev)); + } else { + html("#"); + } + html("'>"); + html_txt(path); + html(""); + html_txt(fmt(" @ %.7s", rev)); + if (item && tail) + path[len - 1] = tail; +} + void cgit_print_date(time_t secs, const char *format, int local_time) { char buf[64]; @@ -510,7 +567,7 @@ void cgit_print_date(time_t secs, const char *format, int local_time) if (!secs) return; - if(local_time) + if (local_time) time = localtime(&secs); else time = gmtime(&secs); @@ -574,7 +631,7 @@ void cgit_print_http_headers(struct cgit_context *ctx) 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); + htmlf("Content-Length: %zd\n", ctx->page.size); if (ctx->page.filename) htmlf("Content-Disposition: inline; filename=\"%s\"\n", ctx->page.filename); @@ -595,7 +652,7 @@ void cgit_print_docstart(struct cgit_context *ctx) return; } - char *host = cgit_hosturl(); + const char *host = cgit_hosturl(); html(cgit_doctype); html("\n"); html("\n"); @@ -613,7 +670,7 @@ void cgit_print_docstart(struct cgit_context *ctx) html_attr(ctx->cfg.favicon); html("'/>\n"); } - if (host && ctx->repo) { + if (host && ctx->repo && ctx->qry.head) { html("\n"); html("\n"); - if (ctx->cfg.logo && ctx->cfg.logo[0] != 0) { + if (ctx->repo && ctx->repo->logo && *ctx->repo->logo) + logo = ctx->repo->logo; + else + logo = ctx->cfg.logo; + if (ctx->repo && ctx->repo->logo_link && *ctx->repo->logo_link) + logo_link = ctx->repo->logo_link; + else + logo_link = ctx->cfg.logo_link; + if (logo && *logo) { html("cgit logo\n"); } html(""); if (ctx->repo) { - cgit_index_link("index", NULL, NULL, NULL, 0); + cgit_index_link("index", NULL, NULL, NULL, NULL, 0); html(" : "); cgit_summary_link(ctx->repo->name, ctx->repo->name, NULL, NULL); html(""); @@ -848,10 +876,10 @@ void cgit_print_pageheader(struct cgit_context *ctx) html("\n"); html("\n"); } else { - site_link(NULL, "index", NULL, hc(ctx, "repolist"), NULL, 0); + site_link(NULL, "index", NULL, hc(ctx, "repolist"), NULL, NULL, 0); if (ctx->cfg.root_readme) site_link("about", "about", NULL, hc(ctx, "about"), - NULL, 0); + NULL, NULL, 0); html(""); html("