X-Git-Url: https://gitweb.ps.run/ps-cgit/blobdiff_plain/6a8f65bf184d85a0c51ffecca16f48e6f4b1ff12..c366bd6fa88fb7dbe1e42c84d56e2bda0b1682c5:/ui-shared.c diff --git a/ui-shared.c b/ui-shared.c index ae29615..d9d5da7 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -83,7 +83,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); @@ -133,7 +133,7 @@ char *cgit_currurl() 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 +146,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 +167,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 +294,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 +313,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 +338,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); @@ -428,7 +434,7 @@ 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, + return 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); @@ -503,6 +509,62 @@ void cgit_object_link(struct object *obj) reporevlink(page, name, NULL, NULL, ctx.qry.head, fullrev, NULL); } +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; + + 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("util, rev)); + } else if (ctx.repo->module_link) { + dir = strrchr(path, '/'); + if (dir) + dir++; + else + dir = path; + html_attr(fmt(ctx.repo->module_link, dir, rev)); + } else { + html("#"); + } + html("'>"); + html_txt(path); + html(""); + if (item && tail) + path[len - 1] = tail; +} + void cgit_print_date(time_t secs, const char *format, int local_time) { char buf[64]; @@ -574,7 +636,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); @@ -613,7 +675,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("